编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。
解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。
虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言)。
在运行的时候,由JVM将字节码再翻译成机器语言。
注:脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL,Nuva都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。
编译型语言:
- 编译型语言最大的优势之一就是其执行速度。用C/C++编写的程序运行速度要比用Java编写的相同程序快30%-70%。
- 编译型程序比解释型程序消耗的内存更少。
- 不利的一面——编译器比解释器要难写得多。
- 编译器在调试程序时提供不了多少帮助——有多少次在你的C语言代码中遇到一个“空指针异常”时,需要花费好几个小时来明确错误到底在代码中的什么位置。
- 可执行的编译型代码要比相同的解释型代码大许多。例如,C/C++的.exe文件要比同样功能的Java的.class文件大很多。
- 编译型程序是面向特定平台的因而是平台依赖的。
- 编译型程序不支持代码中实现安全性——例如,一个编译型的程序可以访问内存的任何区域,并且可以对你的PC做它想做的任何事情(大部分病毒是使用编译型语言编写的)
- 由于松散的安全性和平台依赖性,编译型语言不太适合开发因特网或者基于Web的应用。
解释型语言:
- 解释型语言提供了极佳的调试支持。一名Java程序员只需要几分钟就可以定位并修复一个“空指针异常”,因为Java运行环境不仅指明了异常的性质,而且给出了异常发生位置具体的行号和函数调用顺序(著名的堆栈跟踪信息)。这样的便利是编译型语言所无法提供的。
- 另一个优势是解释器比编译器容易实现
- 解释型语言最大的优势之一是其平台独立性
- 解释型语言也可以保证高度的安全性——这是互联网应用迫切需要的
- 中间语言代码的大小比编译型可执行代码小很多
- 平台独立性,以及严密的安全性是使解释型语言成为适合互联网和Web应用的理想语言的2个最重要的因素。
- 解释型语言存在一些严重的缺点。解释型应用占用更多的内存和CPU资源。这是由于,为了运行解释型语言编写的程序,相关的解释器必须首先运行。解释器是复杂的,智能的,大量消耗资源的程序并且它们会占用很多CPU周期和内存。
- 由于解释型应用的decode-fetch-execute(解码-抓取-执行)的周期,它们比编译型程序慢很多。
- 解释器也会做很多代码优化,运行时安全性检查;这些额外的步骤占用了更多的资源并进一步降低了应用的运行速度。
//'1'高电平 '0'低电平
// 0 1 10 11 100 101 110 111
//5+6 机器语言
//010010101010100101
//100101010010101010
//010101010100101010
//汇编语言
//5+6
//movl $5 -8(rbp)
//movl $6 -12(rbp)
//movl -8(rbp) %eax
//addl -12(rbp) %eax
//movl %eax %esi
编译型语言和解释型语言
计算机是不能理解高级语言,当然也就不能直接执行高级语言了。计算机只能直接理解机器语言,所以任何语言,都必须将其翻译成机器语言,计算机才能运行高级语言编写的程序。
一、编译型语言和解释型语言
翻译的方式有两种,一个是编译,一个是解释。
两种方式只是翻译的时间不同。编译型语言写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以 后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行 效率高。
解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。
二、脚本语言
①脚本语言(JavaScript,VBscript等)介于HTML和C,C++,Java,C#等编程语言之间
HTML通常用于格式化和链结文本。而编程语言通常用于向机器发出一系列复杂的指令。
②脚本语言与编程语言也有很多相似地方,其函数与编程语言比较相象一些,其也涉及到变量。与编程语言之间最大的区别是编程语言的语法和规则更为严格和复杂一些。
③与程序代码的关系:脚本也是一种语言,其同样由程序代码组成
注:脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。
④脚本语言是一种解释性的语言
例如vbscript,javascript,installshield script等等,它不象c/c++等可以编译成二进制代码,以可执行文件的形式存在。脚本语言不需要编译,可以直接用,由解释器来负责解释,不过每次都需要翻译,执行速度慢。
⑤脚本语言一般都是以文本形式存在,类似于一种命令
举个例子说,如果你建立了一个程序,叫aaa.exe,可以打开.js为扩展名的文件。
你为.js文件的编写指定了一套规则(语法),当别人编写了.js文件后,你的程序用这种规则来理解编写人的意图,并作出回应.那么,这一套规则就是脚本语言。
1、编译型语言
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。
优点:编译器一般会有预编译的过程对代码进行优化。 因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高 。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
代表语言:C、C++、 Pascal、Object-C以及最近很火的苹果新语言swift
2、解释型语言
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby
3、混合型语言
既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。
Java先生成字节码再在Java虚拟机中解释执行。
严格来说混合型语言也属于解释型语言。
动态语言和静态语言
1、动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。
2、静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。
3、注意:
很多人认为解释型语言都是动态语言,这个观点是错的!Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。
C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。
动态类型语言和静态类型语言
1、动态类型语言
很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。 动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。
动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。
主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。
2、静态类型语言
静态语言的数据类型是在编译其间确定的,写编写代码的时候要明确确定变量的数据类型。
主要语言:C、C++、C#、Java、Object-C。
3、注意:
相当一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。这个也是错的。swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言。
强类型语言和弱类型语言
1、强类型语言:
强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。
主要语言:Java、C#、Python、Object-C、Ruby
2、弱类型语言:
数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。
主要语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)
3、注意:
一个语言是不是强类型语言和是不是动态类型语言也没有必然联系。Python是动态类型语言,是强类型语言。JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。