同步 异步 阻塞 非阻塞

Synchronous Asynchronous Blocking Nonblocking

Posted by BY on September 27, 2018

前言

对待学习不能以糊弄的态度

正文

问题来源

同学总考我这个概念,总是自己糊弄自己就过去。理解的总是有偏差。

前提概念

类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。

Program Error

strapped 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是弱类型
弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的

动态、静态类型

静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。

常见语言分类

无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

总结:

弱类型:语言的运行时会隐式做数据类型转换。(不全是这样)
强类型:语言运行时确保不会发生未授意的类型转换。
静态类型:编译期进行数据类型检查。
动态类型:运行期才做类型检查。

结语

查漏补缺。