如何设计和实现一种编程语言?

12 投票
4 回答
2703 浏览
提问于 2025-04-16 06:03

这个问题和以下内容有关:

过去几年我一直在思考我喜欢和不喜欢的编程语言。我一直想自己写一种语言,但一直没有行动。

我也有乐高的RCX和NXT,但大多数时候我并没有让我的机器人做什么,因为它们的可视化编程环境限制太多。

我想为NXT设计我的编程语言,因为已经有很多通用语言了,而NXT给了我一套具体的问题和目标,希望能有一个好的环境来进行实验。

那么,我该从哪里开始呢?我需要了解哪些知识?

如果可以的话,我想用Python或Clojure来写编译器。NXT有一个SDK,还有一个汇编语言。哪条路是最好的/最简单的?

乐高NXT有一个小屏幕,支持USB和蓝牙,拥有4个传感器接口(包括数字和模拟),3个输出接口,以及2个ARM处理器,一个主处理器和一个协处理器。http://mindstormsnxt.blogspot.com/2006/08/whats-inside-nxt-brick.html

编程NXT主要是处理数据和事件,所以某种单一数据流/反应式的风格似乎很合适。它还应该能很好地处理并行任务,所以我在考虑函数式编程。目前我也在考虑基于栈的方式。

在我脑海中,我已经在尝试统一这些概念,并考虑示例代码。我想用树而不是栈,功能性分支可以并行运行。举个例子:

# implicit main stack
5 5 +
# 10

# quoted branch or list
[1 -]
# 10 [1 -]

# eval list and recur until false
loop
# [9 8 7 6 5 4 3 2 1 0]

# define stack as a function
[1 = [1 8 motor] [1 0 motor] if] fn
# [9 8 7 6 5 4 3 2 1 0] <function>

# define function as a symbol
"handle-press" def
# [9 8 7 6 5 4 3 2 1 0]

# reactively loop over infinite lazy stack returned by sensor
# in a parallel branch
|4 sensor handle-press for|
# [9 8 7 6 5 4 3 2 1 0] [8 nil nil nil 8 ...]

显然,这个思路中还有很多漏洞,但我还是把这个粗略的构想发出来,希望能引发一些有帮助的回答和讨论。

4 个回答

5

别害怕去写一个编译器,那个编译器是把代码编译成现有的语言,而不是机器代码。比如,Lightweight C++就是一个把C++代码转成C代码的编译器,基于这个想法(虽然C++在某些地方也能做到这点):http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

如果你有一个小而聪明的点子来改善编程,这是一种快速获胜的方法。

搜索引擎也有类似的情况。如果我说我能做得比谷歌更好,或许我可以通过一个谷歌的组合来实现,这个组合重新组织谷歌的结果集,我就不需要花费巨额的存储空间去建立一个新的谷歌,只是为了把结果数量从10改成15。(不幸的是,如果我有不同的排名或抓取想法,这个方法就不行了。)

也许,Twitter是一个更好的例子。你可以利用Twitter的API来写自己的Twitter。(当然,前提是你的想法符合Twitter的基本模型。)

我们现在正在开发一个数据流引擎(可以查查维基百科上的流式编程、数据流编程)。我们开发了一种非常轻量的新语言,它有三种指令类型(组件创建、参数设置、消息声明),和两种块类型(组件声明和实现)。它会被编译成C++代码,所以编译器很简单,结果也很快。此外,还有几种情况,我们的语言脚本是从配置中生成的,或者更优雅地说,它支持元编程。

我们应该打破1步(源代码转可执行文件)和0步(源脚本就是可执行文件)的编译语言;3-4级的编译语言相对容易理解,如果我们做得对,它可以让开发变得更有效。

5

最简单的方法是使用一种叫做连接式编程语言的语言,比如ForthFactor,或者你自己设计的一种。

Forth解释器非常容易实现,而且只需要占用几KB的空间,这对乐高设备来说很重要。你需要了解Forth解释器是如何工作的。相关内容可以在《Starting Forth》的第9章中找到。

23

那接下来呢?我该从哪里开始?我需要知道些什么?

首先,学习更多的编程语言。

学会几种语言后,买一本关于编译器的书。有很多这样的书,谷歌一下就能找到。买哪一本都没关系,你可能需要几本。多读几本书是没问题的。

当你学会了编程语言并了解了编译器的知识后,可以做以下几件事:

  1. 构建你需要的运行时库。可以用一些合适的语言,比如C语言、Python或者其他的语言来实现。

  2. 一旦你有了真正有效的运行时库,真的有效,完全有效。然后你可以开始考虑语法、词法分析和编译这些内容。这些都是比较复杂的问题,但比起让你的运行时库正常工作要简单多了。

玩弄语法(也就是特定领域语言)可能会让人觉得很有趣,但这其实是个吸引人的陷阱。很多人“改进”了语法,却没有可用的运行时库。所以他们的“语言”是不完整的,因为它根本不做任何事情。

先让你的语言能做点事情吧。

撰写回答