这几天如何创建语言?

Mik*_*ike 9 compiler-construction programming-languages language-design

我需要开始编写我一直想编写的编程语言.这些天你们小孩怎么做?我已经离开了十多年了; 你现在以不同于我们之前在互联网之前,窗前的日子做的事情吗?你知道吗,当"真正的"编码器用C编码时,使用命令行,并对哪个shell优于什么狡辩?

只是为了澄清,我的意思是,你不是如何设计一种语言(我可以相当容易地弄清楚)但是你如何构建编译器和标准库等等?这些天你小孩用什么工具?

ito*_*son 7

打孔卡时代以来的一个新考虑因素是虚拟机的存在已经丰富地提供了"标准库".针对JVM或.NET CLR而不是"语言围墙花园",可以为您节省大量的时间.如果你正在创建一个编译语言,你也可能会发现Java字节代码或MSIL比机器代码更容易编译目标(当然,如果你是为了创建一个紧密优化编译器的乐趣那么你会看到这个作为一个错误而不是一个功能).

从消极方面来说,JVM或CLR的习语可能不是您想要的语言.因此,您最终可能只是为了在平台设施上提供惯用接口而构建"标准库".(一个例子是,每种语言及其狗似乎都提供了自己的方法来写入控制台,而不是让用户手动调用System.out.println或Console.WriteLine.)尽管如此,它还能实现惯用语的增量开发.库,意味着即使是以丑陋的方式,仍然可以访问更难以理解的构建惯用接口的库.

如果您正在考虑解释语言,.NET还支持通过动态语言运行时(DLR)进行有效解释.(我不知道是否有JVM的等价物.)这应该有助于让你专注于语言设计,而不必过多担心解释器的优化.


Dav*_*haw 6

我现在已经在Haskell中编写了两个编译器,用于特定于域的特定语言,并且发现它是一种非常高效的体验.该秒差距库使得与语法容易打,并解释是写在Haskell的数据结构非常简单.有一个关于在Haskell编写Lisp解释器的描述,我发现它很有帮助.

如果您对高性能后端感兴趣,我建议使用LLVM.它有一个简洁优雅的字节码和最好的x86/amd64生成后端,你可以找到.有一个可选的垃圾收集器,以及一些针对JVM和CLR的实验后端.

您可以使用生成LLVM字节码的任何语言编写编译器.如果您有足够的冒险精神来学习Haskell但需要LLVM,那么就有一组Haskell-LLVM绑定.


Kev*_*ose 2

我很确定你会做一直以来都在做的事情。

编写一些代码,并向世界展示您的结果。

与以前相比,有一些工具可以让您的工作变得更轻松。我可以建议ANTLR来解析你的语言语法吗?