2023年4月20日 星期四

第一次學程式,到底該選哪個語言? 30年資深工程師的心得


文:戴玉佩 精誠資訊/恆逸教育訓練中心資深講師

先說明一下,這是要給有志成為應用系統軟體開發人員的建議。

如果您想成為這樣的專業人員,不管原來在大學是不是資訊專業,打算此時此刻正式開始從頭學習,投入軟體開發漫漫數十年的開發人生。這樣的您要選擇哪一個程式語言才能贏在起跑點呢?其實這只要觀察將近70年的電腦程式語言發展史,就可以清楚地找到答案-Java。 

首先以中高階程式設計的運作來看。基本上任何的程式語言都要依據該語言的語法規則撰寫並存入文字檔案。每一種程式語言的原始程式碼檔案的延伸檔名各不相同,程式內容當然也有所差異。但是文字檔案的內容是無法在電腦作業系統運作,因為各個作業系統的執行檔案都必須是二進位的位元資料。因為電腦無法直接處理這些文字,所以這些程式都需要先編譯成電腦可以運用的位元(二進位)資料,才能執行。要將程式語言的文字原始碼變成可執行的位元碼,有兩種方式,一種是在執行前將所有要用到的程式碼都先轉成可執行的位元檔,這種稱為編譯式語言,另一種看起來不需要編譯就可以直接執行的稱為直譯式語言。

 

編譯式語言、直譯式語言分別介紹如下:

l   編譯式語言(Compiled Language):這種語言在執行前必須先透過該語言專用的編譯器(compiler)將程式碼編譯(Compile)成特定作業系統看得懂的二進位原生碼(native code)才能執行。作業系統的native code大不相同,所以編譯式語言一旦編譯完成後,就不能跨平台執行。但是編譯式語言的語法較為嚴謹,宣告變數與方法時必須宣告變數型別與方法的參數和回傳型態,還有提供錯誤處理等。compilier也會依據型別檢查語法,若不正確就會發生編譯時期錯誤而無法產生native code。但若編譯成功,native code執行速度流暢迅速的優點,對於要求快速又安全的大型應用系統,是一個較為理想的架構。

知名的編譯式語言有:Fortran、COBOL、C、C++、Pascal…等。其中Fortran(1957年推出)、COB
OL語言(1959年推出)開發的系統,至今都還廣泛的使用中。 

l   直譯式語言(Interpreted Language):不同於編譯式語言,直譯式語言好像可以不用先編譯就可以直接執行,但其實是在執行前把一行文字程式編譯並執行,然後再處理下一行,用這樣逐行地動態直接編譯後立刻執行,故稱為直譯。因為無須事先編譯,直譯語言也稱為動態語言(Dynamic Language),具有靈活的型別處理與自動型別轉換機制,語法規則也相對直覺好學,而且只要作業系統有提供直譯環境,該直譯式語言的程式碼就可以在這個平台執行,也算是某種程度的跨平台。但缺點是,速度會比編譯式語言要慢得多。而且靈活簡單過度的語言結構也常常變成鬆散雜亂,甚至在執行時期發生難以偵測的錯誤。再加上沒有Compilier在編譯程式時提醒開發人員,語法錯誤就只能靠程式人員自己用眼睛找了,所以比較適合小型應用系統,或簡單測試用。

知名的直譯式語言有:JavaScriptPythonRuby …等,甚至最早的BASIC語言(1964年推出)也是直譯式的語言。雖然後來在微軟將BASIC引入Visual BASIC(1991年推出)做為Windows OS視覺化應用系統開發的主要語言,且Visual BASIC 4.0後改為需要編譯,雖不是編譯成native code而是VB特殊的p-code,以提升執行時的效能,甚至VB.NET也加入完整的物件導向設計,但VB核心還是有直譯式語言的根本問題,再加上VBVB.NET都只能在Windows平台執行,許多多年前以VB/VB.NET開發的應用系統,最近都面臨難以維護/除錯,甚至跟不同版本的Windows平台不相容等問題。 

l   編譯+直譯式語言:其實從上述介紹就可以看到VB後來也變成一個編譯+直譯的程式語言,目的是為了提升效能。而1995年出現的Java程式語言,則是直接在規格中宣布了它的編譯+直譯運作機制,目的是為了提供跨平台的解決方案。所以Java程式語言編譯出來的不是Native Code,而是Java自訂的Byte Code。執行Java Byte Code時,作業系統平台要安裝Java Runtime環境,由JVM直譯Byte Code後交由作業系統執行。此外Java也去掉了C++中比較用不到又繁瑣的設計,這樣相對簡潔又可以跨平台的機制,讓程式人員的開發環境與客戶的線上環境可以使用不同的作業系統也可以順利運作,是非常務實的做法。

目前,編譯+直譯式語言知名的有JavaC#VB(包含VB.NET)
只可惜,微軟的C#VBWindows作業系統中特有的Visual C++程式庫勾結太深,所以無法跨平台到Windows以外的作業系統。

 

程式語言除了編譯、直譯式的差別外。語言設計結構也在70年代後期到90年代初期有了重大的變化,在原本程序式語言設計(Procedural programming)上,模組化設計逐步興起,甚至出現了物件導向程式設計(Object-oriented programmingOOP)

從程式語言指標性的統計網站:TIOBE INDEX來看,從2000年開始,熱門程式語言排行榜前五名中除了C語言沒有物件導向,其他都是物件導向程式語言。當然所有的物件導向程式語言也還是保有原來程序式語言設計的部分(C++其實就是把C語言再加上物件導向)

為什麼這些語言都要加上物件導向設計呢?不是因為OOP比較簡單,也不是執行效能更快速!寫過物件導向設計就知道,OOP學習門檻較高,物件運作機制還要用到大量HEAP記憶體,所以記憶體管理也複雜很多。

但是,物件導向設計透過類別與繼承架構提供強大的擴充性,利用Overriding MethodPolymorphism讓系統維持各版本之間的相容性,再藉由物件轉型讓子類別新功能也得以發揮。藉由抽象類別與介面設計,提供嚴謹又不限縮的規格。再加上Encapsulation機制,提供好的Code Securities。集中管理檢查邏輯,維持修改的一致性。

 

有趣的是,除了Java程式語言,這些程式語言的教材中,對於物件導向設計的說明少之又少!使得除了Java之外的程式人員普遍都無法確實正確運用物件導向設計,所以寫出來的程式庫相容性就很差。以資料庫存取程式的API程式庫而言,除了JavaC#對於不同廠牌的資料庫有用到物件導向設計的程式庫標準,再交由資料庫廠商實作,所以用JavaJDBC程式庫或.NETOLE DB程式庫都可以存取各種不同的資料庫而不需改寫。

Python就不是了,因為沒有好的標準,目前Python不同的資料庫就有完全不同的程式庫,所以等於是換資料庫就要重寫。所以其他程式語言只要寫一段時間,不相容的缺點被發現,就會排名下降,Java也才能在這23年間都保持TIOBE Index前三名(只有在2022/12~2023/02被擠到第4),甚至大部分都在第一名。 

因此若想要確實了解好的物件導向設計,也只剩下Java程式語言能達成這個目標。而且在Java學好的物件導向設計,拿到任何其它程式語言,只要是物件導向,設計原則、技巧通通一樣。所以學會JavaC#Python可以無師自通,大概只有CC++的指標設計比較難一點,但也好學許多。 

這也是我身為一個資深開發人員,在資工系、資工所學COBOL、學C++Pascal,前10年主要是使用微軟的VB開發系統。雖然我學程式語言時,還沒有Java,但在認識Java後,深深覺得:

        「如果我一開始就學Java,我一定會進步更多更快呀!」

 

以此,與程式開發初學者共勉之!


學習推薦

OCPJP-SE11 OCP認證Java SE 11專業程式設計師課程

UJWADPJava全方位Web程式設計師養成班 

0 意見:

張貼留言