【问题标题】:How can I write a JavaScript compiler for Arduino or similar microcontroller? [closed]如何为 Arduino 或类似的微控制器编写 JavaScript 编译器? [关闭]
【发布时间】:2014-05-20 16:10:11
【问题描述】:

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

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

我还想用 Arduino 做其他几件事,但坦率地说,C/C++ 不是我最擅长的语言,我不想花有限的业余时间阅读 C 方面的书籍。

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

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

【问题讨论】:

  • @aglasser--谢谢。我已经知道该链接,但它正在讨论一种解释情况,即 Arduino 必须连接到 PC。 JavaScript 实际上并未在设备上编译和运行。
  • @T.J.Crowder--足够公平和好点。我想这就是我问这个问题开始的原因。
  • @MatthewPatrickCashatt,您是否考虑过像V8 这样的解决方案? code.google.com/p/v8
  • @MahonriMoriancumer--谢谢,但我不想在微控制器上运行 JavaScript 解释器。相反,我只希望能够用 JavaScript 编写代码,然后将其编译成与最初用 C 编写的机器语言相同的机器语言。

标签: javascript c compiler-construction arduino microcontroller


【解决方案1】:

这是一个很大的问题,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 开始,因为它可能仍然是学习如何编写编译器的最佳资源。

【讨论】:

  • 除了 JavaScript 到 C++,他还可以研究 JavaScript 到 LLVM 编译器(我认为 JXCore 正在努力)。但是我不确定 Arduino 是否有 LLVM 编译器。
  • 谢谢,我会得到那本书。一件事让我对你的帖子感到困惑;然而,硬件将很难运行最初用 JavaScript 编写的代码的断言。一旦编译,它会不会是与 C 语言完全相同的机器语言?这就是我所追求的:相同的机器代码,最初是用 JavaScript 而不是 C 编写的。
  • @AdamGent 有一个用于 AVR 的 LLVM 版本 (sourceforge.net/projects/avr-llvm) 虽然我不知道它的代码生成有多好。 JXCore 是重量级实现(IE 普通桌面),因此您必须做大量工作才能使其在低内存 16Mhz 环境中工作
  • @MatthewPatrickCashatt 我认为您没有考虑到 Javascript 的重量级。所有标准的 JavaScript 类,它是一种动态语言这一事实​​意味着每个运算符,而变量的使用意味着它需要在运行时进行检查,并进行转换(如果可能)。除非您实现静态类型或将语言限制为整数数学(这将需要额外的工作),否则每一行代码都会生成比等效的 C++ 更多的东西 老实说,如果你想工作,我会得到 Espruino 板在 JavaScript 中。他们已经完成了工作......
  • 好的,我明白你的意思了。我将得到 Espruino,但我担心它的可用性有限。它似乎只有一种格式,而有几十种 Arduino 配置。例如,我的一些较小的飞机只有 Arduino Micros 的空间,宽度约为 1.77 厘米。
【解决方案2】:

我想到了——我相信还有很多其他人——Arduino / 嵌入式生态系统将更加丰富,如果该语言用于 与它的接口是一个更常见的接口。 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 上使用的微控制器以外的微控制器生成代码。当然,有一些带有 arduino 屏蔽连接器的基于 arm 的板可以像 arduino 一样。现在,不幸的是,这需要 C++ 的一些实力才能实现。但可能是为该目标的另一个编译器尚未支持的语言制作编译器的更好途径之一。 gcc 也有钩子,但 gcc 内部比 llvm 混乱得多,随着时间的推移,两者都变得更加混乱,但目前一个使用的管道胶带和钢丝绳比另一个使用更多。 C 将比 C++ 更容易学习,并且您会发现对 C 的嵌入式支持要多得多,实际上您会发现对 C 的更多支持不仅仅是嵌入式。

简短的回答,谷歌,在线查找一些免费课程,和/或显示编译器基础知识的无数网页。寻找 lex/yacc 或 flex/bison 或 antlr 来帮助处理混乱的文本解析(或者直接自己做),但是你仍然需要做大量的工作来制作一个可用的编译器。为一门语言编写编译器比仅仅学习一门现有编译器的语言要大得多。所以如果目标是避免学习一门语言,这个解决方案是行不通的,如果目标是试图吸引喜欢你不想学习新语言的新观众,那么你必须学习一种语言,其他人不必这样做(如果您成功了),最终结果希望成为您真正想要自己使用的工具。

【讨论】:

  • 感谢您的回答,您的观点很好。
  • 不能告诉你我有多少次想发明一些东西,这样我就不必学习一门新语言了。并不是说它永远不会成功,但到目前为止它还没有......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2021-12-03
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多