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

时间:2010-10-25 11:55:28

标签: python programming-languages clojure forth nxt

这个问题与

有关

在过去的几年里,我一直在思考我喜欢的东西,而不喜欢我使用的语言。我一直想写自己的语言,但从未这样做过。

我同时拥有乐高RCX和NXT,但大部分时间我都没有让机器人做任何事情,因为他们的视觉编程环境比较严格。

我想我会为NXT设计我的编程语言,因为已经有很多通用语言,而NXT给了我一套具体的问题和目标,希望能有一个很好的沙盒。

现在怎样?我从哪里开始?我需要知道什么?

如果可能的话,我会用Python或Clojure编写编译器。有SDK for the NXT,但也有Assembly language。什么是最好/最简单的路线?

Lego 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 个答案:

答案 0 :(得分:22)

  

现在怎样?我从哪里开始?我需要知道什么?

首先学习更多编程语言。

学习了几种语言之后,买一本关于编译器的书。有许多。谷歌将提供帮助。你买哪一个都没关系。你需要几个。可以阅读很多书。

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

  1. 构建您需要的运行时库。用一些合适的语言(如C或Python等)实现它们。

  2. 一旦你有真正有用的运行时库。 真的完全工作。完全。您可以考虑语法和词汇扫描和编译。这些都是难题,但并不像让运行时库工作一样困难。

  3. 使用语法(即域特定语言)进行欺骗是一种极具吸引力的麻烦。许多人都有“改进”的语法,但没有可用的运行时库。所以他们的“语言”是不完整的,因为它不会任何事情。

    让你的语言先做点什么。

答案 1 :(得分:5)

不要害怕编写编译器,编译器编译现有语言,而不是编写目标代码。例如,Lightweight C ++是一个C ++ - &gt; C编译器基于这个想法(尽管如此,C ++在某处做了同样的工作):http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

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

搜索引擎也存在类似的情况。如果我说,我可以做得比谷歌好,也许我可以使用谷歌混搭,重组谷歌的结果集,我不需要购买343千兆字节的存储空间来设置第二个谷歌只是为了改变从10到15的结果数量。(不幸的是,如果我有不同的排名或抓取想法,它就不起作用。)

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

我们现在正致力于数据流引擎(参见Wikipedia:基于流程的编程,数据流编程)。我们开发了一种非常精简的新语言,它有3种指令类型(组件创建,参数设置,消息声明)和2种块类型(组件声明和实现)。它被编译为C ++代码,因此编译器很简单,结果很快。此外,有几种情况,我们的语言脚本是从配置生成的,或者更优雅,它支持元编程。

我们应该中断1步(source-&gt;可执行文件)和0步(源脚本是可执行文件)的complilation语言; 3-4级易于概述,而且 - 如果我们做得对 - 它可以使开发更有效。

答案 2 :(得分:4)

最简单的路线是使用concatenative programming language,例如ForthFactor或您自己的设计。

Forth解释器非常容易实现,不需要占用超过几KB;对乐高设备很重要。您需要了解Forth解释器的工作原理。例如,chapter 9 Starting Forth {/ 3}}涵盖了这一点

答案 3 :(得分:4)

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

Clojure的作者推荐使用Christian Queinnec撰写的“小片中的lisp”一书。 Clojure Reading list涵盖了许多包含Clojure语言设计的书籍。