作者Freak1033 (金が信念! XD)
看板b94902xxx
标题[教学] 如何使用 C compiler - 1. 前言
时间Sat Sep 24 19:20:27 2005
在正式开始介绍各家 C compiler(下简称 CC) 的操作之前,
各位必须先了解一支 C 程式由文字转变到执行档之前究竟经过了怎样的过程.
不过现在各位可能对程式设计都还没什麽概念, 看不懂也是很正常的,
建议可以先试着操作看看再回来对照这篇的内容.
(实际的操作会在接下来几篇介绍, 请稍安勿躁.)
完整的过程一般来说分成四个步骤,
前置处理(Preprocessing)->
编译(Compiling)->
组译(Assembling)->
连结(Linking)
不过通常我们会把前面三个步骤简化一次完成,
所以在这篇以初学者为导向的文章就不会讲得那麽深入,
再说当你需要用到这麽细节的处理的时候, 你已经知道它们在做什麽了.
因此, 我们将广义的"编译"作为前面三个步骤的总称, 现在只剩下两个步骤:
编译(Compiling)->连结(Linking)
现在开始介绍这两个步骤的作用.
编译这个过程会将程式码转换成电脑能够了解的机械语言,
并且整理出这段程式码能够提供(Export)的,
以及需要从外面引入(Import)的符号(Symbol).
所谓的"符号", 就是一段 C 程式码所提供出来的物件,
通常是一段独立的程式区块(副程式, Subprocedure),
或是全域变数(Global Variable).
范例:
---- hello.c ----
#include <stdio.h>
int main(){
printf ("hello world!\n");
return 0;
}
----
以一支最经典的 hello world 程式来说,
hello.c 提供了一个可执行的完整程式所必要的, main 副程式.
而同时, hello.c 用到了 printf 这个符号, 但是它本身却没有提供,
因此 compiler 会在产生出来的机械语言码留下适当的空位,
以待未来有其它的程式码提供之时可以引入.
这个将多个程式码所提供的符号互相引入的过程, 就是连结.
现在交作业所写的程式都只要一支程式码就可以完成,
但是未来各位可能会需要进行大型的专案,
而必须将程式切成多个模组来分段修改维护, 就一定会需要连结这个过程.
事实上现在也已经常常在用了, 比方说上面所讲的 printf 的例子,
printf 并不是 C 语言的保留字, 那究竟我们一天到晚在用的 printf 是哪来的呢?
答案是"标准 C 函式库"(Standard C Library), 它是 C 语言标准所定义,
一个支援 C 语言的系统所必须提供的程式集,
而 printf 就是别人所预先写好, 放在这里面的程式之一.
连结还有一个重要的目的, 就是要标出程式的进入点(Entry Point),
电脑看到一大堆机械语言的时候并不知道究竟哪里才是程式的开头,
因此我们要帮它标出来. C 语言规定标准的进入点是由 main 副程式进入,
在所有的原始程式片段全部安置好, 符号都已经成功引入之後,
连结器(Linker) 就会将 main 的位置记录在执行档中,
一个完整的执行档就完成了.
--
「ふ…ふざけるな!そんあ短い咒文で、魔法を起动できるわけないだろうが!
お前わマウゼルの神に逆らう气なのか?!傲慢な~」
「失礼致しました、诚实に全力でお相手致します。
第一战术级‧军用攻性魔法‧出よ、武雷神〈トール〉!」
〈スクラップド‧プリンセス〉
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.109.224.64