Wudy 发表于 2012-5-28 20:43:25

【ADD-IN】【机上C编译器】WSC & FVM 1.0

本帖最后由 Wudy 于 2012-6-7 11:48 编辑

已有新版 http://www.cncalc.org/thread-7516-1-1.html


------------------------------------------------------------------------------

C语言编译器+虚拟机v1.0(尝鲜版)放出!

WSC是编译器,FVM是虚拟机。编辑器可以用EDIT。

用EDIT写好代码(*.c)后,WSC编译出字节码文件(*.f),交由FVM执行。
所有操作均在计算器上执行。


语法、内核基本都好了,下一步的目标就是扩充库函数。
正式版会有更详细的说明文档,以下一些不完善的地方以后也会慢慢改善,欢迎汇报bug,应该会有挺多的...


Features:
1.操作符
+ - * / % += -= *= /= %= < <= > >= == != && || ! & =
注意&是取地址而不是按位于。
2.数据类型
int、char、float、任意维数的数组、指向基本类型的指针(不能指向数组)
3.语句
if while for return break
4.库函数
共6个(有重载)
int scanf( char *fomat, int *address   );
int scanf( char *fomat. float *address );
int printf( char *format );
int printf( char *format, int value );
int printf( char *format, float value );int printf( char *format, char *str );
getsn( char *buffer, int max );


Notice:
1. int * a, b;
这里a、b都会是指向int的指针(所以建议写成int* a, b; 而不是int *a, b;)
2. int *p; p++;
ansi c里实际p的值会加4(即sizeof(int))而WSC编译器只会让它加1
3. a[ i ] += 5;
带有带有索引的左值不能使用 +=、*= 之类的操作符,例句是错误的
4. char s = "abcde";
这种初始化方式暂未被支持,例句是错误的

Wudy 发表于 2012-5-28 20:49:53

几个已经完美测试的代码

本帖最后由 Wudy 于 2012-5-28 21:12 编辑

1.八皇后int C;

int tot = 0;

void search( int cur )
{
      int i, j;
      
      if( cur == 8 )
                tot += 1;
      else
      {
                for(i = 0; i < 8; i += 1 )
                {
                        int ok = 1;

                        C = i;
                        for( j = 0; j < cur; j += 1 )
                              if( C == C || cur - C == j - C || cur + C
                                        == j + C )
                                        {
                                                ok = 0;
                                                break;
                                        }
                        if( ok )
                              search( cur + 1 );                                                
                }
      }
}

void main()
{
      search( 0 );
      printf( "total : %d\n", tot );
}2.快排int partition( int* a, int p, int r )
{
int x, i, j;

x = a;
i = p - 1;
for( j = p; j < r; j += 1 )
{
    if( a <= x )
    {
      i += 1;
      swap( &a, &a );
    }
}
      swap( &a, &a );
return i + 1;
}

void qsort( int *a, int p, int r)
{
int q;

if( p < r )
{
    q = partition( a, p, r );
    qsort( a, p, q-1 );
    qsort( a, q+1, r );
}
}

void main()
{
int a;
int i;

for( i = 0; i < 5; i += 1 )
    scanf( "%d", &a );

qsort( a, 0, 4 );

printf( "-----------\n" );
for( i = 0; i < 5; i += 1 )
    printf( "%d\n", a );
}

void swap( int *a, int *b )
{
int t;

t = *a; *a = *b; *b = t;
}3.hello worldvoid main()
{
      printf( "%s\n", "Hello World!" );
}

Wudy 发表于 2012-5-28 21:05:40

本帖最后由 Wudy 于 2012-5-28 21:15 编辑

机上写好基本框架,可以传到电脑,再让sdk编译,来获取更好效果

zhs490770 发表于 2012-5-29 12:39:22

这样就是说……NOIP初赛可以直接将程序输入得出答案?
(对不起我想得太那个了~)

wtof1996 发表于 2012-5-29 13:13:10

挺不错的,支持!

cnzym 发表于 2012-5-29 17:36:01

感谢楼主,最近在学C

月与映之皮丘 发表于 2012-5-29 23:16:07

顶,很不错的

cnzym 发表于 2012-5-30 12:34:19

编译并执行如下代码:void main()
{
char a;
scanf("%s",&a);
printf("%s\n",a);
}
只能输出前4个char,求解释。

Wudy 发表于 2012-5-30 13:00:31

楼上C语言没学好,代码是错误的,去翻书吧。

Wudy 发表于 2012-5-30 13:24:36

本帖最后由 Wudy 于 2012-5-30 13:32 编辑

再加一个notice
int a;
如果要知道a的值,用printf( "%d", a );会得到错误结果,因为编译器对所有指针都一视同仁,在几个重载的函数里,判断成应该调用printf( char *, char * ) 而不是printf( char *, int )。
要得到正确结果可以 int t = a; printf( "%d", t )

81100118 发表于 2012-5-30 17:14:31

我来下个试试看,看起来很不错

cnzym 发表于 2012-5-30 17:16:01

9# Wudy 我刚刚学C,但是以下代码在VC++6.0上确实可以运行,请教一下这两个C语言有什么区别?

Wudy 发表于 2012-5-30 18:23:11

本帖最后由 Wudy 于 2012-5-30 18:49 编辑

编译器误导新人啊(试了下gcc也这样)...
你可以去比比你的代码和书上的代码哪里不同,scanf错的

Wudy 发表于 2012-5-30 20:50:09

发现一个bug:
把int型数据传给float型参数时会发生错误。

现在已经修复,和下版(支持90%的9860可用标准C函数)一起发布。

wtof1996 发表于 2012-5-30 21:59:52

8l
代码明显是错的……a已经是一个指针了……

jinzihao1996 发表于 2012-5-30 22:13:46

楼主真的很厉害。弱弱地问一句,在计算器上直接编译为g1a有没有可能实现?我还想测试一下同一段代码编译为g1a和编译为“字节码”运行速度相差多少,与casio basic又相差多少。我很关心运行速度,如果字节码的速度能达到g1a的一半就很不错了,不知能不能达到。
楼主前一段时间做的词典其实也很实用,我个人认为是最实用的add-in了,希望能继续开发,并提供更多可供选择的词典文件。

Wudy 发表于 2012-5-31 11:22:17

16# jinzihao1996
直接编译g1a有难度

for 1→i to 100000
我的9750,BASIC算了124s,FVM算了13s。

for 1→i to 10000000
g1a差不多1s

g1a约是FVM的1000倍,FVM约是BASIC的10倍。

yangsc825 发表于 2012-5-31 20:03:24

很不错啊!
对了,我把主函数写成int main()
{
return 0;
}
的形式,结果退不出来了,按reset键退出

wtof1996 发表于 2012-5-31 21:26:52

说实话,比较标准的是int main
不过void main也不能说错

Wudy 发表于 2012-6-1 07:22:14

18# yangsc825
已经修复,欢迎汇报更多bug
页: [1] 2
查看完整版本: 【ADD-IN】【机上C编译器】WSC & FVM 1.0