Chapter II. 新手上路
實作技巧
編譯器
作者WiwiHo

什麼是編譯器


C++ 是一種編譯式的程式語言,什麼意思呢?當我們在執行一支 C++ 程式的時候,電腦並不是直接去執行放 C++ 程式碼的那個 .cpp 檔案的,而是先將 C++ 程式碼編譯(compile)成執行檔(例如在 Windows 裡會看到的 .exe 檔案,它們就是執行檔),然後電腦會去執行這個檔案。用來編譯出執行檔的東西,我們就稱它為編譯器(compiler)。可以想像成電腦其實是看不懂我們寫的程式碼的,而編譯這個動作,就是在將程式碼翻譯成電腦看得懂的語言,也就是執行檔。

編譯器 vs 編輯器


大多數人在寫程式的時候,都會使用像是 Code::Blocks、Dev C++、Sublime 之類的工具,而這些工具常常都會有個「build」、「build and run」這類的按鈕,讓使用者只要按下「build and run」就可以輕鬆執行目前寫好的程式,這裡的 build 就是指編譯出執行檔。那些你會在裡面打程式碼的工具統稱為編輯器(editor),像是 Code::Blocks、Dev C++、Sublime、VS Code、Vim 等等,都屬於編輯器,有些附帶很多功能(像是編譯、debug)的,我們也會稱它們為 IDE(整合開發環境)。實際上它們附帶的編譯功能,都還是由編譯器做到的,不要把編輯器和編譯器的功能搞混了。

如何使用編譯器


雖然如果不會用編譯器的話,還是可以依賴許多編輯器裡面提供的 build 按鈕,不過建議可以稍微理解一下編譯器要怎麼使用,在需要修改編譯設定或是看到和編譯選項相關的說明時才不會一頭霧水。

大多數 Online Judge 使用的編譯器是 GCC 裡的 g++,在安裝好之後,使用的方法很簡單,只要在 terminal 裡面打

g++ <filename>.cpp

就可以把 <filename>.cpp 編譯成執行檔,然後你會得到一個檔名是 a(像是在 Windows 裡面就是 a.exe,Ubuntu 裡面就是 a.out)的執行檔,執行它就可以看到程式的結果了!不過檔名叫作 a 好像有點醜,所以可以加上 -o <你想要的檔案名稱> 來指定檔名,像是

g++ test.cpp -o test.exe

就可以將 test.cpp 這個 C++ 程式碼檔案編譯成叫作 test.exe 的執行檔。

我們剛剛在編譯指令裡面加了一個 - 開頭的東西,這種東西就是編譯選項。還有一個常見的編譯選項是 -std=...,例如 -std=c++17-std=c++14 等等,用來指定使用的 C++ 版本,像是

g++ test.cpp -o test.exe -std=c++17

就會按照 C++ 17 這個版本,把 test.cpp 編譯成 test.exe 這個執行檔。要是程式中有用到一些 C++ 的先進功能的話,別忘了要注意 Online Judge 使用的 C++ 版本是否支援這個功能,最好的方式就是直接在自己編譯的時候,使用一樣的 C++ 版本,這樣在自己測試的時候就可以發現了,更好的話就是直接使用跟 Online Judge 一模一樣的編譯選項。

像是在 TIOJ 提交程式碼時,就可以選擇要使用的編譯選項:

編譯選項還有很多種,有興趣的讀者可以自己查詢相關說明,講義之後的章節也會介紹一些有用的編譯選項。