寫程式工具

**寫程式工具**，又叫**軟件開發工具**，係電腦程式或者程式功能一種，特點係用嚟幫人創造程式、做除錯或者做第啲寫程式相關工作。例如 Spyder 軟件係相當出名嘅 Python 開源寫程式工具，有多種功能畀人用佢寫程式：
*有源碼編輯器畀用家睇同編輯寫緊嗰個程式嘅源碼；
*有 debugger 方便用家做 debug；
*顯示啲變數嘅數值（呢點對 debug 嚟講好有用）；
隨住軟件工程嘅發展，人類對寫程式工具有一定嘅需求，而每個領域往往有佢哋專用嘅架生，例如寫遊戲程式同繪圖軟件用嘅功能可以好唔同；經驗有返咁上下豐富嘅軟件工程師，都要熟自己嗰行用開嘅工具，按自己手上單工作，選擇要用邊隻。

用得寫程式工具，一般會識基礎嘅電腦程式編寫同軟件工程。

## 源碼編輯

源碼編輯器係指畀用家編輯個程式嘅源碼嘅文字編輯器：源碼編輯器可以單獨存在，亦可以係網頁瀏覽器或者綜合開發環境（IDE）嘅一部份。源碼編輯器多數都會有功能或多或少噉自動處理代碼風格嘅嘢，包括－
*句法突顯：按一段字嘅特性，將段字顯示做唔同嘅色水或者唔同字款，等段字更加易睇；即係例如顯示段源碼嗰陣，表示變數嘅字冚唪唥黑色，表示迴圈陳述式嘅字冚唪唥藍色，表示注釋嘅字冚唪唥綠色... 如此類推，好似下圖幅 gif 噉，噉用家容易一眼就睇到每段字係表示啲乜。
*自動完成：指估計用家跟住想打啲乜碼，畀用家齋靠撳一兩個掣就即刻打段碼出嚟；好似下圖幅 gif 噉，用家淨係打咗 `Conso`，個編輯器經已估佢想打 `Console` 同相關嘅陳述式，仲畀佢有得打打吓直接叫個編輯器出其中一段陳述式。
*括弧配對：檢驗啲括弧啱唔啱嘅功能，例如 `((()))` 呢段碼有 3 個 `(` 3 個 `)`，所以啲括弧配對得啱，而 `(({)))` 呢段碼就唔啱－有 2 個 `(` 3 個 `)`，而個 `{` 冇對應嘅 `}`。括弧配對功能就係攞一段碼，然後話畀用家知「啲括弧啱唔啱，而如果唔啱，係喺邊個位出錯」噉嘅資訊。





*極簡化：指由段碼度攞走啲唔必要嘅字符，例如係空格（好多時加落段碼度純粹係為咗等段碼清楚啲易睇啲）呀噉。用以下呢行 JavaScript 碼做例子－
*:
```javascript
var array = [];
for (var i = 0; i < 20; i++) {
  array[i] = i;
}
```

**極簡化咗就會變做噉－
*:
```javascript
for(var a=[i=0];i<20;a[i]=i++);
```

*搵重複：指探測段碼入面有冇重複咗－代碼重複係指源碼有其中段出現咗超過一次，而呢種情況一般認為係唔理想嘅，例如會嘥位（睇埋 DRY 原則）；唔少寫程式工具都曉自動摷吓段碼，睇吓段碼有冇重複嘅情況，有嘅話就建議用家整子程序嚟解決問題。
*代碼審查：喺專業嘅軟件工程中，寫好個程式嘅源碼之後通常會搵人睇吓段碼，當中負責睇段碼嘅人係冇份寫段碼嘅；寫程式工具好多時會有啲功能，幫手做代碼審查嘅工作，例如有唔少常犯錯誤都係電腦程式可以輕易噉探測到嘅，所以寫程式工具好多時會內置埋功能，可以自動檢查，睇吓啲碼有冇呢啲常犯錯誤。

## 相關功能

除咗畀用家編輯源碼之外，寫程式工具好多時仲會有以下呢啲功能：
*圖像用家介面（GUI）：指將編程相關嘅功能用圖像化嘅方式表示出嚟；例如源碼編輯器除咗會顯示段源碼，好多時仲會喺顯示源碼嘅視窗隔離顯示另一個視窗，後者顯示個程式用緊嗰啲檔案嘅目錄，或者顯示第啲有用嘅資訊（睇埋綜合開發環境嘅嘢）。
*編譯工具：編譯係指將一段源碼轉化做第隻程式語言嘅過程；喺編程上，編譯器最常見嘅用途係，攞嚟將段由高級程式語言寫嘅碼轉化做電腦識睇識行（但淨係由 `0` 同 `1` 組成、對人嚟講難明）嘅機械碼。
*自動組建：軟件組建係軟件工程嘅必要工序，指將段源碼轉化做可以實際攞去行嘅程式；實際經驗表明，喺大啲嘅軟件項目當中，吓吓手動噉做軟件組建行唔通，所以應用上嘅軟件工程都會用組建自動化－有啲特製程式自動噉做軟件組建。
*Log：紀錄作業系統或者第啲軟件運行嘅檔案；例如（簡化版）伺服器嘅 log 會紀錄好似噉嘅資訊－
*:用家 112XXXXXX 喺 YYYY 年 M 月 D 日 13:51:31 用過 http:xxxxxxxxxx 呢個檔案；
*:用家 129XXXXXX 喺 YYYY 年 M 月 D 日 13:51:40 用過 http:xxxxxx234x 呢個檔案；
*:...
**Log 喺做 debug 等嘅工作嗰陣好有用。
*手稿語言（scripting）：指用嚟操作同更改現存系統嘅功能嘅程式語言，好多時係喺行個程式嗰陣直譯，而唔係編譯咗先行嘅；例如遊戲引擎 Unity 係用嚟整電子遊戲嘅軟件，有多種方便整遊戲嘅功能，包括畀用家用 C♯ 呢隻物件導向程式語言（程式語言）寫手稿，用手稿嚟設定隻遊戲入面啲物件嘅行為（更改一個現存系統嘅功能）－C♯ 就係 Unity 嘅手稿語言。
*控制流程圖：指將控制流程－迴圈同如果-就等－用圖像化嘅方式呈現出嚟；好似下圖噉，想像下圖嗰 4 個波 A B C D 都各自係段碼，
*#個程式會行 A；
*#A 行完之後個程式有句條件陳述式，`if` 某條件係真就行 B，`else` 個程式就會行 C，
*#無論個程式行嘅係 B 定 C，最後都會行 D。
**唔少人認為，控制流程圖令複雜（好多時成閒閒哋幾千行碼咁長）嘅程式清楚易睇好多，有啲寫程式工具仲做到自動由源碼度產生控制流程圖。

*版本控制：指「管理住對軟件產品（例如寫緊嘅程式）改咗啲乜」呢種功能，最簡單嘅做法係同每個檔案名加返個冧把－即係 `XXX V1.0` 或者 `XXX V2.0` 噉；版本控制相關嘅功能好緊要－事實表明，有咁上下大嘅軟件項目會有數量龐大（閒閒哋幾百幾千）次嘅編輯，而且有陣時軟件工程師仲會例如發覺 10 次前吓修改有問題，所以想返轉頭搵返 10 次編輯前嗰個版本；因為噉，軟件工程師正路會想有套系統，清清楚楚噉打理好整緊嗰隻軟件嘅版本。
*性能分析：指幫手分析程式嘅「性能」嘅功能；如果話件工具識得做性能分析，係指件工具曉畀出一啲顯示個程式「寫得有幾好」嘅重要資訊－例如係個程式行嗰陣用咗幾多時間（睇埋時間複雜度）或者用咗幾多記憶體（睇埋空間複雜度），或者係個程式用每個子程序用咗幾多次... 呀噉。呢啲功能對最佳化嚟講好有用。
*Bug 跟蹤管理系統：泛指用嚟紀錄住啲有關 bug 嘅報告嘅應用程式；喺實際應用上，軟件工程整嘅程式梗會有返咁上下複雜，難免會有 bug；因為噉，專業嘅軟件工程師成日都會用 bug 跟蹤管理系統，即係個系統識喺有 bug 出現嗰陣，將有關隻 bug 嘅資訊－例如「隻 bug 發生嗰時隻程式處於咩狀態」噉－紀錄低同埋提供報告畀軟件工程師知，方便工程師同隻軟件做 debug 。
*垃圾回收：記憶洩漏係指個程式攞咗啲記憶體嚟用，但用完之後又冇放返開啲記憶體，於是個程式就霸咗一啲佢唔會用嘅記憶體，所以就搞到部電腦有嘅系統資源量不必要噉減少咗。具體啲講，程式嘅源碼入面成日會有類似以下噉嘅碼－
*:攞 XXX 呢件資源嚟用；
*:將攞到嘅資源做 YYY 噉嘅運算；
**好多時，用家仲有必要手動噉加多行碼（類似 `delete()` 噉），話畀部電腦知「個程式用完 XXX 呢嚿資源喇，嚿資源霸咗嘅記憶體可以空出嚟做第啲嘢」。如果用家冇噉做，就會引致記憶洩漏，喺複雜啲嘅軟件當中，記憶洩漏會搞到隻軟件行起上嚟明顯慢咗。到咗廿一世紀初，多人用嘅程式語言或者寫程式工具往往會或多或少噉有垃圾回收－指教部電腦自動噉釋放啲「個程式打後唔再提到」嘅記憶體－或者類似嘅功能。
*SWIG：SWIG 係開源軟件工具，能夠將用 C 或者 C++ 寫嘅程式「連接」第啲高級程式語言；SWIG 係一部編譯器，能夠攞住由 C 或者 C++ 寫成嘅程式，容許由第啲程式語言－包括 Python 同埋 Java－寫成嘅程式個 C/C++ 程式嘅 output 去用。
*二進制代碼嘅兼容性：喺廿一世紀初，無論電腦程式嘅源碼係用咩語言寫，部電腦攞個程式去行嗰陣都係要經編譯器，將段源碼轉換做電腦內部實際行嘅機械碼；唔同 CPU 架構用嘅機械碼語言可以好唔同，所以是但攞段碼，嗰段碼喺電腦 A 上面行到，但段碼搬咗去電腦 B 上面就有可能要重新做過編譯（甚至改段碼）先至行得到；有啲寫程式工具做嘅，就係探測兩部機之間有冇二進制代碼嘅兼容性。
*自動編程：指「人類用家畀啲高層次嘅指令，然後件工具自動噉產生出段源碼」噉嘅功能。亦可以睇吓大型語言模型嘅編程能力。

## IDE

綜合開發環境（IDE）係指設計嚟幫人開發軟件嘅應用程式。一般嚟講，綜合開發環境會有返個圖像用家介面，將啲重要嘅資訊（例如係每個變數嘅值）清楚噉顯示嗮畀用家睇，而且基本上會有齊嗮寫程式架生嗰啲主要功能，包括除錯器、手稿語言同埋源碼編輯器... 等等，令用家有得一站式噉做嗮開發軟件要做嗰啲工作，唔使整整吓轉去第隻軟件度。

例子可以睇吓 Unity 等嘅遊戲引擎。遊戲引擎係設計嚟俾人開發電子遊戲嘅綜合開發環境，會有齊嗮啲畀人用嚟開發遊戲用嘅配套，包括係電子遊戲成日用嗰啲聲效、圖像技術同物理模擬，而且仲會將呢啲嘢擺喺個圖像用家介面當中，（例如）隻 IDE 有若干個視窗，一個視窗顯示手上有嘅檔案、下一個視窗顯示隻遊戲個虛擬世界、下一個視窗用文字型式列出個世界有嘅物件同每件物件嘅名... 呀噉。

## 睇埋
*軟體開發套件
*程式語言
*cmd.exe
*用家體驗
*用家創新
*軟件建造
## 文獻

*Delahaye, M., & Du Bousquet, L. (2015). Selecting a software engineering tool: lessons learnt from mutation analysis (PDF). *Software: Practice and Experience*, 45(7), 875-891.
*Gray, J. P., Liu, A., & Scott, L. (2000). Issues in software engineering tool construction. *Information and software technology*, 42(2), 73-77.
*Kernighan, B. W., & Plauger, P. J. (1976). Software tools. *ACM SIGSOFT Software Engineering Notes*, 1(1), 15-20.
*Yoon, Y., & Myers, B. A. (2011, October). Capturing and analyzing low-level events from the code editor. In *Proceedings of the 3rd ACM SIGPLAN workshop on Evaluation and usability of programming languages and tools* (pp. 25-30).

## 註釋

## 引用

## 拎

*寫程式工具，Techopedia
*20 最好嘅軟件開發工具（2022 年嘅分級），Software Testing Help