先来看几个定义:
编译型语言:
需要编辑器将源代码编译成机器码之后才能执行的语言。一般分两个步骤 编译(compile)、链接(linker)编译是把各个文件源代码编译成机器码,链接是把各个文件的机器码和依赖库串连起来生成可执行文件
源代码->汇编代码->机器码->CPU执行
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行(执行效率高)
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件(跨平台性能差)
代表语言:C、C++、Pascal、Object-C、swift
解释型语言:
不需要编译,比编译型语言省了道工序,运行的时候逐行进行解释,生成机器代码
源代码->字节码->解释器->机器码->CPU执行
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。(跨平台性强)
缺点:程序不需要编译,程序在运行时才翻译成机器码,每执行一次就要翻译一次,不可脱离语言环境独立运行(需要虚拟机)(执行效率差)
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby
混合型语言:
既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行
动态语言:
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。
静态语言:
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
动态类型语言:
动态类型语言是指在运行期间才去做数据类型检查的语言
这里需要跟动态语言区别开,动态类型语言说的是数据类型,动态语言说的是运行时改变结构,说的是代码结构。
静态类型语言:
静态语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型
强类型语言:
强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。
弱类型语言:
与上正好相反,像vb、php、js(也就是说,一个变量,你可以直接给他赋值字符串,也可以直接给他赋值数值,你还可以直接让字符串类型的变量和数值类型的变量相加,虽然得出的最终结果未必是你想象的那样,但一定不会报错)
基于上面的例子,你可以说swift允许我们不声明类型并且让编译器自己检测类型
var a = 10
看上去像是弱类型语言,但是swift推出它是int类型的,所以不能像其赋值其他类型的值
这说明了,Swift 是一门强类型的语言。Swift 的类型声明,你可以看成是在定义变量的时候,隐式声明的(由编译器推断出),当然也可以显式的声明。如下:
var a :Int = 10
OC 是 动态类型语言&&强类型语言&&动态语言&&编译型语言
swift 是 动态类型语言&&强类型语言&&静态语言&&编译型语言
Java是一种静态类型语言,也是一种强类型语言。因为编译器不能自动检测类型,所以它是静态的,而且类型受到严格限制,所以它也是一种强类型语言。
javascript是一种动态类型语言和非强类型语言。
因为编译器能够在运行时检测类型,并且类型也不受严格限制。