《操作系统真象还原》——0.18 编译型程序与解释型程序的区别

0.18 编译型程序与解释型程序的区别

解释型语言,也称为脚本语言,如JavaScript、Python、Perl、PHP、Shell脚本等。它们本身是文本文件,是某个应用程序的输入,这个应用程序是脚本解释器。

由于只是文本,这些脚本中的代码在脚本解释器看来和字符串无异。也就是说,脚本中的代码从来没真正上过CPU去执行,CPU的cs:ip寄存器从来没指向过它们,在CPU眼里只看得到脚本解释器,而这些脚本中的代码,CPU从来就不知道有它们的存在。这些脚本代码看似在按照开发人员的逻辑执行,本质上是脚本解释器在时时分析这个脚本,动态根据关键字和语法来做出相应的行为。因此脚本中若出现错误,先前正确的部分也会被正常执行,这和编译型程序有很大区别。

顺便猜想一下解释型语言是如何执行的。我们在执行一个PHP脚本时,其实就是启动一个C语言编写出来的解释器而已,这个解释器就是一个进程,和一般的进程是没有区别的,只是这个进程的输入则是这个php脚本,在php解释器中,这个脚本就是个长一些的字符串,根本不是什么指令代码之类。只是这种解释器了解这种语法,按照语法规则来输出罢了。

举个例子,假设下面是文件名为a.php的PHP代码。

<?php    这是php语法中的固定开始标签
    echo "abcd"; 输出字符串abcd
?>    固定结束标签

PHP解释器分析文本文件a.php时,发现里面的echo关键字,将其后面的参数获取后就调用C语言中提供的输出函数,如printf((echo的参数))。PHP解释器对于PHP脚本,就相当于浏览器对于JavaScript一样,不过这个可完全是我猜测的,我不知道PHP解释器里面的具体工作,以上为了说清楚我的想法,请大家辩证地看。

而编译型语言编译出来的程序,运行时本身就是一个进程。它是由操作系统直接调用的。也就是由操作系统加载到内存后,操作系统将CS:IP寄存器指向这个程序的入口,使它直接上CPU运行。总之调度器在就绪队列中能看到此进程。而解释型程序是无法让调度器“入眼”的,调度器只会看到该脚本语言的解释器。

时间: 2024-08-03 22:13:23

《操作系统真象还原》——0.18 编译型程序与解释型程序的区别的相关文章

《操作系统真象还原》——导读

**前言**想象一下,如果是爱因斯坦那样的天才给我们讲物理知识,我们会觉得物理更容易理解吗?肯定是不会的,因为在爱因斯坦眼中比较容易的内容也许对我们来说非常深奥,他用B解释A的时候也许会让我们更迷惑,因为B我们也不懂,这就是基础的问题了.幸运的是阅读本书时读者只要有C语言和部分汇编语言的基础就行了,涉及的其他方面的知识我都会详细介绍,并以更易懂的方式去解释技术难点,读者不必担心看不懂本书. 回忆一下学车的经历:教练让学员先踩离合器再挂档,然后再踩油门,车子就开动啦.如果学员总是学不会这些,有可能

《操作系统真象还原》——0.14 为什么Linux系统下的应用程序不能在Windows系统下运行

0.14 为什么Linux系统下的应用程序不能在Windows系统下运行 其实,Windows下的程序也无法直接在Linux下运行. 对于这个问题,很多同学都会马上给出答案:格式不同.其实--答对啦,确实是格式不同,不过这只是一方面,还有另一方面,系统API不同,API即Application Programming Interface,应用程序编程接口. 先说说格式.其实格式也算是协议,就是在某个固定的位置有固定意义的数据.Linux下的可执行程序格式是elf,也就是 "Executable

《操作系统真象还原》——0.8 代码中为什么分为代码段、数据段?这和内存访问机制中的段是一回事吗

0.8 代码中为什么分为代码段.数据段?这和内存访问机制中的段是一回事吗 首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美.就像用饭盒装饭菜一样,完全可以将很多菜和米饭混合在一起,或者搅拌成一体,哈哈,但这样可能就没什么胃口啦.如果饭盒中有好多小格子,方便将不同的菜和饭区分存放,这样会让我们胃口大开增加食欲. x86平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址.我们这里讨论的程序代码中的段(用section或segme

《操作系统真象还原》——0.19 什么是大端字节序、小端字节序

0.19 什么是大端字节序.小端字节序 先说一下为什么会产生字节序的问题. 内存是以字节为单位读写的,其最小的读写单位就是字节.故如果在内存中只写入一个字节,一个内存的存储单元便可将其容纳了,只要访问这一内存地址就能够完整取出这1字节.可是1字节要能够表示的范围只有0-255(先只考虑无符号数),超过这个范围的数,只好用多个字节连在一起来表示.因此,在我们的32位程序中,定义的数据类型很多.1字节的数据类型只有char型,像int型要占4字节,double型要占用8字节.正如解决了一个问题又抛出

《操作系统真象还原》——0.27 转义字符与ASCII码

0.27 转义字符与ASCII码 计算机世界中是以二进制来运行的,无论是指令.数据,都是以二进制的形式提交给硬件处理的,字符也一样,必须转换成二进制才能被计算机识别.所以各种各样的字符编码产生,简单来说,字符编码就是用唯一的一个二进制串表示唯一的一个字符.其中最著名的字符编码就是ASCII码. ASCII码表中字符按可见分成两大类,一类是不可见字符,共33个,它们的ASCII码值是0-31和127,属于控制字符或通信专用字符.表中其余的字符是可见字符,它们的ASCII码值是32-126,属于数字

《操作系统真象还原》——0.5 应用程序是什么,和操作系统是如何配合到一起的

0.5 应用程序是什么,和操作系统是如何配合到一起的 应用程序是软件(似乎是废话,别急,往后看),操作系统也是软件.CPU会将它们一视同仁,甚至,CPU不知道自己在执行的程序是操作系统,还是一般应用软件,CPU只知道去cs:ip寄存器中指向的内存取指令并执行,它不知道什么是操作系统,也无需知道. 操作系统是人想出来的,为了让自己管理计算机方便而创造出来的一套管理办法. 应用程序要用某种语言编写,而语言又是编译器来提供的.其实根本就没有什么语言,有的只是编译器.是编译器决定怎样解释某种关键字及某种

《操作系统真象还原》——0.25 指令集、体系结构、微架构、编程语言

0.25 指令集.体系结构.微架构.编程语言 指令集是什么?表面上看它是一套指令的集合.集合的意思显而易见,那咱们说说什么是指令. 在计算机中,CPU只能识别0.1这两个数,甚至它都不知道数是什么,它只知道要么"是",要么"不是",恰好用0.1来表示这两种状态而已. 人发明的东西逃不出人的思维,所以,先看看我们人类的语言是怎么回事. 不同的语言对同一种事物有不同的名字,这个名字其实就是代码.比如说人类的好朋友:狗,咱们在中文里称之为狗,但在英文中它被称为dog,虽然

《操作系统真象还原》——0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的

0.17 先有的语言,还是先有的编译器,第1个编译器是怎么产生的 首先肯定的是先有的编程语言,哪怕这个语言简单到只有一个符号.先是设计好语言的规则,然后编写能够识别这套规则的编译器,否则若没有语言规则作为指导方向,编译器编写将无从下笔. 第1个编译器是怎么产生的?这个问题我并没有求证,不过可以谈下自己的理解,请大伙儿辩证地看. 这个问题属于哲学中鸡生蛋.蛋生鸡的问题,这种思维回旋性质的本源问题经常让人产生迷惑.可是现实生活中这样的例子太多了. (1)英语老师教学生英语,学生成了英语老师后又可以教

《操作系统真象还原》——0.21 Section和Segment的区别

0.21 Section和Segment的区别 C程序大体上分为预处理.编译.汇编和链接4个阶段.预处理阶段是预处理器将高级语言中的宏展开,去掉代码注释,为调试器添加行号等.编译阶段是将预处理后的高级语言进行词法分析.语法分析.语义分析.优化,最后生成汇编代码.汇编阶段是将汇编代码编译成目标文件,也就是转换成了目标机器平台上的机器指令.链接阶段是将目标文件连接成可执行文件.这里我们只关注汇编和链接这两个阶段. 在汇编源码中,通常用语法关键字section或segment来表示一段区域,它们是编译