【问题标题】:How do I design and implement a programming language? [closed]如何设计和实现编程语言? [关闭]
【发布时间】:2011-04-30 04:19:30
【问题描述】:

这个问题与

有关

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

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

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

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

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

乐高 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 ...]

这背后的推理显然仍然存在漏洞,但我还是发布了这个粗略的草图,以引发一些有用的答案和讨论。

【问题讨论】:

标签: python programming-languages clojure forth nxt


【解决方案1】:

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

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

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

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

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

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

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

先用你的语言做某事。

【讨论】:

  • 写一个自托管语言怎么样?使用宿主语言的运行时怎么样?
  • @Pepijn:“自托管语言”?你的意思是像 LISP 或 Forth 这样的语言本身是编写的?你想知道什么?也许你应该提出另一个问题。首先,确定您想了解的具体事项。然后谷歌这些东西。然后在这里提问以澄清任何令人困惑的事情。
  • 您能否对“1. 构建运行时库”发表更多评论。在我的脑海中,“运行时库”这个词很宽泛(可以是语言中内置的任何东西)。您指的是哪种运行时库?
  • @Halst:“你的意思是什么类型的运行时库?”运行时库可以是语言中内置的任何东西。任何事物。第 1 步是先得到一些有用的东西,然后再修改语法。对于“作品”,您必须选择一个主题领域或领域或焦点或其他东西。重要的是要避免对编程语言将要做什么含糊其辞。选择一些东西 - 任何东西 - 并获得运行时支持并正常工作。
  • 如果不知道 IR 指令,就不可能进行 RT。中间表示自然会从 CT 和 DT 中分离出来。命令来自领域的概念/想法。如果您想要一种特定领域的语言,那么机器并不是现实。不要让机器设计语言。您想要进入用户头脑的领域和概念应该是命令。 IR 指令集应尽可能靠近命令,以获得最快的解释器。抱歉,我无法回答,Q 已关闭。
【解决方案2】:

不要害怕编写编译器,它可以编译为现有语言,而不是目标代码。例如,轻量级 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 级很容易概括,而且 - 如果我们做得对 - 它可以使开发更有效。

【讨论】:

  • 是否有地方可以阅读有关您的数据流引擎的信息?它与数字硬件有某种关系吗?无论如何,这对我来说是一个有趣的话题。
  • 访问 homeaut.com,并随时通过电子邮件发送您的问题
【解决方案3】:

最简单的方法是使用concatenative programming language,例如ForthFactor,或者您自己设计的一种。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 2010-11-04
      • 2010-11-23
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多