# 半身曲 ## 前言 用一款語言來介紹這個世界是片面、殘破的。 即使是身爲最普及的"高階"語言,C語言,其實也只不過是利用了部分的計算機部分的概念,使用本身的低抽象來提高移植性。 ## 大綱 * 歷史-計算機 * 計算機上的語言 * 歷史-C語言 * 實現與抽象 * 結語 ## 歷史-計算機 人類的主流計算機是有時代之分的。 * 類比(二次大戰前) * 數位(現在) * 量子(未來) 在二次大戰期前,人類還是以類比計算為主流。 因爲當時人類對於數位運算的還無法掌握,精度極差(計算保留準確度)。并且二位計算也尚未提出。主流還是類比計算,使用不同的齒輪角度差,利用微分的方式進行基本運算(加減乘,再衍生出除法)。但是達成的精度有一定上的物理極限。 ### 類比 --- ![](https://i.imgur.com/NS334Qx.jpg) 類比計算的差分機(from [wiki](https://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86%E6%A9%9F#/media/File:Babbage_Difference_Engine.jpg)) --- ### 數位 二次大戰后,[夏農](https://zh.wikipedia.org/wiki/%E5%85%8B%E5%8A%B3%E5%BE%B7%C2%B7%E9%A6%99%E5%86%9C)提出《[通訊的數學理論](https://web.archive.org/web/19980715013250/http://cm.bell-labs.com/cm/ms/what/shannonday/shannon1948.pdf)》,用全新的方式看待的訊息,根本上解決了被噪音(代表預期外的干擾與能量的流失)影響的數位計算困難。描述了用低精度實現任意高精度的方式。 但實際上要等到電晶體的出現才可以實際運用。 --- ![](https://i.imgur.com/b3zamMJ.png) 信息源—>發送機-(信號)-> 傳輸 -(已經接收的訊號)->接受機->目的地 但在傳送的時候收到"噪音"的影響 --- 通訊的數學理論,電晶體、C語言、Unix都和貝爾實驗室(bell-labs)密不可分。但因爲bell-labs的上游公司AT&T遇到困難所以bell-labs已經被解散了。 ### 量子 量子電腦的强項在模擬自然,與可以犧牲一定的精確度,更快速的得出答案。 對有時間限制的計算來説是不可忽略的未來趨勢。 但目前發展困難重重,有興趣學習的可以加入[SQCS](https://discord.gg/KjWMRewQB2)哦。 ## 計算機上的語言 * 機器語言 * 組合語言 * [中間語言](https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%96%93%E8%AA%9E%E8%A8%80) * 程式語言 ### 機器語言與組合語言的關係 在計算機架構一開始被提出來的時候,世界上并沒有現代計算機,而是一臺臺獨特的類別計算機。他們彼此每一臺都不同,有屬於自己的本地語言,我們可以稱他們為長碼,是由一連串的數字組成。類別計算機彼此就是在傳遞關和開,所以之後也有了用二位來表達一切的機器碼(機器語言)。但我們有沒有辦法用一些特別的標記,來取代一些重複的命令。於是短碼就出現了(組合語言)。可是實際上并非單單如此,短碼的目的是,讓一臺機器模仿另外一臺機器,使用一組相同的短碼,然後讓不同的機器去用不同的方式實現。所以短碼實際上是兩臺機器的長碼實現的交集! ### 程式語言 即使是程式語言也有分好多種,如果有編譯方式來分的話。 * 脚本 * 直譯 * 編譯 脚本語言主要是拿來儲存質料,他們通常是需要一個方式去解析他們,然後再和[API](https://medium.com/codingbar/api-%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E9%BA%BC-%E7%94%A8%E7%99%BD%E8%A9%B1%E6%96%87%E5%B8%B6%E4%BD%A0%E8%AA%8D%E8%AD%98-95f65a9cfc33)交互。并且要以原始碼的方式傳輸。最常用的就是HTML、CSS、JavaScript。 直譯語言是在運行的時候編譯器才將原始代碼翻譯,然後運行。如python,好處就是不需要每次更改后重新編譯。編譯語言便是需要先將原始代碼翻譯完才可以運行。 有一個特殊的存在,便是中間語言。擔當組合語言和高階語言之間的溝通重擔,C因爲天生便是組合語言的抽象,所以經常成爲其他高階語言的中間語言。這可能也是爲什麽C會被稱呼為“中階語言”。 ### C語言的歷史 一開始,在1960年代。大家開發系統是用組合語言,但組合語言每一家都不一樣,導致系統只可以伴隨著機器賣。并且在開發上面有很大的不便。所以那個時候在開發一款新系統的貝爾實驗室,就開發了C語言,那款系統也是如今macOS、Linux、BSD的源頭,Unix。C語言本身並沒有對硬件的控制,而是使用了各種的函式庫去操作。提供了移植性與各種可以輕易實現的漏洞。對C語言歷史在Unix有興趣的,可以看《[Expert C Programming Deep C Secrets](https://progforperf.github.io/Expert_C_Programming.pdf)》。 讓我們進入一下C語言的[時間表](https://en.wikipedia.org/wiki/C_(programming_language)) 1972 出生 1978 C的作者出來一本書,成爲了標準,稱爲“K&R C” 1989 C的標準定下美國標準,稱爲“ANSI C” or “C89” 1990 C的標準交給國際標準化組織設定,成爲第一版的“ISO C” or “C99” 以此類推,C99、C11、C17。 標準的C只不過定義的一些最廣汎和通用的基礎,事實上C有很多的變種,如Plan9 C等等。 ### C++(C plus plus, Cpp) 是C語言歷史上發生過最好的分支。C語言承擔了太多的工作,本身並不適合太過新穎的嘗試與大方向的調整。因此Cpp就出來扛下來了,標準容器、不完全的物件導向,都由Cpp來嘗試,好的且合適的事務都會反饋到C的本身,雖然不一定是以官方標準的形式。像C本身就有一大堆的外接函數庫可以用,Linux的glibc、OpenBSD的libc。 ## 實現與抽象 用高級語言實現一個程式,會經過各種的抽象。像把函式切成一個個單元然後呼叫,或者用各種特殊的函式結構,如for、if,都有各種的抽象。實現他們會有各種額外的花費,一點點小小的花費,纍積起來,也會變的可觀。但在高級語言越來越像人類語言的情況下,這樣的花費或許會越來越多。可是事實並不如此,我們用各種的方式,在編譯期便解決他們,實現了用更低成本達成的抽象。這點要是有興趣的話,可以看Rust的零成本抽象,基礎是泛型與trait。 ## 結語 也是最近才開始寫,這類的文章。請各位多多指教,有問題的可以用Email聯係我(qq1346126834@gmail.com)。或者也可以在IRCNow#plan9找到我。本來想說更多的,但已經超過三千字了,所以只可以留到下次了,期待下次的再見。 對了,我叫艷夏初雪,可以叫我初雪,IRC的名字是SummerSnow。