什麼是「平台」?軟硬件契約的本質
平台 = CPU 處理器架構 + 操作系統內核
- CPU 指令集:x86/x64 (CISC)、ARM/RISC-V (RISC)、PowerPC、SPARC 等,各自擁有獨特機器指令
- OS 系統調用接口:Windows (Win32 API)、Linux (syscall)、macOS (Mach/BSD)、Solaris 等
- 綁定關係:特定 OS 僅支持特定 CPU 指令集(如早期 macOS/PowerPC,現已遷移 Intel/ARM)
傳統編譯模式:C/C++ 的平台綁定

- 源碼
.c → 特定平台編譯器 (GCC/MSVC/Clang) → 機器碼 .exe/.out
- 核心痛點:編譯器與目標平台強綁定,產物不可跨平台運行
- 跨平台需維護多套編譯鏈、條件編譯、平台適配層
Java 革命:中間碼 + 虛擬機雙層架構


三階段執行流程
- 編譯期:
javac (平台無關) 將 .java 編譯為 字節碼 .class(中間語言)
- 加載期:JVM 類加載器 讀取
.class,驗證、準備、解析、初始化
- 運行期:JVM 解釋器/即時編譯器(JIT) 將字節碼轉換為當前平台機器指令 執行
關鍵對比:三種語言執行模式
| 模式 | 代表語言 | 流程 | 優點 | 缺點 |
| 編譯執行 | C/C++、Rust、Go | 源碼 → 機器碼 | 極致性能、無運行時依賴 | 平台綁定、部署複雜 |
| 純解釋執行 | JavaScript、Python、Shell | 源碼 → 解釋器逐行執行 | 天然跨平台、動態特性強 | 性能低、源碼暴露 |
| 中間碼+虛擬機 | Java、C#、Kotlin | 源碼 → 字節碼 → JVM/CLR → 機器碼 | 跨平台+性能平衡、安全沙箱、GC自動內存管理 | 啟動較慢、運行時體積大 |
一次編譯,到處運行的本質
.class 字節碼規範統一(JVM Spec 定義),與平台無關
- 各平台提供對應 JVM 實現 (Windows/Linux/macOS/ARM/x86),負責字節碼→機器碼映射
- 同一 .class 文件 在不同 JVM 產生不同機器指令,但語義結果一致
現代 JVM 性能進化
- 解釋執行:啟動快、預熱階段
- JIT 即時編譯:熱點代碼動態編譯為優化機器碼(C1/C2 編譯器)
- AOT 提前編譯:GraalVM Native Image 直接產出原生可執行文件
- 分層編譯:解釋 → C1 → C2 無縫遷移,平衡啟動與峰值性能
總結
Java 跨平台的核心在於字節碼規範統一性與JVM 實現的平台適配層。這一設計不僅解決了「一次編譯,到處運行」,更引入了垃圾回收、安全管理、動態加載等現代語言運行時核心能力,深刻影響了後續 .NET CLR、V8 引擎、WebAssembly 等技術演進。