尼基尔·科塔里的 脚本# 很可能是我一段时间以来在 JavaScript 领域看到的最令人惊奇的概念之一。这个问题与 JavaScript 无关,而是与 .NET 运行时中的语言编译有关。

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

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

--

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

有帮助吗?

解决方案

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

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

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

其他提示

假设您想将 C# 编译为 Javascript。您问是否可以利用现有的 C# 编译器,而不是直接将 C# 编译为 Javascript,而是将 C# 编译器生成的 MSIL 转换为 Javascript?

当然,你可以这样做。一旦获得 MSIL 二进制文件,您就可以对其进行任何操作。

微软有一个研究项目叫做 沃尔特 其中,除其他外,它将 msil 编译为 JavaScript。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top