Stroustrup声称第一个C ++编译器Cfront是用C ++编写的(Stroustrup FAQ)。
但是,第一个C ++编译器怎么可能用C ++编写?
构成编译器的代码也需要进行编译,因此第一个C ++编译器不能用C ++编写,对吗?
Stroustrup声称第一个C ++编译器Cfront是用C ++编写的(Stroustrup FAQ)。
但是,第一个C ++编译器怎么可能用C ++编写?
构成编译器的代码也需要进行编译,因此第一个C ++编译器不能用C ++编写,对吗?
Answers:
关键就在这里:
第一个C ++编译器(Cfront)用C ++编写。为此,我首先使用C编写了一个“带有类的C”到C的预处理器。“带有类的C”是C语言,它成为C ++的直接祖先。该预处理器将“带有类的C”构造(例如类和构造函数)转换为C。这是一种传统的预处理器,无法理解所有语言,大部分类型检查由C编译器完成,并且单独翻译没有完整知识的构造。然后,我在“带有类的C”中编写了Cfront的第一个版本。
因此,Cfront的第一个版本不是用C ++编写的,而是用中间语言编写的。直接在C语言中创建C编译器和预处理器的能力导致了C语言中的许多创新(以及大量的安全漏洞)。因此,您需要编写新的preprossoror来将“带有类的C”代码转换为直接C(因为直接C可以做到)任何东西),然后使用“带有类的C”编写C ++编译器(不是您不能用C做它,只是需要一段时间),然后使用C ++编译器在其中编写更有效/更完整的编译器C ++。得到它了?
我认为BS回答了这个问题:
第一个C ++编译器(Cfront)用C ++编写。为此,我首先使用C编写了一个“带有类的C”到C的预处理器。“带有类的C”是C语言,它成为C ++的直接祖先。该预处理器将“带有类的C”构造(例如类和构造函数)转换为C。这是一种传统的预处理器,无法理解所有语言,大部分类型检查由C编译器完成,并且单独翻译没有完整知识的构造。
然后,我在“带有类的C”中编写了Cfront的第一个版本。Cfront是传统的编译器,它完成了C ++源代码的语法和语义检查。为此,它具有完整的解析器,构建符号表,并为每个类,函数等构建了完整的内部树表示。在输出C之前,它还对其C ++构造的内部树表示进行了源代码级的优化。生成的C,不依赖C进行任何类型检查。它只是将C用作汇编程序。生成的代码毫不妥协地很快。
首先,他创建了一个称为“带类的C”的东西,该东西由一个简单的预处理器实现为C。基本上是C ++,但是预处理器很少或根本没有检查。然后,他用它来编写Cfront,这是将C ++转换为C的更强大的版本,并带有类型检查,符号表等。