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

时间:2010-09-28 06:10:45

标签: programming-languages

  

可能重复:
  Learning to write a compiler

我四处寻找有关编程语言开发的更多信息,但在网上找不到很多东西。我找到了一些教程视频,但对于文本指南,常见问题解答,建议等并不多。我真的很好奇如何构建自己的编程语言。这让我想问:

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

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

一个人从哪里开始?构建语法?构建编译器?需要什么技能?很多装配和理解操作系统?大多数编译器和语言都内置了哪些语言?我假设C.

4 个答案:

答案 0 :(得分:31)

我说在开始之前,您可能需要查看Dragon Book和/或Programming Language Pragmatics。这将使您了解编程语言理论。这些书涵盖了编译和解释,使您能够构建制作基本编程语言所需的所有工具。

我不知道你知道多少汇编语言,但除非你对汇编语言编程的某些方言感到满意,否则我建议你不要试图编写一个汇编成汇编代码的编译器,因为它非常有点挑战。你刚才提到你熟悉C和C ++,所以也许你可以编写一个编译器,编译成C或C ++,然后使用gcc / g ++或任何其他C / C ++编译器将代码转换为本机可执行文件。这就是Vala编程语言的作用(它将Vala语法转换为使用GObject库的C代码)。

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

您可以简单地生成语法并让FlexBison生成解析器和词法分析器。这非常有用,因为它允许您进行迭代开发以快速获得有效的编译器。

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

此外,如果您希望在编程语言编译器/扫描器/解析器构造中经常使用的模型有更好的基础,那么您应该获得一本关于计算模型的书。我建议Introduction to the Theory of Computation

您似乎也对获得对操作系统的理解表现出兴趣。我想说的是与编程语言设计分开的东西,应该单独进行。这本书Principles of Modern Operating Systems是一个很好的学习起点。您可以从创建shell的小项目开始,或编写模拟ls命令的程序,然后进入更低级别的事情,具体取决于您使用C语言进行系统调用的方式。

我希望能帮助你。

编辑:自从我写这个答案以来,我学到了很多东西。当我在那里看到这个答案时,我正在接受布朗大学提供的online course on programming languages。教授非常正确地指出,这个答案谈论了很多关于解析器的内容,但对其他所有内容都很清楚。如果您想更好地了解如何创建编程语言,我建议您阅读课程视频和练习。

答案 1 :(得分:6)

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

  • 你肯定希望它被编译吗?还有解释语言......或者你可以在执行时实现编译

  • 您希望目标平台是什么?一些选择:

    • 本机代码(架构和操作系统?)
    • JVM
    • Regular .NET
    • .NET使用动态语言运行时(如IronRuby / IronPython)
    • Parrot

我个人强烈考虑定位JVM或.NET,因为那时你可以免费获得很多“安全”,以及你的语言可以使用的大量库。 (显然,使用本机代码也有很多库,但我怀疑它们之间的互操作性可能比较复杂。)

我认为没有理由为特别想要在C中编写编译器(或系统的其他部分),特别是如果它仅用于教育目的(因此您不需要1亿行第二编译器。你个人最有效的语言是什么语言?

答案 2 :(得分:5)

看看ANTLR。它是一个非常棒的编译器编译器,用于构建语言的解析器。

构建语言基本上是关于定义语法并将生成规则添加到此语法中。手工完成这一点并非易事,但一个好的编译器编译器会对你有所帮助。

你可能还想看看经典的“龙书”(一本关于编辑器的书,其中有一个骑士在头版上杀死一条龙)。 (谷歌)。

构建特定于域的语言是一项非常有用的技能。领域特定语言通常不是全功能的编程语言,但通常是为项目定制的定制语言制定的业务规则。也看看那个话题。

答案 3 :(得分:3)

在线提供各种教程,例如Write Yourself a Scheme in 48 hrs

启动的一个地方'可能是“嵌入式域特定语言”(EDSL)。这种语言实际上是在另一个环境中运行的,但是您创建了特别适合您想要使用的主题(域)的关键字,运算符等。