1. 程式人生 > >我發起並創立了一個 VMBC 的 子項目 D#

我發起並創立了一個 VMBC 的 子項目 D#

需要 也會 編譯 大小 裏的 沒有 實現 固態硬盤 基礎架構

大家好,

我發起並創立了一個 VMBC 的 子項目 D# 。

有關 VMBC , 請參考 《我發起了一個 用 C 語言 作為 中間語言 的 編譯器 項目 VMBC》 https://www.cnblogs.com/KSongKing/p/9628981.html ,

D# , 就是一個 簡單版 的 C# 。

下面說一下 D# 項目 的 大概規劃 :

第 1 期, 實現 new 對象 的 機制, GC, 堆 。 (我做)

第 2 期, 實現 對象 的 函數(方法) 調用 。 (後人做)

第 3 期, 實現 元數據, 簡單的 IL 層 基礎架構, 簡單的 IL 層 基礎架構 主要 就是 元數據 架構 。 (後人做)

第 4 期, 實現 簡單類型, 如 int, long, float, double 等 。 (後人做)

第 5 期, 實現 簡單的 表達式 和 語句, 如 變量聲明, 加減乘除, if else, for 循環 等 。 (後人做)

第 6 期, 實現 D# 代碼 翻譯為 C 語言中間代碼 。 (後人做)

第 7 期, 實現 將 C 語言 代碼 編譯 為 本地代碼 。 (後人做)

第 8 期, 各種 高級 語法特性 逐漸 加入 。 (後人做)

第 9 期, 各種 完善發展 …… (後人做)

我們來 具體 看一下 每一期 怎麽做 :

第 1 期, 對象 的 new 機制, 就是用 malloc() 在 內存 裏 申請一段 內存, 內存的 大小(Size) 是 對象 裏 所有字段 的 Size 宗和, 可以用 C 語言的 sizeof() 根據 字段類型 取得 字段占用的 內存長度, 加起來 就是 對象 占用的 內存長度 。

GC, D# 的 GC 和 C# 有一點不同, C# 的 GC 會 做 2 件事 :

1 回收 對象 占用的 內存

2 整理 堆 裏的 碎片空間

D# 只有 第 1 點, 沒有 第 2 點 。 就是說 D# 只 回收 對象占用的 內存, 但不進行 碎片整理 。

C# GC 進行 碎片整理 需要 移動對象, 然後 修改 指向 這個對象 的 引用, 引用 是一個 結構體, 裏面 包含了 一個指針, 指向 對象 的 地址, 對象 被移動後, 地址 發生了 改變, 所以 引用 裏的 這個指針 也需要 修改 。

其實 不做 碎片管理 的 主要原因 是 碎片整理 的 工作 很復雜, 我懶得寫了 。 ^^

碎片 整理 主要是 解決 碎片 占用了 地址空間 和 內存空間 的 問題, 以及 碎片 增多時 堆 分配 效率變低 的 問題 。

當然還有 碎片 占用了 操作系統 虛擬內存 頁 的 問題 。

首先, 關於 碎片占用 地址空間 的問題, 現在 是 64 位 操作系統, 地址空間 可以達到 16 EB, 不用擔心 地址空間 用完 。

內存空間 的 問題, 現在 固態硬盤 已經普及, 內存 也 越來越大, 固態硬盤 可以 讓 操作系統 虛擬內存 很快, 再加上 內存 也 越來越大, 所以 也不用擔心 內存空間 不夠 的 問題 。

碎片 增多時 堆分配 效率變低 的 問題, 我們打算自己實現一個 堆算法, 下面會 介紹 。

碎片 占用了 操作系統 虛擬內存 頁 的 問題 是指 碎片 占用了 較多 的 頁, 導致 操作系統 虛擬內存 可能 頻繁 的 載入載出 頁, 這樣 效率 會降低 。

這個問題 其實 和 碎片 占用 內存空間 的 問題一樣, 固態硬盤 可以 讓 操作系統 虛擬內存 很快, 內存 也 越來越大, 所以 基本上 也可以 忽略 。

另一方面, GC 整理碎片 移動對象 本身 就是一個 工作量 比較大 的 工作, 且 移動對象 時 需要 掛起 所有 線程 。

所以, 碎片整理 也是 有利有弊 的 。

D# 去掉了 GC 整理碎片 的 部分, 也可以說是 “空間換時間” 的做法,

另外, GC 工作時 不用 掛起 應用程序 線程, 可以 和 應用程序 線程 正常的 並發 運行 。

相對於 C#, 實時性 也會 好一些 。

我發起並創立了一個 VMBC 的 子項目 D#