Typing

静态

指程序执行之前,从代码中就可以知道一切,程序静态的部分包括变量,方法的名称和类型以及控制程序的结构等等。

动态

指在程序执行之前有些地方是不知道的,程序动态的部分包括变量的值,执行时间和使用的内存等等。

类型

类型的产生是由于:计算机可以处理的类型只有二进制,在计算机可以直接操作的汇编语言中,数据类型都是整数,其他类型的数据都用整数来表现,这种处理方法很低级,他要求人要理解,记忆用整数来表达所有类型数据的方法。负担比较大,所以编程语言就进化了。

静态类型

FORTRAN(Formula Translator)世界上最初的编程语言诞生了,引入了变量和算式的类型,在程序中,变量只能用整数赋值,数组只能是浮点数的数组等,可以指定数据类型,这是静态数据类型的开始,这种队数据类型的定义称为类型定义。

静态类型最大的优点就是能在编译时发现类型不匹配的错误。而动态语言只能发现程序错误。

静态语言的缺点一个是若不指定类型就写不了程序,另外就是灵活性的问题,静态语言本身限制了给某个变量只能赋值某种类型的对象,这种限制可能成为妨碍将来变化的枷锁。

动态类型

后来出现了Lisp编程语言(List Processor)。刚出现时,Lisp只支持列表(list)和原子(atom)两个数据类型。
列表是可以由两个引用的节点(node)构成的单项列表,比如像(5 13)这样的数据。原子比较难说明,简单地说就是指list以外的数据类型,比如数值和字符串都是原子。
Lisp的每个节点,历史上称为cons单元,可以引用其他的cons单元货原子。cons单元可以有两个引用,因为历史的原因,前面的称为car,后面的称为cdr。
在Lisp中程序好数据如果不能用文字来表现的话会很麻烦。所以Lisp用字符串来表现名为S式的列表,S式是用以下规则把列表转换成字符串的。

  • cons单元中,car的值和cdr的值用点连接,再用括号括起来
  • cdr如果是列表的话,省略括号
  • 末尾的cdr如果是nil,那么省略.nil。

Lisp的数据用列表,程序也用列表,所有的东西都用列表来表示,Lisp用S式表示的列表构造本身就是程序。

1
2
3
4
5
(defun fact (n)
(if (= n 0)
1
(* n (fact (- n 1)))))
//计算阶乘

Lisp的列表中的各个cons单元是指向cons单元还是原子,事先是不知道的。列表中cons单元和原子混杂存在。从本质上就可以说是堕胎的数据结构。

动态语言最大的优点就是源代码变得很整洁。但是动态语言运行要比静态语言缓慢些。另外就是灵活性比静态语言好。但是最大的缺点即使不执行就检测不出错误。

Duck Typing

表达动态类型灵活性的概念就是Duck Typing。
If it walks like a duck and quacks like a duck ,it must be a duck.
如果行为像鸭子,不管他是什么,就把他看做鸭子。根本不考虑一个对象属于什么类,只关心它有什么样的行为(它有哪些方法),这就是Duck Typing.
静态语言的输出一般都限定了类型,如果想要输出其他类型的,就要重新写代码。但是动态语言不关心类型。

`

#使用stringIO类库
require ‘stringio’

#生成stringIO对象
out = StringIO()

#和文件一样输出
log_puts(out, “message”)

#表示字符串结果
puts out.string
`s