【问题标题】:How to go about making your own programming language? [duplicate]如何着手制作自己的编程语言? [复制]
【发布时间】:2011-04-18 03:06:55
【问题描述】:

可能重复:
Learning to write a compiler

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

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

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

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

【问题讨论】:

  • 我不确定你是否会通过编写编译器学到很多关于操作系统的知识......
  • 谢谢我没有看到另一个问题,当我搜索时它没有出现在 Google 或 SO 上。很多不错的回复!
  • 我在不涉及汇编或二进制的情况下构建了一种编程语言。 github.com/struixLang

标签: programming-languages


【解决方案1】:

我想说,在您开始之前,您可能想看看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。教授非常正确地指出,这个答案很多关于解析器的内容,但对其他所有内容都很轻。如果您想更好地了解如何创建编程语言,我真的建议您观看课程视频和练习。

【讨论】:

  • 谢谢,非常有见地的帖子!我肯定会查找所有内容,很棒的帖子!
  • 感谢您将此标记为正确答案。当我把所有的东西都打出来的时候,别人的答案已经被标记为正确了。这是我在此网站上发布的第一个被接受的答案。
  • (因为最终必须有人指出......)这个答案在youtube.com/watch?v=3N__tvmZrzc获得了一定程度的(in?)famy
  • 我在 2012 年在线学习了该课程,并认为这是一门很棒的课程。 :)
【解决方案2】:

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

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

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

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

我个人强烈会考虑以 JVM 或 .NET 为目标,因为这样您就可以免费获得很多“安全”,以及您的语言可以使用的大量库。 (很明显,原生代码也有很多库,但我怀疑正确实现它们之间的互操作性可能会比较棘手。)

我认为您没有理由特别想用 C 语言编写编译器(或系统的其他部分),特别是如果它仅用于教育目的(因此您不需要每秒 1 亿行的编译器)。您个人最擅长哪种语言?

【讨论】:

  • 我可以用 C 和 C++ 编写代码。不过我更喜欢C。我主要想了解一个非常低的层次,了解编译器是如何工作的,生成可执行文件,将代码加载到内存中并执行。我最终想用我自己的小系统/用户程序制作我自己的微型操作系统。我不打算大规模地做任何事情,但非常非常少。我将主要在 Linux 中工作,并希望在大多数 *nix 系统上使用该语言。
【解决方案3】:

看看ANTLR。它是一个很棒的编译器-编译器,您可以使用它来构建一种语言的解析器。

构建一门语言基本上是定义一个语法并为这个语法添加产生式规则。手工操作并非易事,但一个好的编译器-编译器会对您有很大帮助。

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

构建特定领域的语言是一项需要掌握的有用技能。领域特定语言通常不是功能齐全的编程语言,而是通常用为项目量身定制的定制语言制定的业务规则。也看看那个话题。

【讨论】:

  • 谢谢,我找到了这本书,ANTLR 看起来很有趣,而且省时。
  • 如果你想深入研究解析器和/或 ANTLR,我可以推荐 Terence Parr 的书。他非常擅长使解析器编写的困难主题变得易于理解。
【解决方案4】:

网上有各种教程如Write Yourself a Scheme in 48 hrs

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

【讨论】:

  • 第一个链接坏了。
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2011-04-09
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2014-11-17
相关资源
最近更新 更多