一些编程概念的探讨

 Von's Blog     2020-11-06   2557 words    & views

写在前面

最近好像挺久没有更新博客了,主要意识到之前那种为了安全而学习安全的方法是错误的。安全的前提还是开发,开发技能不行,安全技能也没办法达到多高的程度,所以最近觉得还是得沉下心来,学习开发技能。

编译型语言与解释型语言

我们知道,计算机实际上只能理解二进制代码,所以我们用各种高级语言写出来的代码,都要经过相关的过程才能转化为机器语言(二进制代码)。解释型语言和编译型语言就是针对这两种不同的转化过程的解释。

编译型语言

编译型语言就是程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。 以C语言为例:我们在使用C语言时,需要将C语言代码编译为.exe文件,然后直接运行.exe文件就能运行代码了。从这里,我们可以看到编译型语言的几个优势和劣势:

优势:

  1. 代码执行效率高:因为在编译过程中,程序已经直接被编译成机器语言了,机器语言是运行效率最高的语言。
  2. 一次编译,多次执行:当你编译完文件后,下次运行不需要再次编译源代码,直接运行编译完的二进制代码就行了(C语言里面的.exe)
  3. 运行时可以脱离编程环境,比如C语言编程生成的.exe文件可以在相同操作系统、指令集的机器上运行,运行的机器上不需要有C语言的编译器。

    劣势:

  4. 可移植性差:因为生成的机器码是和操作系统密切相关的(Windows的机器码和Linux显然不同),所以在不同的平台上运行代码需要用不同的编译器进行编译生成不同的机器码文件。

常见的编译型语言有:C、C++、Pascal、Object-C

解释型语言

解释型语言就是程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要解释一次。(由解释器解释)

优势

  1. 可移植性好:由于每次运行的时候都有解释器来解释,解释器就像一个万能的翻译官,可以自动的将高级语言解释为适合各种底层操作系统的机器语言,因此具有较好的可移植性。

    劣势

  2. 代码执行效率低:因为代码执行时不是像编译型语言一样一次编译,永久执行。而是运行的时候再来一句一句执行。这就导致了代码执行效率比编译型语言低很多。

常见的解释型语言有:PHP,Python,Javascript

JAVA

JAVA各种语言里面相对比较另类的一种。很难明确定义是属于解释型语言也不属于编译型语言。 JAVA在运行时首先是将代码编译为.class文件,.class文件是字节码文件,可以理解为是高级语言到机器语言的一种中间语言,但是这种字节码文件机器是识别不了的,因此还需要对.class文件进行解释为机器语言才能由计算机执行。 从上面的图片可以看出,对不同的平台,JAVA都是先将代码编译为一份相同的.class文件,再由不同平台对应的JVM对.class文件进行解释为机器语言。这也就是JAVA说的跨平台性的由来,因为他只需要一份.class文件就可以在不同的平台上执行了。所以JAVA的运行过程既需要编译也需要解释,兼有两种的特点。
都说到这里了,就顺便再谈一下JAVA中的几个概念吧。

JVM

JVM即JAVA虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。

JRE

JRE即Java运行时环境,单单靠JVM自身没办法执行JAVA代码,他还需要JRE中的核心类库的辅助才能解释运行JAVA代码。现在的JVM是JRE的子集,即你安装了JRE就能解释运行.class代码了。
所以JRE提供的功能就是面向不需要写JAVA代码的人的,给你一个.class文件,你只要有JRE就能解释.class文件并运行了。

JDK

JDK即Java开发工具包,这是面向JAVA开发者的工具,假如你只有JRE,你是没办法编译java文件的,只能解释执行.class文件,只有你安装了JDK,你才能编译.java文件为.class文件,在现今,JDK包含了JRE. 他们三者的关系可以由这张图来解释 当然这里我们只对JAVA做出了较为详细的探讨,但其实包括Python在内的多种语言其实并不能明确的说是纯解释型语言,现在的多种高级语言都采用了一定程度的编译+解释机制,想要了解的话可以去参考这几篇文章。
Python是编译型语言还是解释型语言?
JavaScript到底是解释型语言还是编译型语言?

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

静态类型语言

编译期间做检查数据类型的语言,即写程序时要声明所有变量的数据类型,是固定的。
例如JAVA声明变量要指定变量类型:

int number = 1;

动态类型语言

运行期间才做数据类型检查的语言,即动态类型语言编程时,永远不用给任何变量指定数据类型。该语言会在第一次赋值给变量时,在内部将数据类型记录下来。
例如Python声明变量不需要指定变量类型:

number = 1

强类型语言和弱类型语言

强类型语言

强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。 就比如在Python中,这种写法是会报错的:

number = 123
print("我的号码是"+number)

弱类型语言

数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。C/C++、PHP都是弱类型语言。
在PHP中,这种写法是可以被接受的。

<?php
$number = 123;
echo ("我的号码是"+$number);

强类型语言在速度上略逊色于弱类型语言,使用弱类型语言可节省很多代码量,有更高的开发效率。而对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。 另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系!(和是不是强类型语言有关系,例如Python是动态语言,但它是类型安全的) 下面这张图展现了常见语言的类型划分