5 偏飞123

尚未进行身份认证

https://github.com/pfysw

等级
TA的排名 5w+

ucc编译器分析与总结(5) 中间代码生成

1.基本框架经过语义检查后,现在已经有了包含符号和类型的完整语法树,现在要做的事情就是继续沿着语法树走一遍,对每条语句和表达式生成相应的中间代码。中间代码以三地址码的形式表示,由两个源操作数,一个目的操作数和一个运算符组成。然后uccc在生成中间代码时以基本块为单位,每个基本块包含若干条中间代码,基本块的开头都会有类似BB1:这样的标签。从静态上来看,所有基本块按顺序通过双向链表连接在一起,...

2019-08-25 16:48:16

词法分析器flex和语法分析器lemon的初步使用

自己手写词法分析器和语法分析器是很麻烦的一件事,而且这里面的逻辑非常复杂很容易出错。flex和lemon就是用来帮助生成词法分析器和语法分析器的,只需要写少量规则代码,就可以生成解析的c代码。现在先不关注实现原理,主要看一下这东西是怎么用的,等以后用熟了要实现深度定制的时候再来看实现源码。1.词法分析器首先得安装一个flex,至于怎么安装就不讲了。词法分析器的功能就是把一串字符串按照给定的规则...

2019-08-12 12:03:15

makefile基本模板

编译时一直以来都是用eclispe自带的自动编译,由于需要对其他开源代码的makefile做一些修改,所以最近学了一下,其实还挺简单的,一些基本概念就不讲了,网上教程很多,下面来举一个基本的例子来记录一下makefile的基本用法。首先文件目录如下,编译的.o文件都放在Obj目录下然后编译时还需要一个库文件libreadline.dll.a,库所在目录为/mingw32/lib,对应的头文...

2019-08-04 14:56:15

ucc编译器分析与总结(4)表达式和语句检查

1.基本框架之前在语法分析时建立了抽象语法树,在声明时为每个符号建立了类型系统,接下来就要遍历表达式和语句的每个结点,将这些声明的类型绑定在对应的结点,并相应的进行语义规范的检查。每个复合语句的检查都以一个大括号为单位,在这里面又分为局部变量声明的检查和执行语句的检查AstStatementCheckCompoundStatement(AstStatementstmt){As...

2019-08-04 10:00:44

ucc编译器分析与总结(3) 声明检查

有了类型系统和符号管理的基础知识之后,接下来就可以分析声明检查部分的代码了。源代码经过预编译后生成.i文件,这时候代码主要分为函数语句和声明语句两部分,其实函数只不过是一种特殊的声明语句,比声明语句多了{}里面的内容。函数语句和非函数语句是分开检查的:if(p->kind==NK_Function){CheckFunction((AstFunction)p);}el...

2019-07-20 16:33:40

ucc编译器分析与总结(2) 类型系统和符号管理

在语法分析的过程中,ucc按照C语言的文法构建了一颗语法树,接下来要根据语法树来进行语义检查,判断代码是否存在编译错误,譬如表达式中的变量有没有定义,定义数组的长度是否为常量,表达式中的类型是否合法等等。语义检查分为语句表达式检查和声明检查两部分,这次主要来分析声明的语义检查,在这个过程中为声明的变量构建了一个类型系统,同时对出现标识符进行管理。1类型系统1.1基本类型首先定义一些最基...

2019-07-20 08:42:22

ucc编译器分析与总结(1) 语法分析

编译器、操作系统、数据库是计算机领域中的三大基础软件,基本上所有应用软件都是建立在这三个基础软件之上,这些领域经过前辈们不断打磨现在已经变得非常成熟,很多涉及到的代码技术都是精华中的精华,所以把上面3个软件搞清楚对代码水平的提高会有很多帮助,而且能够对现代计算机的软件架构有更清晰的了解。我现在要研究一个逻辑推理系统,这个推理系统以C语言为基础,这里必然涉及到C语言的解析问题,所以C语言编译器是必...

2019-07-06 16:08:37

关于存在性问题的本质思考

在做《抽象代数的代码实现》这一专题时,我碰到数学概念难以用代码表达的问题,而这又很大程度上是由于数学上各种杂七杂八的存在性问题引起的,所以我想探究一下存在性问题到底是什么。在存在性问题解决之前先把这个专题暂停掉,因为以我现在的能力基本上挖掘不出什么东西,我需要先学习编译器,程序设计语言原理,范畴论等很多相关知识。还是以最简单的存在性问题抽屉原理为例,把4个苹果放进3个抽屉,证明至少有一个抽屉里的...

2019-06-11 21:28:01

抽象代数的代码实现(6)自同构、正规子群、商群

到目前为止,这里面的复杂性已经超出了我的想象,我觉得最关键的还是表达力太欠缺了,怎么用代码来表示各种数学的表达式如多元函数等,数学上的各种变换和各种代换怎么表示,还有各种表达式间的混合运算,真的感觉这些已经不在我的认知范围内,就好像一个初中生去做微积分一样困难。最后打算先粗略的介绍一下自同构的概念,然后就先告一段落吧。同构对于域K到K’的一一映射σ,如果σ(a)σ(b)=σ(ab),那么就把σ...

2019-05-20 17:56:16

抽象代数的代码实现(5)分裂域

不可约多项式先来纠正上篇文章一处不严谨的地方,给定一个多项式f(x),做出有理数域K的扩域K(α),使得f(α)=0.,这里必须要规定f(x)是不可约多项式才保证能做出扩域,不可约多项式指的是f(x)不能表示成两个次数小于f(x)的多项式之积。如果f(x)是可约多项式,那么并不能按照之前讲的方法扩域,举个例子,假如f(x)=x^3-1,那么f(x)可约,因为f(x)=x^3-1=(...

2019-05-06 08:06:24

抽象代数的代码实现(4)多项式与代数扩域

在实现多项式运算的代码时,突然觉得抽象急剧增加,感觉我的大脑要到极限了,写的代码完全就是调试出来的,对于代码的结构我自己都感到有点模糊,想表述清楚基本不可能了,凑活着记录一下吧。现在我对抽象的理解是,一个符号,一个概念,它不一定就指的是我们常见的概念,也可以代入另外的概念,代入后的新系统与原系统有着某种相似性(同构),但是新系统的运算很难被直观理解。在这一点上C语言还是挺有优势的,同一个指针可以...

2019-05-01 17:32:06

抽象代数的代码实现(3)向量空间

向量空间概念定义上篇文章介绍了域,域可以简单的理解为一个有理数集合,这个集合中有加法运算和乘法运算,运算后的结果是封闭的,还是有理数。接下来我们从这个元素中取出n个元素,这n个元素组成一个有顺序的子集,这个子集称为n维向量。设a、b、c是有理数,那么(abc)是一个三维向量。所有三维向量组成的集合称为V,假设有理数集合为K,V中的元素为A、B、C……如果下面的运算成立,那么把V称为K上的...

2019-04-26 15:49:28

抽象代数的代码实现(2)域

域上一篇文章讲了群的概念,现在来介绍一下域的概念。群是一个集合和运算,集合中元素的运算满足群的4条性质。相比群来说,域增加了一个运算,假设有集合A,运算{+},运算{•},如果集合A对{+}运算做成一个群,称作加法群,加法群A中的单位元称为零元,A中去除零元后的集合对{•}运算也做成一个群,并且+和•满足分配律,即a•(b+c)=a•b+a•c那么我们把A叫做一个域,要注意+和•不一定是...

2019-04-22 16:04:05

抽象代数的代码实现(1) 置换群

前言之前做了一个四国军棋软件,做到最后我发现工作量已经爆炸了,我需要去寻找一个全新的算法,所谓深度学习的算法也许有效果但是对于没有计算资源的人来说并不适用。我其实是挺喜欢数学的,我总觉得数学上的一些思想方法可能对写代码有所帮助,但是我已经深深意识到自己的大脑不适合去处理数学问题。数学的语言是精确的,数学书籍的作者想表达的意思也是清晰的,对于高智商的人能很容易明白作者的意思,但是对于我这么一个智...

2019-04-16 21:49:18

四国军棋引擎开发(12)关键步加深搜索

调了很久终于能够更新一个版本了,这东西是越来越难调了,每一次输棋都要处理茫茫多的复杂逻辑,而且有些bug隐藏在递归的最深处很难定位,真希望软件可以像人一样自己学会想算法调代码做验证。这次更新大的框架没有什么改动,只是调了很多很多的bug,最主要添加的功能是在搜索时记录一些关键步,在关键步如威胁到军旗时,再加深2层,从而在残局中能调集一些子力防守。我不打算把这个软件的棋力做到顶尖,做到能稳赢...

2019-03-17 21:42:11

四国军棋引擎开发(11)多线程搜索

由于现在没有什么好的办法优化剪枝来增加搜索深度,所以现在通过不同的方法进行搜索,最后综合各种搜索方法的结果选择最佳着法。每一种搜索方法是独立的,所以单独放在一个线程里搜索,如果CPU是多核的,操作系统会自动把每个线程放在不同的核心上搜索,达到了并行计算的效果。当前更新版本是2.2,大的框架基本差不多了,行棋时还有很多bug,所以胜率不是很理想,测试结果如下  1.多线程框架首先...

2019-01-05 13:00:29

四国军棋引擎开发(10)局面评估优化

这次对局面评估做了一些优化,棋力有了一些提升,可以定为2.1版本,测试结果如下:引擎Avs引擎B 战绩(胜:负:和) 1.1vs1.0 8:2:0 1.2vs1.1 8:2:0 1.2vs1.0 10:0:0 2.0vs1.2 8:1:1 2.0vs1.1 8:0:2 2.1vs2.0 ...

2018-12-14 22:05:17

四国军棋引擎开发(9)子力概率判断分析

本文分为2部分,第1部分继续深入分析子力的概率问题,第2部分记录下刚刚碰到的一个非常棘手的bug,解决这个bug后,目前这个版本基本上没有什么明显的bug,可以作为版本为2.0。如果全部着法都搜索的话,1秒最多搜4层,军棋每步可行的走法太多,搜索已经很难优化了,接下来的主要优化在局面评估和局部搜索,目前2.0版本的测试结果如下:引擎Avs引擎B 战绩(胜:负:和) 1.1vs...

2018-11-25 13:50:39

四国军棋引擎开发(8)主要变例提取

alpha-beta剪枝算法对着法的搜索顺序有比较高的要求,最好是先搜索好的着法再搜索坏的着法,这样就可以最大程度的进行剪枝。在搜索前我们当然不知道着法的优劣,如果知道了那就不需要搜索了,但我们搜索时是一层层递进的,上一层搜索到的最佳着法在这一层来说也相对较优,提取出来之后我们就可以优先搜索上一层的最佳着法序列,也就是主要变例。从算法上来说,主要变例就是value介于alpha和beta之间的...

2018-10-29 08:39:31

四国军棋引擎开发(7)概率分析与搜索优化

1.概率分析四国军棋属于不完全信息博弈,我们是看不到敌方的棋子,但是可以通过棋子间的碰撞来判断敌方的子力分布情况和棋子大小的概率。当棋子产生碰撞后,可能的判决结果有吃子、打兑、撞死3种结果,有时还会附加是否亮军旗的信息,之前的处理只是简单的把所有情况取平均值,这是不对的,因为某些情况虽然存在,但是概率特别小,如果取平均值就会对着法评分的准确性造成很大的影响,所以更好的方式应该是对每一种情况生成...

2018-10-14 14:27:58

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv1
    勤写标兵Lv1
    授予每个自然周发布1篇到3篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。