栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UCC编译器学习笔记7

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UCC编译器学习笔记7

库函数 printf()的代码在我们编写上述 hello.c 时就已经存在,这意味着被调函数 printf
其实并不知道我们在调用它时,到底传递了几个实参。对 printf 而言,它只是按照格式化字
符串的说明,从栈中取出相应的参数,如下所示:
// 实际上只有 10 这一个参数,但 printf 看到有两个%d,
// 于是仍试图从栈中取两个参数,打印出形如 10,1074172310 的垃圾值
printf(“%d, %d “,10);
// 实际上有 10,20,30 这 3 个参数,但 printf 只看到一个%d,
// 于是只打印出参数 10
printf(“%d”, 10,20,30);

4字节对齐的算法:

宏 ALIGN_INT(char)展开后为(1+3)&(~3),即 4
宏 ALIGN_INT(short)展开后为(2+3) &(~3) ,即 4

我们知道,一个整数乘以 4,相当将其左移 2 位,这意味着对任何一个为 4 倍数的整数
来说,其二进制形式的最低 2 位都是 0。上述(1+3)和(2+3)运算的目的是为了得到一个不小于
4 的数,而&(~3)运算的目的则是把这个不小于 4 的数的低 2 位清 0,从而得到我们需要的对
齐结果。

按 C 标准的规定,如果 f 未经声明就使用,则将函数 f 视为旧式风格的函数声明,相当于 f 的声明为 int f()。我们在“2.4 节 C 语言类型系统”时已做过介绍,旧式风格函数会带来令人抓狂的噩梦。这也应是 C++编译器禁止“函数未声明就使用”的原因。从这一点,我们也能再次体会,C++并非是 C 语言的超集,C++只是尽可能地去兼容已有的 C,对于实在看不下去的部分也采取了“摒弃”的策略。

在UCC编译器中,参与算术运算的小于 int的操作数(char,unsigned char,short 或 unsigned short)都会被提升到 int,要注意的是即使是进行两个 char 类型变量的加法,例如 c1+c2,我们也是先会 c1 和 c2 提升为 int,然后做 32 位的加法运算.以 int型作为操作数,实际上意味着我们总是试图充分利用 CPU 的通用数据寄存器。

语义检查的两个目的,针对语法树,完善类型系统(每个token都具有了可以理解的意思)+合法性检查

    casgn->kids[0] = expr->kids[0]; //创建一个节点,替换了之前的节点了

    casgn->kids[1] = Constant(expr->coord, T(INT), val);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号