在学习python时,我知道了c语言是静态、编译型语言,而python是动态、解释型语言。我一直以为编译型语言==静态类型语言。直到这学期接触了Java,我才知道这两种分类方法的标准是不同的。下面我就依次分析这四种语言的概念。
编译型语言vs解释型语言
编译型语言(compiled language):
程序在执行之前需要一个专门的编译过程,把程序编译成机器语言的文件。在运行时不需要重新翻译,只需要直接讲文件载入内存即可。
解释型语言(interpreted language):
程序不进行预先编译,以文本方式存储程序代码,在运行时才逐行翻译成机器语言并执行;
值得一提的是,Java语言比较特殊,需要先编译成字节码文件(*.class),运行时再通过解释器解释。由此可见,这种分类方法并没有清晰的边界。可以认为Java同时兼有编译型和解释型特点。
二者利弊:
编译型语言由于已经在运行前编译好,运行时速度较快,对系统要求较低。但由于不同的操作系统计算机识别的二进制文件是不同的,因此编译型程序进行移植后,要重新编译,跨平台性差。反之,解释型语言运行速度较慢,但跨平台性好。
因此像开发操作系统、大型应用程序、数据库系统等时都采用编译型语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言。
静态类型语言vs动态类型语言
这个划分标准比较好理解,就是根据进行数据类型检查的阶段而区分的。
静态类型语言(Statically Typed Language):
进行静态类型检测,即在运行前(如编译阶段)对源代码进行数据类型检测。
动态类型语言(Dynamically Typed Language):
进行动态类型检测,即在运行时才进行数据类型检测。
二者利弊:
- 静态类型语言可以及早发现变量类型相关的错误,而动态类型语言只有在运行时才会发现错误。
- 静态类型语言在编程时需要格外注意变量的类型,增大了代码量。而动态类型语言则更加灵活。
在写博客的时候我又发现了另一种区分。
静态编程语言vs动态编程语言
静态语言(static programming language):
在运行时不能改变结构。
动态语言(dynamic programming language):
在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
由于在翻译上的混淆,我们常说的“动态语言”有时指的是“动态类型语言“有时也指”动态编程语言“。因此为了避免歧义,尽量说全称。