【无标题】

前言:

很久之前,我在双十一的时候入手了一本《自制编程语言基于c语言》。这本书是写《操作系统真象还原》的作者。我当时看他的关于操作系统的这本书,非常不错,就连着这本书一起入了。但是后面,因为各种事情,没有来得及仔细翻阅。(当然,当时双十一入手的书有点多,没来及看)。

环境说明

当时,这本书上的代码是基于gcc的,是在linux上面跑的。但是,前不久,我的电脑重刷了系统。下载的window的vm虚拟机也没有了。需要重新下载。下载下来有点麻烦。安装系统啥的。安装gcc啥的。而且各种环境配置也比较麻烦。后期调试也不大方便。我看了一下作者的说明。代码是基于c89的。也没有特别依赖Linux的地方。我想改成window也应该可以运行的。

尝试修改为window环境下运行

我们先拿到源代码,源代码的话,我们到异步社区下载好源码

地址的话,就放到这里:https://box.lenovo.com/l/M1ZtHI

下载好代码以后,打开看一下目录。

这里为了方便修改和测试,我们选择c10文件夹下面的b文件夹里面的代码。直接一步到位。

使用cmake构建项目

使用cmake构建项目,这样方便移植到linux。

  1. 修改的文件的编码格式

    因为文件编码不一样,在vs里面会警告,所以,修改了一下文件编码格式

  2. 修改了一下OBJ_TO_VALUE定义

    复制代码
    #define OBJ_TO_VALUE(objPtr) ({ \
      Value value; \
      value.type = VT_OBJ; \
      value.objHeader = (ObjHeader*)(objPtr); \
      value; \
    })
    static Value OBJ_TO_VALUE(void* objPtr) {
      Value value;
      value.type = VT_OBJ;
      value.objHeader = (ObjHeader*)(objPtr);
      return value;
    }

    上面的语法再gcc里面可以运行,但是在vs会报错。这里改成静态函数。

  3. 将内联类改成普通类

    复制代码
    inline Class* getClassOfObj(VM* vm, Value object);
    Class* getClassOfObj(VM* vm, Value object);

    这里地方只是改了定义,还有一个函数的实现也需要改一下。

  4. 改一下vm的申请内存的代码

    复制代码
    VM* vm = (VM*)malloc(sizeof(VM));
    
    
    VM* vm = (VM*)calloc(1,sizeof(VM));

    用malloc申请的内存不会初始化为0,后期会报错。这里改成calloc全部初始化为0就好。

测试运行

发现没啥问天,代码放到github上了,https://github.com/ddouworld/sparrow_vs, sparrow语言在visualstudio里面运行 (github.com)

我这边只将最后的代码转成vs的可以运行的。但是其实都差不多。有兴趣的自己尝试改改。在window下就更方便调试,理解代码了

相关推荐
Want5952 小时前
C/C++跳动的爱心①
c语言·开发语言·c++
lingggggaaaa2 小时前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
gfdhy3 小时前
【c++】哈希算法深度解析:实现、核心作用与工业级应用
c语言·开发语言·c++·算法·密码学·哈希算法·哈希
我不会插花弄玉3 小时前
vs2022调试基础篇【由浅入深-C语言】
c语言
福尔摩斯张4 小时前
《C 语言指针从入门到精通:全面笔记 + 实战习题深度解析》(超详细)
linux·运维·服务器·c语言·开发语言·c++·算法
fashion 道格4 小时前
数据结构实战:深入理解队列的链式结构与实现
c语言·数据结构
铁手飞鹰5 小时前
二叉树(C语言,手撕)
c语言·数据结构·算法·二叉树·深度优先·广度优先
麦烤楽鸡翅6 小时前
简单迭代法求单根的近似值
java·c++·python·数据分析·c·数值分析
[J] 一坚7 小时前
深入浅出理解冒泡、插入排序和归并、快速排序递归调用过程
c语言·数据结构·算法·排序算法
散峰而望9 小时前
C++数组(一)(算法竞赛)
c语言·开发语言·c++·算法·github