在開始打造自己的 Mini Web Framework 之前,我發現自己一直忽略了一個最根本的問題。
我們每天都在寫程式,但卻很少停下來思考:
電腦真的看得懂我們寫的程式嗎?
以前學程式時,我的流程一直都是:
寫程式。
按下執行。
畫面出現結果。
例如:
Console.WriteLine("Hello, World!");
執行後,終端機就會出現:
Hello, World!
我從來沒有懷疑過中間發生了什麼。
甚至一直以為:
是不是 CPU 就直接讀懂了 C#?
直到開始準備這個系列,我才發現,事情並沒有那麼簡單。
CPU 真的看得懂 C# 嗎?
如果答案是「看得懂」,那事情就很簡單。
但是如果答案是「看不懂」,那又是誰把 C# 翻譯給 CPU 的?
這也是我今天最想找到答案的問題。
今天沒有直接開始研究 Framework。
而是建立了一個最簡單的 Console 專案。
MiniWebFramework
│
├── MiniWebFramework.slnx
└── src
└── MiniWebFramework
├── Program.cs
└── MiniWebFramework.csproj
Program.cs 只有一行程式:
Console.WriteLine("Hello, World!");
執行後畫面成功出現Hello, World!
到目前為止,看起來和平常沒什麼不同。
但是我開始注意到一件事情。
為什麼多了這麼多檔案?
當程式成功執行後,我發現專案裡多出了兩個資料夾:
bin
obj
展開後
MiniWebFramework.dll
MiniWebFramework.exe
MiniWebFramework.deps.json
MiniWebFramework.runtimeconfig.json
MiniWebFramework.pdb

我明明只寫了一行:
Console.WriteLine("Hello, World!");
為什麼 .NET 卻產生了這麼多東西?
這代表程式真正執行的過程,絕對不像我以前想的那麼簡單。
查閱資料並整理後,我發現程式真正執行的流程,其實比較像這樣:
Program.cs(C# 原始碼)
│
▼
Compiler(編譯器)
│
▼
Intermediate Language(IL)
│
▼
JIT(Just-In-Time Compiler)
│
▼
Machine Code(機器碼)
│
▼
CPU
│
▼
Hello, World!
CPU 並不是直接執行 C#。
真正理解 C# 的,是 .NET 的編譯器;而 CPU 最後執行的是機器碼(Machine Code)。
今天的我,先知道了整個流程,但其中每一個步驟到底做了什麼,我還不知道。
今天破解的 Why
以前,我一直以為電腦能直接看懂我寫的 C#。
直到今天,我才知道:
電腦從來沒有看懂過 C#。
真正看懂 C# 的,是 .NET 提供的編譯器;而 CPU 最後執行的,其實是經過層層轉換後的機器碼。
今天我沒有學到新的語法,卻重新認識了程式真正開始運作的方式。原來,我每天按下的 Run,背後還隱藏著一連串我從未注意過的流程。而這,也正是我想透過這個系列,一步一步破解的每一個 Why。