我发起并创立了一个 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#,   实时性 也会 好一些 。

原文地址:https://www.cnblogs.com/KSongKing/p/10348190.html

时间: 2024-10-15 16:29:58

我发起并创立了一个 VMBC 的 子项目 D#的相关文章

我发起并创立了一个 C 语言编译器 开源项目 InnerC

本文是 VMBC / D#  项目 的 系列文章, 有关 VMBC / D# ,  见 <我发起并创立了一个 VMBC 的 子项目 D#>(以下简称 <D#>)  https://www.cnblogs.com/KSongKing/p/10348190.html    . VMBC  需要一个 内置 的  C 编译器,   想来想去, 觉得还是自己写一个, 计划用  C 语言 写,  因为 VMBC 的  C 编译器 要求是一个 本地库,  如果不要求是 本地库,  我就用 C#

我发起了一个 ILBC 的 子项目 EScript

ILBC  见 <ILBC 规范>  https://www.cnblogs.com/KSongKing/p/10354824.html 今天装了个 VsCode , 听说 VsCode 是 用 Javascript 写的, 突然觉得, 跨平台 的 主角 应该是 Javascript 嘛 ~! 所以, 就想 ILBC 是不是也要支持  Javascript ,,,  当然, 从技术上, ILBC 完全没有问题 . Javascript  确实 很容易 跨平台,  比如, 脚步语言 不需要复杂的

java环境搭建(及安装问题“No repository found containing”解决) 并创立第一个java程序

环境: java8 及 Eclipse java8 配置:http://jingyan.baidu.com/article/e2284b2b5967e7e2e7118d74.html Eclipse 安装:  (做企业级开发的可以使用企业级版Eclipse IDE for Java EE Developers) http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/kepler/S

ILBC 运行时 (ILBC Runtime) 架构

本文是 VMBC / D# 项目 的 系列文章, 有关 VMBC / D# , 见 <我发起并创立了一个 VMBC 的 子项目 D#>(以下简称 <D#>)  https://www.cnblogs.com/KSongKing/p/10348190.html   . ILBC 运行时       架构图    如下: 为了便于讲解,   图中 一些位置 标注了 红色数字 . ILBC 运行时  包含  3 个 部分:   调度程序 . C 编译器 . GC  . 1 处,  调度程

用 EPWA 写一个 漫画阅读器 ComicReader

用 EPWA 写一个 图片播放器 ComicReader . 有关 EPWA,见 <我发起并创立了一个 EPWA 的 开源项目> https://www.cnblogs.com/KSongKing/p/10745935.html , js 库 用的是 jWebForm, 见 <我发起并创立了一个 Javascript 前端库 开源项目 jWebForm> https://www.cnblogs.com/KSongKing/p/10326119.html , ComicReader 

js发起长轮询获取推送消息

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.8.1/jquery.min.js">

过程掌握:过程的创立、终止、壅塞、叫醒和切换

过程掌握的次要功用是对零碎中的一切过程施行无效的治理,它具有创立新过程.撤销已有过程.完成过程形态转换等功用.在操作零碎中,普通把过程掌握用的程序段称为原语,原语的特色是履行时期不许可中缀,它是一个弗成联系的根本单元. 过程的创立 许可一个过程创立另一个过程.此时创立者称为父过程,被创立的过程称为子过程.子过程可以承继父过程所具有的资本.当子过程被撤销时,应将其从父过程那边取得的资本出借给父过程.此外,在撤销父过程时,也必需同时撤销其一切的子过程.在操作零碎中,终端用户登录零碎.功课调剂.零碎供

IT人士应该知道的一个趋势-在线教育

IT人士应该知道的一个趋势-在线教育 2014年12月7日,大雪季节,天气微冷 时间过得飞快,工作忙碌起来私人时间就变得少了,天气变冷了,人也会变得懒惰起来,被窝是我们的舒适区,能让我们在浮躁的世界里得到片刻安静,舒舒服服睡上一觉就感觉世界变美好了些许.2014年,即将也要过去了,回想一下着实发生了很多变化,我们作为IT人士自然关注我们所处行业发生了的一些变化,如果你是一位两耳不闻窗外事,一心只想敲代码的人,那么你可能就错过一些比较精彩的事情,现在处于信息泛滥的时代,只要你手中有移动设备,你就可

一个简单的SSL Server和SSL Client来讲解Java环境下SSL的通信原理

首先我们先回顾一下常规的Java Socket编程.在Java下写一个Socket服务器和客户端的例子还是比较简单的.以下是服务端的代码: Java代码   package org.bluedash.tryssl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Serve