【问题标题】:Creating a Programming Language创建编程语言
【发布时间】:2013-02-25 16:58:14
【问题描述】:

我想知道专业程序员如何创建自己的编程语言。
他们是否只创建一个编译器来读取文本文件并从中生成可执行文件(考虑到没有语法错误等)?

我不打算创建自己的编程语言(我显然对此缺乏经验),我只是想知道他们是如何做到的。

【问题讨论】:

    标签: compiler-construction programming-languages


    【解决方案1】:

    如果您有兴趣,可以在 Udacity 上学习一门很棒的免费课程,它会给您一个好主意:https://www.udacity.com/course/cs262(编程语言 - 构建 Web 浏览器)。我的课程还没有完成一半,但我们已经学习了一些有趣的概念以及词法分析的基础。您可能认为 Web 浏览器与编程语言无关(我曾这样做过),但实际上,除了将代码编译为可执行形式之外,它们的作用几乎相同。他们都必须阅读、解析和 lex 代码,并根据语言规范对其进行解释。 JavaScript 也是一种非常强大的语言,内置于每个现代浏览器中(许多其他“语言”现在也被浏览器解释)。

    再举一个例子,Python 的首次实现是用 C 编程语言实现的。这允许 python 程序使用 C 源代码。还有一个 Java 版本的 Python (jython) 可以与 Java 程序互操作。是什么让 Python Python(如果你忽略它的电池方面)是语言规范,其中包括什么是保留字,对象如何存储在内存中,什么样的表达式和控制结构是有效的,等等。 . 我的知识不足以开发像 Python 这样的“严肃”语言。但是有人必须用另一种语言来开发它。即使你确实有能力开发另一种语言,你也必须有一些特别的东西才能让它被广泛使用,因为有成千上万种编程语言,其中许多被认为是爱好语言(例如,有些语言被设计成这样他们的源代码将类似于莎士比亚戏剧或食谱)。

    【讨论】:

    • 谢谢!我现在看了一些视频,我认为这将有助于我理解它。首先我想“为什么要使用浏览器?我想学习/了解如何制作编程语言”,但后来我想了想,才意识到你所说的。
    【解决方案2】:

    您应该阅读编译器构造。一些主要领域包括:

    • 词法分析
    • 语法分析
    • 语义分析
    • 代码优化

    【讨论】:

    • 我认为前 3 点可以通过使用“无语法”的编程语言来省略,它允许开发人员直接定义程序结​​构,而不是基于分析的编译器。我自己也一直在尝试做类似的事情,但在编程方面我还很年轻。
    • 等等,您列出了代码优化,但既没有代码生成也没有解释?比如,让程序做任何事情的东西?
    • 我注意到了,但为什么要省略绝对重要的主题,而列出其他完全可选(有时甚至不适用)的部分?
    • @delnan - 我学习编译器构造的方法是使用我在回答中提到的技术。如果您不同意或对如何解决此问题有不同看法,请随时发布您自己的答案。
    【解决方案3】:

    大多数时候,当有人需要一种编程语言时,他们正在创建一种“特定领域的语言”。基本上,他们正在创建一种专门针对他们需要解决的问题而构建的编程语言。

    通常这些编程语言不会产生可执行代码。他们通常会分析程序并在内存中生成一个数据结构,该数据结构是程序的一种表示形式,以便于评估程序的语句。然后他们直接从该数据结构评估这些语句,而不是将该数据结构翻译成一系列汇编语言指令。

    执行此操作的编程语言称为“解释性”。并且有一些非常流行的编程语言属于这一类。用于此类语言的另一个术语是“脚本语言”。所有的脚本语言都是解释型的,但并不是所有的解释型语言都被称为脚本语言。

    产生“可执行”或 CPU 直接执行的一系列指令的策略称为“编译”。使用这种策略的语言被称为“编译”语言。 C 和 C++ 都是编译语言。

    一个有趣的事情是编译或解释只是不同的执行策略。可以制作 C 解释器,也可以编译 Python 程序。但是使用一种执行策略获得广泛接受的语言很少看到使用另一种执行策略的实现。

    因此,程序员为创建新的编程语言所做的最重要的事情是:

    1. 创建词法分析器和/或解析器。 (这是将一系列字符转换为代表程序的内部数据结构的部分。)
    2. 创建一个执行引擎来执行由数据结构表示的语句。

    通常选择特定领域语言的语法是为了使第一步非常容易。要么选择与现有语言非常接近的语法,以便程序员可以重用现有的解析器,要么专门选择语法以使语言非常易于解析。

    第二步通常相当简单,尽管某些语言特性可能会使事情变得非常复杂。

    【讨论】:

      【解决方案4】:

      我发现那里的许多资源太自下而上或太理论化,对于那些不想深入了解 LLVM、C 或汇编但仍喜欢从“零”开始编写编程语言(不使用解析器生成工具)。

      你可以看看我的系列教程Implementing a Programming Language in Swift

      我也喜欢这些资源,它们也非常适合初学者:

      【讨论】:

        猜你喜欢
        • 2011-04-20
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2013-04-23
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多