【问题标题】:how to start writing a very simple programming language [duplicate]如何开始编写一种非常简单的编程语言[重复]
【发布时间】:2011-03-01 19:18:40
【问题描述】:

最近,我四处寻找有关今年夏天可以使用 C 构建什么的想法,结果发现了这篇文章:Interesting project to learn C?

实现一种编程语言。这 不必非常辛苦——我 做了不能用的语言 命名 - 但它会迫使你学习 C的很多重要部分。如果 您不想编写词法分析器和/或 自己解析,你可以使用 lex/flex 和 yacc/bison,但如果你打算 你可能想从一个 稍微小一点的项目。

我对实现编程语言的答案有点好奇,我想知道如何开始这个?我已经阅读了整本 K&R 的书,也做了一些练习。如果这很重要,我在 C++ 和 Java 方面也有一些经验。有小费吗?谢谢!

【问题讨论】:

标签: c programming-languages project


【解决方案1】:

嗯,我认为这样的事情真的很难做到,但它也是一个很棒的宠物项目。您应该对解析器、词法分析器、流控制、范式(命令式、函数式、OO)和许多其他东西有概念。

很多人说Dragon Book 是这方面最好的书之一。也许你可以看看它:)

祝你好运!

【讨论】:

  • 不要为“非常简单”的玩具项目推荐 Dragon book。只是不要。
  • @dmckee 如果是为了学习有什么问题?
  • 问题在于,提供一个以完全抽象形式编写的综合性——实际上是百科全书式的——参考作为教程是愚蠢的,而且适得其反。编译器是深奥而复杂的魔法,要做好,但它们很容易做到。龙书掩盖了这一事实。
  • @Markust:如果您正在研究有关编译器和编程语言的重度计算机科学理论,那么 Dragon 的书是一个很好的参考。这不是一本很棒的“入门”书。
  • @dmckee:我确实推荐小项目的龙书。没有理由忽视复杂性并假装它不存在。
【解决方案2】:

你可以阅读 Niklaus Wirth 的一些写得很好的论文:

  • “编译器构建”(here 提供)是对构建编译器艺术的简短介绍。
  • “算法 + 数据结构 = 程序”(很遗憾已绝版)在他的最后一章中介绍了一种更简单的语言(名为 PL/0)。

虽然这些论文主要是用 Pascal 编写的,但所公开的概念很容易翻译成 C。

【讨论】:

    【解决方案3】:

    了解正则表达式、语法和优秀的解析器生成器。

    即使您最终实现了自己的解析器,这些也是实现任何编程语言的基本概念。

    【讨论】:

      【解决方案4】:

      从一种非常简单的(玩具)语言开始;稍后您可以创建更复杂的语法。

      您可以编写一个解释器来解析字符串,例如,

      integer x
      integer y
      set x, 2
      set y, 5
      add x, y // x = x + y
      print x
      

      并立即评估每一行。如果将行存储在向量中,则使用goto 命令很容易实现循环。


      一个例子,Another World(复古游戏)
      脚本编辑器:

      【讨论】:

      • 与其担心编译器将如何编写以及将使用什么工具,主要关注的是语言设计。在您的设计显而易见之前,没有任何有用的细节可供参考。我完全同意这个答案的概念。
      【解决方案5】:

      另一种选择是构建一种语言而不看其他任何东西。弄清楚你可以轻松做什么,然后从那里开始。例如,您可以将表达式解析为标记列表,用空格分隔,并使用前缀表示法(这很容易处理)。这种事情很有趣,你可以从实验中学到很多东西。

      【讨论】:

      • 实验可以很好。我想说不要进行实验,并且一定要在你自己诚实地解决问题之后查找你遇到的问题的答案,无论你是否设法解决了这些问题。然而,完全非结构化的实验(四处游荡)并不是非常有用
      【解决方案6】:

      如果您会说法语,您可能会对我同事的一门课程感兴趣(免费提供) http://matthieuamiguet.ch/scientifique/enseignement/langages-et-compilateurs 虽然他使用 Python 来解释语言构造和编译的概念。

      来自 PyCon 2010 的英文 PDF http://matthieuamiguet.ch/assets/files/scientifique/publis/TeachingCompilersWithPython_Paper.pdf

      我可能需要和他谈谈将他的信息翻译成英文 8)

      【讨论】:

        【解决方案7】:

        我前段时间用 Java 做了一个简单的语言解析器,主要是评估数学表达式,替换常量和变量,并提供一些关于语法/类型错误的反馈。

        我发现做这种事情的最简单方法是创建一个parse tree。这可以通过使用两个堆栈轻松完成,一个运算符堆栈和一个结果堆栈。 之后你可以使用 DFS 递归解析它,如果你决定用面向对象的语言实现它,可以使用 visitor pattern

        关于这些事情有很多话要说,如果你愿意,我可以更深入地解释它们,我没有因为我认为你想尝试自己实现上述内容,但如果你这样做了,只要通知我,我们就可以谈谈。

        【讨论】:

          【解决方案8】:

          一个旧的编译器教程是this one。虽然它是在 Pascal 中,但它是一个非常好的信息来源。如果你想要更新的东西,你应该看看ANTLR

          【讨论】:

            【解决方案9】:

            为了简单起见,我建议实现一种简单的后缀语言。 FORTH 或 PostScript 的核心部分将是不错的选择。

            【讨论】:

              【解决方案10】:

              阅读 usenet 新闻组 comp.compilers 上的帖子,它可以通过 Google 组访问。它有许多与构建语言、构建编译器、lex/yacc、语法等相关的讨论。当然,您必须熟悉诸如龙之书,虎之书等许多有关编译器的书籍以及有关算法和数据结构的好书。

              The Original C Compiler 被赋予了新的生命。大部分都在重写,它的代码库小到可以在暑假里阅读和理解。考虑阅读代码以及用于编写此编译器或任何工作编译器的代码的论文,我相信您会对从哪里开始等有所了解。

              【讨论】:

              • 注意:PCC 并不是第一个 C 编译器。
              【解决方案11】:

              Scheme from Scratch 是一系列关于在 C 中实现 Scheme 的精彩博客文章。代码可读性很强,每个版本都以易于理解的方式构建在前一个版本之上。

              这是第一部分:v0.1 - Integers

              【讨论】:

              • 找不到页面!
              • 请更新链接
              【解决方案12】:

              我会从一个简单的桌面计算器程序开始,它可以读取如下内容:

              5 + 10 * 3

              并打印答案。然后你可以继续添加变量、控制流,甚至函数。

              【讨论】:

              【解决方案13】:

              让其他人为你做脏活,即词法分析器和解析器。使用 cup、yacc 或 bison 来处理语法。这将使您专注于更重要的语言设计决策。甚至还有许多语言的示例解析器定义,您可以将其用作您自己的模板。

              【讨论】:

                【解决方案14】:

                我只能说,我看到很多人问诸如“我如何制作编程语言?”之类的问题。或者“制作一门编程语言有多难”,大多数答案只是告诉他们,你必须经历多年的大学生活并阅读 1000 页长的书籍。我在这里告诉大家,您可以发布这些答案,但这对他们制作编程语言的旅程毫无帮助。我今年 16 岁,从事编程工作近 2 年,我编写编程语言。面向对象的也相当先进,但我没有读过任何书,也没有读过 8 年的大学。为了让人们开始,这里有一个用 C# 编写的简单编程语言:

                string code = "print Hello World";
                foreach (string a in code.Split('\n'))
                {
                    if (a.StartsWith("print "))
                    {
                        Console.WriteLine(a.Substring(6));
                    }
                }
                

                任何了解基本 C# 的人都应该能够理解这一点。如果没有一些编程经验,你就无法开始制作编程语言。确保你学习了一门编程语言并确保你对它有很多了解,然后开始编写简单的小代码,就像我已经发布的那样,通过实验和实践,你将开始编写一些复杂的编程语言时间:)

                【讨论】:

                • 嘿,我 15 岁(不久前是 14 岁)。我还创建了 JavaScript 和 Lua 解释器。这种方法的问题在于它是非常静态的。我建议人们首先了解 Lexers、Parser 和(可选)AST。然而,这很好地证明了有多少种不同的方法可以制作一种语言。在我(有限的)经验中,当您了解这些概念时,它们会简单得多,即让 Lexer 听起来很困难,但通常您可以将其简化为核心概念。
                • 这是一个转译器...
                • 我非常喜欢你的方法。
                猜你喜欢
                • 2011-03-01
                • 2014-02-11
                • 1970-01-01
                • 1970-01-01
                • 2012-07-22
                • 2011-07-16
                • 1970-01-01
                • 1970-01-01
                • 2011-03-18
                相关资源
                最近更新 更多