编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

11 | 语义分析(上):如何建立一个完善的类型系统?

I属性(Inherited Attribute)
S属性(Synthesized Attribute)
类型转换
类型检查
类型推导
强类型语言 vs. 弱类型语言
静态类型语言 vs. 动态类型语言
类型的定义
类型检查、推导和转换
设计类型系统的特征
类型系统
语法树
语义设计与分析
语法分析
语义分析

该思维导图由 AI 生成,仅供参考

在做语法分析时我们可以得到一棵语法树,而基于这棵树能做什么,是语义的事情。比如,+ 号的含义是让两个数值相加,并且通常还能进行缺省的类型转换。所以,如果要区分不同语言的差异,不能光看语言的语法。比如 Java 语言和 JavaScript 在代码块的语法上是一样的,都是用花括号,但在语义上是不同的,一个有块作用域,一个没有。
这样看来,相比词法和语法的设计与处理,语义设计和分析似乎要复杂很多。虽然我们借作用域、生存期、函数等特性的实现涉猎了很多语义分析的场景,但离系统地掌握语义分析,还差一点儿火候。所以,为了帮你攻破语义分析这个阶段,我会用两节课的时间,再梳理一下语义分析中的重要知识,让你更好地建立起相关的知识脉络。
今天这节课,我们把注意力集中在类型系统这个话题上。
围绕类型系统产生过一些争论,有的程序员会拥护动态类型语言,有的会觉得静态类型语言好。要想探究这个问题,我们需要对类型系统有个清晰的了解,最直接的方式,就是建立一个完善的类型系统。
那么什么是类型系统?我们又该怎样建立一个完善的类型系统呢?
其实,类型系统是一门语言所有的类型的集合,操作这些类型的规则,以及类型之间怎么相互作用的(比如一个类型能否转换成另一个类型)。如果要建立一个完善的类型系统,形成对类型系统比较完整的认知,需要从两个方面出发:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了语义分析中类型系统的设计和特征,重点讨论了类型检查、类型推导和类型转换的重要性。文章首先介绍了类型系统的概念和作用,强调了根据领域需求进行类型系统设计的重要性。接着,文章详细讨论了类型推导的过程,以及类型检查在赋值语句、变量声明语句、函数传参和函数返回值中的应用。此外,文章还提到了类型转换的重要性,以及在不同语言中类型转换的风险和特点。作者通过示例代码展示了类型推导和类型检查的具体实现,以及S属性和I属性的概念。最后,文章总结了对类型系统的理解对学习语言的帮助,并鼓励读者深入理解计算机语言,以获得额外的收获。整体而言,本文为读者提供了对语义分析中类型系统的深入认知和理解。 文章链接:[如何做类型检查、类型推导和类型转换](https://example.com/article123)

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • janey
    C语言是静态类型语言,大部分变量是强类型,但指针是弱类型吧,查不出错啊。Go语言是静态类型语言,但interface 实现接口到运行时才报错又有动态的成份。请老师指正。

    作者回复: 同意你的分析:-)

    2019-09-10
    2
    10
  • 智晨
    想请教一下老师,类型论是干什么用的?跟类型系统有什么关系?

    作者回复: 我认为,如果想从根本上理解编程语言的类型系统,以及其他学科如社会学、生物学中的分类系统,应该都要理解类型论。因为数学是最最底层的形式体系了。 对子类型的严格定义,也最好用数学方式表达。 如果有对理论追根究底的兴趣,还是可以研究一下类型论。对于想设计一套类型系统的人来说,本着严谨的态度,也有必要了解类型论。

    2019-10-10
    9
  • VVK
    老师讲的太好了,十几年没搞懂的概念终于理整明白了。

    作者回复: 谢谢肯定:-)

    2019-09-08
    7
  • Sudouble
    以类型系统实现的原理看已使用了良久的编程语言,有种莫名的亲切感。很好奇编程语言的发展史,以及特定的编程语言是为什么而诞生的,相互间又有什么异同之处。

    作者回复: 研究技术到最后,一定会研究历史,以及推动历史发展的那些人。我在结束语中提了一些关键的人物。我们仔细研究语言的特性的话,会发现它们传承、发展的脉络,很有意思。

    2019-11-14
    2
    3
  • D
    Java中的封装类,提供了类型系统,好处就是方便使用,符合类型系统规范,坏处是性能损失。

    作者回复: 是的:-)

    2019-09-09
    2
  • dra
    老师竟然回复了上一位留言。还在维护👍🏼期待老师下一个专栏

    作者回复: 肯定要回复。最近时间宽裕了些,希望可以回复更及时:)

    2020-04-02
  • 墨灵
    a = 1 # 变量初始化,假设类型推导成功 a + 1 # 两个数值相加,正常执行 a = '1' # 如果允许在运行期改变a的类型,则是动态类型,否则是静态类型 a + 1 # 如果定义char + int是没意义的,报错的是强类型,不报错是弱类型 JavaScript是动态类型,也是弱类型;python是动态类型,却是强类型。
    2020-09-14
    2
    2
  • 核桃
    我是学Rust的,Rust中特别强调生命周期,可变引用,不可变引用这些概念,一开始觉得好像和其他语言差不多,但是学着写了一些代码之后才发现,其实差异会很大,Rust是无gc的,但是又没有C/C++那种高度自由,所以做了很多折中和规矩,因此像Rust的编译原理,后面有机会也想深入了解一下。
    2022-06-06
  • hilltsui
    老师你好,请问老师你文中说运行程序时机机械码不区分数据类型,但为什么cpu 存在整型运算和浮点运算单元的区别?常说的fpu 。
    2022-02-25
    1
  • 爱笑的布谷鸟
    宫老师,类型系统的目的,就是为了做类型检查,这样理解对吗?
    2021-11-21
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部