計算機怎麼閱讀代碼?
3 次觀看·2025年8月20日
在你第一堂程式課,你可能會被介紹到一種叫做Compiler的概念
這就是它的使用方式
首先,你寫出你的程式,但是電腦還沒能夠讀到
所以,為了能夠實際運行你的程式
你首先需要通過這個特別的程式叫做Compiler
然後出現一個新版本的程式,能夠被電腦讀到
它可能是被測試了用一堆輸出和預期輸出的輸出來運行
所以,你的程式有兩個版本
你寫出的程式,但是電腦還沒能夠讀到
但是,它比魔術還要好
Compiler是一個複雜的機器
它可以隔離人類的讀取方式和電腦的讀取方式
所以,Compiler到底在做什麼?
你的程式的可行版本其實是什麼樣子?
什麼?
你說你不知道我在說什麼?
噢,我想我知道發生了什麼
在你第一堂程式課,你大概只是使用了一個IDE
在這件事情下,整個過程都被你隱藏了
當你按下運行按鈕,你的作品被儲存,你的程式被建立
它就會自動運行
所以,現在我們來到速度
這程式的可行版本是什麼樣子?
Compiler到底在做什麼?
什麼?
你說你不知道我在說什麼?
你只做了Python寫程式?
噢,我的天啊,這裡有好多弱點
好,這就是一般程式的處理方式
它是怎麼運行的?我不知道,我們來看看
在低級程式中,電腦處理器只能做少數事情
它可以讀取和記錄
它可以做數字和數學
現代處理器也能做其他事情,但這就基本上就是它
現在,一個可運行程式,那是由Compiler生產的
只是一張列表的指令,讓處理器遵循
寫在雙語範圍
指令像是
讀取這些記憶點,做一些事情給它們
寫記憶點,跳過這麼多條
跳過這麼多條,但只要這個標誌是正確的
這些東西
一個程式,表達在一張列表中的記憶點
叫做機械碼
這是電腦可以讀取的程式
但為什麼電腦處理器只能讀取這個樣子的程式?
為什麼這個樣子?
簡單來說,這就是處理器的運行方式
處理器已經包含所有的記憶點
但正確的記憶點只能連在一起
當相同的記憶點連在一起時
指令中的1和0會導致某些傳輸器開啟或關閉
這就會連接正確的記憶點一起來執行這個指令
如果你想了解更多
你可能會想看Crash Course Computer Science
尤其是第五到八集
第三和四集也有幫助
如果你需要更新雙語範圍和邏輯門
不過你也可以看我的視頻
據說,Crash Course沒有要求我推薦它們
我只是非常喜歡這個系列
簡單來說,知道處理器的運行方式就像這樣
但當你第一次學習程式的時候
你不需要知道任何關於這些複雜的機械文法
例如記憶管理、記憶點運行方式或定義跳動
程式是關於variables, if statements, loops, and functions
這些只是高級的構造
讓人類更容易思考程式
程式表達的這個形式叫做source code
是一個人類能夠理解的程式
因此是大多數人類寫程式的版本
製作人的工作是把這個人類能夠理解的source code
轉成一個人類能夠理解的機械文法
但它是怎麼做到的?
它是怎麼把一條文字轉成一張語句列?
我們來看看一些例子
這是一個很簡單的程式
宣佈一個會叫做x的代碼
然後把它定義為3
目前這個程式只有source code
我知道它看起來有某種結構
但對於電腦來說
它只是一個無意義的文字
它只是一個文字
我知道這個程式沒有什麼用
但我們先來簡單的
我們把這個source code轉到文件夾
看看它會做什麼
文件夾首先把文字分成個人的代碼
就像文件夾在找出這個程式裡的文字
然後代碼被組成一個結構
叫做parse tree
就像在找出這個程式裡的語句
這個結構
然後製作人記錄了程式的概念
包括代碼和功能名稱
這是電腦需要留意的東西
在不同部分的程式
在我們的情況下
唯一的概念是x的代碼
哦,還有主功能
但這對我們來說不重要
最後的步驟是穿過樹枝
來找出某種機械軟件
能夠做到同樣的事情
如同這個特定的source code
我只是想強調
通常製作人不會直接從parse tree
轉到機械軟件
通常我們會跳過一些中途的步驟
這就是機械軟件的組成方式
它有點難讀和解釋
所以我們來把它削減
寫成文字
其實還是有點難讀
我們來寫成組成方式
這是機械軟件的比較人類能讀到的版本
這樣比較好
現在我們就不理會這個東西
只要知道它負責開始和結束主功能
這就能決定程式的開始和結束
這就是指示
符合機械軟件的組成方式
這個指示說要把3移到這個記憶體位置
我們來開啟程式看看會發生什麼
正如我們預期的
3被移到這個記憶體位置
看來製作人決定
這個記憶體位置是機械軟件的存在
就這樣
製作人拿了我們的source code
說要把機械軟件的x
和3的數值組成
並把它轉成機械軟件
這就說要把3的數值移到這個記憶體位置
所以我們的程式現在有點無聊
如果我們把它改變的話會發生什麼
我們來加一條線
把x的數值移到3之後
我們把它移到x的現有數值的數值
加上1
現在我們把它轉到製作人身上
來製作一個新版本的機械軟件
製作人找到tokens
複製
並製作
看來只有一個新的指示
要把1的數值加到這個記憶體位置
畢竟這個位置是製作人決定的x的存在
複製x的數值
就等於複製這個記憶體位置存在的數值
來製作
3的數值出現在記憶體位置
定義為x的數值
然後數值就變成4
到目前為止
我們已經看到了
如何把variable assignment
和簡單的數學行為翻譯
但這並不簡單
對於if statement, loops, and functions
沒有機械指示
是直接的相似性
而是
我們需要模擬他們的行為
用存在的指示
我們先來做一個if statement
在一個if statement中
我們只會在這個格子中
如果這個條件是正確的
如果這個條件是錯誤的
我們就會跳過這個格子
在安裝中
格子裡面的指示
通常會被翻譯
但在此之前
我們會有一些指示
來評估這個條件
然後我們會有一個
conditional jump instruction
在這個情況下
我們會跳過這個格子
我們想跳過
但只有如果我們應該跳過
處理器會知道
我們應該跳過這個格子
根據前面的指示
這個指示
在處理器中暫時設定了一些標籤
讓我們可以記住結果
當我們到達這個conditional jump
跳過這個格子
如果我們不應該跳過
那處理器就會無視跳過
然後繼續正常
方便地在格子裡面執行
注意到這些機械指示
實際上都在做
和我們的if statement一樣的事情
我們來看看
如何跳過可以模擬
其他源源碼的行為
這裡有一個if else statement
只在這個格子中執行
如果這個條件是正確的
否則
在這個格子中執行
在組裝中
我們有一個格子
在第一個格子
和一個格子
在第二個格子
在第一個格子之前
我們有一個比較
和conditional jump
就像我們之前有的
在格子之間
我們有一個正常的
non-conditional jump instruction
這使得執行
跳過第二個格子
如果剛剛完成了第一個
這就是
if else statement
如果你想一下
然後還有一個while loop
只執行這個格子
如果這個條件是正確的
然後一直執行
重複重複
直到它不再是正確的
在組裝中
我們有格子的密碼
條件來評估這個條件
和跳過模擬這個loop
功能是比較複雜的
基本上
功能包含了一個密碼格子
使得它可以用在
多個部分的程式中
大部分程式師在外面
應該也知道
它們也能隔離現象
並且可以做循環
這就是它的類似
組裝密碼的樣子
我們來運行它
看看它能做什麼
按下功能呼叫
我們把所有的情境
儲存在記憶中
分配新空間在上面
執行功能呼叫
這可能會牽涉到
呼叫更多的功能
再跳回完成後
這使得功能
呼叫其他功能
甚至是自己
你只需要推動記憶
再跳回完成後
所以這就是組裝師的工作
他們拿你的源頭密碼
然後製作機械密碼
但是有一個問題
如果你將程式組裝在一臺電腦上
然後複製到另一臺電腦
然後試著運行
這可能不會成功
如果新的電腦
有不同的運行系統
或有不同的處理器模式
它可能會使用
不同的機械指令
所以如果你想你的程式
能夠運行到這臺新的電腦
你最好能夠組裝到
那臺電腦的機械密碼
如果你的程式的使用者
可能會運行你的軟件
在不同的平臺上
除非你正在分配源頭
你必須保留一張
每個平臺你想運行的
每
個
平臺
有些語言像是Java
藉此藉口
而不是機械密碼
Java會被組成
一種中間代表
叫做Bytecode
然後Bytecode
可以被發送到其他電腦
它會被轉換到
那些電腦的機械密碼
當程式運行
通過一個解釋器
這是一點點的妥協
你會有更好的運行性
雖然不夠有效
但無論如何
你寫的語言
是符合
一系列的處理器
和運行系統
你能想像
當年
電腦程式
是把組裝
甚至是機械密碼
放在打字卡上嗎
不僅你必須
找出對的洞
來打字
你甚至無法使用
你的程式
在不同的電腦模型上
因為另一個模型
期望你打不同的洞
現在的事情
有些好一點
你寫一個程式
複製
然後測試它的輸出和輸出
如果只有這麼簡單
全靠那些
寫特別程式的人
Compiler
但是
記得Compiler
是一個程式
如果人們用Compiler
來製作程式
Compiler是怎麼製作的
應該是寫了
然後複製成另一個語言
甚至是同一個語言
複製成一個Compiler
和前面的版本
如果我們跟著這個路線
某個時候
我們會達到
發展工具的起源
程式
寫在機械密碼上
幫助你寫別的程式
寫程式
就是在製作程式的過程中
電腦語言的歷史
是蠻複雜的
難怪要花幾十年
才能到現在的地步
記得
下一次你寫程式
我們有很多美麗的東西
例如標示文字
數位分析
物理程式
功能程式
圖書館
連接器
建造工具
和解析器
但還是很神奇
我們可以告訴我們的電腦
跟著我們的正確指令
按下一個按鈕
不
等等
我們成功了
按下一個按鈕
程式實在太難了
