学习笔记:如何保证人不能吃屎

类型的定义:
如名称所提示,就是把一些相同或相似的东西归类,或者说放到一个集合里。我们给这个类或集合打上一个标签,这个标签就是“类型”。有关类型的学习,从幼儿园就开始了,考虑你是如何学着把一些玩具放入一个篮子里,然后把一堆小人书放到书架上。这就是根据“类型”做不同的处理。

类型的作用:
对世界的认知工具,能根据已知的知识对新事物做正确的处理。考虑你在桌子上看到一块咖啡色的东西,你的认知系统识别出这是一块巧克力。你的知识库有一条规则是“巧克力可以吃”,然后你的推理系统做出推理“这块东西可以吃”,然后你把它放入嘴中品尝。如果没有类型的概念,你将无法判断这块东西是否可以吃。

编程语言中的类型:
也是一样的。通过类型,定义对象的可行动作或者不同对象之间的交互。例如:狗吃屎(定义)。
通过定义允许的操作,自然就定义的不允许的操作。例如:人吃屎(错误)。

错误的分类:

计算机系统不会考虑到人不能吃屎。它认为:吃了也死不了人,为什么不让吃!然后人吃屎的事情发生了,在计算机里被称为untraped error. 程序继续跑,直到这个矛盾积累总爆发,遇到一些未可预料的事件:呕吐?或者此人依旧谈笑风声?或者此人因过度刺激一命呜呼?对应的还有一类错误是trapped error.计算机程序遇到此类错误将立即终止执行。考虑:2除以0,这明显错误,计算机见到这种脑残指令立即罢工。这是一个trapped error错误。考虑:数组越界访问。C语言里是untrapped error,Java语言里trapped error. 定义forbidden errors = {所有的untrapped error,部分trapped error} 我们竭力防止的是“人吃屎”这类错误。有条件时,也防止trapped error发生(也许比较难做到)。


强类型,弱类型:
如果一种编程语言编写的一段程序,能防止forbidden errors的发生,则此段程序被标记为well-behaved
如果一种编程语言编写的全部程序,都是well-behaved, 则此编程语言被称为strongly-typed
不是strongly-typed,则为weakly-typed.
Java,Python是强类型语言;C,C++是弱类型语言。
C++语言一直向强类型方向进化,无奈于C语言的继承物(printf,指针运算等),是摆脱不了弱类型的美名了。
如果使用C++类型安全的子集,则可以做到强类型语言特性。

静态类型,动态类型:
找出not-welled-behaved,是程序正确运行的关键。如何找出ill-behehaved的程序片段呢?当然是依靠“类型系统”。
“人吃屎”这类错误能找出多少出来是区分编程语言强弱的指标。找的越多就越强。有关何时报告此类错误,就涉及到静态类型和动态类型的区别了。静态类型绝对不是在运行期做检查的。以“人吃屎”为例,在菜进献给顾客之前,就已经发现此类错误(菜叶中有狗屎),并且排除。动态类型,是在运行期做类型检查的。当一份菜被上到顾客那里,顾客当然不是傻子,识别出了菜叶里有狗屎,他当然不会吃进去了。虽然都实现了规则(人不能吃屎),但是实现的时间或阶段不同。
Java和C++都是静态类型的,区别于“类型系统”在解释器起作用,另一个是在编译器起作用。

静态类型的优点:
以“人吃屎”为例,在厨房发现错误总比端到顾客面前才发现错误好吧?
一般的静态类型语言都是“显式类型”,这有利于程序员理解变量含义。例如:CStudent xiaowang;  //学生小王。
静态类型有利于编译器做优化,因为是预先定义好的变量的类型,所以可以根据类型做不同的优化。
静态类型语言的速度不知道快过动态类型语言多少倍了。
运行期做类型检查,当然要消耗不少资源了。像C语言这样数组越界都不顾后果的猛跑的语言,当然运行速度快了。

动态类型的优点:
一般的动态类型语言都是“隐式类型”,编写快,因为少敲打了不少字符。CStudent xiaowang变成了xiaowang.
开发越快,越能快速出成果以响应瞬息万变的市场需求。动态类型语言能快速通过编译阶段,快速部署。
python就是动态类型语言的杰出代表。有无数成功案例。
动态语言的运行速度也在加快,因为硬件换代,这点速度损失也逐渐变得不值一提了。

显示类型,隐式类型
int a; //显式类型,每个对象或变量必须给出类型注解
隐式类型,就不需要给出类型说明。由系统(编译器等)自动推导(type inference)。
a=10; //一个变量被赋予整数10,则这个变量很可能是int吧?
复杂的类型:一个走路像鸭子,嘎嘎叫的,水里游的东西,应该被当成鸭子(类型)吧?
python是隐式类型的语言。看来,python是动态,隐式,强类型语言。c++是静态,显式,弱类型语言。
c++11开始向隐式类型进化,例如auto a =10; //a的类型被推导成int
静态类型语言以隐式类型方式声明变量也不是什么奇怪的事。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值