如何为Arduino或类似的微控制器编写JavaScript编译器?

时间:2014-05-20 16:10:11

标签: javascript c compiler-construction arduino microcontroller

我意识到这个问题会引起一些人的注意,我意识到JavaScript传统上是一种解释性语言,请让我解释一下:

我是专门从事Web应用程序(特定于.NET堆栈)的软件工程师。作为一种爱好,我喜欢创建基于Arduino的组件运行的RC UAVs

我还想和Arduino做其他几件事,但坦率地说,C / C ++并不是我最强的语言,而且我不想花很少的空余时间在C上读书。

我发现 - 以及我确信的许多其他人 - 如果用于与之交互的语言更为常见,那么Arduino /嵌入式生态系统会更加丰富。 JavaScript对我来说似乎是一个很好的选择,因为大多数软件开发人员都知道它,并且在JavaScript世界中构建开源框架和插件的文化非常强大。

所以,回到我的第一个问题:如果我想能够在JavaScript中为我的Arduino编写和编译代码,我将如何开始?我当然正在设想一个开源项目,但我需要一些帮助来获得牵引力。我从来没有写过编译器,所以感谢任何帮助。

2 个答案:

答案 0 :(得分:10)

这是一个很好的问题,Arduino UNO,LEO等的微控制器是ATmega328p,它有32K闪存用于程序存储,2K RAM和2K EEPROM(用于持久存储)。这对于像Javascript这样的语言来说非常紧张。

现在有人写了一个Javascript compiler for the ATmega128,你可以在Arduino Mega中找到它,它有4K的RAM和更多的闪存。

如果你升级到Arduino DUE,Arduino Zero或Teensy 3.x--所有这些都是基于ARM的 - 那么你可以查看Espruino这是ARM的JavaScript版本,但是你仍然需要将它移植到Arduino硬件。

因此,如果您真正想要的是可以运行JavaScript的嵌入式主板,那么我只会看看Esprino主板本身。

最后,如果你仍然在为ATmega328p设置JavaScript,那么你应该考虑为JavaScript语言的一个子集编写一个JavaScript到C ++的翻译器。这样做的范围远远超出SO回复,因此我建议从着名的Dragon Book开始,因为它仍然可能是学习如何编写编译器的最佳资源。

答案 1 :(得分:2)

  

我发现 - 我相信其他许多人 - Arduino /   如果习惯的语言,嵌入式生态系统将更加丰富   与它的接口是一个更常见的。 JavaScript似乎很好   我的候选人,因为大多数软件开发人员都知道它和   构建开源框架和插件的文化非常强大   在JavaScript世界中。

C和asm是这些平台最常用的语言,这就是这些语言占主导地位的原因。

因为这些是首选语言,所以你基本上必须构建你的编译器来生成一个或另一个,这意味着你需要在一个或另一个中强大。基本上要完成这项任务,你需要做你不想做的事。

  

我不想在C上花有限的业余时间阅读书籍。

这是一项重大任务,值得一群人参与,所以如果你没有空闲时间,那就用C语言编写你的程序.Arduino环境为你做了很多动手,这是非常重要的。

  

相反,我只希望能够用JavaScript编写代码,   然后将其编译为与之相同的机器语言   它最初是用C语写的

这不大可能。获取执行相同任务的机器代码是如何工作但是通过其他编译器使用与其他语言相同的机器代码,仅适用于非常简单的程序,添加两个数字返回结果,这类事情。各种编译器上的相同C代码不会返回相同的机器代码,因此不希望不同编译器上的不同语言返回相同的代码。

编译器上有无数的网页和书籍。典型的方法是使用flex / bison或antlr生成解析器。这意味着学习另一种编程语言,你需要为解析器提供什么。至少对于lex / yacc或flex / bison,输出是一个非常强力的程序(你可以自己编写,但是非常繁琐)进行解析,然后生成你想要的任何内容,这样你就可以转换它两个数字分成两个,以某种形式的伪代码分配一个add和return结果。然后你必须以某种方式将其转换为机器代码(最简单的是输出组件然后组装它)。优化等是在这样一个资源有限的平台上取得成功的重要组成部分,这不仅仅是一个研究项目,而是需要多年的经验才能获得一半的体面。理想情况下,您希望输出一些语言,该语言具有针对该平台进行优化的编译器,因此这意味着C,这意味着如果您想在更短的时间内或更省力地将其关闭,则必须在C中获得强大。 / p>

到目前为止,您的最短路径是学习C语言,这是一种非常简单的编程语言。

正如有人提到的,LLVM在某些方面并不是一个糟糕的方式,它是一个非平凡的研究项目来添加一种语言,但你得到的是LLVM支持的目标的LLVM后端(avr如果我没记错的话,不是一个),ARM和MIPS是这样你可以使用你的llvm基础工具来生成除arduino上使用的微控制器之外的微控制器的代码。当然,有一些基于臂的板与arduino屏蔽连接器,可以像arduino一样。现在,这需要一些C ++的优势,不幸的是。但对于为该目标的另一个编译器尚未支持的语言编写编译器可能是更好的途径之一。 gcc也有钩子,但是gcc里面比llvm更加凌乱,随着时间的推移,两者都变得越来越混乱,但是目前使用更多的管道胶带和捞线。 C比C ++更容易学习,你会发现C语言的嵌入式支持要多得多,实际上你会发现对C的支持远远超过嵌入式。

简短回答,google,在网上找到一些免费课程,和/或显示编译器基础知识的无数网页。寻找lex / yacc或flex / bison或antlr来帮助解决凌乱的文本(或者直接自己动手),但是你仍然需要做大量的工作来制作一个可用的编译器。为一种语言编写编译器比仅仅学习一种现有编译器的语言要大得多。因此,如果目标是避免学习语言,那么这个解决方案就无法运作,如果目标是吸引喜欢你不想学习新语言的新观众,那么你必须学习一种语言,这样才能其他人不必(如果你成功了),最终的结果有望成为你真正想要自己使用的工具。