2010-01-04 52 views
3

编译器将代码编译为汇编语言,还是直接输出二进制机器代码会更好吗?汇编与二进制输出

我能想到的汇编语言的优势:避免了学习目标文件格式的需要,调试后端的难度。

二进制的优点:编译速度更快。这有多重要?假设使用Gnu汇编器(除了其他任何东西,它可以合理地假定在大多数机器上都可用),是否需要花费大量的时间来组装比如说一百万行代码?

汇编器隐藏的各种操作系统之间的目标文件格式是否存在差异?

我还没有想到任何一方都有其他优点吗?

+2

GNU汇编器一次工作。它在生成的二进制文件的大小上是线性的。除非你的编译器是非常基本的,并且根本没有任何困难的优化,否则GNU汇编器所花费的时间在整个编译时间内可以忽略不计。 – 2010-01-04 13:48:22

回答

3

装配更容易输出,它具有人类可读性的好处。 至于编译的时候,这里是从我的编译器的一些统计数据:

[~/ecc/ellcc/ecc/Main] main% ../../bin/x86-elf-ecc test/sieve.c -time-actions 
===-------------------------------------------------------------------------=== 
        ... Ellcc action timing report ... 
===-------------------------------------------------------------------------=== 
Total Execution Time: 2.9006 seconds (2.9857 wall clock) 

---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name --- 
2.0397 (71.3%) 0.0250 (65.8%) 2.0647 (71.2%) 2.1174 (70.9%) Bitcode linking 
0.7999 (27.9%) 0.0070 (18.4%) 0.8069 (27.8%) 0.8111 (27.2%) Generating 
0.0000 ( 0.0%) 0.0010 ( 2.6%) 0.0010 ( 0.0%) 0.0274 ( 0.9%) Assembly 
0.0110 ( 0.4%) 0.0030 ( 7.9%) 0.0140 ( 0.5%) 0.0143 ( 0.5%) LLVM generation 
0.0070 ( 0.2%) 0.0000 ( 0.0%) 0.0070 ( 0.2%) 0.0066 ( 0.2%) Type checking 
0.0000 ( 0.0%) 0.0020 ( 5.3%) 0.0020 ( 0.1%) 0.0041 ( 0.1%) Linking 
0.0030 ( 0.1%) 0.0000 ( 0.0%) 0.0030 ( 0.1%) 0.0031 ( 0.1%) Optimization 
0.0010 ( 0.0%) 0.0000 ( 0.0%) 0.0010 ( 0.0%) 0.0010 ( 0.0%) Elaboration 
0.0010 ( 0.0%) 0.0000 ( 0.0%) 0.0010 ( 0.0%) 0.0004 ( 0.0%) Integrity checking 
0.0000 ( 0.0%) 0.0000 ( 0.0%) 0.0000 ( 0.0%) 0.0004 ( 0.0%) Parsing 
2.8626 (100.0%) 0.0380 (100.0%) 2.9006 (100.0%) 2.9857 (100.0%) TOTAL 

[~/ecc/ellcc/ecc/Main] main% 

正如你所看到的装配时间由联和代码生成相形见绌。这个例子编译并链接一个小的main()以及标准库,全部使用LLVM中间形式。然后为整个程序生成一个汇编语言文件。该文件使用链接器进行链接(实际重新定位),该链接器创建a.out文件。

2

程序集的另一个优点:可以使用标签进行跳转,循环,分支和函数调用,因此不需要手动计算内存地址。

0

你可以尝试一下它需要多长时间来生成汇编为您的代码:

gcc -O2 -S -c foo.c 
2

如果生成汇编代码,那么你最终会

  • 编写代码到磁盘上,汇编器将不得不阅读它;
  • 调用汇编程序,即启动一个新的进程。

汇编程序本身运行速度很快,但文件I/O需要一两分钟。一百万行?也许5秒。例如,启动汇编程序需要100到1000毫秒。那里没什么大不了的。

我认为调试和解除对象格式操作的轻松性很容易弥补稍长的编译时间。

1

直接生成二进制文件的主要优点是可以直接将代码喷入内存,刷新I缓存,然后分支到内存。这意味着您可以使用本地代码编译器创建一个良好的交互式循环。一个很好的功能,并在编译器中部署了超过20年的Standard ML of New Jersey

1

汇编器隐藏的各种操作系统之间的目标文件格式是否存在差异?

是的,即使在同一个操作系统上,也可以有多种目标文件格式。(例如,MASM可以生成例如OMF或COFF目标格式,以通过不同的连接体来使用。)

更多关于不同的对象的文件格式可以在相应的部分中 this document找到。