iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
Software Development

程式設計沒有告訴你的事:30 天破解每一個 Why系列 第 2

程式到底是什麼?為什麼電腦看得懂我們寫的程式?

  • 分享至 

  • xImage
  •  

在開始打造自己的 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!
https://ithelp.ithome.com.tw/upload/images/20260803/20183395yhASyVGPFO.png

到目前為止,看起來和平常沒什麼不同。
但是我開始注意到一件事情。

為什麼多了這麼多檔案?

當程式成功執行後,我發現專案裡多出了兩個資料夾:

bin
obj

展開後

MiniWebFramework.dll
MiniWebFramework.exe
MiniWebFramework.deps.json
MiniWebFramework.runtimeconfig.json
MiniWebFramework.pdb

https://ithelp.ithome.com.tw/upload/images/20260803/20183395yXPl4j7myx.png
我明明只寫了一行:

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。


上一篇
為什麼我想從「Why」重新學習程式設計?
下一篇
如果 CPU 看不懂 C#,那到底是誰看得懂?
系列文
程式設計沒有告訴你的事:30 天破解每一個 Why3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言