在聊解什麼是 Compiler 之前
我們先建立一個共識:
每一顆 CPU 在設計的時候
其實他有固定的、能理解的指令
舉例來說,某顆 CPU 可能只認得 100 道指令
所以所有的程式,無論你寫了幾千甚至幾百萬行
它終究會變成100道指令的某種排列組合
這樣說好了,它有點像密碼鎖
密碼鎖雖然只有 0-9 但你只要按得夠多次
它就會變成一個很長、很難破解的東西
又或者你可以把它想像成是樂高積木
雖然樂高積木的『類型』有限
但你只要發揮創意就能夠把它變成各式各樣的東西
所以你不論是寫 C/C++/Python/Scala/Java....
它終究終究終究是一道一道的CPU指令
那麼這個時候也許你會出現數個問題:
首先,你可以寫指令,這是絕對可行的
只是這代表兩件事:
這有點像是你家如果有十個密碼鎖
每個密碼鎖的密碼都不一樣,如果你很熟很熟你也是可以每個都打開的
但是這會變得很麻煩~於是很快的...資公領域就發展出一種東西叫 Compiler(編譯器)
它的功能就是:把 C/C++ 寫的程式變成一道一道的指令給 CPU 執行
那麼你就只要對 C/C++ 很熟就好了,其他的事情就交給 Compiler 做
而 Compiler 的通常是由非常熟悉CPU指令的人所寫的
所以 CPU 指令只要有少數幾個人熟就好,其他人只要用 Compiler 就可以把程式碼轉成指令
試想,市面上有成千上萬種 CPU,而你寫的程式碼可以在他們全部上面跑
這可以省去多少時間
PS 程式碼 ---> (經過編譯器)-----> CPU可以執行的執行檔
所以簡單的來講:
”Compiler 就是把程式語言變成CPU指令的工具“
當我們說 “C-compiler”的時候,我們的意思是能夠暸解 C 語言並且把它轉成 CPU 指令的編譯器
而當我們說 "Rust-Compiler"的時候,我們是只能夠暸解 Rust 語言並且把它轉成 CPU 指令的編譯器
但就像我前面說的,其實CPU可能有成千上萬種,編譯器怎麼知道你是要編譯給誰用的呢?
通常通常,如果我們在 A 這種 CPU 上編譯的結果就是給 A 這種 CPU 用的
但少數也會有在 A CPU 上編譯的結果給 B CPU 用的狀況,這個過程我們稱之為 Cross-Compile 但一般人應該是用不到才對
講了這麼多,希望你對編譯器有點想法
那以下就是最最最普通使用 gcc (C-compiler)的時候會用的 command:
gcc -o main main.c