编程语言抽象笔记
动态语言和静态语言的本质区别是什么?
静态语言
静态类型语言 如果在编译时知道变量的类型,则该语言是静态类型的。我们经常说道的Java、C、C++在写代码的时候必须指定每个变量的类型。 优点就是编译器可以执行各种检查,也就是程序还没跑起来就能找到一些小错误,也就是是在compile-time检查出错误的。
动态语言
动态类型语言 一般是脚本语言,比如说Perl、Ruby、Python、PHP、JavaScript,可以更快地编写代码,不必每次都指定类型,做type checking是在run-time的时候去做的。优点是可能代码开发快,但是维护难(但是脚本语言平常写的代码量应该不太多,还比较好debug和修改)
编译执行和解释执行
这个是看Python的时候,发现的一个问题,Python是脚本语言,解释执行。Java是静态语言,编译执行。但是java在运行时,JVM普遍采用混合模式。
一、编译和解释
- 编译:将源代码一次性转换成目标代码的过程 类似英语中的全文翻译。
执行编译过程的程序叫做编译器。
- 解释:将源代码逐条转换成目标代码同时逐条运行的过程。 类似英语中的同声传译。
执行解释过程的程序叫做解释器。
- 编译过程只进行一次,所以,编译过程的速度并不是关键,目标代码的运行速度是关键。因此,编译器一般都集成尽可能多的优化技术,使生成的目标代码具备更好的执行效率。 解释则在每次程序运行时都需要解释器和源代码,不能集成太多优化技术,因为代码优化技术会消耗运行时间,使整个程序的执行速度受到影响。
- 高级语言 高级语言按照计算机执行方式的不同可分为两类:静态语言和脚本语言。 这里所说的执行方式是指计算机执行一个程序的过程,也就是编译执行和解释执行。 静态语言:使用编译执行的编程语言,比如C/C++、Java(这里我还有话说,等会儿后面说)等。 脚本语言:使用解释执行的编程语言,比如Python语言,JavaScript、PHP等。
执行方式不同,二者的优势各有不同
静态语言(编译方式):编译器一次性生成目标代码,优化更充分,程序运行时速度更快。 1)对于相同的源代码,编译所产生的的目标代码执行速度更快。 2)目标代码不需要编译器就可以运行,在同类操作系统上使用灵活。 脚本语言(解释方式):执行程序时需要源代码,维护更加灵活。 1)解释执行需要保留源代码,程序纠错和维护十分方便。 2)只要存在解释器,源代码可以在任何操作系统上运行,可移植性好。
(有的企业有时候开发一个大型的应用程序,用静态语言,可能过个五六年,就只有功能还在,源程序都找不到了,但是使用脚本语言就不会出现源程序找不到的问题。)
二、Java的解释执行和编译执行
上面根据计算机执行方式的不同,把高级语言分为两类,静态语言和脚本语言。 但是,在前面的博客里我也写过Java语言的执行是有解释执行和编译执行两种的。
Java在编译时期,通过将源代码编译成.class ,配合JVM这种跨平台的抽象,屏蔽了底层计算机操作系统和硬件的区别,实现了“一次编译,到处运行” 。 而在运行时期,目前主流的JVM 都是混合模式(-Xmixed),即解释运行 和编译运行配合使用。解释器的优势在于不用等待,编译器则在实际运行当中效率更高。在Java虚拟机运行时,解释器和即时编译器能够相互协作,各自取长补短,从而提高运行效率。
注:Python语言是一种被广泛使用的高级通用脚本编程语言,虽然采用解释执行方式,但是它的解释器也保留了编译器的部分功能,随程序运行,解释器也会生成一个完整的目标代码。这种将解释器和编译器结合的新解释器是现代脚本语言为了提升计算机性能的一种有益演进。
这是《Python程序设计语言》第二版里的话,可以参考理解 高级语言按照计算机执行方式的分类和他们在执行过程中实际采用的执行方式不太一致的问题吧。
ps:希望有大佬看见了能够解释的更详细,或者指出错误。 ps2:这个图我很想知道有没有什么简单的方法能够缩小鸭~感激不尽OTZ