关于python:如何设计和实现编程语言?

How do I design and implement a programming language?

这个问题与

  • 关于奥尔德瓦克的这个问题
  • 关于这个问题

在过去的几年里,我一直在思考我喜欢和不喜欢的语言。我一直想写自己的语言,但从来没有写过。

我也拥有乐高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进行编程将涉及处理数据和事件,因此某种单一的数据流/反应式风格似乎是合适的。它还应该很好地处理并行任务,所以我认为它是实用的。我现在也在考虑基于堆栈的方法。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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 ...]

很明显,这背后的推理仍然存在漏洞,但我还是要发布这个草图来激发一些有用的答案和讨论。


Now what? Where do I start? What do I need to know?

从学习更多的编程语言开始。

学习了几种语言后,买一本关于编译器的书。有很多。谷歌将提供帮助。你买哪一个无关紧要。你需要几个。多看点书没关系。

一旦您学习了语言并阅读了编译器,请执行以下操作。

  • 构建所需的运行时库。用一些合适的语言实现它们,比如C或python之类的。

  • 一旦你有了真正有效的运行时库。真的很有效。完全地。您可以考虑语法和词汇扫描和编译。这些都是很难解决的问题,但并没有让运行时库工作的一半难。

  • 玩弄语法(即特定于领域的语言)是一个很有吸引力的麻烦。许多人已经"改进"了语法,但没有可用的运行时库。所以他们的"语言"是不完整的,因为它没有任何作用。

    先让你的语言做点什么。


    不要害怕编写编译器,它编译到现有的语言,而不是对象代码。例如,轻量级C++是一个C++ ->编译器基于这个想法(Ac强硬,C++在某个地方做同样的工作):HTTP:/Luux.WaSeErk.Co/CalpGue/Load Health-C-1.3.2.ZIP/31414

    如果你对如何改进编程有一个小而聪明的想法,那么这是一个快速胜利的方法。

    搜索引擎也有类似的情况。如果我说,我可以做的比谷歌更好,也许我可以做的谷歌mashup,它重新组织谷歌的结果集,我不需要购买343个zigabytes的存储来建立第二个谷歌,只是为了将结果数从10改为15。(不幸的是,如果我有不同的排名或爬行的想法,它就不起作用了。)

    也许,Twitter是一个更好的例子。使用Twitter API编写自己的Twitter。(当然,只有你的想法符合Twitter的基本模式。)

    我们现在正在开发一个数据流引擎(参见维基百科:基于流的编程,数据流编程)。我们开发了一种非常精简的新语言,它有3种指令类型(组件创建、参数设置、消息声明)和2种块类型(组件声明和实现)。它被编译成C++代码,编译器简单,结果是最优的快速。还有一些情况,当我们的语言脚本是由配置生成的,或者更优雅地说,它支持元编程。

    我们应该分离出1步(源代码->可执行代码)和0步(源代码脚本是可执行代码)的组合语言;3-4级很容易概述,如果我们做得对,它可以使开发更有效。


    阅读有关语言设计的有趣书籍!

    Clojure的作者建议遵循ChristianQueinnec的书《小口齿不清》。clojure阅读清单涵盖了许多包含clojure语言设计的书籍。


    最简单的方法是使用串联编程语言,如forth、factor或您自己设计的一种。

    第四个解释器非常容易实现,不需要占用超过几KB的空间;对于乐高设备很重要。你需要了解第四个口译员是如何工作的。例如,这一点在《开始》的第9章中有介绍。