peo*_*oro 9 language-agnostic compiler-construction programming-languages
通常编译器从它们支持的语言转换为汇编.或者至多是类似汇编的语言(字节码),如GCC的GIMPLE/GENERIC或Python/Java/.NET字节码.
如果编译器转换为更简单的语言(已经实现了语法的一个重要子集),这不是更简单吗?
例如,与C 100%兼容的Objective-C编译器只能为它扩展到C的语法添加语义,将其转换为C.我可以看到这样做的许多优点; 可以使用这个Objective-C编译器将其代码转换为C,以便使用不支持C++的不同编译器编译生成的C代码(但是可以更好地编译,或者编译更快,或者能够编译更多架构).或者,可以在仅允许C的项目中使用生成的C代码.
我想/希望如果事情像这样工作,那么为当前语言编写扩展会更容易(例如:添加C++关键字以简化常见模式的实现,或者,仍然在C++中,删除之前的声明通过将内联成员函数移动到头文件的末尾来使用规则)
会有什么样的惩罚?生成的代码很难被人类理解?编译器无法像现在这样进行优化?还有什么?
这实际上是由许多语言使用,通过使用中间语言.最典型的例子是Pascal,它有Pascal-P系统:Pascal被编译成一种假设的汇编语言.移植pascal只意味着为这种汇编语言编写一个编译器:一个比移植整个pascal编译器简单得多的任务.编写完这个编译器之后,你只需要编译用这个编写的(机器无关的)pascal编译器.
Bootstrapping在编程语言设计中也经常使用.许多语言的编译器都用同一种语言编写(Haskell在这里可以想到).通过这样做,为该语言编写新功能只是意味着将该想法转换为当前语言,将其放入编译器,然后重新编译.
我不认为这个方法的问题实际上是生成代码的可读性(我不会通过编译器个人生成的汇编字节代码进行筛选),而是优化之一.高级编程语言中的许多想法(弱写入)都很难自动转换为C等低级系统语言.GCC倾向于在代码生成之前进行优化.
但在大多数情况下,编译器确实会转换为更简单的语言,除了最基本的系统语言.