---
# System prepended metadata

title: 半身曲

---

# 半身曲
## 前言
用一款語言來介紹這個世界是片面、殘破的。
即使是身爲最普及的"高階"語言，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。






