12

这个问题与

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

我还拥有乐高 RCX 和 NXT,但大多数时候我从未真正让我的机器人做任何事情,因为它们具有限制性的可视化编程环境。

我想我会为 NXT 设计我的编程语言,因为已经有大量的通用语言,而 NXT 给了我一组具体的问题和目标,并希望有一个不错的沙盒可供使用。

怎么办?我从哪说起呢?我需要知道什么?

如果可能的话,我会用 Python 或 Clojure 编写编译器。NXT有一个SDK ,也有一个汇编语言。什么是最好/最简单的路线?

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

4 回答 4

22

怎么办?我从哪说起呢?我需要知道什么?

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

在学习了几种语言之后,买一本关于编译器的书。有许多。谷歌会提供帮助。你买哪一个都没关系。你需要几个。看很多书没问题。

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

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

  2. 一旦你有了真正有效的运行时库。 真的完全工作。完全。您可以考虑语法和词法扫描和编译。这些都是难题,但还不如让你的运行时库正常工作的一半。

玩弄语法(即,特定领域的语言)是一种有吸引力的麻烦。许多人有“改进”的语法,但没有可用的运行时库。所以他们的“语言”是不完整的,因为它什么也没

让你的语言先做某事。

于 2010-10-25T12:07:35.573 回答
5

不要害怕编写编译器,它可以编译为现有语言,而不是目标代码。例如,轻量级 C++ 是一个 C++ -> C 编译器基于这个想法(虽然,C++ 在某处做同样的工作): http: //linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/ 331414

如果您对如何改进编程有一个小而精明的想法,这是一种快速获胜的方法。

搜索引擎也有类似的情况。如果我说我可以比 Google 做得更好,也许我可以使用 Google mashup 来做到这一点,它重新组织了 Google 的结果集,而且我不需要购买 343 Zigabytes 的存储空间来设置第二个 Google 只是为了改变结果数从 10 到 15。(不幸的是,如果我有不同的排名或爬取想法,它就不起作用。)

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

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

我们应该打破 1-step (source->executable) 和 0-step (source script 是可执行文件) 编译语言;3-4级很容易概括,而且——如果我们做得对——它可以使开发更有效。

于 2010-11-01T22:42:22.433 回答
4

最简单的方法是使用连接编程语言,例如ForthFactor或您自己设计的一种。

Forth 解释器非常容易实现,不需要占用超过几个 KB;对乐高设备很重要。您需要了解 Forth 解释器是如何工作的。例如,在Starting Forth的第 9 章中对此进行了介绍。

于 2010-10-25T15:34:36.000 回答
4

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

Clojure 的作者推荐跟随 Christian Queinnec 的书“lisp in small Pieces”。Clojure 阅读清单涵盖了许多涉及 Clojure 语言设计的书籍。

于 2010-10-26T18:42:15.393 回答