- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在大学里修了一个编译器类(class),内容非常丰富,很有趣,尽管也很多工作。既然给了我们要实现的语言规范,所以我学不到的一件事就是语言设计。我现在正在考虑创建一种有趣的简单玩具语言,以便我可以玩耍并尝试不同的语言设计原则。
到目前为止,我还没有决定的一件事就是我希望编译器输出哪种语言或格式。理想情况下,我想为虚拟机输出字节码,该虚拟机易于使用并且还具有一些调试功能(例如,能够暂停执行并随时查看堆栈)。不过,我还很喜欢。为了让您大致了解我要寻找的东西,以下是我考虑过的一些选项,以及它们在我看来的优缺点:
最佳答案
这实际上取决于您要构建的语言的完整程度以及您要使用的语言。如果您想为与其他语言交互的真实项目创建一种成熟的语言,则比起只想尝试编译特定语言功能的复杂性,您的需求将要大得多。
输出到汇编语言文件是一种流行的选择。您可以使用程序中的实际代码注释汇编语言文件(在注释中)。这样,您可以准确地看到编译器对每种语言构造所做的工作。可能(自从我使用这些工具以来已经很长时间了)以一种使源代码级调试成为可能的方式来注释ASM文件。
如果您打算从事语言设计,那么几乎可以肯定您需要了解x86汇编语言。因此,您花费在学习上的时间不会浪费。而且,CISC指令集确实不是问题。如果您已经使用了某种其他汇编语言(看来您已经使用过),那么您将需要花费几个小时的时间来了解寄存器和不同的寻址模式,并且可能需要不到一周的时间才能精通某些语言。
输出JVM,lua或.NET的字节码是另一种合理的方法,尽管这样做会使您自己依赖于VM所做的假设。而且,正如您所说,这将需要对VM的详细了解。任何流行的VM都有可能具有您所需的功能,因此选择实际上只是优先考虑的问题,而不是功能。
LLVM是一个不错的选择。它功能强大并且越来越受欢迎。如果输出LLVM IR,则您更有可能与他人的代码进行交互,并使其与您的代码进行交互。如果您希望在编译器或语言设计领域找到一份工作,那么一定要知道LLVM的工作原理。
我不建议您设计和实现自己的虚拟机,然后再获得其他VM的更多经验,以便您可以看到并了解它们在实现过程中所进行的权衡。如果走这条路,您将最终学习JVM,lua,.NET和许多其他VM。我并不是说不这样做,而是这样做会使您脱离探索语言设计的既定目标。
知识很少是无用的。无论您决定使用什么,都需要学习新知识。这就是全部。但是,如果您要专注于语言设计,请选择需要最少工作量的输出格式,而不是专门设计语言。当然,与功能一致。
在您的选择中,我认为您的大学的虚拟机已退出。我要说的是,设计自己的VM也已完成。在其他三个中,我可能会选择LLVM。但是后来,我对x86汇编非常熟悉,因此学习LLVM的想法颇具吸引力。
关于assembly - 玩具编译器的输出语言/格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473824/
我不会说谎。这是一道作业题。但是,就我而言,积分已经消失了。现在,我只是在寻找答案,因为我-认为-我可能疯了。 这个程序的目标是执行命令ps -A | grep(输入字符串) | wc -l 以类似于
我有兴趣编写玩具 DVCS。 要研究的最小 DVCS 是什么? (我不需要 ssl、ssh、svn 兼容性等......它应该能够做本地存储库) 最佳答案 Git 的实际核心相当小。不幸的是,它不是用
近年来,低代码平台非常火,尤其是Mendix和Outsystems的收购及融资后,很多人越来越相信,低代码平台或将成为继云计算之后,又一个千亿级赛道。 什么是低代码平台 那么什么是低代码平台
我是一名优秀的程序员,十分优秀!