易码技术论坛

 找回密码
 加入易码
搜索
查看: 13352|回复: 77

[工具] [开源][原创][Gvm1/Gvm2编译器:GSCIDE]

[复制链接]
发表于 2008-2-11 19:37:38 | 显示全部楼层 |阅读模式
工程文件已经传上来,在下面下载。
截图:
Cut.JPG

目前编译器支持了float语法,当前的完成进度基本达到了我写这个编译器最初的目的.
当前版本为最新版本.
支持了new/delete,对结构增加成员函数,构造和析构函数,和成员函数重载.这些基本得用法同C++;

上次上传时忘了说明一下具体用法:
如果要使用new和delete运算符,必须包含malloc.h或virtualram.h!!

#include <Gvm1Def.h>
#include <malloc.h>
struct Base
{
    Base()
    {
        printf("Base Structor\n");
        getchar();
    }
    ~Base()
    {
        printf("Base Destructor\n");
        getchar();
    }
};

struct Test : Base
{
    void *member;
    Test()
    {
        printf("Test Structor\n");
        getchar();
    }
    Test(void *p)
    {
        member = p;
        printf("Test Structor\n");
        getchar();
    }
    ~Test();
};

Test::~Test()
{
    printf("Test Destructor\n");
    getchar();
}

void fun()
{
    Test t1;
    Test t2();
    Test t3(&t1);
    Test *t4 = new Test;

    Test *t5 = new Test();
    Test *t6 = new Test(t4);
    delete t4;
    delete t5;
    delete t6;
}

void main()
{
    fun();
}

以下是编译器在编译方面的特性.

语法的支持

(1).typedef的使用

typedef struct Structure
{
long Member;
} STRUCTURE, *LPSTRUCTURE;
定义Structure结构的同时定义了两个类型:结构STRUCTURE和结构指针LPSTRUCTURE
之后声明结构或结构指针时就可以使用类型定义:
LPSTRUCTURE pStructure;
STRUCTURE Structure;

(2)指针的使用

1)指针可以使用下标运算符,使用下标的方式和数组相同:

long *pLong = (long *)malloc(100 * sizeof(long));

pLong[10] = *(&pLong[11] + 1);
2)特别注意指针的自增,自减和加减运算

按照C语言的定义,指针的自增和自减的增量和减量要看其指向的类型在内存中所占的大小.

所以当声明一个long型指针(long *)时,它在自增(++)运算之后,实际增加了sizeof(long).

同样,一个结构指针自增运算之后实际增加的值是这个结构的size.

在加减运算中也是一样,long型指针和一个整数a相加后,得出的值是
指针的值 + a * sizeof(long).

同样两个long型指针相减时(注意:要在同一个序列中),得出的值被除以了4.

这和 &pLong[11] - &pLong[10] 的道理是一样的.

*注意:对于指针的size(如 long *),或更高级指针的size(如 long **, long ***...),
在GVM1和GVM2里分别被定义为2和4.


(3)赋值

编译器已经实现了 +=,-=,*=,/=,%=,&=,|=,^=,<<=,>>= 扩展赋值运算符.


(4)初始化

目前已经完成了结构的初始化,和在函数内对结构和数组的初始化.
但是要注意,对结构的初始化必须有完整的大括号嵌套,而数组没有这个限制:

#include <Gvm1Def.h>

void main()
{
    struct STRU1
    {
        long member1[2][10];
        char member2;
    }varstru1 = {
        {{1,2,3,4}, 9,8,7,6,5},
        '\13'
    };

    typedef struct STRU1 STRU1;

    typedef struct STRU2
    {
        STRU1 member1;
        long member2;
        char member3[10];
    }STRU2;

    STRU2 varstru2 = {{{{1,2,3,4,5}, 6,7,8,9,0}, 97}, 0x12345, "member3"};
   
    printf("%d,%c,%s", &varstru2.member1.member1[1][0],
        varstru2.member1.member2, varstru2.member3);
}

对于函数内的初始化,需要占用一部分静态内存,
在GVmaker1里占用128字节,在GVmaker2里占用256字节,这部分内存正常程序无法使用,
但是可以作临时的储存区, 当出现函数内部的初始化时此区域被随机覆盖.

(5)对结构的赋值

void main()
{
    struct STRU1
    {
        long member1[2][10];
        char member2;
        float member3;
    }varstru1 = {
        {{1,2,3,4}, {9,8,7,6,5}},
        '\13', 1.25
    };

    struct STRU1 varstru2;
    varstru2 = varstru1;
}

除了一般指针变量和char,int,long,float型变量,数组和结构的初始化都是常量型的,
在函数体内一般型的变量可以在声明时使用表达式赋值:

void main()
{
    char a = 4, b = 5;
    long c = a + b;
    float f = 1 + 1.2;
}

(6)对浮点语法的支持

编译器的语法支持了float, 使用时和一般变量的使用方法完全相同,如果想在TC800以外的平台上使用模拟float,那么就在代码中包含<float.h>
(此文件引用自yan的float库,并作了一些修改),此文件对运算符的浮点指令进行了重载.

如果在使用float之前未包含<float.h>,那么对float变量的操作指令将编译成TC800默认的浮点指令.即可以直接支持TC800的所有语法.

编译器在编译数值的运算和传参时,会自动进行类型转换(float 到 char,int,long 或 char,int,long 到 float),不用手动转换.
如:

#include <gvm1def.h>
#include <float.h>

float fun(float a)
{
        a += 10.25;
        return a;
}

void main()
{
        long b = fun(2);
        printf("%d", b);
}


(7)几个头文件的说明
1)        Gvm1def.h
此文件对Gvmaker1.0的系统函数作了定义,如果要编译GVmaker1.0的程序需要首先包含此文件.
2)        Gvm2def.h
此文件对Gvmaker2.x的系统函数作了定义,如果要编译GVmaker2.x的程序需要首先包含此文件.
3)        GvmExt.h
此文件只是针对个别系统函数进行了扩展,一般没什么用处.
4)        malloc.h
此文件中定义了动态内存分配的函数malloc()和free().
5)        Float.h
此文件重载了浮点运算符,使之实现模拟浮点语法.
6)        VirtualRam.h

此文件为虚拟内存的实现文件,通过重载指针运算符实现,目前仅用于Gvm2的工程.
使用此文件时,可以不用再包含<malloc.h>.
分配和释放函数为void *_vmalloc(long __size), void _vfree(void *pmem).
当被分配的内存大于32K或物理内存分配失败时,将分配虚拟内存.虚拟内存的地址都从 0x10000开始.

由于重载了指针运算符,所以只要取得了虚拟内存的指针,直接使用指针操作即可.
目前此文件里只重写memcpy为vmemcpy,这个函数实现了任何内存(虚拟内存和物理内存)之间的数据复制,
如:

#include <gvm2def.h>
#include <virtualram.h>
#include <float.h>

void FloatOut(int x, int y, float fnum)
{
        char str[20];
        TextOut(x, y, ftoa(fnum,str));
}
void main()
{
float *pf = _vmalloc(0x10000);
if (pf == NULL)
{
    return;
}

DigitOut(0,0,(long)pf);

pf[0x2000] = 0.125;
*(pf + 0x2001) = 0.521;

FloatOut(0,16, pf[0x2000] + pf[0x2001]);
}
7)        TC800Def.h
此文件是专为TC800写的定义文件,使用时不需要包含Float.h文件,支持TC800的数学函数(但稍做了些修改,具体函数的定义请查看源文件).


就这么多了.具体内容看压缩包内的说明.

4.12更新:重新修改了代码的优化和部分浮点运算的编译, 增加函数指针的支持,函数指针的用法和C语言完全相同,示例如下:

#include <gvm1def.h>
#include <float.h>

float (*pfun)(char, long);

typedef float *(*T_fun)(void *);

typedef T_fun (*T_fun2)(void);

float func1(char p1, long p2)
{
    printf("func1\n");
    return 1.0;
}

float *func2(void *p)
{
    printf("func2\n");
    return NULL;
}

T_fun func3(void)//返回函数指针的函数
{
    printf("func3\n");
    return func2;
}

void main()
{
    pfun = func1;
    pfun(1,2);

    T_fun pfun2 = func2;
    pfun2(NULL);

    T_fun2 pfun3 = func3;
    pfun3();
}

K3->gameghost

文件大小:600k
文件类型:RAR
程序作者:gameghost

[ 本帖最后由 gameghost 于 2008-10-6 17:29 编辑 ]

GSCIDE.part1.rar

488.28 KB, 下载次数: 924

GSCIDE.part2.rar

138.22 KB, 下载次数: 762

GLGCIDE工程文件.rar

216.29 KB, 阅读权限: 3, 下载次数: 239

VS2005工程文件

评分

参与人数 14小红花 +110 收起 理由
wcxbo + 5 迟到的评分
starwing + 5 支持开源~~
澜心飞扬 + 5 支持gs~
月魂 + 5 支持 红花全给了
mzx + 5

查看全部评分

发表于 2008-2-11 19:40:44 | 显示全部楼层
沙发!~!!!
发表于 2008-2-11 19:41:24 | 显示全部楼层
有模拟器吗?
 楼主| 发表于 2008-2-11 19:47:47 | 显示全部楼层
模拟器不做了,调试功能也不加了.
要执行就把模拟器放在编译器一个文件夹里就行了.
发表于 2008-2-11 20:31:42 | 显示全部楼层
极好的编译器!
发表于 2008-2-11 21:13:43 | 显示全部楼层
支持一下!
发表于 2008-2-11 21:22:37 | 显示全部楼层
哦,了解了。
发表于 2008-2-11 22:08:19 | 显示全部楼层
小红花支持~
发表于 2008-2-11 22:09:39 | 显示全部楼层
gameghost就是强啊。强烈支持!
发表于 2008-2-11 22:24:33 | 显示全部楼层
支持!支持!
发表于 2008-2-12 00:23:19 | 显示全部楼层
这个要顶下,强烈支持啊!~~~
发表于 2008-2-12 00:40:02 | 显示全部楼层
绝对支持~~
发表于 2008-2-12 09:15:03 | 显示全部楼层
很好很强大
发表于 2008-2-12 11:15:44 | 显示全部楼层
强烈希望弄到GVM2上!
以前的那个输入有点问题...
发表于 2008-2-12 14:02:35 | 显示全部楼层
支持GG的IDE!
发表于 2008-2-12 19:08:00 | 显示全部楼层
支持!!!!


发表于 2008-2-14 14:00:48 | 显示全部楼层
小红花
发表于 2008-2-14 17:52:12 | 显示全部楼层
我现在在搞 不太会用
发表于 2008-2-14 17:53:41 | 显示全部楼层
现在小红花一朵
发表于 2008-2-14 21:48:40 | 显示全部楼层
gameghost,做的就是精品!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-25 20:52 , Processed in 0.015755 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表