欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编译型和解释型、动态语言和静态语言、强类型定义语言和弱类型定义语言

程序员文章站 2024-01-15 08:15:52
...

一、编译型与解释型语言

我们编写程序也就是源代码基本是用高级编程语言,比如JavaScript, java, c等等,这些语言计算机是不理解的,所以需要转化(翻译)成计算机理解的机器语言,或者说目标CPU的指令。

源代码====>(中间表示形式====>)基本操作序列====>生成最终动作

这个转化的方式就分为两种:编译和解释。区别在于转化的时机不同。

用编译型语言写的程序执行之前,需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成机器语言,把源高级程序编译成为机器语言文件,比如windows下的exe文件。以后就可以直接运行而不需要编译了,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

解释则不同,解释型语言编写的程序不需要编译。解释型语言在运行的时候才翻译,比如VB语言,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。

  • 编译型语言同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,C/C++、Pascal/Object Pascal(Delphi)等都是编译语言。
  • 而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等。

但随着硬件的升级和设计思想的变革,编译型和解释型语言越来越笼统,而解释型语言的自身特点也使得编译器厂商愿意花费更多成本来优化解释器,解释型语言性能超过编译型语言也是必然的。

JavaScript是解释型语言吗:它的即时编译(JIT)

编译型语言需要花费更多的时间来准备执行,因为它要进行此法分析、极致优化等,而解释型语言几乎没有什么优化,每一条语句都是单独翻译(编译)的,如果在一个循环中多次转换,性能就很低。

优化

在JS中如果一段代码运行超过一次,就称为warm。如果一个函数开始变得warmer(运行更多次),JIT将把这段代码送到比那一起进行比那一并保存一个编译版本,下次同样的代码执行就可以跳过翻译过程直接使用这个版本。

JS处理语句声明的过程
  1. V8引擎进入一个执行上下文,对代码进行词法分析,分割成原子符号
  2. 分析完后将token翻译成AST(抽象语法树)
  3. 每次遇到声明语句,在scope中创建一个绑定,每次声明为变量分配内存,默认设为undefined
  4. 每次取值或者赋值,通过作用域链查找绑定(标识符)
  5. 引擎生成可以执行的机器码
  6. 代码执行完毕

二、动态类型语言和静态类型语言

  1. 动态类型语言,是指数据类型的检查是在运行时做的。用动态类型语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部记录数据类型。
  2. 静态类型语言,是指数据类型的检查是在运行前(如编译阶段)做的。

三、强类型定义语言和弱类型定义语言

  1. 强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。强类型定义语言是类型安全的语言。
  2. 弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的。

参考:
程序的编译与解释有什么区别?
解释型语言和编译型语言的区别
JavaScript到底是解释型语言还是编译型语言