The*_*ide 7 .net compiler-theory language-design
Nikhil Kothari的脚本#很可能是我在JavaScript领域看到的最令人惊奇的概念之一已经有一段时间了.这个问题不是关于JavaScript,而是关于.NET运行时中的语言编译.
我一直很感兴趣,使用.NET平台,可以为已经有编译器(如C#)的语言编写编译器,该编译器将从原始编译器生成单独的输出,同时允许原始编译器生成输出在同一构建操作期间使用相同的源,同时引用/使用其他编译器的输出.
我不完全确定我甚至能够很好地理解这个过程以便用正确的细节提出问题,但这是我目前看到这个过程的方式,正如Script#docs中的图表所示.我想过很多涉及复杂语言设计和编译的东西,可以利用这样的概念,我对其他人对这些概念的看法感兴趣.
-
编辑:感谢您的评论,到目前为止; 你的信息本身就非常有趣,我想更多地研究它,但我的问题实际上是关于如何编写我自己的编译器,它可以在同一个源上同时运行使用CLR产生多种不同类型的(可能)相互依赖的输出.脚本#作为一个例子,因为它使用相同的C#源生成JavaScript和汇编,同时使编译的汇编与JavaScript协作.我很好奇在设计这种性质的东西时,各种方法和理论概念是什么.
重要的是要认识到,编译器所做的一切就是获取源语言(在本例中为 C#),对其进行解析,以便编译器具有对它有意义的表示形式,而不是对人类有意义的表示形式(这是抽象语法树),然后执行目标语言的原生代码生成(msil 是在 .NET 运行时上运行的语言的目标)。
现在,如果 script# 代码转换为程序集并与其他 .NET 代码交互,则意味着该编译器必须生成 msil。script# 为此使用 csc.exe,它只是标准的 c# 编译器。现在要生成 javascript,它必须使用 c# 或 msil,解析它,并生成 javascript 发送到浏览器。文档说它有一个名为 ssc.exe 的自定义 c# -> js 编译器。
为了使客户端和服务器端的交互一致,它有一组用 .NET 编写但也编译为 JavaScript 的参考程序集。但这不是编译器特定的问题,这些引用程序集是 script# 运行时。不过,运行时可能是造成您所感知到的许多 script# 魔法的原因。