程式人間倘若談到程式語言之間的比較話題,無論比較的是那個較好、那個最重要、或者應該學什麼最有幫助,總是引起無止盡的論戰,而且難以止息。

這樣的話題就跟日本車、歐洲車孰優孰劣一樣,每個程式語言總有基本支持群眾,爭論時往往各執一詞,使得這樣的討論主題,很難歸納出結論。

程式語言的選擇,沒有絕對的論斷方式
每個程式語言背後皆有設計的中心思想及哲學,而且也都隱含著一套表述方式。每個程式人都有自己偏好的程式語言,而之所以會有偏好,和學習程式語言的經驗、過程,以及個人特質有關。

在早期雖也有許多程式語言的發明,但實際上用於一般軟體開發,選擇並不多。到了現今,百家爭鳴,一般程式人可以接觸到的程式語言數量遠勝以往,對於究竟該學習,或該採用那一個程式語言,可以抉擇的空間又大了許多。

以我的觀點來看,程式語言間的比較,其實是不具太多實質意義的。倘若程式語言對你來說是一種純粹的嗜好,並不存在太多開發上的實務考量;僅以欣賞或喜好的心情看待一個程式語言,甚至做為擁護者,那麼選用哪個程式語言,就完全是一個由個人愛好決定的事情。但如果要選擇一個程式語言去開發真實的專案,那麼需要考量的事情就複雜許多。
事實上,每個語言都有它特有的性質,發明者在設計程式語言時,多半都訂定了一定的目標範圍,以及想要解決的軟體開發問題。隨著程式人的實際應用以及語言本身的逐漸演化,每個語言都會被發掘出適合的應用領域。

沒有一個程式語言是打遍天下無敵手的,都有各自的優點和缺點。優點的另一面往往就是缺點所在,例如Java的垃圾收集機制,簡化了程式人配置、釋放記憶體的模式,因為犯下錯誤存取記憶體的問題,而耗去的除錯時間也大幅降低了。

但是,也因為垃圾收集機制的關係,使得Java虛擬機器的設計更形複雜,也影響到Java虛擬機器執行時期的效率。

你所開發的應用程式,或許可以接受現今Java虛擬機器的運行效能(事實上,Java虛擬機器的運行效能,應當足以開發大多數我們會接觸到的應用程式),而選擇使用Java,即可避免無形中的錯誤,藉以提升開發生產力。

但如果你所開發的程式極需執行效能,例如多媒體視訊或音訊的解碼器,便可能採用像C或C++之類的程式語言,甚至使用組合語言。
這種應用情境下,開發生產力不是關鍵,因為執行效能已經成了必要的門檻。所以,選擇程式語言,其實只是取與捨的判斷,優劣、好壞不過都是相對的特性,而沒有絕對的論斷方式。

優秀的程式人不應受限在特定程式語言
程式語言也有流行的情況,你或許觀察到新問世的程式語言,有時能引起一陣風潮,讓程式人們爭相追逐。但不可諱言的是,即使一個程式語言能引起短暫的流行,但需要經過殘酷的考驗才得以生存下來。而歷時多年尚能存活至今的程式語言,都具備了賴以生存的重要特性。與其爭辯程式語言的好與壞,不如放開成見,了解每個程式語言的特性,理性分析適合做什麼,以及不適合做什麼,才能客觀地選擇。

優秀的程式人應當是程式語言中立的(Programming Language Neutral),也就是說,你或許會專長、熟悉若干個程式語言,但因為開發上的需要,你可以很容易學會、適應其他的程式語言。也就是說,從事開發工作時,並不會被特定的程式語言所限制住。

最起碼,你必須熟悉多個程式語言,並且能夠自在地運用。主流的程式語言思維模式不出幾類,例如程序式、物件導向式、函數式,或者混合模式等,同一類的語言間,即使語言語法或特性有所差異,但畢竟是源自於相同的血統,觸類旁通並不是件難事。

例如C++、Java以及C#,皆為一脈相承,尤其是Java和C#,二者相互模仿,熟悉Java的程式人,必能在極短時間熟悉C#,甚至應該不經太多的訓練,便能輕易地讀懂C#程式碼。能以多種程式語言編寫,已然成了優秀程式人的判斷標準之一。

當你具備了以多種語言編寫程式的能力,就能夠(也應該)依照需求而非喜好來選擇程式語言,你也不會固定只採用一種程式語言撰寫程式。這已經是一個多語言開發的時代了。當你開發某個服務和產品時,時常會需要動用多個程式語言。

或許你會利用Java開發伺服器端,利用C#開發客戶端的GUI部分,但利用C++開發客戶端的核心程式庫。選擇採用一個程式語言,是因為它最適合應用在你要應用的地方,而不是因為你最喜愛它。

程式語言的選擇,要考量團隊與專案的特性
那麼應當如何選擇程式語言呢?通常這是一整個團隊針對要開發的專案而做的決策,因此必須考慮到所有成員的技能特性。程式語言的選擇不單是個人化的,更是團隊化的,主要都會依據專案本身的特性及目標,決定欲使用的程式語言。你首先可能會考慮到客戶選用的平臺,或者產品所設定的平臺,有些程式語言基本上只在某些平臺上可用,例如.NET上的程式語言,實務上只能在Windows的作業系統上執行。

除了平臺之外,你會考慮到執行效能,有些系統元件必須滿足執行時間或者服務規模的限制,對於這些元件,必須選用效能表現足夠的程式語言。

而開發的生產力也是很重要的考量因素。專案都有執行的期限,面對時程緊迫的網站應用程式,你或許會考慮以Ruby程式語言,搭配RoR應用程式框架,做為程式語言的主軸,以善用RoR的高生產力。
在提供.NET的Windows平臺上,選擇C#之類開發GUI,生產力多半能勝過VC++搭配MFC。

此外,開發程式的穩定度、支援的程式庫豐富與否、或者是否提供你所需的程式庫,都是選用時必須考慮的條件。

混用多語言的情況,越來越普遍
此外,在同一系統中混用一種以上程式語言,已經越來越常見,這使得我們能更輕易地善用每個語言的優點,規避掉持定語言的缺點。採用多語言開發時,還必須考慮所選用的程式語言是否能夠相互整合、整合的方式、介面是否滿足需求及限制條件等因素。

例如使用Java做為主要的開發語言,又想使用C語言撰寫需要高效能的模組時,就必須考慮使用JNI(Java Native Interface)做為二者介接的方式,但又會失去平臺的可攜性,決策者就必須有所取捨。

當兩個備選的程式語言條件勢均力敵或是相差不遠時,應該選擇自己較熟悉的。對程式語言的熟悉度,能夠避免許多因為陌生而造成的不必要陷阱,也可以省去許多無謂的時間浪費。

與其擔心落伍,不如掌握語言的共通之處
許多程式人會擔心某個語言是否會退流行,或者是擔心沒有趕上最新流行的程式語言會讓自己淘汰。我的看法是,與其擔心跟不上最新的趨勢,不如想想如何掌握不同程式語言的共通之處。

主流的程式語言思維模式其實不脫幾類,而且甚至以物件導向與程序式混合的程式語言為主。如果你熟悉這種表達方式,而且要同時操作不同的程式語言,其實多半只是語法及細節的特性不同,跨多語言其實不構成太大的問題。關鍵往往不會是在語法,而是在你怎麼執行抽象層次上的設計。

與其爭辯程式語言孰優孰劣,不如更自在、更恰到好處地運用多種程式語言。

作者簡介:
王建興
清華大學資訊工程系的博士研究生,研究興趣包括電腦網路、點對點網路、分散式網路管理、以及行動式代理人,專長則是Internet應用系統的開發。曾參與過的開發專案性質十分廣泛而且不同,從ERP、PC Game到P2P網路電話都在他的涉獵範圍之內。

熱門新聞

Advertisement