首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Arduino或类似的微控制器编写JavaScript编译器?

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

Stack Overflow用户
提问于 2014-05-21 00:10:11
回答 2查看 3.2K关注 0票数 3

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

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

我还想用Arduino做其他几件事,但坦率地说,C / C++不是我最强的语言,我不想把有限的业余时间花在阅读关于C语言的书上。

我和其他许多人都想到,如果与Arduino / embedded生态系统交互的语言更加通用,Arduino/embedded生态系统会更加丰富。对我来说,JavaScript似乎是一个很好的候选者,因为大多数软件开发人员都知道这一点,而且在JavaScript世界中,构建开源框架和插件的文化非常强大。

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

EN

回答 2

Stack Overflow用户

发布于 2014-05-21 00:29:51

这是一个相当高的要求,在Arduino UNO,LEO等中的微控制器是ATmega328p,它有32K的闪存用于程序存储,2K的RAM和2K的EEPROM (用于永久存储)。对于Javascript这样的语言来说,这是相当紧凑的。

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

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

因此,如果你真正想要的是一个可以运行JavaScript的嵌入式电路板,那么我只需要看看Esprino电路板本身。

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

票数 11
EN

Stack Overflow用户

发布于 2014-05-21 13:36:38

我和其他许多人都想到过,如果用来与Arduino / embedded生态系统交互的语言更加通用,它将变得更加丰富。对我来说,JavaScript似乎是一个很好的候选者,因为大多数软件开发人员都知道这一点,而且在JavaScript世界中,构建开源框架和插件的文化非常强大。

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

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

我不想把有限的业余时间花在C语言上看书。

这是一项重要的工作,值得一群人来做,所以如果你没有空闲时间,那就用C编写你的程序吧。Arduino环境为你做了如此多的手把手操作,以至于它是相当琐碎的。

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

这是不太可能的。获取执行相同任务的机器码是它的工作方式,但通过其他编译器获得与其他语言相同的机器码,只适用于非常简单的程序,将两个数字相加返回结果,诸如此类的事情。不同编译器上的相同C代码不会返回相同的机器代码,因此不同编译器上的不同语言不会返回相同的代码。

在编译器上有无数的网页和书籍。典型的方法是使用flex/bison或antlr来生成解析器。这意味着要学习另一种编程语言,即提供解析器所需的编程语言。至少对于lex/yacc或flex/bison来说,输出是一个非常暴力的程序(您可以自己编写,但是非常繁琐),它执行解析,然后生成您想要生成的任何内容,因此您可以将两个数字相加转换为两个分配,并以某种形式的伪代码分配一个相加和返回结果。然后,您必须以某种方式将其转换为机器码(最简单的方法是输出汇编,然后对其进行汇编)。优化等是它在这样一个资源有限的平台上取得成功的很大一部分,这不仅仅是一个研究项目,而且需要多年的经验才能达到一半的水平。理想情况下,您希望输出一些具有针对该平台优化的编译器的语言,因此这意味着C语言,这意味着如果您想在更短的时间或更少的工作中完成这项工作,您必须掌握强大的C语言。

到目前为止,你最短的路径就是学习C语言,它是一种非常容易的编程语言。

正如有人提到的,LLVM在某些方面不是一个糟糕的方法,它是一个添加语言的不平凡的研究项目,但你得到的是LLVM支持的目标的LLVM后端(如果我没记错的话,avr不是),ARM和MIPS是这样的,所以你可以使用你的llvm基础工具为微控制器生成代码,而不是那些在arduino上使用的代码。诚然,有一些基于arm的主板,带有arduino屏蔽连接器,可以像arduino一样。不幸的是,这需要C++中的一些力量才能实现。但这可能是为一种尚未被该目标的另一编译器支持的语言制作编译器的较好途径之一。gcc也有钩子,但gcc的内部远比llvm凌乱,随着时间的推移,两者都变得更加凌乱,但其中一个使用的管道胶带和钢丝比另一个更多。C将比C++更容易学习,你会发现更多对C的嵌入式支持,实际上你会发现更多对C的支持,而不仅仅是嵌入式。

简而言之,google,在网上找到一些免费的类,和/或无数显示编译器基础知识的网页。寻找lex/yacc、flex/bison或antlr来帮助进行杂乱的文本解析(或者直接自己做),但是您仍然需要做大量的工作才能制作一个可用的编译器。为一种语言编写编译器是一项比学习现有编译器的语言要大得多的任务。所以,如果你的目标是避免学习一门语言,这个解决方案是行不通的,如果你的目标是试图吸引像你一样不想学习一门新语言的新受众,那么你必须学习一种语言,这样其他人就不必学习了(如果你成功了),最终的结果希望是你真正想要使用的工具。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23764967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档