1编译器不能运行代码 - 当然,它可以运行一些代码,但它不会运行您的最终程序,否则它就不会被称为“编译器”,而应该被称为“运行时”。例如,C++模板是一种将编译器欺骗成执行声明性语言而非命令式语言编写的代码的方法。编译器执行的此代码的输出是编译时实体(类、函数),它们组成编译器输出的程序的一部分。 - Steve Jessop
@SteveJessop:是的,这就是我想说的,谢谢你澄清。当然,编译器运行代码,至少它必须运行执行编译的代码。对于像C++模板、Scala的图灵完备类型系统、甚至是C#中的重载分辨率(虽然不是图灵完备,但可以编码任何3-SAT问题)和当然还有Lisp宏,编译器需要嵌入一个解释器来解释该语言或在“主”程序的编译之前编译它们。 - Jörg W Mittag
如果“没有解释器无法运行代码”,那解释器是如何运行的呢? - fotanus
@fotanus:根据这个定义,CPU 是一个解释器。它按照某些抽象规范通过推动电子来运行。 - Steve Jessop
@fotanus:解释器不一定是代码。它可以是一个人,例如 - 你从未在脑海中或用纸笔执行过程序吗?但更常见的情况是解释器是在硅中实现的。 - Jörg W Mittag