有可能用JACK编写一个HACK汇编程序吗



我现在正在学习nand2tetris课程,目前正在用Lua编写汇编程序。我知道稍后我们将编写一个JACK编译器。

完成课程后,我有了一台带有操作系统和虚拟机的HACK计算机,我可以在JACK中制作一个HACK汇编程序,然后将该程序编译成汇编程序,再自行编译吗
这种形式的靴子捆扎可能吗,还是我飞得离太阳太近了?

汇编程序或编译器自托管并不罕见,即能够自行编译。是的,您可以从手工编写的机器代码开始引导到这一点。请参阅第一批汇编程序是用机器代码编写的吗关于软件再造。SE re:引导工具链。

例如,GCC和clang/LLVM都是自托管的,即它们是用C或C++编写的,这些项目的C编译器部分可以编译自己的源代码。

是的,他们称之为";自举;当你从一些随机的C编译器开始,它可以针对你想要的平台,并用它来编译GCC。然后,您可以使用该GCC为同一平台进行GCC的优化构建,从而降低编译时间。因此,任何需要GNU C扩展的GCC内部特性或优化都可以启用(如果它是用ISO C编译器构建的(。

假设JACK接近图灵完备,那么你可以在其中编写任意程序来读取文本文件和编写二进制文件,这是没有问题的。


还相关:新家用计算机平台的第一个汇编程序是如何编写的on retrocomputing描述了大多数8位微型计算机的工具链是如何在其他机器上启动的,通常是Gates和Allen等有进取心的同事可以访问的大学小型计算机或大型机,或者任何其他可以输出到ROM编程格式的系统,只要有一些硬件黑客攻击。或者像沃兹尼亚克对苹果6502机器代码所做的那样,用十六进制手工操作。

进一步的自举相关的逆向计算Q&As:

  • 口译员是如何加载到计算机中的
  • 这是什么;"开关寄存器-显示";它是用来干什么的-早期电脑的前面板开关。通常用作自举";bootloader";其可以加载操作系统,例如穿孔卡读取器的驱动程序。在没有电传打字机终端的系统上,程序运行后可能会输入数据
  • 一个平台编程过的最基本的输入法是什么尽管大多数答案甚至更为原始,但半永久性地硬连接整个程序,而不仅仅是引导程序

值得思考的是:一个编译自己的编译器为恶意版本打开了一个有趣的漏洞,让它在编译器中隐藏一些代码,通过识别自己何时编译并发出机器代码来将自己传播到未来的版本。我们不认为GCC/clang或其他自托管编译器的任何当前二进制发行版都有这种情况,但从经审计的源代码重建还不足以验证。wiki.c2.com的一篇文章提供了更多信息,包括2009年在Delphi 4到7中发现的信息。

这个想法最初是由Ken Thompson在1984年的文章《关于信任的思考》中提出的,作为一种假设的可能性。(包括yacc和lex以及链接器,作为工具链的一部分。(另请参阅https://security.stackexchange.com/questions/222072/are-compilers-safe

实际的安全考虑并不是我在这一节中要强调的重点:去阅读那篇文章,并采用他们描述编译器如何用于编译下一个版本的方法。这可能有助于你了解它是如何工作的。

(但关于安全问题,有一些关于安全的问答。SE和其他一些:一、二、三。最终,你必须相信一些东西,除非你徒手建造自己的CPU,从生沙开始。或者至少,自己制造光刻机和芯片布局;其他人可以做制备硅和掺杂材料的化学工作。(

最新更新