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章中有介绍。