低级语言和高级语言
低级语言
低级语言(机器语言,汇编语言):机器语言和汇编语言是一种面向机器的语言。
机器语言
汇编语言
执行速度快
汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快
可移植性差汇编语言只是将机器语言简单进行了编译,所以并没有根本上解决机器语言的特定性,所以汇编语言和机器自身的编程环境息息相关,推广和移植很难(不同机器的汇编语言也有所不同)
应用场合通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言
把汇编语言翻译成机器语言的过程称为汇编。
注意:编译和汇编是两种不同的翻译方式
高级语言
高级语言:高级语言完全脱离机器指令,是面向科学计算和实际问题的语言(面向过程和对象)
高级语言设计的程序必须经过“翻译”以后才能被机器执行。“翻译”的方法有两种,一种是解释,一种是编译。解释是把源程序翻译一句,执行一句的过程,而编译是源程序翻译成机器指令形式的目标程序的过程,再用链接程序把目标程序链接成可执行程序后才能执行
。解释翻译过程。对高级语言程序进行解释并执行的程序称为解释程序(软件)。它的功能是读入源程序,按源程序动态逻辑顺序进行逐句分析、翻译,解释一句执行一句,不产生任何中间代码,最终得到程序的执行结果
编译型语言
运行效率较高,可移植性差
在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了
因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立的运行,而且通常运行效率较高;但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行性程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定平台上
,针对特定平台进行修改,至少也需要采用特定平台上的编译器进行重新编译。C、C++、FORTRAN、Pascal等高级语言都属于 编译型语言
解释型语言
可移植性好,执行效率差
每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。解释型语言可以方便的实现源程序级的移植,但以牺牲程序执行效率为代价。
Ruby、Python等语言都属于解释型语言
&&为什么编译型语言可移植性差?
可移植性是相对于编译之后的程序代码来说的
对于编译型语言来说,不同的操作系统需要不同的编译器,
对于解释性语言来说,不同的操作系统需要不同的解释器
那么,只要在特定的操作系统应用特定的编译器或解释器,源代码也是可以移植的,所以编译型语言是可以移植的,但移植性差,为什么?
对于编译语言:有些情况下,源码是不希望别人看见的,那么就需要提前编译成可执行语言再提交给别人,这个时候如果别人的操作系统和你的操作系统不一样,那么这个可执行文件别人就无法执行
而对于解释性语言:即使操作系统不一致,解释器可以将源码编译为字节流文件(比如python的pyc文件),而不是可执行文件,字节流文件移植到特定的操作系统,再由特定的操作系统去编译执行
从高级语言到可执行文件
经历四个阶段:
预处理器→编译器→汇编器→链接器
最难理解的是编译与汇编的区别。这里采用《深入理解计算机系统》的说法。
预处理阶段:写好的高级语言的程序文本比如hello.c,预处理器根据#开头的命令,修改原始的程序,如#include<stdio.h>#include<stdio.h>,将把系统中的头文件插入到程序文本中,通常是以.i.i结尾的文件。
编译阶段:编译器将hello.i文件翻译成文本文件*hello.s,这个是汇编语言程序。高级语言是源程序。所以注意概念之间的区别。汇编语言程序干嘛?每条语句都以标准的文本格式确切描述一条低级机器语言指令。*不同的高级语言翻译的汇编语言相同。
汇编阶段:汇编器将hello.s翻译成机器语言指令。把这些指令打包成可重定位目标程序,即.o.o文件。hello.o是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。
链接阶段:比如hello程序调用printf程序,它是每个C编译器都会提供的标准库C的函数。这个函数存在于一个名叫printf.o的单独编译好的目标文件中,这个文件将以某种方式合并到hello.o中。链接器就负责这种合并。得到的是可执行目标文件。
处理高级程序的一定是预处理程序或编译程序。汇编处理的对象是汇编程序文本,链接处理的是可重定位二进制程序
一般所说的机器目标代码文件用来指代的是汇编程序文件
python并不完全属于解释型语言
解释性语言中:一段程序在解释器中运行时可能会被编译多次,因为每次运行到这段程序时,都会重新编译一次这样效率必定会很低。
所以python里有一种.pyc文件来改善这个问题
什么是pyc文件
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte
code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。pyc的另一个用途就是:将源码编译为.pyc,避免源码泄露出去。 由于像这种.pyc文件的存在,解释型语言和编译型语言的界限就没有那么明确了
关于PyCodeObject和pyc文件
在硬盘上看到的pyc文件,其实PyCodeObject才是Python编译器真正编译成的结果。
当python程序运行时,编译的结果是保存在位于内存中,PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
pyc文件其实是PyCodeObject的一种持久化保存方式。
什么是字节码,什么是机器码
字节码 Byte Code
字节码严格来说不算是编程语言,而是高级编程语言为了种种需求(可移植性、可传输性、预编译等)而产生的中间码(Intermediate
Code)。 它是由一堆指令集组成的代码,例如在javac编译过后的java源码产生的就是字节码。 源码在编译的过程中,是需要进行「词法分析
→ 语法分析 → 生成目标代码」等过程的,在预编译的过程中,就完成这部分工作,生成字节码。
然后在后面交由解释器(这里通常指编程语言的虚拟机)解释执行,省去前面预编译的开销。
机器码 Machine Code
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native
Code),是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂
面向过程与面向对象编程的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
面向过程与面向对象的优缺点
面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
https://zhidao.baidu.com/question/513391187.html.
汇编语言_百度百科.
https://blog.youkuaiyun.com/zxr15709447338/article/details/87925861.
https://blog.youkuaiyun.com/qq_36627886/article/details/80402959.
https://blog.youkuaiyun.com/loveliuzz/article/details/77503802.
https://www.cnblogs.com/strivers/p/6681876.html.
https://blog.youkuaiyun.com/u011240016/article/details/53285575.