和饭老湿日常撕逼时提到了”何为强类型”这一问题,发现在这一认识上一直存在误区,以至于延伸到了编程语言的分类上。很多人对这方面的解释也存在误区,于是打算尽力去解释一下。

Type System

维基上的解释并没有强类型弱类型之分,只是给出了两种区分:动态类型和静态类型,显示转换和隐式转换,然而从定义上看我认为大概只分以下两种。

  • Explicit type conversion(显示类型转换)
    一旦变量被指定某个数据类型,如果不经强制转换,即永远是此数据类型。

  • Implicit type conversion(隐式类型转换)
    据类型可以被忽略的语言。它与显示相反, 一个变量可以赋不同数据类型的值。

Mozilla是这样解释的:”That means you don’t have to specify the data type of a variable when you declare it, and data types are converted automatically as needed during script execution”

–这意味着你定义变量时不必指定数据类型,而数据类型会在脚本执行需要时自动转换。

换种方式说:显示在编译的时候检查数据类型,隐式在执行的时候检查数据类型。套进强弱类型这种说法的话,python,js,php,ruby明显属于弱类型定义,java,C/C++属于强类型定义。

Language Type

编程语言的分类是个超蛋疼的问题,很多人认为:”py,php等解释型语言没有编译的过程,C/Java有编译的过程”。其实这样区分也是欠妥当的。从py来看,py实现的机制其实是和java无比类似的,py也是编译成二进制代码扔进虚拟机的。

维基上主要把编程语言这样区分:

  • Interpreted language(直译语言)

这种类型的编程语言,会将代码一句一句直接运行,不需要像编译语言一样,经过编译器先行编译为机器码,之后再运行。这种编程语言需要利用解释器,在运行期,动态将代码逐句直译(interpret)为机器码,或是已经预先编译为机器码的的子程序,之后再运行。

  • Compiled language(编译语言)

由编译器全部编译完毕在执行。

某乎上看到过是否java是编译型语言的问题,记得有一个说法:”其实,现在用编译型、解释型来分类编程语言已经有点力不从心了”。从运行方式上看,Java和python是无比类似的,然而Java被归到了编译语言,python被归到了直译语言(脚本语言)
。目前只能这样认为:Java规定编译是一个强制的行为,即必须全部完成以后才可以进入下一步(生成.class文件),而python对于这个比较模糊(然而也会编译生成.pyc文件)。除此之外,python除了C语言的实现版本,还有java的实现版本(jython),这也从侧面说明了一些问题。

又折腾到了深夜档,写半截还丢了一次稿,累觉不爱,今天先折腾到这里。最后感谢饭老湿(留空放链接)带来的这个很值得讨论的问题。