如何制作自己的编程语言?

How to go about making your own programming language?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Learning to write a compiler

我环顾四周,试图找到更多关于编程语言开发的信息,但在网上找不到很多。我找到了一些教程视频,但没有太多的文本指南、常见问题解答、建议等。我真的很好奇如何构建自己的编程语言。我想问一下:

你怎么能做你自己的编程语言呢?

我想建立一种非常基础的语言。我不打算有一个非常好的语言,我也不认为它会被任何人使用。我只想用自己的语言来学习更多关于操作系统、编程的知识,并且在所有方面都变得更好。

从哪里开始?构建语法?构建编译器?需要什么技能?对操作系统有很多的组装和理解?大多数编译器和语言都内置哪些语言?我假设C。


我想说在你开始之前,你可能想看看龙书和/或编程语言语用学。这将为您奠定编程语言理论的基础。这些书涵盖了编译和解释,并将使您能够构建制作基本编程语言所需的所有工具。

我不知道你知道多少汇编语言,但是除非你对汇编语言编程的一些方言比较熟悉,否则我建议你不要试图编写一个编译成汇编代码的编译器,因为这是一个相当大的挑战。前面提到过,你对C和C++都很熟悉,所以也许你可以编写一个编译成C或C++的编译器,然后使用GCC/G++或任何其他C/C++编译器将代码转换成本地可执行文件。这就是Vala编程语言所做的(它将Vala语法转换为使用Gobject库的C代码)。

至于您可以用什么编写编译器,您有很多选项。你可以用C或C++手工编写,或者为了简化开发,你可以使用更高级的语言,这样你就可以专注于编译器的编写,而不仅仅是内存分配和在C.中使用字符串所需要的。

您可以简单地生成语法,让flex和bison生成语法分析器和词汇分析器。这真的很有用,因为它允许您进行迭代开发,以快速获得一个可工作的编译器。

另一个选择是使用antlr来生成解析器,这样做的好处是可以获得许多antlr可以编译的目标语言。我从来没有用过这个,但我听说过很多。

此外,如果您希望更好地了解编程语言编译器/扫描器/解析器构造中经常使用的模型,那么您应该获得一本关于计算模型的书。我建议你介绍一下计算理论。

您似乎还对了解操作系统表现出兴趣。我想说的是,这与编程语言设计是分离的,应该单独进行。《现代操作系统原理》是一个很好的学习起点。您可以从一些小项目开始,比如创建一个shell,或者编写一个模拟ls命令的程序,然后根据您如何使用c中的系统调用来进行更低级的操作。

希望这对你有帮助。

编辑:自从我写这个答案以来,我学到了很多东西。当我看到这个答案出现在网上时,我正在参加布朗大学提供的编程语言在线课程。教授非常正确地指出,这个答案涉及很多解析器,但对其他所有东西都很清楚。如果您想更好地了解如何创建编程语言,我建议您仔细阅读课程视频和练习。


这完全取决于您的编程语言将是什么样的。

  • 你确定要编译它吗?还有解释语言…或者可以在执行时实现编译

  • 你希望目标平台是什么?一些选项:

    • 本机代码(哪些架构和操作系统?)
    • JVM
    • 规则网
    • .NET使用动态语言运行时(如IronRuby/Ironpython)
    • 鹦鹉

就我个人而言,我会强烈考虑以jvm或.net为目标,因为这样你就可以免费获得大量的"安全性",以及你的语言可以使用的大量库。(显然,对于本机代码,也有很多库,但我怀疑正确地实现它们之间的互操作性可能更难。)

我看不出你为什么特别想用C语言编写一个编译器(或者系统的其他部分),特别是如果它只是为了教育目的(所以你不需要一个每秒1亿行的编译器)。你个人最擅长的语言是什么?


看看安特尔。它是一个很棒的编译器,你可以用它为一种语言构建一个解析器。

构建一种语言基本上就是定义一种语法,并向这种语法添加生产规则。手工操作并不是一件容易的事情,但是一个好的编译器会帮助你很多。

你可能还想看看经典的《龙书》(一本关于编纂者的书,在头版有一位骑士杀死了一条龙)。(谷歌IT)。

构建特定于领域的语言是一种需要掌握的有用技能。特定于域的语言通常不是全功能的编程语言,但通常是用为项目量身定制的自定义语言制定的业务规则。也可以看看那个主题。


网上有各种各样的教程,比如在48小时内给自己写一个计划。

可以从"嵌入式领域特定语言"(EDSL)开始。这是一种实际在另一种环境中运行的语言,但是您已经创建了关键字、运算符等,这些关键字、运算符等特别适合您要使用的主题(域)。