层次结构
实际机器(物理设备)
硬件逻辑层
门,触发器等逻辑电路组成
属于电子工程的领域
微程序机器层
编程语言是微指令集
微指令所组成的微程序(机器指令)直接交由硬件执行
传统机器曾
编程语言是CPU指令集(机器指令
编程语言和硬件是直接相关
不同架构的CPU使用不同的CPU指令集
虚拟机器
系统软件
·操作系统层
向上提供了简易的操作界面
向下对接了指令系统,管理硬件资源
操作系统层是软件和硬件之间的适配层
·汇编语言层
编程语言是汇编语言
汇编语言可以翻译成可直接执行的机器语言
完成翻译的过程的程序就是汇编曾
·高级语言层
编程语言为广大程序员所接受
高级语言的类别非常多,由几百
常见的高级语言有:Python,java,C/C++,Golang等
应用层
满足计算机针对某种用途而专门设计
程序翻译和程序解释
编译是将源程序翻译成可执行的目标代码,翻译与执行是分开的;而解释是对源程序的翻译与执行一次性完成,不生成可存储的目标代码。这只是表象,二者背后的最大区别是:对解释执行而言,程序运行时的控制权在解释器而不在用户程序;对编译执行而言,运行时的控制权在用户程序。
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;
解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.
编译型语言和解释型语言
在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计算机,一个关键的问题是程序执行时的基本表示是实际计算机上的机器语言还是虚拟机的机器语言。这个问题决定了语言的实现。根据这个问题的回答,可以将程序设计语言划分为两大类:编译型语言和解释型语言。
编译型语言编写的源程序需要经过编译、汇编和链接才能输出目标代码,然后机器执行目标代码,得出运行结果,目标代码由机器指令组成,一般不能独立运行,因为源程序中可能使用了某些汇编程序不能解释引用的库函数,而库函数代码又不在源程序中,此时还需要链接程序完成外部引用和目标模块调用的链接任务,最后输出可执行代码。C、C++、Fortran、Pascal、Ada都是编译实现的。
解释型语言的实现中,翻译器并不产生目标机器代码,而是产生易于执行的中间代码,这种中间代码与机器代码是不同的,中间代码的解释是由软件支持的,不能直接使用硬件,软件解释器通常会导致执行效率较低。用解释型语言编写的程序是由另一个可以理解中间代码的解释程序执行的。与编译程序不同的是,解释程序的任务是逐一将源程序的语句解释成可执行的机器指令,不需要将源程序翻译成目标代码后再执行。对于解释型Basic语言,需要一个专门的解释器解释执行 Basic程序,每条语言只有在执行才被翻译。这种解释型语言每执行一次就翻译一次,因而效率低下。
为什么编译型语言不需要配置环境而解释型语言需要配置环境
java是一个跨平台性的语言。跨平台就是在一个计算机上编译的字节码文件可以复制到任何一个安装了java环境的计算机上直接使用。我们首先要知道的是所有编程语言编写的应用程序都是先编译为字节码,再由计算机,或者更准确的说,是程序所在的平台,去运行这些字节码才能呈现出最后的结果。而平台是由操作系统(OS)和处理器(CPU)构成的,每个平台都会形成自己独特的机器指令,即该平台可以直接识别,执行的一种由0,1组成的序列代码。因为平台会因为操作系统或者处理器的不同,导致相同的0,1序列表示不同的指令,所以只要OS 或者CPU不同,机器指令就会发生改变。也就是说,在一台机器上编译好的字节码,可能因为机器换了另一种CPU的芯片,使得平台可识别的机器指令发生改变而无法运行,必须重新进行编译。
而我们都了解过c/c++,它是不需要安装配置环境的,因为c/c++ 直接对当前所在的平台进行编译,它所编译好的字节码就是当前平台可识别的机器指令。这也是c/c++ 的缺点,编译好的程序并不能跨平台使用。java则不同,只要平台包含java运行环境,编译好的java程序就可以在这个平台上运行。因为java的运行环境中带有java虚拟机,它可以识别java编译好的字节码文件,并把它转换为当前平台可识别的机器码。
这里需要注意的一点是,编译语言编译好的字节码文件不能在不同的平台使用,并不代表程序无法运行,只是需要重新编译。