如何在编译器中包含汇编程序

How to include an assembler in a compiler

我目前正在参加一个编译器课程,并且已经在 JAVA 中成功构建了一个小型编译器,它接受一个文件作为输入并写入 NASM 输出。

然而,我想知道如果我决定分发我的编译器,我将如何用它打包一个汇编器?

我确定我不能要求最终用户先将代码编译为 NASM,确保 he/she 已安装 NASM,然后使用它来构建最终的可执行文件!

此外,由于我想针对几个不同的系统,为每个预期目标编写高效汇编器的想法显然是一项艰巨且耗时(更不用说看似不可能的任务)!

感谢您的帮助。

您可以 select 一个开源汇编程序并将其与您的编译器打包在一起。但是,请注意许可证,汇编程序的许可证可能还要求您在特定许可证下发布编译器。

当然这并不能解决你的第二个问题:如何让这个平台(或者至少CPU)独立。然后通过汇编语言(或直接到机器代码)不是要走的路。

一个解决方案可能是使用其他人的后端。 LLVM 目前有点 "hot"。在某种程度上,这是通过将 "platform independent assembly language" 发送到 LLVM 来实现的,然后 LLVM 会为您输出目标平台的目标代码。

来自 www.nasm.us/pub/nasm/releasebuilds/2.11.08 it seems that at least for Windows and Mac OS X platforms the NASM assembler can be deployed as simple portable applicationzip 文件。

您只需将 zip 文件与您的应用程序一起分发,并在需要时将适当的特定于平台的 zip 提取到一个临时目录中,并在后台 运行 该工具。


在采取行动之前需要进一步澄清的一些主题:

  • 如何使用Java创建临时目录?
  • 如何使用 Java 解压缩压缩文件?
  • 如何在不威胁用户的情况下将可执行文件标记为可执行文件(例如如何设置 chmod+x)?
  • 如何在 Java 中生成等待后台进程?
  • NASM 的再分发许可政策是什么?
  • NASM 是否有不常见的第 3 方依赖项也必须交付?
  • 如何编写跨平台Java代码以及如何进行多平台测试?
  • ...