• 计算机组件及操作系统基础知识


    计算机组件及操作系统基础知识

    原创 2016年01月11日 22:58:29

    一、计算机组件简介

           现代计算机设备主要有五个部分组成:运算器、控制器、存储器、输入设备、输出设备。CPU是中央处理器,是控制和运算器,是一台计算机的运算核心和控制核心。存储器的主要功能是存储程序和各种。输入输出设备我们一般统称I/O,用于连接计算机内外部。而这些组件的连接则需要总线和主板来完成。

    1、CPU

           中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。CPU从内存或cpu缓存中取出指令,放入指令寄存器,并对指令译码。它把指令分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。

    1)主频

    主频也叫时钟频率,用来表示CPU的运算、处理数据的速度。通常,主频越高,CPU处理数据的速度就越快。

    问:主频越高速度一定越快吗?

    答:假设某个CPU在一个时钟周期内执行一条运算指令,那么当CPU运行在2GHz主频时,将比它运行在1GHz主频时速度快一倍。因为2GHz的时钟周期比1GHz的时钟周期占用时间减少了一半,也就是工作在2GHz主频的CPU执行一条运算指令所需时间比工作在1GHz主频时的时间缩短了一半,自然运算速度也就快了一倍,所以目前很多人对于超频乐此不疲。但是使用主频的高低来衡量处理器的性能,需要在相同的条件下相互比较,比如核心与线程数量,核心工艺(指令集),核心缓存等因素对于处理器来说也非常重要,我们不能拿一个过去的高主频的落后处理器和现在先进的低主频处理器相比较,性能方面显然是现在的处理器性能要好。

    2)CPU缓存

    CPU缓存位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。

    CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在Cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。由此可见,在CPU中加入Cache是一种高效的解决方案,这样整个内存储器(Cache+内存)就变成了既有Cache的高速度,又有内存的大容量的存储系统了。

    按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是下一级缓存的一部分,这三种缓存的技术难度和制造成本是相对递减的,所以其容量也是相对递增的。当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。一般来说,每级缓存的命中率大概都在80%左右,也就是说全部数据量的80%都可以在一级缓存中找到,只剩下20%的总数据量才需要从二级缓存、三级缓存或内存中读取,由此可见一级缓存是整个CPU缓存架构中最为重要的部分。

    2、Memory

    存储器分内存储器和外存储器,外存主要是U盘、硬盘等,一般意义上我们会讲外存归类于I/O设备。所以这里的存储器我们仅仅指的是内存。

    内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁,是CPU能直接寻址的存储空间。我们平常使用的程序,如Windows操作系统、打字软件、游戏软件等,一般都是安装在硬盘等外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的。就好比在一个书房里,存放书籍的书架和书柜相当于电脑的外存,而我们工作的办公桌就是内存。通常我们把要永久保存的、大量的数据存储在外存上,而把一些临时的或少量的数据和程序放在内存上。

    内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。

    ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器停电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。

    RAM表示随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。

    高速缓冲存储器(Cache)就是CPU缓存,前文已经有介绍。

    3、I/O

    I/O(input/output),即输入/输出端口。每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。常见的I/O设备包括键盘、硬盘、打印机、鼠标、键盘等。硬盘就是通过I/O接口,把数据送到内存中供CPU处理的。

    4、BUS

    总线(Bus)是由导线组成的传输线束。它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。

    1)按照功能分类

    数据总线:用于传送数据信息。数据总线是双向三态形式的总线,即他既可以把CPU的数据传送到存储器或I/O接口等其它部件,也可以将其它部件的数据传送到CPU。需要指出的是,数据的含义是广义的,它可以是真正的数据,也可以是指令代码或状态信息,有时甚至是一个控制信息,因此,在实际工作中,数据总线上传送的并不一定仅仅是真正意义上的数据。常见的数据总线为ISA、EISA、VESA、PCI等。

    地址总线:是专门用来传送地址的,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线总是单向三态的,这与数据总线不同。地址总线的位数决定了CPU可直接寻址的内存空间大小,比如8位微机的地址总线为16位,则其最大可寻址空间为2^16=64KB,16位微型机的地址总线为20位,其可寻址空间为2^20=1MB。一般来说,若地址总线为n位,则可寻址空间为2^n字节。

    控制总线:用来传送控制信号和时序信号。控制信号中,有的是微处理器送往存储器和I/O接口电路的,如读/写信号,片选信号、中断响应信号等;也有是其它部件反馈给CPU的,比如:中断申请信号、复位信号、总线请求信号、设备就绪信号等。因此,控制总线的传送方向由具体控制信号而定,一般是双向的,控制总线的位数要根据系统的实际控制需要而定。

    问:为什么32位操作系统最大只能支持4G内存?

    答:32位代表地址总线位宽,总线的位宽指的是总线能同时传送的二进制数据的位数,而地址总线的位宽决定了CPU可直接寻址的内存空间大小,由于二进制每个位寻址只有0、1两种,所以32位操作系统的寻址空间就是2^32=4GB。

    2)按照层次分类

    内部总线:在CPU内部,寄存器之间和算术逻辑部件ALU与控制部件之间传输数据所用的总线称为片内总线(即芯片内部的总线),如I2C总线、SPI总线、SCI总线等。

    系统总线:又称内总线或板级总线,是微机中各插件板与系统板之间的总线,用于插件板一级的互联。因为该总线是用来连接微机各功能部件而构成一个完整微机系统的,所以称之为系统总线。人们平常所说的微机总线就是指系统总线,如ISA总线、PCI总线等。

    外部总线:是计算机和外部设备之间的总线,如IDE总线、USB总线、SCSI总线等。

    3)按照传输方式分类

    串行总线:所有信号复用一对信号线,串行总线通信速率比较低,但在数据通信量不是很大的微处理器电路中,显得更加便捷、灵活。如USB总线、SPI总线、I2C总线等。

    并行总线:每个信号都有自己的信号线,并行总线通信速度快,实时性好,但由于占用的口线多,成本上会有所增加。如ISA总线、PCI总线等。

    5、主板

    主板提供一系列接合点,供处理器、显卡、声效卡、硬盘、存储器、I/O设备等设备接合。它们通常直接插入有关插槽,或用线路连接。主板上最重要的构成组件是芯片组。而芯片组通常由北桥和南桥组成,这些芯片组为主板提供一个通用平台供不同设备连接,控制不同设备的沟通。

    芯片组(Chipset)是主板的核心组成部分,几乎决定了这块主板的功能,进而影响到整个电脑系统性能的发挥。按照在主板上的排列位置的不同,通常分为北桥芯片和南桥芯片。北桥芯片提供对CPU的类型和主频、内存的类型和最大容量、ISA/PCI/AGP插槽、ECC纠错等支持。南桥芯片则提供对KBC(键盘控制器)、RTC(实时时钟控制器)、USB(通用串行总线)、Ultra DMA/33(66)EIDE数据传输方式和ACPI(高级能源管理)等的支持。其中北桥芯片起着主导性的作用,也称为主桥(Host Bridge)。

     

    二、计算机系统层次总述

    1、第一级是微程序级。这级的机器语言是微指令集,程序员用微指令编写的微程序,一般是直接由硬件直接执行的。

    2、第二级是传统机器级,这级的机器语言是该机的指令集,程序员用机器指令编写的程序可以由微程序进行解释

    3、第三级是操作系统级,从操作系统的基本功能来看,一方面它要直接管理传统机器中的软硬件资源,另一方面它又是传统机器的延伸。

    4、第四级是汇编语言级,这级的机器语言是汇编语言,完成汇编语言翻译的程序叫做汇编程序。

    5、第五级是高级语言级,这集的机器语言就是各种高级语言,通常用编译程序来完成高级语言翻译的工作。

    总结:不同层级的程序设计都是由不同的语言来完成了,越低级的语言越接近机器,越高级的语言越接近人类,所以我们大多数应用程序员都工作在高级语言级。而操作系统可以看做是一个中间层,起到机器语言和人类自然语言承上启下的作用,所以操作系统非常重要,也是我们后面学习的重点。

    三、操作系统

    1、操作系统作用:

    1)屏蔽硬件物理特性和操作细节,向上输出统一接口,为用户使用计算机提供了便利

    操作系统将底层计算机所提供的的各种计算能力抽象为一种统一接口的软件,无论底层是AMD的cpu还是Inter的cpu,都统一成一个提供计算能力的,也不管内存是1G、2G、4G、8G都统一成32位系统4G内存,64位系统4G*4G的内存。所以程序员写程序就大大的简化了,不管底层到底硬件如何,我直观面对linux或者window这种操作系统,或者32位、64位操作系统写程序即可。这就是我们为什么买了电脑第一件事情是装操作系统,然后才能装各种软件,因为一般来说程序员写程序是面对操作系统写的,而不是面对机器写的,没有操作系统软件没法运行。

    问:是不是软件一定要在操作系统上才能运行?

    答:并不是那么绝对,如果程序员愿意按照底层的机器语言去写程序,是不需要操作系统的,但是底层的机器语言太过复杂,难以满足现在应用软件的需求。

    2)有效管理系统资源,提高系统资源使用效率。如何有效地管理、合理地分配系统资源,提高系统资源的使用效率是操作系统必须发挥的主要作用。比如:硬件驱动、CPU时间片切割分配(进程管理)、内存管理、网络管理等等。

    2、操作系统组成:

    1)内核(Kernel)

    内核,是一个操作系统的核心。从不同的角度来看,内核担任的角色不同。从纯技术角度来看,内核只是软件和硬件的一个中间层,它把从软件发来的请求发送给硬件,完成寻址等操作,还充当了底层驱动。从应用程序角度来看,内核是对硬件的一个高层次的抽象,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的最底层。从多个并发的进程的角度来看,内核是一个资源管理器,它完成对进程的切换,调度,共享计算机资源(CPU,内存,磁盘,网络等)。还可以把内核看成一个库,通过系统调用向内核发送各种请求。

    2)系统调用(System Calls)

    在CPU的所有指令中,有一些指令是非常危险的,如果所有的程序都能使用这些指令,一旦错用指令将导致整个系统崩溃,比如:清内存、设置时钟等。所以,CPU将指令分为特权指令和非特权指令,对于那些危险的特权指令,只允许操作系统的内核使用,普通的应用程序只能使用那些不会造成灾难的非特权指令。

    但是一个应用程序肯定是特权指令和非特权指令都需要使用的,这时怎么办?

    操作系统将程序的运行空间分为内核空间用户空间(即内核态和用户态),他们分别运行在不同的级别上,逻辑上是相互隔离的。用户进程在通常情况下是不允许访问内核数据的,它也就无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。Linux使用了Ring3级别运行用户态,Ring0作为内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。而系统调用正是操作系统向用户程序提供支持的接口,系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。注意,系统调用并非每一个时刻都会发生,只有那些特权指令才需要通过系统调用接口去请求内核。而一些非特权指令并不需要调用内核而直接可以运行在CPU上。

    问:应用程序如何在用户态和内核态之间切换?

    答:当进程在执行用户自己的代码时,我们称其处于用户态。即此时处理器在特权级最低的用户代码中运行。每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。当一个进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核态。此时处理器处于特权级最高的内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。

    问:为什么应用程序不能直接调用内核?

    答:现代的操作系统通常都具有多任务处理的功能,通常靠进程来实现。由于操作系统快速的在每个进程间切换执行,所以一切看起来就会像是同时的。同时这也带来了很多安全问题,例如,一个进程可以轻易的修改进程的内存空间中的数据来使另一个进程异常或达到一些目的,因此操作系统必须保证每一个进程都能安全的执行。这一问题的解决方法是在处理器中加入基址寄存器和界限寄存器。这两个寄存器中的内容用硬件限制了对储存器的存取指令所访问的储存器的地址。这样就可以在系统切换进程时写入这两个寄存器的内容到该进程被分配的地址范围,从而避免恶意软件。为了防止用户程序修改基址寄存器和界限寄存器中的内容来达到访问其他内存空间的目的,这两个寄存器必须通过一些特殊的指令来访问。通常,处理器设有两种模式:“用户模式”与“内核模式”,通过一个标签位来鉴别当前正处于什么模式。一些诸如修改基址寄存器内容的指令只有在内核模式中可以执行,而处于用户模式的时候硬件会直接跳过这个指令并继续执行下一个。同样,为了安全问题,一些I/O操作的指令都被限制在只有内核模式可以执行,因此操作系统有必要提供接口来为应用程序提供诸如读取磁盘某位置的数据的接口,这些接口就被称为系统调用。当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如I/O操作,修改基址寄存器内容等指令,而当处理完系统调用内容后,操作系统会让处理器返回用户模式,来执行用户代码。

    3)库函数调用(Library Calls)

    系统调用虽然是内核和用户应用程序之间的沟通桥梁,是用户应用程序访问内核的入口点,但通常情况下,系统调用并不直接和程序员打交道,它仅仅是一个通过软中断机制(X86中的int 0x80)向内核提交请求以获取内核服务的接口。应用程序是通过操作系统提供的应用编程接口(API)而不是直接通过系统调用来编程。操作系统API的主要作用是把操作系统的功能完全展示出来,提供给应用程序,基于该操作系统,与文件、内存、时钟、网络、图形、各种外设等互操作的能力。此外,操作系统API通常还提供许多工具类的功能,比如操纵字符串、各种数据类型、时间日期等。

    在Linux中,API遵循了在UNIX中最流行的应用编程界面标准——POSIX标准,该标准基于当时现有的UNIX 实践和经验,描述了操作系统的系统调用编程接口(即API),用于保证应用程序可以再源代码一级多种操作系统上移植运行,这些系统调用编程接口主要是通过 C 库(libc)实现的。库函数(library function)是由用户或组织自己开发的,具有一定功能的函数集合,一般具有较好平台移植性,通过库文件(静态库或动态库)向程序员提供功能性调用。程序员无需关心平台差异,由库来屏蔽平台差异性。

    C库(libc)提供了POSIX的绝大部分API,同时,内核提供的每个系统调用在C库中都具有相应的封装函数。系统调用与其C库封装函数的名称常常相同,比如,read系统调用在C库中的封装函数即为read函数。实际上,从用户的角度看,系统调用和C库之间的区别并不重要,他们只需通过C库函数完成所需功能。相反,从内核的角度看,需要考虑的则是提供哪些针对确定目的的系统调用,并不需要关注它们如何被使用。

    4)系统调用和函数库调用的联系和区别

    系统调用和函数库调用的联系:

        1、库函数是在系统调用上的一层包装,运行在用户态(user mode),打个比方,库函数相当于包工头,系统调用是工人,我们可以自己找工人分任务,但一般是把任务摊给包工头,包工头再去给工人分任务。

        2、函数库中的某些函数调用了系统调用接口,编程人员可以通过函数库调用系统调用接口,当然高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介;

        3、很多函数库中的函数名与系统调用的名称一样,是因为该函数本身其实就是调用的系统调用,放到函数库就是为了用户态的使用,这样可以减少用户态到内核态的切换开销。但系统调用和库函数之间并不是一一对应的关系,可能几个不同的函数会调用到同一个系统调用,也有可能一个函数调用多个系统调用。更有些函数并不依赖于任何系统调用,因为它们并不需要向内核请求任何服务。

    系统调用和函数库调用的区别:

    问:一个程序需要执行内核代码最终都是要系统调用,但是为什么我们通常的做法是调用库函数而不是直接系统调用?

    答: 1、库函数调用不依赖于操作系统,平台移植性好;

           2、库函数给我们提供的接口更人性化,所以调用起来更方便;

           3、调用库函数更安全,内存管理不用自己太操心;

           4、调用库函数效率更高,虽然库函数最终是调用系统函数,但是库函数会比我们用更好的方式方法调用系统函数(比如说使用缓冲池)。

    问:系统调用在各个操作系统是不同的,而库函数调用最终还是会进行系统调用,那如何实现库函数的可移植呢?

    答:在各个操作系统之间,基于大部分需求会抽象出一个中间层。在中间层中,中间层用了屏蔽底层细节,在程序员看来C言语库就是这样一个中间层的作用。在各个平台下,我们默认C标准库中的函数都是一样的,这样基本可以实现可移植。但是对于C库本身而言,在各种操作系统平台下其内部实现是完全不同的,也就是说C库封装了系统调用接口在其内部的实现细节(编译器来负责库函数到系统调用之间的转换)。  因此,C语言提供了我们在代码级的可移植性,即这种可移植是通过C语言这个中间层来完成的。

    问:如果程序员写的程序是面向API而非操作系统,具有可移植性,那为什么一般情况下windows上的程序在linux上无法运行?

    答:这里说的可移植,是源码可移植,并非程序可移植,可执行程序是经过源码编译而成的,编译后源码就变成了机器语言二进制代码,而不同操作系统编译出来的二进制代码是不同的,不同操作系统对二进制代码的解释也是不一样的,并且编译后的可执行文件在各个操作系统中也是不一样的。通俗的说如果把源码比喻成一篇中文文章,那么用德语翻译的文章只有德国人能看懂,用法语翻译的文章只有法国人才能看懂。(编译器是把源代码整个编译成目标代码,执行时不在需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码exe程序,在windows平台上执行。)

    关于更多系统调用和库函数调用知识请参考:系统调用和c库之间的关系

    四、汇编语言

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。

    汇编语言优点:

    1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源;

    2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。

    汇编语言缺点:

    1、汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低;

    2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;

    3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。

    汇编语言的运用场景:

    历史上,汇编语言曾经是非常流行的程序设计语言之一。但随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。

    但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。

    1、汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时响应的场合比较有用,比如仪器仪表和工业控制设备中。

    2、在系统程序的核心部分,以及与系统硬件频繁打交道的部分,可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序,以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。

    3、汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。

    4、通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。

    五、高级语言

    由于汇编语言依赖于硬件体系,且助记符量大难记,于是人们又发明了更加易用的所谓高级语言.高级语言(High-level programming language)是高度封装了的编程语言,与低级语言相对。它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。由于早期电脑业的发展主要在美国,因此一般的高级语言都是以英语为蓝本。正因为高级语言是经过封装的编程语言,所以不能直接被计算机所识别,并需经过转化才能被执行,按转换方式可以讲他们分成两类:

    1、编译型语言

    编译型语言包括C、C++等。这里说的编译是指在应用源程序执行之前,就将程序源代码“翻译”成汇编语言,然后进一步的根据硬件环境被变成符合运行需要的机器语言的目标文件。

    2、解释型语言

    解释型语言包括Python、Perl、ruby、JavaScript等。解释型语言的实现中,翻译器并不产生机器语言的目标文件,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由解释器软件支持的,不能直接使用硬件。(我们不难发现在编译型和解释型中都没有找到java,因为java既需要编译又需要解释,可以算是一种混合型的,只是java没有直接编译成为机器语言,而是编译成为字节码,然后在Java虚拟机上用解释方式执行字节码。)

    3、编译型语言和解释型语言的比较

    1)运行效率

    编译语言需要编译一次,运行直接执行、不需要翻译,所以编译型语言的程序执行效率高;

    解释语言的程序不需要编译,在运行程序的时候才翻译,这样解释性语言每执行一次就要翻译一次,效率比较低。

    2)使用方便

    编译型语言编写的应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件才能执行,只有目标文件而没有源代码,几乎是没法修改的;

    解释型语言编写的应用程序是由另一个可以理解中间代码的解释程序执行的,所以当语句出现语法错误时,可以立即引起程序员注意,而程序员在程序开发期间就能进行校正。

    3)跨平台性

    编译型语言需要依赖编译器,而编译器是基于操作系统,所以平台移植性差;

    解释型语言需要依赖解释器,而解释器不基于操作系统,所以平台移植性好。

    4)应用场景

    编译型语言由于其执行效率高,所以一般用于一些底层的开发上,如驱动,网络设备,操作系统内核等等。

    解释型语言由于其接近人类自然语言且相对简单,所以一般用于开发应用程序、游戏、网站等。

    总结:从机器语言、汇编语言、再到不同类型的高级语言,纵观整个计算机系统语言体系,我们会发现越靠近人类自然语言的就越简单,用的也越多,但是运行效率也越低。而越靠近机器语言的就越复杂,用的也越少,但是运行效率越高。因此在计算机体系下不同的层次和场景,需要选择不同的语言对其进行程序设计

  • 相关阅读:
    matplotlib
    CNN中feature map、卷积核、卷积核个数、filter、channel的概念解释,以及CNN 学习过程中卷积核更新的理解
    Batch Normlization原理
    pycharts
    stm 32 LED(寄存器版本)
    stm32 滴答时钟实现较准时延时功能
    LFS笔记一:从LFS网站获取资源
    ubuntu 12.04编译安装linux3.6.10内核笔记
    stm32 外部事件<按键>中断输入实现过程<寄存器>
    stm32 中断几个库函数实现过程分析。
  • 原文地址:https://www.cnblogs.com/jacklong-yin/p/8399063.html
Copyright © 2020-2023  润新知