鉴于拥有10到20年经验的熟练开发人员从未构建过编译器或模拟器,这将更具挑战性吗?
你能比较一下这两个问题的路障吗?
谢谢.
仿真和编译是完全不同的,但由于被认为是"低级别",往往会被混为一谈.
仿真6502或Z80这样的简单架构对于工作的CPU块来说相当简单,但是由于需要为每条指令提供一个函数,因此需要编写相当多的代码.您需要以某种方式自动执行此操作,从具有所有时序的指令集规范等,因为输入这一切将非常繁琐:)旧的CPU指令集规格很容易找到,所以这有助于很多在构建模拟器时.
最重要的是,您需要实现某种级别的硬件仿真,这通常涉及处理和生成中断(例如,如果模拟器用于游戏控制台,则显示设备的垂直空白中断).这又需要一定程度的规范和代码生成,但你可能不得不手工编写大部分内容,因为它不会像指令集代码那样重复(因此可自动化).
编译将涉及您要为其实现编译器的任何语言的某种语言规范,以及您将要为其输出代码的目标.输出可以是直接二进制,也可以是汇编,或者甚至可以是另一种语言(这实际上只是一个翻译器,但当目标被认为是"足够"低级别时,它会被视为编译).由于您将在某种硬件或VM平台上运行,因此您不太可能担心中断处理等等.
两者的绊脚石都是复杂性和正确性 - 对于模拟器,您需要使其非常准确地工作,除非您选择非常简单的事情来模拟.您还需要为模拟器创建某种集成的调试器,否则当它总是这样做时,几乎不可能知道出现了什么问题.对于编译器来说,翻译玩具语言或更复杂语言的一小部分应该是相当直接的,并且随着时间的推移进行构建.
请记住,对于这两个项目,您需要能够生成输入来测试它们,如果您无法生成简单的输入,那么您将发现从一开始就很难进行调试. 仅这一点使得编译器工作变得更容易进入,imho(那并且您将希望拥有一些模拟完整控制台或某些东西的东西:)
我已经写了两个,并会说其他的事情都是平等的(语言或指令集的复杂性),它是方式更容易编写一个模拟器,特别是如果你正试图写一个有趣的仿真器或编译器.
原因是,使用模拟器,您试图使用另一个类似的低级别事物来模拟低级别的事物.这不是太糟糕.使用编译器,您可能正在尝试使用非常低级别的工具(机器字和机器指令)实现非常高级的想法(例如,对象,一流函数,托管内存,字符串扫描).这个任务要困难得多.
当然,对于有趣的团队,您可以编写一个通过动态二进制翻译工作的模拟器,这是将模拟体系结构的机器代码编译到本机体系结构的机器代码中.通过这种方式,您可以获得两者的所有乐趣 - 并且您可以生产真正快速的仿真器,如QEMU或已故的感叹数字FX!32.
我写过这两篇文章并且会说模拟器通常更容易.当然,这在很大程度上取决于你试图模仿的东西(在iPhone上模拟IBM大型机可能有点挑战)以及你想要编译的东西(一个小的C编译器很简单,一个完整的C++编译器几乎难以置信.