more
理解golang的强,静态类型
关于弱类型,强类型,动态类型,静态类型语言的区别,在这里补充一下
Program Errors
- trapped errors。导致程序终止执行,如除0,Java中数组越界访问
- untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址
Forbidden Behaviours
语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.
Well behaved、ill behaved
- well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved。
- ill behaved: 否则为ill behaved…
基于上面的概念再讨论强弱类型,静态和动态类型
强弱类型
- 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
- 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型
动态、静态类型
- 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
- 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。
误区
大家觉得C语言要写int a, int b之类的,Python不用写(可以直接写a, b),所以C是静态,Python是动态。这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可以不用明确地写出来。 Ocaml是静态隐式类型
静态类型可以分为两种
- 如果类型是语言语法的一部分,在是explicitly typed显式类型;
- 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell
例子
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell
简化理解
- 动态类型语言:意思就是类型的检查是在运行时做的。
- 静态类型语言:类型判断是在运行前,在编译期进行判断。
- 强类型:一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
- 弱类型:一个变量可以赋不同数据类型的值
那么go语言为什么选择的是强静态类型语言的实现呢?
静态类型的优点:
- IDE聪明的提示,因为静态类型的语言的类型是确定的,所以编辑器可以知道当前的变量有哪些属性和方法。
- 编译的时候能够发现类型不匹配的错误,而动态语言至多只能发现语法错误。
- 我们在开发过程中明确了某些变量在程序中扮演了什么角色,这是开发可靠性高的程序所必须的。
静态类型的缺点:
- 因为要定义数据类型,程序的规模也变得很大,编程应该考虑程序的本质,而不是把精力集中于一个个数据类型的定义。
- 缺乏灵活性,因为一个变量,只能赋值某种类型的对象。明显当程序需要扩展的时候,这会成为枷锁,当然可以通过继承和接口实现,这会陷入另一个深渊,你总会去纠结复杂的继承关系。
动态类型的优点:
- 相反于静态类型,编程完全集中于程序的设计的本质,代码的简洁度也会提高,开发效率可能会数倍的提高。
- 因为程序的规模降低, 程序的可理解性也会提高。(静态类型的拥护者可能会认为,少了类型信息,程序变的不可读了。这里认为读程序应该集中在程序的本质上)
动态类型的缺点:
- 程序执行速度慢,因为动态类型的语言,类型检查是在运行期做的。(随着计算机性能的提高,执行速度不是什么严重的问题了,关键是生产力提高了)
- 不执行就检测不出错误。
对于开发大型系统,静态强类型语言会优于动态弱类型语言,代码的可读性和可维护性上都会更强,采用静态强类型语言可以避免程序员在动态语言中无意犯下的绝大多数错误。Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡.(GO语言是一门类型安全(强类型)和内存安全的编程语言。)
go支持这样定义变量
1 | var abc = 10 |
让golang看上去有点像动态类型语言,但golang实际上时强类型的,前面的定义会被自动推导出是int类型, 所以Go是一门写起来像动态语言,有着动态语言开发效率的静态语言。
快速构建
关于golang的快速构建 https://talks.golang.org/2012/splash.article
动态语言将快速编译作为自身的一大亮点,像 C++ 那样的静态语言一般都有非常漫长的
编译和链接工作。而同样作为静态语言的 Go 语言,通过自身优良的构建机制,成功地
去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样
的高效开发的能力。
Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。C 语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间,而Go 语言采用包模型这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性