2010-10-25 56 views
12

这个问题是关系到如何设计和实现编程语言?

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

我也同时拥有乐高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是要所有的有关处理数据和事件,所以某种monoiconic数据流的/无功风格似乎是适当的。它也应该处理并行任务,所以我在思考功能。我目前也在考虑基于堆栈。

在我的脑海,我已经在努力统一这些概念,并认为的示例代码。我正在考虑一个树而不是堆栈,其中功能分支可以并行运行。举个例子:

# 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 ...] 

有明显仍然张开在这背后的原因洞,但我无论如何张贴此草图引发一些有用的答案和讨论。

+0

[学习写一个编译器]的可能重复(http://stackoverflow.com/questions/1669/learning-to-write-a-compiler),http://stackoverflow.com/questions/453870/suggestions -for-writing-a-programming-language,http://stackoverflow.com/questions/426239/parsers-and-compilers-for-dummies-where-to-start?lq=1,http://stackoverflow.com /问题/ 365602 /创建你自己的语言? – nawfal 2014-07-23 07:31:09

回答

22

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

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

学习好几种语言之后,买一本关于编译器的书。有许多。 Google会提供帮助。你买哪一个并不重要。你需要几个。读很多书可以。

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

  1. 构建您所需的运行库。用C或Python等适当的语言来实现它们。

  2. 一旦你有运行时库真的有效。 真的完全工作。完全。你可以考虑语法和词法扫描和编译。这些都是很难解决的问题,但要让运行时库运行起来并不困难。

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

让你的语言先做事。

+0

如何编写自主语言?使用宿主语言的运行时间怎么样? – Pepijn 2011-05-11 11:20:38

+0

@Pepijn:“自主语言”?你的意思是像LISP或Forth这样的语言是自己编写的吗?你想知道什么?也许你应该打开另一个问题。首先,确定你想知道的**具体**事情。然后谷歌为那些事情。然后在这里提问以澄清任何令人困惑的事情。 – 2011-05-11 13:41:54

+0

您可以更多地评论“1.构建运行时库”。在我的脑海里,“运行时库”这个术语很广泛(可以是任何内置于语言中的)。你的意思是什么样的运行时库? – Halst 2011-10-16 21:35:10

4

乐趣书籍语言设计的!

的Clojure的作者建议书“口齿不清小件”,由基督教Queinnec以下。 Clojure Reading list涵盖了许多包含Clojure语言设计的书籍。

5

不要害怕编写一个编译器,编译为现有语言,而不是编译目标代码。例如,Lightweight C++是一个基于这个想法的C++ - > C编译器(尽管C++在某个地方的作用相同):http://linux.wareseeker.com/Programming/lightweight-c-1.3.2.zip/331414

如果你对如何改进编程有一个小巧的想法,一个快速胜出的方式。

搜索引擎也有类似的情况。如果我说,我可以比谷歌做得更好,也许我可以用谷歌mashup来重组谷歌的结果集,而且我不需要购买343千兆字节的存储空间来设置第二个Google来改变从10到15的结果数(可惜的是,它没有,如果我有不同的排名或爬行的思想工作。)

或许,Twitter是一个更好的例子。使用Twitter API编写您自己的Twitter。 (当然,只有当你的想法融入了Twitter的基本型号)

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

我们应该断绝1步骤(源 - >可执行文件)和0-步骤(源脚本是可执行)complilation语言; 3-4级很容易进行总览,如果我们做得对,它可以使开发更有效。

+0

有没有可以阅读您的数据流引擎的地方?它与数字硬件有某种关系吗?无论如何,这对我来说是一个有趣的话题。 – Halst 2011-10-16 21:38:59

+0

请参阅homeaut.com,并随时通过电子邮件发送您的问题 – ern0 2011-10-17 04:58:26