先生可以賞我一個連結程式嗎? Please Sir May I Have a Linker?

作者:周思博 (Joel Spolsky)
譯:Paul May 梅普華
Wednesday, January 28, 2004
屬於 Joel on Software, https://www.joelonsoftware.com/2004/01/28/please-sir-may-i-have-a-linker/

原因不明,不過微軟最先進又很出色的 .NET 開發環境少了一個重要的工具... 一個約 1950 年起在軟體開發環境裡就很普遍的工具,這個工具是理當所然應該有的,真奇怪竟然沒人注意到 .NET 真的沒有。

少了的工具是什麼?就是連結程式啦。連結程式做的事如下,它會把你的程式編譯過的版本,和所有有用到的程式庫函數編譯過的版本結合起來。然後會把你沒用到的所有程式庫函數都拿掉。最後再產生大家可以在自己電腦上執行的單一可執行二位元程式。

.NET用了一個叫 "runtime" 的想法來取代連結程式。這是一大團 22 MB 並會動態連結的程式碼,每個人在用 .NET 應用程式之前電腦上都得先有這東西才行。

Runtime 是個和 DLL 很像的問題,因為版本 1 的應用程式在設計上是要配合版本 1 的 runtime,而等版本 2 的 runtime 出來,版本 1 的應用程式突然間就會原因不明地不太正常,這時候你麻煩就大了。舉例來說我們把 runtime 由 1.0 升級到 1.1 之後,現在公司的控制面板會把銷售數字取成小數點後 4 位的數字。通常不相容的狀況要比這更糟。

事實上 .NET 包含了一個叫 "manifests" 的大型技術系統,這個系統顯然很複雜,本來的用意是要確保各個應用程式只會用到正確的 runtime,不過我認識的人沒有一個知道要怎麼用。

這衍生了一個故事。在 Fog Creek 的新年除夕宴會上,我們要讓主要房間裡的很多電腦螢幕在午夜前倒數。Michael 用 C# 的 WinForm 寫了一隻程式,只用了 60 秒左右。真是個偉大的開發環境。

我的工作是把 countdown.exe 拷到三台電腦上執行。聽起來很簡單。

才怪。在執行檔上連按兩下就看到一個荒謬又神秘的錯誤訊息,說 mscoree.dll 還是什麼東西有問題,然後就是沒有意義地傾印了我的路徑。一點也沒提到問題其實只是沒有安裝 .NET runtime 而已。還好我是個程式師,知道這一定就是問題。

你要怎麼安裝 runtime 呢?「最簡單」的方法是用 Windows Update。不過 Windows Update 一定要我取得所有重大的更新後才能裝 runtime。這很合理,對吧?「重大」更新裡面有兩個分別是 Windows service pack 和新版的 Internet Explorer,這兩個都得重開機。

就這樣,為了要在這幾台機器執行這小小的 .NET 應用程式,我得下載大約 70 或 80 MB(還好我們網路夠快)然後重開機三四次。而這還是在一家軟體公司裡!我知道這花的確實時間,因為我一開始下載就在大電視螢幕上放映上班一條蟲(Office Space),電影放完時也幾乎快裝完了。電影每播十分鐘左右我就得起來,到每台電腦前去按那些笨對話盒的確定按鈕。

這就我們自己用的程式來說已經夠令人沮喪的了。不過再想想我們的產品 CityDesk。我們的使用者幾乎每個人都會在購買前下載一份免費試用版。下載檔案的大小約 9 MB 而且不需要任何其他東西。而這些使用者幾乎全部都還沒有 .NET runtime。

如果我們要求我們的試用者(通常是小型組織或家庭用戶),只為了試用我們的應用程式,卻要經歷整部電影長的痛苦安裝過程,我想我們大概會損失 95% 的潛在客戶。這些人還不是客戶,只是期望的客戶,我實在無法承受只為了一個較好用的開發環境而放棄 95% 的期望客戶。

「不過,」人們會說:「有 runtime 的人數總會變多,最後人數夠多這個問題就不見啦。」

我也這麼認為,然後我瞭解到微軟每六到十二個月就會推出新版的 runtime,於是逐漸增加的已安裝人數又跳回零。如果我得痛苦掙扎在三種 runtime 版本上測試我的應用程式,只為了多那 1.2% 有其中一個版本的客戶,那我還真該死啊。

我只想把所有用到的東西連結成單一個靜態的執行檔,不用先裝任何東西就能執行。我不在意執行檔是否會大一點。我要的只是我實際用到的函數、byte code 直譯器和小小的執行時期程式。我不需要屬於 runtime 一部份的整個 C# 編譯器。我承諾 CityDesk 不會編譯到任何 C# 原始碼。我也不需要全部的 22 MB,我要的最多只有 5 或 6 MB 吧。

我知道有些公司擁有這種技術,不過沒有獲得微軟許可不能重新發送 runtime 裡的資料(如 byte code 直譯器)。所以微軟醒醒吧,給我們一些 1950 年代的連結程式技術吧,讓我可以製作單一個執行檔在 Win 98 及後續系統上執行,而且沒有其他外部關聯。否則 .NET 對消費者下載軟體來說有致命的缺陷。

這些網頁的內容為表達個人意見。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.