2022年11月8日 星期二

『普林斯頓最熱門的電腦通識課』 編程及程式語言

從電腦程式語言的歷史來看,進入門檻越低且容易取得相關資源的程式語言會被廣泛使用。因為我一直是專注在機器視覺與影像處理的演算法與應用軟體開發工作,在這個領域效能是相對受到重視,基本上 C/C++ 就是基本要會的工具,越熟練越好,甚至十幾年前還要想辦法去寫 MMX 加速指令集的組合語言。

當然,現在還是要熟悉 SSE/AVX/NEON 等跟 CPU 相關的加速指令集,才能讓函式功能的效能符合工業界的要求。所以我一直沒有考慮用其他語言來開發相關演算法,導致忽略了近十年來最熱門的 Python

後來因為授課需求,使用 Python 來呼叫自建的函式庫後,非常驚訝它在開發上的易用性以及各種豐富的專業領域函式庫資源,非常適合專業上的學習與實作,類似機器學習、影像處理、機器視覺、數值運算等課程應該都可以導入使用。

同時,因為機器學習與深度學習的推廣助攻,又讓 Python 的能見度更上一層樓,我覺得以後應該會普及到中小學生就開始學習。

從組語式微變成高階語言的天下,再到 Python 的市佔率逼近第一名,都顯示現代程式語言的開發已經轉向重視易用性、安全性及函式庫支援的豐富程度,而非單純講求執行階段的效能。 如同作者所言,現在讓他只能學一種程式,首選是  Python

先前的心得也曾經提到過,現代的軟體開發更重視軟體元件(函式庫)的整合使用與架構,更勝於程式語言本身的特性。雖然因為效率因素,我還是必須使用 C/C++SIMD 加速指令集來開發演算法,但未來授課會以 C/C++ 來進行函式庫的設計與包裝,然後以 Python 來做為驗證與教學用,在應用端降低使用門檻,藉此提高學習意願與效率。 

開放原始碼應該會是各個領域軟體發展的主流,對此我抱持樂觀態度,也許有一天我也能加入這個行列,並藉機了解開源專案要怎麼賺錢?  這也是我的一大疑問阿!


本章節的重點摘要如下:

「程式」具體敘述一台真實的電腦為完成一項工作而必須執行的每個步驟。一個演算法和一個程式的區別,就像一份「建築設計圖」和一棟「建物」的區別;一個是理想化的東西,另一個是真實的東西。

把程式看成用一種讓電腦能夠直接處理的形式來表述一種或多種演算法。程式必須考慮實際問題,包含不充足的記憶體、有限的處理器速度、無效或甚至惡意的輸入資料、有問題的硬體、中斷的網路連結以及「人為疏失(導致其他問題惡化的主因)」

組合語言:當使用組合語言時,組譯器的角色是用來追蹤每一條指令,和每一個資料值的記憶體位置,不需要程式設計師以人工的方式做簿記。

一特定處理器架構使用的「組合語言是該架構專門使用的」,這組語通常和處理器指令一堆一地搭配,它知道哪些指令是如何用二進制編程,資訊是如何存入記憶體。

用組語為特定處理器(Ex. x86)撰寫的程式,將不同於為另一個處理器 (Ex. ARM)的相同工作撰寫的處理器。 如果想轉換程式到另一台處理器就必須重寫。

高階語言:高階程式語言獨立於任何特定的處理器架構之外,亦即非特定處理器架構專用,它的運算表述方式更接近一般人的表述方式。

用高階語言撰寫的程式由一種翻譯程式 (translator program) 轉換成一特定處理器的組合語言指令,再由組譯器轉換成位元,載入記憶體及執行,這翻譯程式通常稱為「編譯器 (compiler)」

實務上,一個編譯器內部可能被區分成一個「前端」和幾個「後端」,前端負責把高階語言撰寫的程式處理成某種中間形式,每一個後端把共通的中間形式轉換成其特定架構的組合語言。

高階語言更接近人們的思考方式,因此更容易使用與學習,不需要知道任何特定處理器的指令集,也能有效地用高階語言來撰寫程式。

因為高階語言的程式獨立於任何處理器架構之外,相同的程式可以在不同的架構下運行,通常不需做任何修改,只需要用一個不同的編譯器去編譯它就行了。寫一次程式可以在不同的電腦上運行,程式開發成本就可以分攤到多種電腦上。

六種最重要的高階語言,Fortran, C,  C++,  Java,  JavaScript,  Python

在電腦昂貴、慢且資源有限的早年,有人擔心用高階語言撰寫的程式效率太低,因為編譯器無法像一位技巧嫻熟的組合語言設計師那樣產生簡潔且有效率的組合程式。今日電腦速度及記憶體皆已為當初的數百萬倍,程式設計師鮮少擔心個別指令的效率。

1973  「C 語言」推出至今,語法只改變了一些,至今仍是最受歡迎及最被廣為使用的程式語言之一。

C++是從 C 演進而來,多數情況下一個 C 語言程式也是一個有效的 C++ 程式

現今在電腦上使用的主要程式,大都是用 C C++ 撰寫的。Unix Linux 這兩個作業系統都是 C 程式,FilefoxChrome Edge 這三種瀏覽器都是 C++ 撰寫的。

90年代,因應網際網路及全球資訊網的成長,「編程速度及便利性變得比機器效率更為重要」Java JavaScript 之類的程式語言就是刻意做出這方面的折衷。

Java 原本是針對內建於家電及電子裝置的小型系統而開發的程式語言,靈活性比速度重要;後來 Java 在網頁伺服器上廣為使用。當造訪一個網站如 eBay 時,電腦跑的是用 C++JaveScript 撰寫的程式,但 eBay 可能是使用 Java 來撰寫它送到你的瀏覽器上的網頁。

Java 也是撰寫 Android 行動應用程式的首選,它比 C++ 簡單 (但也漸漸朝向相似於 C++ 的複雜程度),但比 C 語言更複雜。Java 也比 C 語言更安全,因為它去除了一些具有安全性隱憂的性能,並有內建機制去處理容易出錯的工作,如管理記憶體中複雜的資料結構。

「JavaScript 是源於 C 語言家族中的一種程式語言」,但有很多的差異;JavaScript 和 Java 沒有關係,它的原始設計目的是要用於一款瀏覽器上,以在網頁上達成動態效果;現今近乎所有網頁都包含了一些 JavaScript 程式。

Python 在語法上有些不同於 C, C++, Java 及 JavaScript,它用縮排來表達敘述的開始與結束,而非使用大括號 { }。 

Python 在設計之初就聚焦於可靠性,它易於學習,已經成為最被廣為使用的程式語言之一,有大量用它撰寫的軟體,涵蓋近乎任何你能想到的編程工作。 

若要作者只學習或教導一種程式語言的話,他會選擇 Python

程式語言未來的發展走向,應該是讓程式撰寫更容易以及更安全的程式語言。 「C 語言是極其高效靈活的工具,但它很容易不慎地犯下程式撰寫的錯誤」,在被發現時可能已經被利用於惡意目的。

新的程式語言比較容易防止犯錯,或至少能偵測出一些錯誤,但為此得付出運行較慢及使用更多記憶體的代價。

「緊湊、快速的程式」仍然對很多應用領域如車子、飛機或武器等非常重要,因此仍然會使用 C 語言這類高效率的程式語言

經驗豐富的專業程式設計師,可能稱得上熟練十幾種程式語言,但他們不會對所有這些程式語言都具有相同水準的技能。

軟體開發:作者專案課程的學生以小組方式作業,經常以八到十週的時間交出兩三千行程式碼,這段時間他們需要設計他們的系統,通常是一個容易存取某個大學資料庫的網路服務,或是一款手機應用程式。

函式庫、應用程式介面,開發套件:很少有任何大程式是完全從零做起而創造出來的,有很多現成、他人撰寫的元件可供直接使用。

程式撰寫的工作中,有很大一部分是了解這類元件,以你自己的方式去把它們結合起來

這些元件本身的建造大多也是倚賴了其它更簡單、更基礎的元件,而且往往是幾層的元件。通常這一切都是在作業系統上運行,作業系統程式管理硬體,控管發生的每件事。

在最簡單的層級,程式語言提供一個函式 (function) 機制,讓程式設計師能夠撰寫程式去執行一個有用的運算,再以一種形式包裝這程式,讓其它程式設計師在無需知道它是如何運行的情況下,用在自己的程式中。

函式讓程式設計師可以使用已經被分別建造出來的元件來撰寫程式,所有程式設計師在需要時都可以使用這些元件。

一個相關的函式集合通常被稱為一個函式庫 (Library),例如 C 語言有一個標準的函式庫 (stdio.h) 去讀取儲存於磁碟或其他地方的資料,或把資料寫入磁碟及其他地方。

如何知道一個函式庫提供哪些服務,以及程式設計師如何知道該如何使用這些服務? 這就要談到應用程式介面(Application Programming Interface, API)

API 敘述一個函式庫提供的服務,這個函式庫裡有哪些函式,這些函式做哪些事,如何在程式中使用這些函式,它們請求甚麼輸入資料或資料結構,產生甚麼值或資料結構。

API 定義程式設計師在請求函式庫提供服務時,必須做什麼,以及這些函式將運算什麼。它不僅包含有關語法規定的聲明,也包含支援文件以幫助程式設計師有效設計系統。

現在的大型系統往往涉及一個軟體開發套件 (Software Development Kit, SDK),讓程式設計師能使用越來越複雜的軟體函式庫,類似 Android StudioXcode Visual Studio


智慧財產:智慧財產指的是個人的創造行動(例如發明)所產生的種種無形財產或著作,例如書籍、音樂、畫作、相片等。

軟體也是一種重要的智慧財產,它是無形的,但很有價值,開發及維修一個大程式需要持續的辛苦努力。

軟體可無限量複製,邊際成本趨近於零,且可線上傳送至世界各地,並隨時被修改。但軟體比硬體更容易衍生法律問題,有幾種法律機制保護軟體的智慧財產,包括「商業機密商標著作權專利及授權」

商業機密是最明顯的智慧財產,被所有權人保密,或是只在具有法律約束力的合約(例如保密協議)之下才揭露。這既簡單也有成效,但若機密被洩露,無法提供什麼救濟行為,典型例子是可口可樂的配方。

理論上,若機密已經變成公開知識,任何人都能製造同樣的產品,但他們不能稱之為「Coca-Cola」或「Coke」,因為這是商標,另一種形式的智慧財產。

商標是用以區別一公司提供的產品或服務的一個詞或詞組、一個名稱、一個標誌,甚至一種獨特顏色。

著作權保護創意的表述 (expression)。一般人很熟悉文學、藝術、音樂及電影等領域的著作權,它保護創意作品不被他人抄襲,並且賦予創作者在一定期間內利用其作品的權利。

數位資料的著作權執法相當困難,著作權也適用於程式,如同小說撰寫一樣,無人可以不經我的准許使用我取得著作權的程式但若只是了解程式的行為後,撰寫全新的實作(implementation),那可能就「不算侵權」。

專利對發明提供法律保護,不同於著作權只保護表述 - 只保護程式是如何撰寫的,而專利會保護程式中內含的原始概念。

授權是撰寫使用一項產品的法律合約,在實體店或線上購買軟體,大多是授權而非出售。就大多數的購買而言,法律上的第一次銷售原則,若你買了一本印刷書,它就是你的,你可以轉賣或送給他人,但是數位產品的供應商幾乎都是以授權的方式「銷售」,這讓供應商保留所有權。

開放源碼(open source)指的是把原始碼開放,供研究與改進。

程式語言及支援工具現在幾乎都是開放源碼,把軟體送出去,要如何賺錢呢? 像 Red Hat  銷售你可以在網路上免費取得的 Linux 原始碼,但它靠著提供支援、訓練、品質保證、整合及其他服務來賺錢。

許多開放源碼程式設計師是公司的正式員工,這些公司使用開放源碼,並對它做出貢獻。這些公司受益於能夠引導程式的演進,以及有其他人修補漏洞及做出改進。

沒有留言:

張貼留言

今日閱讀: 財富哪裡來 (九) 執行力的重要性

本章節重點摘要如下: 只要在「認知」的基礎上具備極強的「執行力」,賺錢就不是一件難事。 很多人無法克服「拖延症」是因為看不到機會,沒有意識到懶惰給自己帶來的「機會成本」有多高。 錯過機會比直接虧錢更讓人心痛。 看不到機會的根本原因在於「認知」不足,意識不到自己面對的是機會,也意識...