有没有办法将JAVA代码转换为汇编语言(机器语言)。因此它可以在IC上刻录(如微控制器8051或其他)

时间:2015-02-12 12:49:17

标签: java assembly microcontroller x86-16 8051

有没有办法将JAVA代码转换为汇编语言(机器语言)。因此它可以在IC上刻录(如微控制器8051或其他)。

3 个答案:

答案 0 :(得分:3)

构建编译器主要是出汗。但是8051具有非常小的地址空间,通常是4K字节的ROM和仅128字节的RAM。 这意味着一个实用的编译器必须有许多限制才能使它接近可行,更不用说实用或有吸引力了。

首先,ROM空间会大大限制任何Java程序的大小; JDK的几乎所有东西都不适合。你不能拥有大部分List或String甚至Object; toString可能是一种无法承受的奢侈品。您的数据类型几乎肯定限于8位整数; 32位和64位整数可能完全不切实际。 IEEE浮点是不可能的,因为它需要代码空间来支持它;你可以实现一个更简单的格式浮点,但它需要一大块ROM(我在许多小处理器上编码浮点)。 你不能拥有很多物品;没有足够的空间。更糟糕的是,你可能无法动态分配它们,因为访问它们所需的内存空间(基于指针+ offet),所以" new"必须以非常严格的方式取缔或对待。垃圾收集是完全不切实际的。因此,程序使用的对象可能必须“神奇地”#34;程序启动时存在。如何指定? (也许main包含所有" new"调用,它们是静态编译的,但即使这样也可能会花费宝贵的代码空间更好地花在其他东西上。

一个非常严重的问题是Java没有用户级I / O.程序如何与硬件通信?一个笨重的答案是创建一个覆盖所有专用寄存器的巨型对象,因此可以将它们作为字段值进行访问。这相当违反了Java语言设计,因为只有程序读取或写入才会改变字段,但特殊功能寄存器可能因硬件条件而改变。因此,这个解决方案会将语言改为不完全Java。

8051最佳功能之一是位寻址。 Java没有进行位寻址;它最多只能解决字节问题。所以你要么失去了(你的程序在空间中爆炸),要么添加有趣的运算符来模拟位寻址。再说一次,不是非常Java。

投掷和捕获动态错误对象可能是不可能的。如果强制错误对象被静态分配,则可以使其工作。

大多数微控制器最终会控制几个I / O点,这可能是异步的。你无法使用Java任务。你可以诉诸民意调查;这并不比通常在许多简单的微控制器程序上编码的情况差很多。 8051可以处理中断;在Java程序中没有标准的方法来设置它。您可以使用语言来添加中断关键字;回到不那么java。

可能会完成构建具有所有这些限制的编译器。剩下的语言类似于Java,但不允许人们编写任何传统的Java程序,因此不清楚实际的好处是什么。传统的Java程序员必须重新学习如何在这个语言中进行编码。

它似乎没有任何积极的好处。

如果您坚持使用编译器,我认为您最好使用C compiler。其中一些编译器可以处理更多的ROM空间。使用他们的技术,您可以克服我上面讨论的空间限制的一些后果。但8051和大型记忆有点不相容; 8051的重点是便宜,便宜,便宜[因为它是单芯片形式]并且添加外部存储器会消除一些廉价。

对于复杂的程序,您可能需要回退到汇编程序,以便能够编写足够聪明的代码来窃取必要的代码和数据。有些机器最好在硬件附近编程。

答案 1 :(得分:1)

我强烈建议您阅读本文(仅3-4页):Byte code Interpreter for 8051 Microcontroller

答案 2 :(得分:0)

Java通常编译为“bytecodes”;字节码通常由Java虚拟机执行。在控制器上运行它们的一种方法是编写在控制器上运行的Java虚拟机;这是否可行取决于控制器的架构。它是否实用取决于它加上其他东西。

当然,可以将Java代码直接编译为汇编语言,假设目标处理器的体系结构支持字节码中包含的操作。一个人是否已经存在是一个单独的问题。