创建一种编程语言

6
我想知道专业程序员是如何创建他们自己的编程语言的。 他们是否只是创建一个编译器,读取文本文件并将其制作成可执行文件(假设没有语法错误等)? 我并不打算创建自己的编程语言(显然我太没有经验了),我只是想知道他们是如何做到的。
4个回答

4
如果您感兴趣,可以在Udacity上参加一门非常好的免费课程,它将为您提供一个很好的想法:https://www.udacity.com/course/cs262(编程语言-构建Web浏览器)。我还没有完成这门课程的一半,但我们已经学习了一些有趣的概念以及词法分析的基础知识。你可能认为Web浏览器与编程语言无关(我曾经这么认为),但实际上,它们做的事情几乎一样,除了将代码编译成可执行形式之外。它们都必须读取、解析和分析代码,并根据语言规范进行解释。JavaScript也是每个现代浏览器内置的一种相当强大的语言(许多其他“语言”现在也被浏览器解释)。
再举个例子,Python的最初实现是用C语言实现的。这使得Python程序可以利用C源代码。也有一个Java版本的Python(jython),可以与Java程序互操作。如果忽略了它的“电池包含”的方面,那么使Python成为Python的是语言规范,其中包括保留字、对象在内存中的存储方式、哪些表达式和控制结构是有效的等等。我绝不会像开发Python这样“严肃”的语言那样有足够的知识水平。但是,任何一个有能力开发另一种语言的人都必须用另一种语言来开发它。即使您有开发另一种语言的能力,要使其广泛使用,您也必须拥有某些特殊的东西,因为有成千上万种编程语言,其中许多被认为是业余爱好语言(例如,有些语言设计成源代码将类似于莎士比亚戏剧或食谱)。

谢谢!我现在看了几个视频,我觉得那会帮助我理解它。一开始我想,“为什么要用浏览器?我想学习/理解如何制作编程语言”,但后来我想了想,意识到你所说的话是对的。 - Normal People Scare Me

3

您应该学习编译器构建。一些主要领域包括:

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

我认为前三点可以通过选择“无语法”编程语言来省略,这种语言允许开发人员直接定义程序结构,而不是基于分析的编译器。我一直在尝试做类似的事情,但在编程方面我还很菜。 - dtech
1
等等,你列出了代码优化,但没有提到代码生成解释?也就是说,这些东西才能让程序真正执行起来? - user395760
我注意到了,但为什么要省略绝对重要的主题,而列出其他完全可选(有时甚至不适用)的部分呢? - user395760
@delnan - 我学习编译器构建的方式是使用我在答案中提到的技术。如果您不同意或对如何处理此事有不同的看法,请随时发布您自己的答案。 - Darren

2
大多数情况下,当有人需要一种编程语言时,他们正在创建一种“特定领域语言”。基本上,他们正在创建一种专门为解决问题而构建的编程语言。
通常,这些编程语言不会生成可执行代码。它们通常分析程序并生成一个内存中的数据结构,该数据结构是程序的表示形式,并排列成易于评估程序语句的方式。然后,它们直接从该数据结构中评估这些语句,而不是将该数据结构转换为一系列汇编语言指令。
这样做的编程语言称为“解释性语言”。有一些非常流行的编程语言属于这个类别。另一个用于此类语言的术语是“脚本语言”。所有脚本语言都是解释性的,但并非所有解释性语言都被称为脚本语言。
制作“可执行文件”或一系列CPU直接执行的指令的策略称为“编译”。使用此策略的语言称为“编译语言”。C和C ++都是编译语言。
有趣的是,编译或解释只是不同的执行策略。可以制作C解释器,并且可以编译Python程序。但是,使用一种执行策略广泛接受的语言很少看到使用另一种执行策略的实现。
因此,程序员创建新编程语言时最重要的事情是:
1. 创建词法分析器和/或解析器。(这是将一系列字符转换为表示程序的内部数据结构的部分。) 2. 创建执行引擎,执行由数据结构表示的语句。
通常,特定领域语言的语法被选择为使第一步变得非常容易。可以选择非常接近现有语言的语法,以便程序员可以重用已经存在的解析器,或者选择具有非常易于解析的语法,以使语言非常易于解析。
第二步通常相当简单,尽管某些语言功能可能会极大地复杂化事情。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接