7

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

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

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

--

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

4

3 回答 3

2

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

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

为了使客户端和服务器端的交互保持一致,它具有一组用 .NET 编写但也编译为 javascript 的参考程序集。不过,这不是编译器特定的问题,这些参考程序集是 script# 运行时。运行时可能负责您所感知的许多脚本# 魔法。

于 2008-09-30T22:47:14.340 回答
0

因此,假设您要将 C# 编译为 Javascript。您在问是否可以利用现有的 C# 编译器,所以不是直接将 C# 编译为 Javascript,而是实际上将 C# 编译器生成的 MSIL 转换为 Javascript?

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

于 2008-09-16T18:23:00.183 回答
0

微软有一个名为Volta的研究项目,其中包括将 msil 编译为 JavaScript。

一个开发人员工具集,用于使用现有和熟悉的工具、技术和模式构建多层 Web 应用程序。Volta 的声明式分层使开发人员能够将有关分发的架构决策推迟到最后可能的负责时刻。此外,由于跨多个层的共享编程模型,Volta 支持新的端到端分析和测试,以实现更高级别的应用程序性能、稳健性和可靠性。使用声明性层拆分,开发人员可以根据此分析数据细化架构决策。这节省了与手动重构相关的时间和成本。实际上,Volta 扩展了 .NET 平台,以进一步支持使用现有和熟悉的工具和技术开发软件+服务应用程序。

您将应用程序架构和构建为 .NET 客户端应用程序,在开发过程的后期分配在服务器层和客户端层上运行的应用程序部分。您可以将 Web 浏览器或 CLR 作为客户端,而 Volta 可以处理层拆分的复杂性。编译器为客户端层创建跨浏览器 JavaScript,为服务器层创建 Web 服务,以及所有通信、序列化、同步、安全和其他样板代码,以将这些层联系在一起。实际上,Volta 可以在多种环境中提供最佳体验,而无需定制应用程序。

于 2008-09-16T18:41:49.967 回答