# 教学计划

  • 迭代学习法
在具体知识和抽象理论之间做折返式学习

# 数据类型

—— 规则与变通

  • 两个要素
允许取值的范围
允许参与的运算
  • 意义
物理意义  进行底层的内存分配和数值运算等
逻辑意义  表达高层的逻辑概念
  • 类型的动静

以类型的绑定时间来区分

    • 动态类型语言
数据类型检查发生在运行期间
不需要显式的变量声明

鸭子类型(duck typing)形式
动态类型的一种风格
是一种非继承性的多态形式,即一个对象的类型可以由其接口集合来确定,不需要通过显式的继承
哲学意义 名义不重要,重要的是能力
为软件重用开启了新窗口,同时也埋下了一些陷阱

优势
简明、快捷、灵活,天然具有泛型特征
易于重用
适合泛型编程和快速原型开发

动态类型语言类似“疑罪从无”的无罪推定制——在被证明非法之前都是合法的
    • 静态类型语言
数据类型检查发生在运行之前
一般需要显式的变量声明,但是有些静态语言也不需要,
这种情况下编译器会通过上下文做类型推断(type inference),一旦类型被推断后,不再更改

类型推断
既有动态类型的间接性,也保留了声明式静态类型的安全性

优势
代码可靠性强,符合“发现错误要尽早”的软件开发原则
编译器有可能籍此优化机器代码以提升运行效率
相比动态类型语言,节省了运气在类型检查上花费的时间和空间
变量类型的声明彰显了编程者的意图,有辅助文档的功效

静态类型语言类似“疑罪从有”的有罪推定制——在被证明合法之前是非法的
    • 取舍
Static Typing Where Possible, Dynamic Typing When Needed
尽可能守规则,必要时求变通
  • 类型的强弱

以类型的约束强度来划分

    • 弱类型语言(weakly-typed language)
允许一种类型的值隐性转化(强制转换coericion)为另一种类型
C、JS
    • 强类型语言(strongly-typed language)
着意贯彻类型控制,为保障数据的完整性和代码的安全有效性,一般不允许隐性类型转换。
如果一定需要类型转换,都必须是显式转换,一般通过铸型(Cast)来完成

但许多强类型语言对于宽转换(widening conversion)还是允许隐性的,如int在必要时可以转为float

Java、Smalltalk
  • 类型的安全性

类型安全语言(type-safe language) 类型不安全语言(type-unsafe language)

类型检查的目的就是为了避免类型错误,
即杜绝因类型问题而产生的错误或不良代码,如果一个类型系统能完全做到这一点,就被称为类型安全的

一般情况下,强类型语言对类型控制更严格,因而是类型安全的,而弱类型语言是不安全的。
(但要注意类型的安全与强弱是正交的两个概念)

类型安全对保证程序的合理性和可靠性很重要,但过于严苛,程序也会失去活力。

# 动态语言

—— 穿着彩衣飞舞的脚本语言

  • 脚本语言
    • 特征
以语言的实际用途为标志
与一般程序一个不同之处是,面向字符而非面向数值的,
因为字符是最通用的接口,正好发挥它的粘合作用,而数值运算对性能要求较高,多由核心程序来完成
    • 脚本(Script)
A script is what you give the actors, a program is what you give the audience.
//脚本是给演员(程序员)看的,节目(程序)是给观众(用户)看的。

脚本是为程序员服务的,而程序是为终端用户服务的
    • Shell
主要用于整合其他程序
注重简洁实用、语法也不太严格、性能要求也不高
    • Perl
高级脚本语言
在Shell脚本、AWK、SED基础上,融合了命令式的C与函数式的Lisp的特征
    • 应用
命令行程序、图形界面应用、多媒体应用、网络应用等
  • 动态语言
    • 特征

以语言的语法特征为标志

      • 从用途上看
一个脚本语言如果不在局限于命令行工具和粘合工具
从专用语言发展为通用语言,并能胜任复杂的应用开发,或许更有资格归为动态语言

动态语言继承了脚本语言擅长字符处理的特征
除了正则表达式外,为字符串、数组、列表、集合、映射等常用数据结构
提供了丰富简洁的运算,远比静态语言依赖库来的自然方便得多
      • 从用法上看
动态语言能在运行中增加或改变数据结构、函数定义、对象行为或指令流等

如果说动态类型语言的动态体现在类型上,动态语言的动态体现在结构和功能上
静态语言可能也能实现同样的效果,但不方便也是不自然的
动态语言大多数是开源的,其本身的发生也更具有动态性
      • 从语法上看
动态语言为了粘合来之不同系统、不同语言的程序,对类型的要求不如静态语言那么严格
代码更加简洁自由,故而多为动态类型和弱类型的,天然支持泛型编程

大多数动态语言支持eval函数,能动态执行任意字符串形式的代码,并有丰富的反射机制,天然支持元编程
很多动态语言还支持高阶函数和闭包等在内的函数式编程
大多数动态语言也支持面对对象编程(Python、Ruby、Perl 5、PHP 3)
许多动态语言也支持并发式和过程式编程
Python Groovy Ruby 等可以进行切面编程
逻辑式编程语言的代表Prolog,具有动态语言的特征
至于事件驱动,对于支持callback的语言来说都不是难事
    • 理念

优化人的时间而不是机器的时间

为提高人的生产率,宁可牺牲一部分性能或者购买更高配置的硬件
由于硬件相对于人力在不断贬值,该理念有合理的显式基础

# 语言误区

—— 语言的宗教情结

语言只有两种:一种怨声载道,一种无人问津。

如果一种语言不影响你对编程的看法,那么就不值得去了解
对于一个程序员来说,编程语言才是立身之本(包括语言背后的思想)

# Notes

类型系统与语言