程式語言

出自Reko Wiki
跳至導覽 跳至搜尋
有關Reko Wiki的緊急聯絡可以電郵至crossbonegod@gmail.com或
直接聯絡Facebook專頁
凡加入Reko Wiki之註冊者,請先閱讀Reko Wiki使用須知條目。

已有編輯動作之編輯者會被視為已閱讀該條目。

使用須知可能會因應不足之處或爭議行為而有所擴充,請各編輯者隨時注意使用須知條目。
為保護條目,現時須註冊並確認電郵才能夠進行編輯,敬請原諒。
歡迎各位新註冊的編者一同加入Reko Wiki的Discord群組一同討論
程式語言/Programming Language

解說

  • 為了在電腦上撰寫程式而使用的指令集,因為有一定規則故可分類為「語言」的一種
  • 一般分為低階語言與高階語言
    • 低階語言就是機械執行的語言,基本上CPU可以即時理解並進行處理的語言
      • 由於CPU是電子元件,能直接處理的就是二進制的0和1,故直接用二進制去寫的稱為機器語言(Machine Language)。
      • 而把機器語言的每條指令指定一個名字(例如令「add」代表加法),即得到組譯語言/匯編語言(Assembly Language)。
      • 上面兩種并稱低階語言。
    • 以下所談的基本上都是屬於高階語言的範疇,也就是「人類比較能輕易看懂」的程式語言。
  • 現今的程式語言分為三種類型:指令式程式設計、物件導向程式設計以及函式型程式設計
    • 指令式程式設計(Imperative programming)顧名思義就是一個指令一個動作,包含一些簡單的邏輯指令,大部份的程式都屬於這種。
    • 物件導向程式設計(Object-oriented programming)是進一步去將眾多指令包裝為一個物件,並增加像是:
      • 繼承(Inheritance):繼承一種/一個物件使這個新物件擁有同樣的方法與屬性,但又可以在這上面衍生出更多方法與屬性。
      • 封裝(Encapsulation):將部分方法與屬性給「黑盒子」[1]
      • 多型(Polymorphism):藉由繼承,讓不同類型的繼承物件對母物件的方法做不同的實現[2]
        • 其實也有不依賴繼承的多型。例如名曰加法,兩個整數相「加」與兩個字元串相「加」就大不一樣,前者是數學的加法、後者是兩個字串前後接成一個長串。嚴格來講這也是一種多型。
      • 抽象性(Abstraction):將一些難以定義的方法不做任何動作的方式抽象化,由繼承的物件去實作這個方法[3]的特性。
    • 函式式程式設計(functional programming)則是將一個個方法都視為數學上的函式
      • 除了對傳入的數值進行運算外,數學的函式是沒有多餘操作過程的,因此這種語言寫出的程式可以用數學的手段加以驗證。
        • 但真正的程式總要給人用,給人用就要把資料傳入傳出,而天底下找不出一種數學運算能把數字印在紙上螢幕上,所以這種語言到頭來要麽沒法實用化、要麽必須引入不是函式的東西。


  • 不過這只是個大略分類,並不代表所有程式語言必定是這三種類型的其中一種,例如JavaScript本身就是使用函式(Function)卻兼濃厚物導氛圍的一種奇妙語言
    • JavaScript以函式來代表物件,但又使用「原型(Prototype)」的概念去營造出物件導向的概念。[4]
    • 另外還有使用稱作鴨子類型[5]的設計概念,也是和許多注重繼承的程式語言較為不同的概念。
  • 為了在機器上執行,高階程式語言都會帶有編譯器(Compiler)或直譯器(Interpreter),將程式變成低階語言再交給CPU去執行。
    • 更後來的程式語言為了避免因為程式忘記釋放記憶體空間造成程式跑一跑記憶體不足(俗稱記憶體流失/Memory Leak)的問題,會引入「垃圾收集器(Garbage Collection,一般俗稱GC)」的機制來定時清除不再用到的變數來釋放記憶體空間。
    • 近年來GC的處理速度以及是否會影響到正在執行的程式就成了程式語言分高下的關鍵要素
      • 因為GC是在背景定時偵測變數是否不再使用,故開一個程式的時候,其實都是開兩個以上的執行緒(Thread),CPU若只有一個的話會必須在這兩條執行緒中間快速切換[6]
      • 一旦GC需要運算的時間太長,就會阻礙到前台程式的執行而讓系統看起來跑得很慢。
        • 也因此GC不能運用在要求高度實時響應的系統中,例如工業控制。[7]
      • 而GC如何判斷變數已經不再被使用,也有各種運算方式。
    • Java一直被嫌速度慢,某原因上是其GC執行方式會影響到前面正在執行的程式
      • JavaScript本身也類似,不過近年來在直譯器不斷演進的狀況下,現已經出現V8引擎為基礎的node.js可當作伺服器端程式語言使用
  • 關於直譯編譯的差別,大致可以用這樣的比喻來說明:
    • 假使有一本英文撰寫的紙本原文書(高階語言)要被翻譯成中文(可執行語言),可能會有這幾種方式:
      • 編譯器類型的程式語言會直接由翻譯把英文翻譯成紙本的中文書,好處當然是翻譯後就可以馬上閱讀(執行),但缺點是當原文書改版時,即使只是小改版或者是換個語言都要重新翻譯出一整本的書,無形中增加不少成本。
      • 直譯器類型的程式語言則像是直接由一名翻譯站在讀者旁邊即時翻譯給讀者聽。好處是改版時就能馬上對應,不過因為每次都要重新翻譯,一旦是個用詞艱深且塊頭超大的磚塊書的話,那麼直譯器的速度就會變得很慢[8]
      • 而像C#、Java之類先編譯成中介語言(多重翻譯)的方式則是原文書先由第一名翻譯讓他先翻譯成他與第二名翻譯都熟練的語言(如英文翻成日文),再由第二名翻譯像直譯器類型一樣站在讀者旁邊一邊翻這本由中介語言撰寫的一次翻譯本一邊現場翻譯給讀者聽。好處是一次翻譯本因為轉換為比較容易解讀的語言,直譯器的速度會比較快,偏偏Java的大問題就真的是直譯時太慢了
        • 這類中介語言的優點在於由於每家廠商與每種架構的CPU採用的操作介面不同[9],若是每次都要由開發者針對不同的平台產出對應的程式不僅花時間也難以維護,因此以

先編譯成中介語言再由平台上的直譯器翻譯為平台可執行的CODE的狀況下,程式開發者可以專注於開發所需功能而不需管如何讓每個平台都可以展現出一樣的效果。


框架

  • 原文為Framework,是以一到多種程式語言撰寫的組件規範
  • 雖然程式語言本身可以做許多功能,但在特定的方向上為了輔助開發者,因此用來作為程式地基的框架(Framework)就誕生了。
  • 一般來講,從最基礎,用來開發網頁介面的Bootstrap/Foundation(採用CSS和JavaScript)、React/Vue/Angular.js(JavaScript,牽涉前端控制端),到連後端資料庫操作介面都包含的Wordpress(基底為PHP)甚至是作為網頁伺服器的Ruby on Rails(基底為Ruby)都是框架的一種
    • 正確來講,框架並不是程式語言,而是用來簡便使用程式語言的方式,要打個明確比喻的話,會比較接近Office軟體內附上的文書範本。


現實存在的程式語言

通用計算語言

語言名 創造者 主要用途 備註
Fortran
(FORmula TRANslation)
John Backus & IBM 數值計算 最早的程式語言,語法接近數學算式,執行效率很高。
由於過去數十年累積了大量的程式碼/庫,直至現在仍有新版本推出,作為超級電腦的常用語言。
C Brian Kernighan、Dennis Ritchie(K&R 驅動程式等基礎程式 由於過於簡單,不適合用在比較高階的程式
但因可直接影響硬體運行和修改記憶體資料,因此現多作為驅動程式的編寫語言
其語法規則產生出了許多子集
Objective-C Brad Cox、Tom Love Mac OS與iOS APP開發 衍生自C語言,差不多是蘋果公司專用語言,雖然過去較少人用,但因為iOS APP限定使用此語言開發,現今使用者也不少。
Swift 蘋果公司為了取代Objective-C而研發的新一代程式語言,語法比較接近JAVA、C++等語言,也因為取消了指標等C語言特性而減少了許多錯誤的發生可能
C艹
C++
Bjarne Stroustrup 從驅動程式等基礎程式到游戲編寫等高階複雜應用 衍生自C語言,作為比C高階一點的程式語言
2000~2010年代的PC遊戲幾乎泰半都是用這個程式語言撰寫,目前因為Unreal3D引擎免費化,也還是有不少遊戲使用。
公認的易學難精,即使是編譯器的作者也要為這門語言頭痛。[10]
Java SUN公司→Oracle 跨平台程式、Android APP 受C++啓發[11],以跨平台為號召的程式語言,但因為實際上是先編譯成中間程式碼,然後再透過該平台的編譯器編譯成實際的程式碼,因此早期電腦速度不快的時候執行的速度就更慢
現時Java編譯器主要有兩個分枝,一個為非開源的JDK,另一個則是開源的OpenJDK,前者多用在Windows環境中,後者則多用在非Windows環境中,現時兩者皆為Oracle所持有
此外Google因為實際上是未經授權就直接取用原本Java的程式庫來當作Android的開發工具,因此後來跟買下SUN公司的Oracle打了好陣子官司,最後Google把背後的Java引擎替換為開源版本的OpenJDK而解決
Python 吉多·范羅蘇姆 跨平台程式,數據分析 傳說中以一個星期就寫成的程式語言
主要的設計理念是要「優雅」、「明確」、「簡單」,就算是複習如AI學習和數據分析也能在數十句內完成
C# 微軟公司 .NET平台程式、Windows桌面開發、Windows Phone APP開發、Unity3D遊戲 屬於.NET平台的主要程式語言,不過在現今Unity3D遊戲引擎快速興起的情況下,也擁有不少使用者。[12]
Basic
(Beginners' All-purpose Symbolic Instruction Code)
John G. Kemeny、Thomas E. Kurtz 基礎程式 與C是同樣等級的遠祖程式語言,以容易上手並且容易閱讀為特點
Visual Basic
微軟公司 Windows程式、.NET平台程式 衍生自Basic,由於推出當時是少數能夠用視窗介面直接安排控制項位置的開發環境,過去有不少人很愛用,其簡化版VBA/VBScript廣泛用在Office巨集與ASP開發上
現時微軟官方已不再推動發展Visual Basic,只有限度為Visual Basic作出維護
Perl Larry Wall 腳本 腳本語言中的瑞士軍刀,什麽都能寫、寫成什麽樣子都可以。人送外號「只寫語言」。
Ruby 松本行弘 腳本:RPG製作大師(XP~VX ACE)、網頁伺服器 由日本人創造的語言,現今亦有Ruby on rail這樣的網頁伺服器架構
Lua Roberto Ierusalimschy、Waldemar Celes Luiz、Henrique de Figueiredo 腳本:Shiva3D、遊戲腳本檔,如《軒轅劍外傳:漢之雲》等 因為語法簡單,容易與其他語言整合,許多遊戲會利用此作為遊戲使用的腳本檔。
JavaScript EMCA協會 腳本:網頁的執行代碼

雖然名字有Java,但實際上跟Java語言無關,只是借了Java的名字來推廣而已。正式名稱是「ECMAScript」(的一種),目前最新版本為2016年6月發表的第7版。
跟一般程式語言相比有些微妙的部分在於函式在搭配原型後也可以直接當成一種物件使用。此外在5版開始加入了原先僅作為保留字的class(類別)和與之相關的繼承功能,不過這也僅是將先前的Prototype繼承鏈包裝起來的語法糖
雖然作為網頁背後的客戶端的通用程式語言,但會因各家瀏覽器實作的子集不同,同樣是叫JavaScript但實際上還是有一些差異
為減低開發難度,很多開發者會在JavaScript的基礎下開發出不同的程式框架,例如jQuery和React

jQuery John Resig 嚴格來講比較接近可供利用的函式庫,採用CSS語法來選取目標後對目標進行操作的方式,除此之外還擴充了許多舊版瀏覽器上使用不方便或者是沒有的功能,像是AJAX的支援與ForEach迭代方法等等。
由於使用上相當簡便[13],外加相容眾多瀏覽器也有許多架構在其上的框架,因此問世至今仍舊是世界上最多人使用的函式庫
JSX 搭配React框架而開始廣為人知的一種語法,可以直接在JavaScript中使用HTML標籤描述外觀[14],實際上是一種語法糖[15],執行時會由編輯器將其轉換回JavaScript的標準語法
node.js Node.js Developers 脚本:網頁、伺服器端程式 JavaScript的子集,使用Google用於Chrome上的V8引擎,特性是大量使用回呼函式[16]來處理異步[17],也因為其架構簡單和可用模組(module)與模組包(package)來增強功能,現今已經有不少使用者
其實就是個依附於特殊定製版執行引擎的JS,而模組與模組包的語法更在之後被正式納入ES5標準。
Type Script 微軟公司 同上是JavaScript的子集,但以可以加速執行效率[18]、並可直接編譯為能夠使用的JavaScript作為號召
PHP Rasmus Lerdorf 網頁:網頁生成、伺服器端程式 網頁背後的伺服器端程式語言,用以製作動態的網頁。
吸收了C、Java和Perl等流行電腦語言的特點。

標記語言

語言名 創造者 主要用途 備註
XML
(eXtensible Markup Language)
全球資訊網協會 資料存儲:文件檔、Android APP介面檔 屬於標記語言SGML的簡化版本。

雖說平常會接觸到的機會很高,但使用者不容易意識到。像是HTML(語法嚴格時,亦即XHTML)就是XML的子集、 office 生成的 .docx、.xlsx、.pptx等檔案也有使用到XML……
多數程式語言會利用這個標準格式來儲存必要的資料
曾是網路資料傳送的標準格式,後來被JSON搶走位子。

HTML
(HyperText Markup Language)
全球資訊網協會、網頁超文字技術工作小組 網頁 同XML,屬於SGML的簡化版本,重要的特性之一是標記不僅有自我描述功能,還帶有外觀的設定,全世界的網頁全部都是用這個語言編寫的,目前最新版本是HTML5。
XHTML 全球資訊網協會 就是HTML,只是要求更嚴謹,例如不允許標籤(tag)沒有閉合[19],特性是更標準化、更嚴謹,以及規格更往XML方向偏過去,說白了就是符合XML規範的HTML

另外,XHTML1.0 和 XHTML2.0 雖然都稱之為 XHTML ,但是是兩種不同的東西。通常說到 XHTML 都是指前者;後者是已經被放棄開發的事物。

XAML 微軟公司 GUI安排:WPF程式、Silverlight程式、Windows Phone APP開發、Windows 8 APP開發 XML的子集,主要用在程式介面安排上,需要後端程式碼(如C#、Visual Basic等)來輔助產生組件
JSON EMCA協會 嚴格來說只是JavaScript的物件標記方式(在JavaScript中被稱作實字標記),因為只有物件(嚴格來說是函數)與陣列兩種形式,不僅可以直接被JavaScript解讀拿來用,加上其可以在較短的長度內描述大規模的物件[20],因此成為目前網際網路程式中交換資料的主流。[21]
缺點是不易為人類直接讀懂。
LaTeX 萊斯利·蘭伯特 學術論文編寫 把排版和內容分開處理,並能輕易生成複雜表格、數學公式、化學式、電路圖等
Pure Wiki標記 網頁:2017年以前的糟糕島維基等使用同系統的維基條目編輯語法 基本上比起語言還比較偏向是不成語言的標記,這點XML其實也是一樣
Media Wiki標記 網頁:目前的糟糕島維基、維基百科與萌娘百科等使用到MediaWiki系統的百科

遊戲程式語言

語言名 類似或基底語言 主要用途 備註
RGSS RUBY 與其說是類似Ruby不如當成一種以Ruby撰寫的框架比較好。
最新版的MV則改用JavaScript作為基底語言
東方彈幕風 C++ 彈幕遊戲製作
http://studiopixel.sakura.ne.jp/ C++ 洞窟物語 FC版的洛克人7、8代,是參考本作的程式
Unity Script JavaScript Unity3D遊戲開發 不過Unity Script簡單之餘、可使用的功能較少且跨平台能力較弱,因此大部分使用Unity3D的遊戲基底程式碼仍是使用C#,而官方目前也宣布將在Unity 2017以後的幾個未來版本內正式停止對Unity Script的支援。
Joker Script 依附在Unity3D底下的外掛框架JokerScript的腳本語言,特化在2D AVG遊戲上,基本上AVG的功能一應俱全,且能自行以C#開發需要的功能。

回應

Loading comments...

備註

  1. 例如部分物件可能會有內部運算用的屬性與函式,封裝起來後外部只能使用其公開出來的屬性與函式;打個比方來說,你就算不知道洗衣機內部構造如何,還是可以把衣服丟進去洗一樣。
  2. 如狗跟貓都是會叫的動物,但叫聲完全不同,以物件導向來說就是他們都從「動物」這個物件繼承了名為「叫」的方法,但是他們用不同的方式去實作同個方法。簡言之就是「同名不同事」。
  3. 以上面的動物例子來說,人、貓、狗同樣是會叫的動物,但方式都不一樣,如果用同樣的來說,就是「動物」這個物件中的「叫」這個方法為空白並設定成抽象化,再由繼承「動物」物件的人、貓、狗去分別「啊」、「喵」、「汪」。此外,將一個基底類別抽象化代表你可以在必要的時候隨時將子物件轉化成母物件來使用,例如預設活動範圍,參數為一個動物時,如果不透過基底物件,就變成每種都要寫一個方法、既不實用也很耗時;若設成使用一個抽象範本作為參數,就能將程式碼減少到最少。
  4. 說白了這就是在原型繼承的基礎上強行加了類繼承。
  5. duck typing,源於James Whitcomb Riley提出的理論,定義是「當看到一隻鳥走起來像鴨子、游起來像鴨子、叫起來像鴨子,那就可以被稱為鴨子。」用在程式上就是「不管操作的東西,是繼承還是隸屬於哪裡,反正只要是支援的運算方法相同(像屬性、函式),那就是可以拿來用的東西」之意
  6. 雖然近年來多執行緒已經是常態,但實際上若你只有一顆CPU,多執行緒的執行方式是在單顆CPU上快速切換執行緒,好讓使用者有「看起來像是多顆CPU在跑」的錯覺,事實上仍然是一條單執行緒
  7. 經典笑話:垃圾收集器不能用在垃圾處理廠。
  8. 對機械語言而言,高等程式語言的用詞對機器來說是艱難的;不過對人類而言反而是高等程式語言較容易閱讀。
  9. 目前的趨勢是分成x86和ARM兩種平台,前者是家用電腦,後者多用於手機等攜帶產品
  10. 大概是唯一一門語義反過來影響語法結構(嵌套template的連續>)的語言。
  11. 說Java衍生自C++的全都給我流放爪哇島!
  12. 要注意的是隨著.NET的平台不同,可使用的API也有差別,因此雖然美其名可以跨平台,但實際上.NET的程式若要跨到另一個平台,需要重寫不少腳本可說是家常便飯,並沒有那麼容易;不過近年來隨著微軟認真注意Windows以外的平台,加上併購Xamarin後,倒是開始整併.NET的核心API,讓改寫的問題有減少的趨勢。
  13. jQuery基本上語法只有兩個:用$([選擇器]).[方法]()來選擇欲操作的目標後進行操作,而大部分的方法因為回傳的是jQuery物件還可以串接起來一口氣做相當多的工作;又或者是以$.[方法]()來進行單純、大致無涉網頁介面操作的變數操作
  14. 但為了避開JavaScript的保留字,因此指定樣式的class改用className屬性,Label標籤中用來指定點擊時將焦點放至於哪個表單物件上的for屬性改為htmlFor屬性
  15. Syntactic sugar,由英國計算機科學家彼得·蘭丁發明的一個術語,因為科技始終來自於人性本懶為了避免過長的描述與隨之導致的拼錯字、難以解讀的問題,所以由程式語言設計者添加的一種能讓程式設計師簡單使用的語法,實際上運用時會在編譯器中自動將這些語法糖「去糖」轉換回本來該有的語法
  16. Callback,意指讓被呼叫的一方反過來呼叫的、由呼叫方提供的函式。
  17. Asynchronous,一般會翻成「非同步」,不過是指同時間可以多條執行緒做不同的事情,與其相對的同步(Synchronous)反而是指同時間只能處理一件事情。實際上這兩個用語真正的意思是指呼叫的發起者是/否不必等待被呼叫者執行完
  18. 例如使用false||x的方式令執行引擎直接把x當作布林值對待、省去判斷其真實型別的時間。
  19. 例如換行符號<br />,必須寫成<br />,寫成<br>(中間沒斜線)是錯誤的。
  20. 用Word的字數計算功能算一下「<Types><Type>A</Type><Type>B</Type></Types>」和「{"Type":["A","B"]}」哪個比較長就知道JSON的好處在哪了。為了爭取時間以及避免中途斷線,基本上網際網路傳送資料是越短越好
  21. 不過正也因為其可說直接等同JavaScript(甚至物件可包含可執行的函式),因此使用上會有安全性的問題,一般來講會避免使用eval函式直接轉換成可用的物件,而是以JSON.parse()來解析物件,並以JSON.stringify()來將物件字串化。