编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

37 | 高级特性(二):揭秘泛型编程的实现机制

模板技术的缺点
C++的模板元编程技术
支持值类型
C#的具体化技术
局限性
Java的类型擦除
Julia中的泛型和类型计算
不变、协变和逆变
基于元编程技术的泛型实现
具体化技术
类型擦除技术
泛型的多态现象
泛型的用途
泛型的特点
参考资料
一课一思
课程小结
泛型对类型系统的增强
泛型的实现
什么是泛型?
泛型编程的实现机制

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

你好,我是宫文学。
对泛型的支持,是现代语言中的一个重要特性。它能有效地降低程序员编程的工作量,避免重复造轮子,写很多雷同的代码。像 C++、Java、Scala、Kotlin、Swift 和 Julia 这些语言都支持泛型。至于 Go 语言,它的开发团队也对泛型技术方案讨论了很久,并可能会在 2021 年的版本中正式支持泛型。可见,泛型真的是成为各种强类型语言的必备特性了。
那么,泛型有哪些特点?在设计和实现上有哪些不同的方案?编译器应该进行什么样的配合呢?今天这一讲,我就带你一起探讨泛型的实现原理,借此加深你对编译原理相关知识点的认知,让你能够在自己的编程中更好地使用泛型技术。
首先,我们来了解一下什么是泛型。

什么是泛型?

在日常编程中,我们经常会遇到一些代码逻辑,它们除了类型不同,其他逻辑是完全一样的。你可以看一下这段示例代码,里面有两个类,其中一个类是保存 Integer 的列表,另一个类是保存 Student 对象的列表。
public class IntegerList{
List data = new ArrayList();
public void add(Integer elem){
data.add(elem);
}
public Integer get(int index){
return (Integer) data.get(index);
}
}
public class StudentList{
List data = new ArrayList();
public void add(Student elem){
data.add(elem);
}
public Student get(int index){
return (Student) data.get(index);
}
}
我们都知道,程序员是很不喜欢重复的代码的。像上面这样的代码,如果要为每种类型都重新写一遍,简直会把人逼疯!
泛型的典型用途是针对集合类型,能够更简单地保存各种类型的数据,比如 List、Map 这些。在 Java 语言里,如果用通用的集合类来保存特定类型的对象,就要做很多强制转换工作。而且,我们还要小心地做类型检查。比如:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了C#、Java和C++中泛型技术的实现方式和特点。C#通过具体化技术成功避免了Java泛型的局限性,IL保留了类型参数的类型信息,使得在运行时可以使用这些类型信息,同时支持值类型,避免了额外的内存开销和性能开销。相比之下,C++的泛型技术依托模板元编程技术,能够提供对基础数据类型的支持,但在类型检查能力和错误信息定位方面存在一些短板。文章还提到了泛型对类型系统的增强,包括不变、协变和逆变三种情况,以及在类型参数化后对计算机语言的类型系统带来的挑战。通过对比不同语言的实现技术,本文为读者提供了深入了解泛型编程的机制和原理的视角。文章内容丰富,涉及了泛型技术的具体实现和对类型系统的影响,对于想深入了解泛型编程的读者具有很高的参考价值。 Julia中的泛型和类型计算方面,文章介绍了Julia设计的类型体系,以及在函数编写和结构体定义时使用泛型的特点。文章强调了泛型提供的参数化多态和方法多态的融合,以及被泛型增强后的类型体系对动态分派算法提出的更高要求。最后,文章提出了两道思考题,分别针对Java和Go语言的泛型技术问题,鼓励读者深入思考并分享观点。文章内容丰富,对于想深入了解泛型和类型计算的读者具有很高的参考价值。

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

全部留言(4)

  • 最新
  • 精选
  • kkxue
    Rust or Go?

    作者回复: 你想表达的意思是?

    2021-03-04
    4
  • math715
    宫老师,你好。 对于c++的元编程,是否需要增加反射机制呢?像rust的,支持反射机制。如果需要,增加哪些功能才能支持反射机制呢?

    作者回复: 对于是否需要这个问题,确实在一些场景中是有需求的。比如对象的序列化,或者把一个编译期未知的对象的字段取出来,写到数据库里去(这是典型的ORM工具的功能),等等。 C++标准的制定者们已经在考虑反射机制,据说最早在C++23,最晚在C++26中确定下来,不过这个反射机制仍然是编译期的,而不是运行期的。 有一些第三方的工具实现反射功能。具体实现策略,你可以看考这篇文章,比如可以利用debug信息,使用预处理器等。http://www.garret.ru/cppreflection/docs/reflect.html

    2020-09-16
    2
  • gk
    只想说牛!
    2021-04-23
    1
  • kkxue
    这里有篇讲解Go 1.19版本之前泛型方案的极客课程加餐,可以参考http://gk.link/a/120AW
    2023-03-28归属地:广东
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部