在教室等了好久,穿著道袍,手拿拂塵的老師才慢慢走了過來。進到教室,老師拿出粉筆在黑板上畫下了「⚊」和「⚋」,緩緩開口……
「今天,我們要來學--八卦。」
咦咦咦?我不是來學機器學習的嗎?老師你真的沒走錯教室嗎?
道家說,「陰陽之中生萬物」,聽起來很難理解。但你知道嗎,現在我們手中的手機、電腦,都是由最基本的0和1建立起來的。
會想要用這樣特別的方式來介紹程式語言,實在是因為之前看到一本小說,裡面的敘述讓我頗有感觸。
她說:「0與1的概念其實就是陰與陽。」(請自行參考蝴蝶seba-三臺令)
這句話讓我思考了很久。
當然,你知道我知道,連作者自己都說了,這些就是胡言亂語。但是如果從這個角度看程式語言,的確會發現有許多有趣的相似之處。
《易傳.繫辭上》言:「《易》有太極,是生兩儀,兩儀生四象,四象生八卦,八卦定吉凶,吉凶生大業。」
有沒有人看到這段臉就黑了,怎麼我來還要上國文?別急,我簡單說一下這段的意思。
兩儀(「⚊」和「⚋」)從太極之中演化出來,演變成四象、八卦,而八卦可以用來測定吉凶,並運用於生活種的各項事務處理之中。
你看,不難吧?如果從圖來看,會更好理解。
用一個爻(ㄧㄠˊ),來表示「有」、「無」這兩個概念。而這兩個概念同時包含不同的涵義,像「有」包含了陽、剛、男這樣的概念,而「無」包含了陰、柔、女這些概念。
在電腦中,則是用ㄧ個bit(位元)作為單位,裡面的「0」和「1」則分別代表著通電的有無,有打開開關的話就是1,沒有就是零。
所以在你操作電腦的時候,其中的某一個電子元件會一直進行「開開關關」的操作,把0和1的電子訊號傳給電腦,聽起來很酷吧!
而這個電子元件就是最非常紅的「半導體」,他透過電壓的調控來達到操作來達到開關的目的,至於其中的原理就不細說,因為要討論起來又得是一篇文章了= =
這個世界上有10種人,懂二進位的人與不懂二進位的人。
這是一句流傳很久的笑話,如果你會心一笑,表示你懂二進制了。但如果你質疑了一下這句話的數學邏輯……
那可能表示你的二進位知識還需要加強XD
十進制、二進制這些方法在生活中常聽到,所謂的「進」,就是數到多少的時候進位的意思啦!
我們最常用的十進制很好理解,就是從零數到九的時候進ㄧ位變成10。
二進制很神奇,從0數到1的時候就要進位了。這種跟現實世界不太ㄧ樣的進位方法常常讓學習的人霧薩薩,但其實不難。因為二進制逢1就要進位,所以數字的表示會是這樣的:
0 = 00
1 = 01
2 = 10
...
看到這裡,你應該知道上面那則笑話的笑點了吧!
如同前面圖片中提到的,電腦的世界中只有0和1,那理所當然的,他是用二進制作為主要的數學系統。
但是我們可以先想一下,為什麼會出現八卦?每一件事物的誕生都有其原因。
其實不難理解,因為如果只有純粹的陰和陽,的確是最貼近世界的邏輯方式,但是對人類就不太友善了。
畢竟當時易學是用來推演占卜用的,如果在推演的過程中用的是單純的陰與陽……
那可能會出現占卜大師念著:「陰陽陰陰陽陰陰陽陰陽陽陰陽陽陰陽陰陰陽陰陽陰陽陰陽陰陽陰陽……案陰陽咧!我剛剛算到哪了?!」這樣的情況發生。
而電腦語言也是ㄧ樣,最原始的機器語言當然運算最有效率,但可能程式設計師心血來潮時飛快寫著:「0100010100100101010110101010010101010101010010101010101010101010010101010101……」
等喝口水回來,看著螢幕陷入沉思……我TM剛剛幹了些什麼?
所以聰明的古人把三個爻放在一起,創出了八卦,分別代表了天、地、山、澤、水、火、風、雷,八種不同的自然現象,同時也能代表八種身體部位、性情之類。
後來因為八卦所能代表的事物太少太籠統,於是又把兩個八卦合起來,形成六十四個重卦,每個重卦有六個爻,這樣占卜大師的腦子終於可以稍微休息了。
而程式設計師也是聰明的,不約而同地用了同樣的辦法,他們將8個bit組合,稱為byte(位元組),可以有2⁸=256種變化,每一種變化都可以代表一種符號。
而256種符號足以讓程式設計師給數字(0~9)、英文(大小寫a~z),以及鍵盤上出現的所有符號ㄧ個代表的變化了……程式設計師終於也輕鬆一點了。
從圖片上看的話,應該可以更好理解這幾點:
人類將世界歸納成語言,又從語言中創造了世界。
不用去找出處了,這句話是我自己說的XD
我覺得電腦的創造是人類史上一個非常偉大的奇蹟,從龐大機台般的計算機,到現在人手一支手機,人類很努力的創造了一個屬於自己的世界。
而在這個世界的背後,是無數人或偶然間的靈光一閃,或堅持著的嘔心瀝血。我們今天能如此方便都是因為站在了巨人的肩膀上。
今天我們就來看看這個巨人是如何長成的吧。
所謂的機器語言,就是0和1,機器的原始語言。
機器語言最大的優點就是消能非常高,因為完全不需要經過轉譯就可直接執行,但缺點也非常明顯……非常的費程式設計師。
看看現在的程序員就知道了,光是寫高階語言就累得要死了,如果要人類寫機器語言……太恐怖了。
咦?語言也有分高低階?所以比較高階的比較厲害嗎?
沒有哦!這裡所謂的高階、低階,代表的是「方便人類理解的程度」,人類越難理解的就越低階,越接近人類語言的就越高階。
會有這樣的演變,是因為0和1這樣的機器語言太難讓人理解了,於是人類就想了一個方法--
如果我先把需要的程式碼做成一個指令集,我需要的時候再去調用就好了,這樣不是很方便嗎?
以下是用組合語言寫出1加到100程式的過程(因為我也不會寫組合語言,我叫ChatGPT幫我寫的,有錯再跟我說……)
section .data
sum dw 0 ; 初始化總和為0
section .text
global _start
_start:
mov cx, 100 ; 設定迴圈計數器為100
loop_start:
add ax, cx ; 將迴圈計數器的值加到總和中
loop loop_start ; 減少迴圈計數器,如果不為零,則重複迴圈
; 在這裡,ax中包含了1到100的總和
; 你可以將ax中的值輸出到螢幕或儲存在記憶體中,視需求而定。
; 程式結束
mov eax, 0x60 ; 使用系統調用(exit)的系統調用號
xor edi, edi ; 返回碼為0
syscall ; 執行系統調用
很複雜吧?但跟機器語言比起來已經好很多了呢!
屬於低階語言的有:x86/x86-64、ARM、MIPS、PowerPC、SPARC、RISC-V等等,主要用來控制硬體、驅動程式開發等等,不同的語言需要經過不同的「組譯」,回推到機器語言作執行。
雖然組合語言已經接近人類的語言系統了,但仍然有些難以閱讀,想要操作需要先對硬體架構和指令集有相當程度的了解,所以人類又對程式語言做了更進一步的進階。
下面是用python寫一段從1加到100的程式碼,跟前面的X86相比,是不是差很多XD
sum = 0
for i in range(1, 101):
sum += i
print("總和為:", sum)
再編輯完成後,需要先將程式碼轉換為低階。其中,分成了編譯、直譯和即時編譯三種。
確認程式碼沒錯之後,一次翻譯、執行。
代表的有:C、C++、Objective-C、Visual Basic、Swift、Go、Rust……等等。
一行一行翻譯程式碼,翻一行跑一行。
代表的有:JavaScript、Python、Ruby、PHP、R……等等。
會先把程式原始碼編譯成中介碼 (Bytecode)。到執行期時,再將中介碼直譯,之後執行。
使用即時編譯技術的語言會比純編譯語言來的慢一些,但是卻又擁有直譯語言的特性。
代表的有:Java、C#……等等。
所有的一切,都是從最基礎發展起來的,理解基礎,才能理解更高深的變化。 -- 蝴蝶seba
對於這句話我一直是認同的,當然,程式學習演變到今天已經成為一門非常龐大的學科,如果只是需要用到一點點,當然直接學某個程式與研就好,沒有太大的必要學太多的基礎。
但如果你是真的想把這門學科學好的,把基礎打扎實了會比較好。
看完今天的文章,各位應該對程式語言有了比較深的認識了吧?祝福你們可以在打好基礎後,未來在程式設計上發光發熱。
如果你看懂的是陰陽學說的部分……嗯,相信未來龍山寺前的攤位也會有你的一席之地(喂
如果你都沒看懂……
趕快翻到前面重看一次啊!我寫的很辛苦欸!!
最後的最後,有問題的都問,我盡量回答。
因為這樣解釋今天也是第一次,如果有任何錯誤,也請不吝指正,謝謝啦~~