Compiler construction 什么是C';s(或ML';s)在创建编译器中的角色?

Compiler construction 什么是C';s(或ML';s)在创建编译器中的角色?,compiler-construction,programming-languages,Compiler Construction,Programming Languages,我认为主要任务是解析数据并创建与之对应的汇编语言指令集(两种逻辑)。 这些编译器是否使用除此之外的任何其他固有的C特性? 我的意思是,我可以编写一个程序,用X语言编写一个类似C的程序,然后用gcc进行编译——所有事情都发生在后端——但这种方法明智吗? 我的问题的图示为: 语言X—用C语言编写的编译器,使用C语言的字符串处理和解析功能创建ASM—在计算机上运行 特点:使用C的基本机制生成汇编代码——只需使用它自己的汇编逻辑即可 语言X-用C编写的编译器再次将其重新编码为类似C的语法-将其提供给类似

我认为主要任务是解析数据并创建与之对应的汇编语言指令集(两种逻辑)。 这些编译器是否使用除此之外的任何其他固有的C特性? 我的意思是,我可以编写一个程序,用X语言编写一个类似C的程序,然后用gcc进行编译——所有事情都发生在后端——但这种方法明智吗? 我的问题的图示为:

语言X—用C语言编写的编译器,使用C语言的字符串处理和解析功能创建ASM—在计算机上运行 特点:使用C的基本机制生成汇编代码——只需使用它自己的汇编逻辑即可

语言X-用C编写的编译器再次将其重新编码为类似C的语法-将其提供给类似GCC的编译器-ASM-机器代码
特征:
哑系统,因为它最终使用了C的工具

每个编译器都是不同的

编译器编写者可以(并且已经!)完成您能想到的任何事情。旧的“translator”f2c实际上是一个以c为目标(即以c为输出)的Fortran编译器

这没有什么错,尽管它会使编译过程变慢(毕竟还有一个额外的lex和parse阶段)


另一点,对于严肃的编译器来说,它是对抽象语法树的操作,以优化输出,这占用了大部分代码和时间。在中完成的即时代码生成与功能齐全的编译器之间存在巨大差异。

每个编译器都不同

编译器编写者可以(并且已经!)完成您能想到的任何事情。旧的“translator”f2c实际上是一个以c为目标(即以c为输出)的Fortran编译器

这没有什么错,尽管它会使编译过程变慢(毕竟还有一个额外的lex和parse阶段)


另一点,对于严肃的编译器来说,它是对抽象语法树的操作,以优化输出,这占用了大部分代码和时间。在中完成的即时代码生成与功能齐全的编译器之间存在巨大差异。

编译器的两个主要任务是“编写解析器”和“将输出写入汇编程序”,这一点您大错特错了。最有趣的是发生在中间,验证通过(类型检查),分析通过(各种信息收集进一步优化)和转换(从高级到低级别的语言,直到在某个阶段之后,你完成了看起来像汇编的东西)。 即使您设计了一个简单的编译器(您不需要第一次与GCC竞争),解析器也不应该是“主要任务”。事实上,解析器现在被认为是一个相当常规的问题,至少如果您的语法相当常规的话(我不是在谈论疯狂的语法扩展性);有一些解析器生成器工作得比较好,您也可以使用手工制作的解析器以获得更大的灵活性,但总而言之,这绝对不是问题所在

编写一个输出C或任何其他语言的编译器是非常明智的。许多不同的编译器(例如Haskell和各种Scheme)都使用C作为目标语言。但是通常(不管怎样,对于有趣的语言来说)需要做大量的前期工作,将编程语言的抽象编译成可以翻译成C的更低级的东西

如今,还有其他方法可以将自己从低级组装部件中抽象出来:您可以将虚拟机(JVM、CLR、Erlang的VM、Parrot…)作为目标,或者生成LLVM字节码,等等


你在问题中提到了ML。使用代数数据类型的静态类型函数语言(即SML、OCaml、Haskell等)是编写编译器的非常好的语言;我敢说是最合适的。您可能对这本书感兴趣(有C和Java的变体,但ML书是最好的)。它在某些地方有点专业化,但对编译技术有一个良好的整体视图可能是一个不错的选择。当然,如果你想成为一名编译大师,你还应该使用其他参考资料,如《龙之书》,可能还应该使用与你的类似的语言编译参考资料(我的意思是编译纯函数式语言可能与编译命令式过程式语言大不相同)你大错特错了,编译器的两个主要任务是“编写解析器”和“将输出写入汇编程序”。最有趣的是发生在中间,验证通过(类型检查),分析通过(各种信息收集进一步优化)和转换(从高级到低级别的语言,直到在某个阶段之后,你完成了看起来像汇编的东西)。 即使您设计了一个简单的编译器(您不需要第一次与GCC竞争),解析器也不应该是“主要任务”。事实上,解析器现在被认为是一个相当常规的问题,至少如果您的语法相当常规的话(我不是在谈论疯狂的语法扩展性);有一些解析器生成器工作得比较好,您也可以使用手工制作的解析器以获得更大的灵活性,但总而言之,这绝对不是问题所在

编写一个输出C或任何其他语言的编译器是非常明智的。许多不同的编译器(例如Haskell和各种Scheme)都使用C作为目标语言。但是通常(不管怎样,对于有趣的语言来说)需要做大量的前期工作,将编程语言的抽象编译成可以翻译成C的更低级的东西

如今,还有其他方法可以将自己从低级组装部件中抽象出来:您可以将虚拟机(JVM、CLR、Erlang的VM、Parrot…)作为目标,或者生成LLVM字节码,等等<