我现在正在学习nand2tetris课程,我目前正在用Lua编写汇编程序。我知道以后我们将编写一个JACK编译器。
在我完成课程之后,我有一台带有操作系统和虚拟机的黑客计算机,我能用杰克做一个黑客汇编程序,然后将程序编译成程序集,然后自己编译吗?
这种系靴的可能吗,还是我飞得离太阳太近了?
发布于 2022-08-02 06:08:42
对于汇编程序或编译器来说,自我托管并不少见,也就是能够自己编译。是的,你可以从手写的机器代码开始,引导到这一点。参见https://softwareengineering.stackexchange.com/questions/129123/were-the-first-assemblers-written-in-machine-code on softwareengineering.SE re:引导工具链。
例如GCC和clang/LLVM都是自托管的,即它们是用C或C++编写的,这些项目的C编译器部分可以编译自己的源代码。
是的,当你从一些随机的C编译器开始时,他们称之为“引导”,它可以针对你想要的平台,然后你用它编译GCC。然后你用GCC为同一个平台做GCC的优化构建,这样你的编译时间就更低了。因此,任何需要GNU扩展的GCC内部特性或优化都可以启用(如果它是用ISO C编译器构建的)。
假设JACK接近图灵完成,所以您可以在其中编写读取文本文件和写入二进制文件的任意程序,这是没有问题的。
与此相关的还有:https://retrocomputing.stackexchange.com/q/3326在追溯计算中描述了大多数8位微计算机的工具链是如何在其他机器上引导的,这些机器通常是大学小型计算机或大型机,盖茨和艾伦等有进取心的人可以访问这些计算机或大型机,或者任何其他系统,只要有一些硬件黑客,就可以输出到可编程ROM的格式。或者,就像沃兹尼亚克( Wozniak )显然对苹果6502的机器代码所做的那样,只是手指点点。
与引导相关的进一步追溯计算Q&As:
思考:编译自己的编译器打开了一个有趣的漏洞,让恶意版本在编译器中隐藏一些代码,通过识别自己编译的时间并发出机器代码,将自己传播到未来的版本。我们认为当前GCC / clang或其他自托管编译器的二进制发行版没有这种情况,但是从经过审计的源进行重建还不足以验证。一个wiki.c2.com文章有更多的信息,包括它是在野生的德尔菲4到7,检测到2009年。
这个想法最初是由肯·汤普森在1984年的文章“关于信任的思考”中提出的,认为这是一种假设的可能性。(包括yacc和lex,以及链接器,作为工具链的一部分)。另见https://security.stackexchange.com/questions/222072/are-compilers-safe
实际的安全考虑并不是我试图在本节中强调的问题:去读这篇文章,看看他们描述编译器如何习惯于编译下一个版本本身的方式。这也许能帮你了解一下这是怎么回事。
(但re:安全方面的影响,在security.SE和其他方面都有一些问题:一,二,三。最终,你必须相信一些东西,除非你赤手空拳地建立了自己的CPU,从原始的沙子开始。或者至少,自己创建光刻机和芯片布局;其他人可以做化学制备硅和掺杂材料。)
https://stackoverflow.com/questions/73202457
复制相似问题