侵权投诉

介绍了C语言和机器语言的关系 以及其他类型语言的实现机制

2018-02-05 09:58 次阅读

我们知道,任何编程语言编写的程序归根到底都是由底层机器的机器代码(01序列)执行的,无论是编译型语言还是解释型语言。而任何高级编程语言程序的源代码都是一个字符序列,这个字符序列到底层的01序列是通过编译器或解析器经过多次转换完成的。

图1 编程语言的层次结构

这个层次结构中,从高到低越来越接近于机器硬件。机器代码就是01序列,汇编语言就是描述本地机器的指令集体系结构,而高级语言就包含相应的数据结构和语法结构,更接近人类的语言习惯。因此,层次越高就越面向于人类。在计算机科学中,CPU被抽象为指令集体系结构,这个指令集描述了CPU所有完成的所有功能。所有的程序都经过编译或解释转化为这个指令集表示的机器程序。在指令集中指令可以按功能划分为:

1. 数据传输指令,用于读写内存、寄存器

2. 算术与逻辑运算指令,比如:addl执行双字(32bit)的加法,andl双字的按位与。

3. 控制流指令,用于实现高级编程语言中的分支、循环等控制结构。

4. 过程调用指令,用于实现函数调用,分配、恢复栈帧等操作。

任何程序都需要被转换为某个指令集的指令序列,比如下列简单的求阶乘的C程序:

[cpp] view plaincopyprint?int fact_while(int n)

{

int result = 1;

while (n > 1) {

result *= n;

n = n-1;

}

return result;

}

在32bit机器上,经过gcc编译之后的x86指令序列为:

[plain] view plaincopyprint? movl 8(%ebp), %edx

movl $1, %eax

cmpl $1, %edx

jle .L7

.L10:

imull %edx, %eax

subl $1, %edx

cmpl $1, %edx

jg .L10

.L7:

通过观察C程序的机器代码可以发现由C程序转化为机器代码,主要有数据类型和控制结构的转换。下面以x86指令集说明:

1. 数据类型的转换:在底层,x86指令对于数据是不区分逻辑类型的,也就是不分int,float,double。所有的数据按照其所占的字节数被归类为字(16个字节,Word)、双字(32个字节,Double Words)、四字(64个字节,Quad Words)。一个指令操作的数据类型是由这个指令的后缀表示的,比如mov指令,movw操作字,movl操作双字。也就是说高级语言的程序中的不同数据类型反映到底层指令集上主要体现是指令的不同。比如,将上述C程序中的result类型改为short,在相应的汇编代码中的mov指令会由movl转换为movw。当然,还有一个问题就是C语言中的具体数据类型,在机器代码中是如何存储表示的。这应该是gcc编译器的职责,比如对于int,首先gcc需要知道底层指令集如何编码int,采用什么编码方式,字节顺序是Big-endian还是Little-endian等。在知道底层的实现方式后gcc才能将表示整型数字的字符串编码为相应的二进制形式。而对于数组、struct和union这些数据结构会转化为相应的内存地址加偏移量的形式。

2. 控制结构的转换:控制结构就是执行指令的流程。在x86中,所有的指令集都是顺序执行。要实现分支、循环等结构,必须具备go形式的跳转指令,以及相应的条件判断指令。CPU中有一组条件码寄存器,指示算术或逻辑运算的状态(计算结果是否溢出、为0或者是负数等)。执行条件运算指令可以测试一个条件,比如"cmpl $1, %edx"比较直接数1与寄存器%edx中存放的数的大小,并将结果存入条件码寄存器中。接下来执行条件跳转指令,根据条件码寄存器中的状态进行判断是否进行跳转。比如“jg .L10”是在前一条的cmpl指令结果返回大于的情况跳转到L10,否则执行下一条指令。

当然,在进行函数调用时,还要在底层用机器码对其进行描述。我们知道,计算机科学中用栈来实现函数的调用(叫做调用栈),栈中存放栈帧。每一次函数调用对应一个栈帧,栈帧中包含该方法的局部变量、保存的寄存器值等数据。这样函数的调用和返回就对应着栈帧的入栈和出栈。CPU的寄存器组中,有两个专门用于实现方法调用,分别是%esp和%ebp。%esp是栈指针寄存器,存放当前函数栈栈顶的内存地址。%ebp是帧指针寄存器,在%esp和%ebp之间的内存地址序列就对应于当前函数的栈帧。由于函数调用、返回与栈帧的关系很密切,所以可以将以此函数调用过程描述为:

1. 初始化被调用函数的栈帧,并将其入栈。也就是调用函数过程,通过call指令实现。

2. 执行被调用函数。

3. 恢复调用函数的栈帧,将被调用函数的栈帧出栈。也就是函数返回的过程,通过ret指令实现。

对于初始化、恢复栈帧实际上都是%esp和%ebp的调整,还要包括传参和返回值的问题,这些都是由编译器实现的。

上面介绍了C++语言和机器语言的关系,下面看一下其他类型语言的实现机制。首先,我们可以把编程语言分为编译型语言、解释型语言和虚拟机语言。编译型语言直接被编译成本地机器代码,比如C、C++。解释型语言是通过解释器执行,比如javascript、shell、python等。虚拟机语言运行在虚拟机上,需要被编译成虚拟机代码,由虚拟机执行,比如java。虽然python也有自己的虚拟机,但是不需要编译,所以把它归类为解释型语言。

介绍了C语言和机器语言的关系 以及其他类型语言的实现机制

图2 编程语言实现结构

通过上文的分析、我们知道对于一门语言最重要的是数据类型、控制结构和语法结构以及系统调用。从上图可以看出,C和C++更接近于底层硬件,但是不能像汇编语言一样可以直接访问寄存器等硬件。而python和java相对于C和C++的抽象层次又高了一层,它们不能通过指针直接访问内存。从机器语言->汇编语言->系统语言(C和C++)->解释型语言(python)和虚拟机语言(java),抽象层次越来越高,越贴近于人的思维,不需要考虑那么多细节;同时,程序员的自由度和程序的运行速度越来越低。下面从低向高j讨论一下。

在底层,汇编语言会经过汇编器转换为机器代码。比如,通过gcc编译C程序时,会调用汇编器进行汇编。通过汇编器和汇编语言这一层次,可以很好的隔离底层机器硬件的实现细节。不同的处理器具有与之对应的汇编器,将汇编语言汇编成该处理器支持的指令集。这样就是实现了汇编语言这一层的移植性。

在C和C++系统编程语言这一层,会通过编译器完成语言元素到汇编语言的映射。比如前文描述的,数据类型、控制结构、函数调用等结构的转换。

python是解释型语言,它通过python解释器实现向底层语言的映射。我们知道python虚拟机是由C语言编写的,所以python程序会转化为C程序而执行。比如,python中的所有对象都会在C中有对应的PyObject结构体。python的list、dict等数据类型也要在C中有对应的表示。而像生成器、迭代器等语法结构需要相应的支持。

而虚拟机是模拟一个指令集的程序,所以它自身有一套独立于具体硬件、操作系统的指令集。需要通过底层语言实现这套指令集。虚拟机本身也有自己的数据类型系统、语言结构等。比如,java虚拟机上支持的数据类型有基本数据类型和引用类型,也支持tableswitch和lookupswitch等实现switch语法结构的字节码指令。对于这些语言元素映射到底层语言的实现方式可以不同的方式。首先是解释器模式转化为C++,还有就是JIT直接编译成本地机器代码。

像java这样的虚拟机语言会被编译器编译成虚拟机本地的机器代码,然后再虚拟机上执行,这里就需要向javac编译器实现java语言的数据类型、语言结构和java虚拟机上的数据类型、语法结构的映射。

通过谈论,可以看出编译器和解释器以及虚拟机在编程语言中的重要性,它们都是编程语言可以在计算机上运行的基石。一门编程语言的编译器、解释器或者虚拟机可以很大程度上影响这门语言的执行效率。因为它们在进行语言转换时会进行很多的优化以提高执行效率。这也是为什么JVM上有那么多优秀的语言,因为JVM很强大。所以,要深入语言的底层,要学会编译器、解释器和虚拟机的实现,这方面还需要下功夫啊。

原文标题:关于编程语言的思考—编译型和解释型

文章出处:【微信号:weixin21ic,微信公众号:21ic电子网】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

什么是数据科学家的最佳编程语言?

每个数据科学学习者都最常问的问题:“ 什么是数据科学家的最佳编程语言?”。
的头像 如意 发表于 07-05 11:32 149次 阅读
什么是数据科学家的最佳编程语言?

干货:一些Python有用的小技巧,离精通更进一步

Python看起来似乎是一种任何人都可以学习的简单语言,但实际上,学会不等于精通,Python的“后....
的头像 如意 发表于 07-05 10:25 107次 阅读
干货:一些Python有用的小技巧,离精通更进一步

Python不为人知的机器学习软件包

动态数据科学的这三剑客几乎无人不知无人不晓:Numpy,Pandas和Matplotlib。你可能已....
的头像 如意 发表于 07-05 10:22 51次 阅读
Python不为人知的机器学习软件包

浅谈2020年六大主流编程语言

目前,计算机语言的总数总计达9000种。但是,其中只有50种编程语言是较为流行的。今天,小编就给大家....
的头像 如意 发表于 07-03 11:36 211次 阅读
浅谈2020年六大主流编程语言

python二级考试的选择复习题和答案说明

本文档的主要内容详细介绍的是python二级考试的选择复习题和答案说明。
发表于 07-02 18:03 18次 阅读
python二级考试的选择复习题和答案说明

单片机教程之C语言的程序设计说明

C51是在标准C的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,而C51在....
发表于 07-02 17:45 50次 阅读
单片机教程之C语言的程序设计说明

安利5个流畅自如的Python Web框架

如今,可供选择的Python web框架有不少,能帮助你更快更轻松地创建web应用。本文就将为大家介....
的头像 如意 发表于 07-02 17:15 183次 阅读
安利5个流畅自如的Python Web框架

c语言宏定义的使用方法

当宏作为常量使用时,C程序员习惯在名字中只使用大写字母。但是并没有如何将用于其他目的的宏大写的统一做....
发表于 07-02 15:04 72次 阅读
c语言宏定义的使用方法

C语言二级指针的用法与原理

提到指针,我们都知道指针是用来存储一个变量的地址。所以,当我们定义了一个指向指针的指针的时候(poi....
发表于 07-02 14:52 58次 阅读
C语言二级指针的用法与原理

HW资料华-为硬件(硬件开发C语言PCB设计天线通信)

链接:https://pan.baidu.com/s/1HFxkb4O1jAZvCEccWVcd4w 提取码:stns 回复可见提取码,资源需求可加q1051514663 ...
发表于 07-01 18:20 78次 阅读
HW资料华-为硬件(硬件开发C语言PCB设计天线通信)

C语言和PHP,新手选择哪个比较好?

计科专业从事嵌入式开发多年,从现在的市场行情以及就业的机会上讲php的就业空间还是大于C语言,但并不....
的头像 如意 发表于 07-01 16:15 103次 阅读
C语言和PHP,新手选择哪个比较好?

Python:装饰器的原理和案例

Python中的装饰器用于扩展可调用对象的功能,而无需修改其结构。基本上,装饰器函数包装另一个函数以....
的头像 如意 发表于 07-01 11:35 169次 阅读
Python:装饰器的原理和案例

Python的发展趋势,未来可期

首先,当前Python作为一门流行程度比较高的全场景编程语言,在IT互联网行业和一部分传统行业已经有....
的头像 如意 发表于 07-01 10:19 172次 阅读
Python的发展趋势,未来可期

如何通过星号编写Python代码的最佳方式

Python以句法简单、简洁而闻名,只需掌握简单的英语就能理解其代码。对初学者来说极具吸引力,它没有....
的头像 如意 发表于 07-01 09:58 136次 阅读
如何通过星号编写Python代码的最佳方式

优化代码,加速Python运行的八大方法

Python有时用起来确实很慢,我敢打赌你肯定抱怨过这一点,尤其是那些用惯了C,C ++或Java的....
的头像 如意 发表于 07-01 09:50 146次 阅读
优化代码,加速Python运行的八大方法

怎么样才能在Keil C51环境下实现64位浮点库的设计

为解决Keil C51环境下无法进行64位双精度计算的问题,采用分部存储和分部计算的方法,设计了在K....
发表于 07-01 08:00 15次 阅读
怎么样才能在Keil C51环境下实现64位浮点库的设计

怎么样才能使用Keil C51开发大型嵌入式程序

 结合在8051系列单片机平台上的实际开发应用的经验,介绍用 Keil C在8051单片机上进行大型....
发表于 07-01 08:00 14次 阅读
怎么样才能使用Keil C51开发大型嵌入式程序

反爬虫:网络爬虫需要代理服务器的协助

进入到大数据时代,我们很多时候都离不开数据使用,特别是对于网络而言,数据更是基础。
的头像 如意 发表于 06-30 18:07 279次 阅读
反爬虫:网络爬虫需要代理服务器的协助

详谈选择排序算法的定义和过程

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数....
的头像 如意 发表于 06-30 17:06 67次 阅读
详谈选择排序算法的定义和过程

Python的发展前景及工作

不知道大家有没有遇到过这种情况,面试时被面试官问会不会用python,结果就没有结果了。于是你很气愤....
的头像 如意 发表于 06-30 11:07 187次 阅读
Python的发展前景及工作

Python语言和人工智能之间有何联系?

人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应....
的头像 我快闭嘴 发表于 06-29 19:18 593次 阅读
Python语言和人工智能之间有何联系?

C语言模拟实现memmove函数

memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmo....
的头像 如意 发表于 06-29 17:53 83次 阅读
C语言模拟实现memmove函数

C语言模拟实现memcpy函数

memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起....
的头像 如意 发表于 06-29 17:29 168次 阅读
C语言模拟实现memcpy函数

ISD4002语音录放电路的设计C语言程序免费下载

  本文档的主要内容详细介绍的是ISD4002语音录放电路的设计C语言程序免费下载。
发表于 06-29 17:20 15次 阅读
ISD4002语音录放电路的设计C语言程序免费下载

简易LCD示波器设计的C语言程序免费下载

本文档的与内容详细介绍的是简易LCD示波器设计的C语言程序免费下载。
发表于 06-29 17:20 26次 阅读
简易LCD示波器设计的C语言程序免费下载

液晶GPS定位信息显示器的设计C语言程序免费下载

本文档的主要内容详细介绍的是液晶GPS定位信息显示器的设计C语言程序免费下载。
发表于 06-29 17:20 34次 阅读
液晶GPS定位信息显示器的设计C语言程序免费下载

超声波测距器设计的C语言程序免费下载

本文档的主要内容详细介绍的是超声波测距器设计的C语言程序免费下载。
发表于 06-29 17:20 25次 阅读
超声波测距器设计的C语言程序免费下载

远程电话控制器设计的C语言程序免费下载

本文档的主要内容详细介绍的是远程电话控制器设计的C语言程序免费下载。
发表于 06-29 17:20 36次 阅读
远程电话控制器设计的C语言程序免费下载

C语言模拟实现strcmp函数

C语言模拟实现strcmp函数
的头像 如意 发表于 06-29 16:51 189次 阅读
C语言模拟实现strcmp函数

C语言模拟实现strstr函数

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数....
的头像 如意 发表于 06-29 16:36 332次 阅读
C语言模拟实现strstr函数

C语言模拟实现strcat函数

C语言模拟实现strcat函数
的头像 如意 发表于 06-29 16:18 145次 阅读
C语言模拟实现strcat函数

C语言模拟实现strcpy

strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有’\0’结束符的字符串复制....
的头像 如意 发表于 06-29 15:54 125次 阅读
C语言模拟实现strcpy

C语言模拟实现strlen的步骤

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是....
的头像 如意 发表于 06-29 15:48 143次 阅读
C语言模拟实现strlen的步骤

图文详解:数组和指针的传参

数组传参时,会退化为指针,所以我们先来看看什么是退化!
的头像 如意 发表于 06-29 15:34 117次 阅读
图文详解:数组和指针的传参

详谈C语言和C++的区别和联系

在学习了C语言和C++之后,这两者之间的区别我们需要仔细的捋一捋!
的头像 如意 发表于 06-29 14:56 77次 阅读
详谈C语言和C++的区别和联系

单片机程序开发的语言怎么选择

单片机程序的开发可以使用的两种语言,分别是C语言和汇编语言。这里要指出的一件事是,这不是嵌入式单片机....
的头像 电子魔法师 发表于 06-29 11:22 306次 阅读
单片机程序开发的语言怎么选择

JavaSE的基础教程讲解

Java确实是从C语言和C++语言继承了许多成份,甚至可以将Java看成是类C语言发展和衍生的产物。....
发表于 06-29 08:00 14次 阅读
JavaSE的基础教程讲解

Python基础教程第三版PDF电子书免费下载

《Python基础教程 第3版》包括Python程序设计的方方面面:首先,从Python的安装开始,....
发表于 06-29 08:00 96次 阅读
Python基础教程第三版PDF电子书免费下载

3D数学基础图形与游戏开发PDF电子书免费下载

 本书主要研究隐藏在3D几何世界背后的数学问题。3D数学是一门与计算几何相关的学科,计算几何则是研究....
发表于 06-29 08:00 56次 阅读
3D数学基础图形与游戏开发PDF电子书免费下载

C语言精华知识:表驱动法编程实践

根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值....
的头像 玩转单片机 发表于 06-28 17:10 154次 阅读
C语言精华知识:表驱动法编程实践

聊聊我为什么热爱开源

后面的学习过程中,接触了单片机,我发现这东西也很有趣,能做点小东西,做个时钟、小车、LED小蛮腰。。....
的头像 玩转单片机 发表于 06-28 17:07 131次 阅读
聊聊我为什么热爱开源

Python爬虫入门知识:解析数据篇

解析数据,其用途就是在爬虫过程中将服务器返回的HTML源代码转换为我们能读懂的格式。那么,接下来就正....
的头像 如意 发表于 06-28 16:38 208次 阅读
Python爬虫入门知识:解析数据篇

Python爬虫:安全级别高的代理ip爬虫

现在是大数据的时代,无论是哪一个行业,对于数据都是有必要了解的,特别是代理ip在爬虫中的使用。
的头像 如意 发表于 06-28 16:29 226次 阅读
Python爬虫:安全级别高的代理ip爬虫

Python爬虫:工作者常用的动态IP代理

爬虫工作者应该经常要与代理ip工具打交道,根据不同的抓取网站,大家要调用不同类型的动态ip代理。
的头像 如意 发表于 06-28 16:29 167次 阅读
Python爬虫:工作者常用的动态IP代理

Python爬虫:使用哪种协议的代理IP最佳?

网络大数据要抓取信息,大多需要经过python爬虫工作,爬虫能够帮助我们将页面的信息抓取下来。
的头像 如意 发表于 06-28 16:25 305次 阅读
Python爬虫:使用哪种协议的代理IP最佳?

一个叫做MATLAB的美国软件被禁用了

有网友开始为AutoCAD担心。中国软件界要好好审视一下自己了,中国的工业未来在哪里?中国的软件未来....
的头像 算法与数据结构 发表于 06-28 11:08 329次 阅读
一个叫做MATLAB的美国软件被禁用了

Linux TraceEvent - 史上最长宏定义

看完了例子,我们就该看代码实现了。讲真,这是我见过的最长的宏展开了。之前在qemu上看到的那个hmp....
的头像 Linuxer 发表于 06-28 09:34 194次 阅读
Linux TraceEvent - 史上最长宏定义

Python快速入门手册免费下载

实际上 C 语言跟 Python 是有很密切的交际的。 当我们从 Python 官方网站下载并安装好....
发表于 06-28 08:00 30次 阅读
Python快速入门手册免费下载

大学生如何学习FPGA初学者怎么学FPGA

无论是从自身的发展,还是从FPGA所拥有的巨大市场来讲,学习FPGA都是一个不错的选择,对大家来说FPGA技术可能还是新...
发表于 06-23 15:12 272次 阅读
大学生如何学习FPGA初学者怎么学FPGA

python数据分析基础之使用statasmodels进行线性回归

python 数据分析基础 day16-使用statasmodels进行线性回归...
发表于 06-19 11:22 57次 阅读
python数据分析基础之使用statasmodels进行线性回归

深度学习入门之基于python的理论与实现

深度学习入门-基于python的理论与实现(2)
发表于 06-19 11:22 151次 阅读
深度学习入门之基于python的理论与实现

Python模拟太阳的运动模型

Python模拟太阳-地球-月亮运动模型
发表于 06-18 14:38 41次 阅读
Python模拟太阳的运动模型

如何利用Python中的tkinter和MyQR制作个性二维码转换器

利用Python中的tkinter和MyQR制作个性二维码转换器...
发表于 06-18 06:17 51次 阅读
如何利用Python中的tkinter和MyQR制作个性二维码转换器

Python全栈日记分享

【022】Python全栈日记-飞机大战(下)
发表于 06-16 10:29 54次 阅读
Python全栈日记分享

有人用过C语言位域吗

typedef struct {u16 b :5; u16 g :6; u16 r :5; } RGB; RGB *rgb; tx=0xf40f;        ...
发表于 06-16 04:35 40次 阅读
有人用过C语言位域吗

Python在信号处理中的优势

[翻译] Python 在信号处理中的优势之二
发表于 06-15 12:05 58次 阅读
Python在信号处理中的优势

Python基础教程

Python基础教程,第五讲,字典详解
发表于 06-15 11:49 61次 阅读
Python基础教程