左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家,骨灰级程序员
立即订阅
40357 人已学习
课程目录
已完结 108 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 | 洞悉技术的本质,享受科技的乐趣
免费
01 | 程序员如何用技术变现(上)
02 | 程序员如何用技术变现(下)
03 | Equifax信息泄露始末
04 | 从Equifax信息泄露看数据安全
05 | 何为技术领导力?
06 | 如何才能拥有技术领导力?
07 | 推荐阅读:每个程序员都该知道的知识
08 | Go语言,Docker和新技术
09 | 答疑解惑:渴望、热情和选择
10 | 如何成为一个大家愿意追随的Leader?
11 | 程序中的错误处理:错误返回码和异常捕捉
12 | 程序中的错误处理:异步编程以及我的最佳实践
13 | 魔数 0x5f3759df
14 | 推荐阅读:机器学习101
15 | 时间管理:同扭曲时间的事儿抗争
16 | 时间管理:如何利用好自己的时间?
17 | 故障处理最佳实践:应对故障
18 | 故障处理最佳实践:故障改进
19 | 答疑解惑:我们应该能够识别的表象和本质
20 | Git协同工作流,你该怎么选?
21 | 分布式系统架构的冰与火
22 | 从亚马逊的实践,谈分布式系统的难点
23 | 分布式系统的技术栈
24 | 分布式系统关键技术:全栈监控
25 | 分布式系统关键技术:服务调度
26 | 分布式系统关键技术:流量与数据调度
27 | 洞悉PaaS平台的本质
28 | 推荐阅读:分布式系统架构经典资料
29 | 推荐阅读:分布式数据调度相关论文
30 | 编程范式游记(1)- 起源
31 | 编程范式游记(2)- 泛型编程
32 | 编程范式游记(3) - 类型系统和泛型的本质
33 | 编程范式游记(4)- 函数式编程
34 | 编程范式游记(5)- 修饰器模式
35 | 编程范式游记(6)- 面向对象编程
36 | 编程范式游记(7)- 基于原型的编程范式
37 | 编程范式游记(8)- Go 语言的委托模式
38 | 编程范式游记(9)- 编程的本质
39 | 编程范式游记(10)- 逻辑编程范式
40 | 编程范式游记(11)- 程序世界里的编程范式
41 | 弹力设计篇之“认识故障和弹力设计”
42 | 弹力设计篇之“隔离设计”
43 | 弹力设计篇之“异步通讯设计”
44 | 弹力设计篇之“幂等性设计”
45 | 弹力设计篇之“服务的状态”
46 | 弹力设计篇之“补偿事务”
47 | 弹力设计篇之“重试设计”
48 | 弹力设计篇之“熔断设计”
49 | 弹力设计篇之“限流设计”
50 | 弹力设计篇之“降级设计”
51 | 弹力设计篇之“弹力设计总结”
52 | 管理设计篇之“分布式锁”
53 | 管理设计篇之“配置中心”
54 | 管理设计篇之“边车模式”
55 | 管理设计篇之“服务网格”
56 | 管理设计篇之“网关模式”
57 | 管理设计篇之“部署升级策略”
58 | 性能设计篇之“缓存”
59 | 性能设计篇之“异步处理”
60 | 性能设计篇之“数据库扩展”
61 | 性能设计篇之“秒杀”
62 | 性能设计篇之“边缘计算”
63 | 区块链技术的本质
64 | 区块链技术细节:哈希算法
65 | 区块链技术细节:加密和挖矿
66 | 区块链技术细节:去中心化的共识机制
67 | 区块链技术细节:智能合约
68 | 区块链技术 - 传统金融和虚拟货币
69 | 程序员练级攻略:开篇词
70 | 程序员练级攻略:零基础启蒙
71 | 程序员练级攻略:正式入门
72 | 程序员练级攻略:程序员修养
73 | 程序员练级攻略:编程语言
74 | 程序员练级攻略:理论学科
75 | 程序员练级攻略:系统知识
76 | 程序员练级攻略:软件设计
77 | 程序员练级攻略:Linux系统、内存和网络
78 | 程序员练级攻略:异步I/O模型和Lock-Free编程
79 | 程序员练级攻略:Java底层知识
80 | 程序员练级攻略:数据库
81 | 程序员练级攻略:分布式架构入门
82 | 程序员练级攻略:分布式架构经典图书和论文
83 | 程序员练级攻略:分布式架构工程设计
84 | 程序员练级攻略:微服务
85 | 程序员练级攻略:容器化和自动化运维
86 | 程序员练级攻略:机器学习和人工智能
87 | 程序员练级攻略:前端基础和底层原理
88 | 程序员练级攻略:前端性能优化和框架
89 | 程序员练级攻略:UI/UX设计
90 | 程序员练级攻略:技术资源集散地
91 | 程序员面试攻略:面试前的准备
92 | 程序员面试攻略:面试中的技巧
93 | 程序员面试攻略:面试风格
94 | 程序员面试攻略:实力才是王中王
95 | 高效学习:端正学习态度
96 | 高效学习:源头、原理和知识地图
97 | 高效学习:深度,归纳和坚持实践
98 | 高效学习:如何学习和阅读代码
99 | 高效学习:面对枯燥和量大的知识
左耳听风
登录|注册

32 | 编程范式游记(3) - 类型系统和泛型的本质

陈皓 2018-01-18
前面,我们讨论了从 C 到 C++ 的泛型编程方法,并且初探了更为抽象的函数式编程。正如在上一篇文章中所说的,泛型编程的方式并不只有 C++ 这一种类型,我们只是通过这个过程了解一下,底层静态类型语言的泛型编程原理。这样能够方便我们继续后面的历程。
是的,除了 C++ 那样的泛型,如果你了解其它编程语言一定会发现,在动态类型语言或是某些有语法糖支持的语言中,那个swap()search() 函数的泛型其实可以很简单地就实现了。
比如,你甚至可以把swap()函数简单地写成下面这个样子(包括 Go 语言也有这样的语法):
b, a = a, b;
在上一篇文章后面的 Reduce 函数中,可以看到,在编程世界中,我们需要处理好两件事:
第一件事是编程语言中的类型问题。
第二件事是对真实世界中业务代码的抽象、重用和拼装。
所以,在这篇文章中,我们还是继续深入地讨论上面这两个问题,着重讨论一下编程语言中的类型系统和泛型编程的本质。

类型系统

在计算机科学中,类型系统用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,以及如何操作这些类型,还有这些类型如何互相作用。类型可以确认一个值或者一组值,具有特定的意义和目的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《左耳听风》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(24)

  • 云学
    意犹未尽啊,比追剧还痛苦

    作者回复: 哈哈

    2018-01-12
    23
  • shougao
    “类型是对内存的抽象,不同的类型会有不同的内存分布和内配策略”,见识了,用范型这么多年真是白用了。
    2018-01-19
    14
  • W_T
    类型是对内存的一种抽象。这是我在这篇文章中最大的收获
    2018-02-03
    7
  • Casey
    本来说就看10分钟,一不小心就从一看到三了,耗哥快更新^_^。
    这个系列除了了解不同的编程范式,最关注的是不同的编程范式如何设计,解决了什么问题。这些皓哥都点到了。我个人喜欢Scala这门语言,觉得它的设计非常优美,函数式编程和类型系统都是它的特点,希望皓哥这个系列或者答疑中能写写您的看法。
    对于皓哥掌握那么多不同的编程范式,每种起源发展娓娓道来,我也是钦佩不已,不知道皓哥能不能介绍下是怎么学习和了解的,谢谢!
    2018-01-11
    7
  • saiyn
    “C 语言偏向于让程序员可以控制更多的底层细节,而 Java 和 Python 则让程序员更多地关注业务功能的实现。而 C++ 则是两者都想要,导致语言在设计上非常复杂” —多么简单而又深刻的诠释,大赞
    2018-05-31
    6
  • edisonhuang
    所有编程语言都需要解决两个件事情:
    第一件事是编程语言中的类型问题。
    第二件事是对真实世界中业务代码的抽象、重用和拼装。
    使用数据类型,可以帮助程序员忽略掉底层系统对资源的操作,但同时也带来代码和类型的绑定。因此泛型就是采用合适的策略,解决掉对底层系统资源访问,内存的分配和释放问题。解决数据的移位变换问题,解决数据容器的访问问题。
    可以看到,由于程序语言是业余系统和计算机底层硬件之间的粘合剂,因此任何程序语言都不可能避免数据类型,区别只在于类型是编译时指定,还是运行时检查。通过泛型可以带来代码的重用,同时保证类型的安全
    2019-06-19
    1
  • 桃子妈妈
    如果当时大学的课程是这样讲解语言该多好!看到这里才知道自己死记硬背的那些复杂设计背后是这么简单的背景。
    2019-06-10
    1
  • escray
    看到这一篇的时候,有点后悔当年没有仔细看一遍斯坦福的那个编程范式公开课了,似乎当时听了个开头,感觉比较简单,后来就放弃了。

    如果能早点梳理一下编程范式方面的内容,应该会对编程有很大的好处。即使经验不足的时候,能够有个大致的概念和方向,也会有相当大的方向。

    “类型是对内存的抽象”,这个可以算是本课金句了,让我能够更好的理解为什么会有类型系统这样的东西。以前可能更多的是隐隐约约的感性认识,这节课的内容算是捅破了窗户纸。

    “编程语言的本质是帮助程序员屏蔽机器代码的实现,而让我们可以更为关注于业务逻辑代码。” 这句我也很认可。从另一个角度讲,因为不够熟悉编程语言,代码写的不够多,所以影响了我对于业务逻辑的实现。
    2019-05-30
    1
  • 靠人品去赢
    之前看泛型这一块,什么类型系统,类型检查系统听起来模糊不理解,看了一下JS的相关文章,而且在项目中看到一个声明的变量,在由null变为function的一个操作过程中。
    结合动态语言,变量类型可以转换,而静态语言,声明了变量类型少了个类型检查系统,整个语言代码可以简洁不少。
    2019-04-10
    1
  • 沙漠之鹰
    说出了语言的本质,如果大学能看到这样高质量的文章,学生会更有创造力
    2019-02-01
    1
  • 靠人品去赢
    之前对强类型语言和弱类型语言,有点理解不清,现在貌似理解了。
    2018-12-24
    1
  • wessonwang
    “内存操作”-类型-数据结构(容器)-算法,分层思想。
    2018-12-13
    1
  • 章炎
    “C++两者都想要". 感觉这就给了Go可乘之机了。泛型做的不如Go彻底,性能和简单的C相比没有绝对优势,到现在C++14不断地扩充和简化语法,感觉到头来两边都做不好。这个和做事情一样,二鸟在林不如一鸟在手。
    2018-10-16
    1
  • lostsquirrel
    谢谢指正,是我记错了,是 x = 5, y = "hello", x + y 会报错,随便吐槽下这app到处坑,留言不能回复,昨天在小程序听音频,不知道在哪停止。。。

    作者回复:
    我帮你转答池建强

    2018-03-27
    1
  • lostsquirrel
    python 不能这样用吧, x=5,x="hello", python 可以说是强类型吧

    作者回复: 当然可以。强类型和动态类型是两码事,前者是判断不同的类型是否可以互转,后者是变量的类型可以动态调整。

    2018-03-27
    1
  • 易轻尘
    自己的总结:任何编程语言都有类型系统,因为它们都需要在内存中表示数据,不同类型可能具有不同的内存布局和内存分配问题。特别是计算机底层还区分大小端、浮点数、整型等等,再加上用户自定类型,如何处理不同类型间的运算、判断不同类型间的运算是否合法就更为复杂。
    有的语言将这个任务放在编译时进行(静态类型系统),有的语言放在运行时进行(动态类型系统)。
    而泛型的主要目的就是提高代码的复用性,能够使某个算法能在不同的类型上正确运行,而无需程序员为每个类型都写出相应的算法。怎么做呢,加中间层呗,这个中间层的作用还是自己根据具体不同类型选择内存的操作方式以及进行必要的数据类型转换。
    2019-08-27
  • 程斌
    通了,通了。
    2019-07-31
  • 瀚海星尘
    原来typescript是为了解决javascript在写大型项目时容易出现类型错误而诞生的~
    2019-07-13
  • 北风一叶
    泛型编程:将类型泛化的一种编程方式
    2018-08-02
  • allwmh
    期待后续
    2018-01-17
收起评论
24
返回
顶部