11 | 语义分析(上):如何建立一个完善的类型系统?
宫文学
该思维导图由 AI 生成,仅供参考
在做语法分析时我们可以得到一棵语法树,而基于这棵树能做什么,是语义的事情。比如,+ 号的含义是让两个数值相加,并且通常还能进行缺省的类型转换。所以,如果要区分不同语言的差异,不能光看语言的语法。比如 Java 语言和 JavaScript 在代码块的语法上是一样的,都是用花括号,但在语义上是不同的,一个有块作用域,一个没有。
这样看来,相比词法和语法的设计与处理,语义设计和分析似乎要复杂很多。虽然我们借作用域、生存期、函数等特性的实现涉猎了很多语义分析的场景,但离系统地掌握语义分析,还差一点儿火候。所以,为了帮你攻破语义分析这个阶段,我会用两节课的时间,再梳理一下语义分析中的重要知识,让你更好地建立起相关的知识脉络。
今天这节课,我们把注意力集中在类型系统这个话题上。
围绕类型系统产生过一些争论,有的程序员会拥护动态类型语言,有的会觉得静态类型语言好。要想探究这个问题,我们需要对类型系统有个清晰的了解,最直接的方式,就是建立一个完善的类型系统。
那么什么是类型系统?我们又该怎样建立一个完善的类型系统呢?
其实,类型系统是一门语言所有的类型的集合,操作这些类型的规则,以及类型之间怎么相互作用的(比如一个类型能否转换成另一个类型)。如果要建立一个完善的类型系统,形成对类型系统比较完整的认知,需要从两个方面出发:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了语义分析中类型系统的设计和特征,重点讨论了类型检查、类型推导和类型转换的重要性。文章首先介绍了类型系统的概念和作用,强调了根据领域需求进行类型系统设计的重要性。接着,文章详细讨论了类型推导的过程,以及类型检查在赋值语句、变量声明语句、函数传参和函数返回值中的应用。此外,文章还提到了类型转换的重要性,以及在不同语言中类型转换的风险和特点。作者通过示例代码展示了类型推导和类型检查的具体实现,以及S属性和I属性的概念。最后,文章总结了对类型系统的理解对学习语言的帮助,并鼓励读者深入理解计算机语言,以获得额外的收获。整体而言,本文为读者提供了对语义分析中类型系统的深入认知和理解。 文章链接:[如何做类型检查、类型推导和类型转换](https://example.com/article123)
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》,新⼈⾸单¥59
《编译原理之美》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- janeyC语言是静态类型语言,大部分变量是强类型,但指针是弱类型吧,查不出错啊。Go语言是静态类型语言,但interface 实现接口到运行时才报错又有动态的成份。请老师指正。
作者回复: 同意你的分析:-)
2019-09-10210 - 智晨想请教一下老师,类型论是干什么用的?跟类型系统有什么关系?
作者回复: 我认为,如果想从根本上理解编程语言的类型系统,以及其他学科如社会学、生物学中的分类系统,应该都要理解类型论。因为数学是最最底层的形式体系了。 对子类型的严格定义,也最好用数学方式表达。 如果有对理论追根究底的兴趣,还是可以研究一下类型论。对于想设计一套类型系统的人来说,本着严谨的态度,也有必要了解类型论。
2019-10-109 - VVK老师讲的太好了,十几年没搞懂的概念终于理整明白了。
作者回复: 谢谢肯定:-)
2019-09-087 - Sudouble以类型系统实现的原理看已使用了良久的编程语言,有种莫名的亲切感。很好奇编程语言的发展史,以及特定的编程语言是为什么而诞生的,相互间又有什么异同之处。
作者回复: 研究技术到最后,一定会研究历史,以及推动历史发展的那些人。我在结束语中提了一些关键的人物。我们仔细研究语言的特性的话,会发现它们传承、发展的脉络,很有意思。
2019-11-1423 - DJava中的封装类,提供了类型系统,好处就是方便使用,符合类型系统规范,坏处是性能损失。
作者回复: 是的:-)
2019-09-092 - dra老师竟然回复了上一位留言。还在维护👍🏼期待老师下一个专栏
作者回复: 肯定要回复。最近时间宽裕了些,希望可以回复更及时:)
2020-04-02 - 墨灵a = 1 # 变量初始化,假设类型推导成功 a + 1 # 两个数值相加,正常执行 a = '1' # 如果允许在运行期改变a的类型,则是动态类型,否则是静态类型 a + 1 # 如果定义char + int是没意义的,报错的是强类型,不报错是弱类型 JavaScript是动态类型,也是弱类型;python是动态类型,却是强类型。2020-09-1422
- 核桃我是学Rust的,Rust中特别强调生命周期,可变引用,不可变引用这些概念,一开始觉得好像和其他语言差不多,但是学着写了一些代码之后才发现,其实差异会很大,Rust是无gc的,但是又没有C/C++那种高度自由,所以做了很多折中和规矩,因此像Rust的编译原理,后面有机会也想深入了解一下。2022-06-06
- hilltsui老师你好,请问老师你文中说运行程序时机机械码不区分数据类型,但为什么cpu 存在整型运算和浮点运算单元的区别?常说的fpu 。2022-02-251
- 爱笑的布谷鸟宫老师,类型系统的目的,就是为了做类型检查,这样理解对吗?2021-11-21
收起评论