con*_*ist 2 c compiler-construction assembly
据我所知,当编译程序(例如用C语言编写)时,它首先被翻译成汇编语言,然后翻译成机器语言.为什么不能(不是)跳过"汇编语言步骤"?
编译器开发人员更容易.
可以编写一个读取C并编写目标代码的编译器.但是,这需要编译器编写器编写所有编码指令的计算.某些机器上的指令编码错综复杂.此外,还有一些要填写的字段取决于其他交互,例如分支目标的距离,这取决于分支和目标之间的指令.
另外,编写编译器的部分方式是使用类似"增加对象x,发出增量指令"的模式.为了直接编写目标代码,必须编写要写入的所有指令.那些模式.这意味着您的模式必须具有某种语言来描述指令.
好吧,我们已经有了一种语言:汇编语言.因此,以"增加对象x,问题inc x" 等方式编写模式会更容易.
现代编译器有很多层.有一个前端读取C文本(或其他语言)并将其转换为编译器内部的语言.有一个优化器可以对内部语言(或其表示)进行操作,并尝试改进代码.有一个后端将内部语言转换为汇编语言.有一个汇编程序可以将程序集转换为目标代码.并且有一个链接器将对象代码链接到可执行文件中.
与许多复杂的任务一样,当人类思维被分成很好的部分时,它可以更容易地处理复杂的任务.这可以减少错误并缩短使用软件所需的时间.它还使软件变得灵活,因为我们可以更改前端以支持新语言(例如,Java而不是C)或更改后端以支持新处理器(从Intel组件更改为PowerPC组件).更改一个优化器可以改进所有编译器,包括Java和C以及Intel和PowerPC.
我们用于编译的gcc命令实际上只是一个驱动程序,它调用执行前端处理,优化,程序集和链接的其他程序.您也可以单独调用大部分这些阶段,或使用开关告诉gcc向您显示正在使用的命令.
此外,GCC还具有一项功能,允许开发人员直接插入与C代码混合的汇编语言.这迫使GCC包括汇编程序.