close

//本文章為C/C++程式設計研習班課後心得摘要

1.1編譯器與連結器概念

它的原始碼(source code)是要用來被編譯為讓電腦能直接執行的機械碼(object code, 或俗稱 binary code)的,所以 C/C++ 語言的一切指令設計幾乎有硬體上的目的

1.2c/c++語言特性

C/C++ 語言裡都要明確地指定每一筆資料的型態和儲存方式(如:正負號(signed)、無號的正整數(unsigned)),所以 C/C++ 語言被稱為強型別(strong type)語言。

C++特性:

 

  1. 原始碼通常被編譯為機械碼,而 Java 和 C# 則不是,所以如上所述地,以 C/C++ 語言寫程式會直接地處理資料儲存格式和編碼方式的問題。
  2. 語言變數的宣告與使用方式和記憶體中的實際儲存方式相符合,例如整數佔記憶體 4 bytes, 變數的排列順序即資料在記憶體中的排列順序,其他的語言你不會去管這個。
  3. 可直接依位址存取記憶體,現在幾乎只有 C/C++ 語言獨有指標(pointer)資料型態。
  4. 作業系統與軔體本身常用C語言撰寫,正因為 C/C++ 語言可以直接地編譯為餵給 CPU 執行的機械碼,所以是撰寫作業系統本身或韌體的主流方法。

必備知識:

 

  1. 程式語言的知識,例如使用 C/C++ 語言。
  2. 編譯器軟體,通常包含連結器,例如 Visual C++ 之於 Windows 系統。
  3. 必須的程式庫,通常已包含於編譯器軟體當中,例如 Win32 SDK 或 MFC 程式庫。

1.3作業系統如何執行

作業系統首先在系統記憶體(RAM)中配置一塊程式專屬的記憶體,如下圖所示,然後把可執行檔(.exe)由硬碟載入到該專屬記憶體,接著把程式指位器(program counter) 指向該記憶體中的機械碼起始位置,程式就開始執行了,如果是單工的作業系統(例如DOS),作業系統的工作便到此結束了。如果是多工的作業系統(例如 Windows),作業系統會持續地監控各程式的執行進度,並把滑鼠鍵盤的輸入資訊傳遞給程式。

1.4編譯器工作

編譯器(compiler)的工作,就是把原始碼重新編成與翻譯為機械碼(object code, 俗稱 binary code)。

Visual C++ 編譯器為例,每一個 .c 或 .cpp 檔案都會被編譯成一個 .obj 檔案,當中的內容已經是這些原始碼編譯而成的機械碼(object code)。

 

1.5連結器工作

連結器示意圖

如上圖所示,HelloWorld.cpp 中所做的事情就只有呼叫了 printf( ) 函式來顯示 Hello World! 文字。

甚麼函式呢?如下圖所示,函式一段程式碼片段,放置在主程式以外的另一個地方,它可能會有要求輸入參數,也可能會傳回一些結果數值。當程式執行到一個函式的時候,如下圖所示,它的流程會跳躍到該函式的程式碼處,執行函式的內容,完畢的時候再返回原流程呼叫該函式的地方,接著執行下去。

一個程式所呼叫的函式可能在另一個原始碼檔案(.c 或 .cpp)當中,也可能在另一個機械碼檔案(.obj)中,也可能在程式庫檔案中(.lib)中,無論如何,當編譯器在編譯 HelloWorld.cpp 的時候它並不知道 printf( ) 的程式碼在哪裡,亦不知道程式的流程該跳往何位址,所以在編譯出的 .obj 檔案中這個「空格」會被保留下來,而由連結器(linker)收集了所有的機械碼檔案(.obj與.lib)以後,才將它們填上,其實程式庫檔案(.lib)只不過是一些機械碼檔案(.obj)的集合體。

承續上面的例子,如下圖所示,連結器所產出的可執行檔(executable file)裡面,它把 HelloWorld.obj 和 printf( ) 的機械碼都合併 HelloWorld.exe 當中了,所以在 HelloWorld.obj 當中呼叫 printf( )函式所造成的程式流程跳躍(jump),就變成了是同一個 .exe 檔案內(作業系統載入後是同一塊記憶體內)的位址跳躍了,所以連結器可以明確地寫上位址數值,總結地來說連結器所做的事情就是收集像這樣互相參考的機械碼、合併為執行檔、並且填寫這些機械碼之間的參考位址,這就是為甚麼通常由原始碼產生的可執行檔都會比原始檔案大很多,因為合併了許多來其他檔案的機械碼。

 

重點整理:

  • 建置(build)執行檔的過程包括編譯和連結。
  • 編譯器(compiler)把原始碼變成機械碼。
  • 機械碼本質上就是控制CPU針腳的01訊號。
  • 連結器(linker)把多份機械碼合併成執行檔,並更正檔案內的參考位址(address)。

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 winage 的頭像
    winage

    winage的部落格

    winage 發表在 痞客邦 留言(0) 人氣()