代码之家  ›  专栏  ›  技术社区  ›  TheXenocide

如何为制作并排编译器。导航战鉴定小组

  •  7
  • TheXenocide  · 技术社区  · 17 年前

    Nikhil Kothari的 Script# 这很可能是我一段时间以来在JavaScript领域看到的最令人惊叹的概念之一。这个问题不是关于JavaScript的,而是关于中的语言编译。NET运行时。

    我一直对如何使用它很感兴趣。NET平台,可以为已经有编译器(如C#)的语言编写编译器,该编译器将从原始编译器生成单独的输出,同时允许原始编译器在同一构建操作期间为同一源生成输出,同时引用/使用其他编译器的输出。

    我甚至不完全确定我对这个过程的理解是否足以提出正确的细节问题,但这是我目前看待这个过程的方式,如Script#文档中的图表所示。我考虑过许多涉及复杂语言设计和编译的事情,这些事情可能能够利用这样的概念,我对其他人对这些概念的看法很感兴趣。

    --

    编辑:感谢您的评论,到目前为止;你的信息本身就很有趣,我想对其进行更多的研究,但我的问题实际上是,我如何能够编写自己的编译器,同时在同一个源上运行,使用CLR产生多种不同类型的(潜在的)相互依存的输出。Script#就是一个例子,因为它使用相同的C#源代码生成JavaScript和程序集,同时使编译后的程序集与JavaScript协同工作。我很好奇设计这种性质的东西的各种方法和理论概念是什么。

    3 回复  |  直到 17 年前
        1
  •  2
  •   sirwart    17 年前

    重要的是要意识到,编译器所做的只是获取源语言(在这种情况下为C#),解析它,使编译器具有对它有意义的表示,而不是人类(这是抽象语法树),然后对目标语言进行简单的代码生成(msil是在.NET运行时上运行的语言的目标)。

    现在,如果脚本#代码被转换为程序集并与其他程序集交互。NET代码,这意味着此编译器必须生成msil。script#为此使用了csc.exe,这只是标准的c#comiler。现在要生成javascript,它必须使用c#或msil,解析它,并生成javascript以发送到浏览器。文档说它有一个自定义c#->js编译器名为ssc.exe。

    为了使客户端和服务器端的交互保持一致,它有一组编写的引用程序集。NET,但也编译为javascript。不过,这不是编译器特定的问题,这些引用程序集是脚本#运行时。运行时可能是你感知到的许多脚本#magic的原因。

        2
  •  0
  •   ibz    17 年前

    假设你想把C#编译成Javascript。您在问是否可以利用现有的C#编译器,因此,与其直接将C#编译为Javascript,不如将C#编译器生成的MSIL转换为Javascript?

    当然,你可以做到。一旦你有了MSIL二进制文件,你就可以对它做任何你想做的事情。

        3
  •  0
  •   Lars Truijens    17 年前

    微软有一个名为 Volta 除其他功能外,它还将msil编译为JavaScript。

    用于构建的开发人员工具集 使用的多层web应用程序 现有的和熟悉的工具, 技术和模式。伏特 声明性层拆分启用 开发商推迟建筑 关于分配的决定,直到 最后一个可能的责任时刻。 此外,由于共享编程 Volta跨多层模型 支持新的端到端分析和 更高水平的测试 应用性能、鲁棒性, 以及可靠性。使用声明式 分层,开发人员可以细化 基于此的架构决策 分析数据。这节省了时间和 与人工相关的成本 重构。实际上,Volta扩展了 这个。NET平台进一步启用 软件+服务的发展 应用程序,使用现有和 熟悉的工具和技术。

    你设计并构建你的 作为一个应用程序。NET客户端 应用程序,分配以下部分 在服务器上运行的应用程序 层和客户端层 发展过程。你可以瞄准 无论是web浏览器还是CLR 客户和Volta负责 分层的复杂性。这个 编译器创建跨浏览器 客户端层、web的JavaScript 服务器层的服务,以及所有 通信、序列化, 同步、安全和其他 绑定层的样板代码 一起。实际上,Volta提供了 多方面的最佳努力体验 环境无需 定制应用程序。

    推荐文章