编译型语言_编译型语言和解释型语言 - CSDN
精华内容
参与话题
  • 编译语言和解释性语言

    千次阅读 2018-10-05 14:52:33
    我们知道,任何编程语言编写的程序归根到底都是由底层机器的机器代码(01序列)执行的,无论是编译型语言还是解释型语言。而任何高级编程语言程序的源代码都是一个字符序列,这个字符序列到底层的01序列是通过编译器...

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

    图1 编程语言的层次结构

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

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

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

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

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

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

     

    [cpp] view plain copy

     print?

    1. int fact_while(int n)  
    2. {  
    3.     int result = 1;  
    4.     while (n > 1) {  
    5.         result *= n;  
    6.         n = n-1;  
    7.     }  
    8.     return result;  
    9. }  


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

     

     

    [plain] view plain copy

     print?

    1.     movl 8(%ebp), %edx   
    2.     movl $1, %eax   
    3.     cmpl $1, %edx   
    4.     jle .L7   
    5. .L10:   
    6.     imull %edx, %eax   
    7.     subl $1, %edx   
    8.     cmpl $1, %edx   
    9.     jg .L10  
    10. .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也有自己的虚拟机,但是不需要编译,所以把它归类为解释型语言。

    图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很强大。所以,要深入语言的底层,要学会编译器、解释器和虚拟机的实现,这方面还需要下功夫啊。

    --------------------- 本文来自 zhangzker 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zhangzker/article/details/53171132?utm_source=copy

    展开全文
  • 编译型语言  编译型语言在执行之前就将代码编译成了机器语言,当执行的时候就直接运行机器语言,就可以了,如java,编译之后产生.class文件,然后JVM直接执行编译产生的文件就可以了,只要源代码没有发生改变,就...

    编译型语言

      编译型语言在执行之前就将代码编译成了机器语言,当执行的时候就直接运行机器语言,就可以了,如java,编译之后产生.class文件,然后JVM直接执行编译产生的文件就可以了,只要源代码没有发生改变,就不用再次编译,大大提高了执行速度

    解释性语言

     

    解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低。

     

    脚本语言

     ①脚本语言(JavaScript,VBscript等)介于HTML和C,C++,Java,C#等编程语言之间
      HTML通常用于格式化和链结文本。而编程语言通常用于向机器发出一系列复杂的指令。
     ②脚本语言与编程语言也有很多相似地方,其函数与编程语言比较相象一些,其也涉及到变量。与编程语言之间最大的区别是编程语言的语法   和规则更为严格和复杂一些。
     ③与程序代码的关系:脚本也是一种语言,其同样由程序代码组成
      注:脚本语言一般都有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。JAVASCRIPT,ASP,PHP,PERL都是脚本语言。C/C++编译、  链接后,可形成独立执行的exe文件。
     ④脚本语言是一种解释性的语言
      例如vbscript,javascript,installshield script等等,它不象c/c++等可以编译成二进制代码,以可执行文件的形式存在。脚本语言不需要编  译,可以直接用,由解释器来负责解释,不过每次都需要翻译,执行速度慢。
     ⑤脚本语言一般都是以文本形式存在,类似于一种命令
      举个例子说,如果你建立了一个程序,叫aaa.exe,可以打开.js为扩展名的文件。
      你为.js文件的编写指定了一套规则(语法),当别人编写了.js文件后,你的程序用这种规则来理解编写人的意图,并作出回应.那么,这一套规则  就是脚本语言。 

      

    转载于:https://www.cnblogs.com/Thomas-blog/p/9624732.html

    展开全文
  • 编译型语言and解释型语言(脚本语言)

    千次阅读 2018-07-16 18:58:19
    解释型语言(脚本语言) 常见:Python、JavaScript、php等 脚本语言一般都有相应的脚本引擎来解释执行,需要解释器才能运行。脚本语言有很多种,解释器也有很多种,所以不同的脚本需要不同的解释器,只有脚本与解释...

    解释型语言(脚本语言)
    常见:Python、JavaScript、php等
    注意:解释型语言包含脚本语言。脚本语言(js) 解释型语言(js、php)

    脚本语言一般都有相应的脚本引擎来解释执行,需要解释器才能运行。脚本语言有很多种,解释器也有很多种,所以不同的脚本需要不同的解释器,只有脚本与解释器对应,才能正确解释脚本。 
    
    python 为例: python 源码不需要编译成二进制代码,它可以直接从源代码运行程序。当我们运行 python 文件程序的时候,python 解释器将源代码转换为字节码,然后再由 python 解释器来执行这些字节码。这也是Python代码无法运行的像编译语言一样快的原因。 
    脚本语言运行只需要直接运行源代码便可。

    这里写图片描述
    Javascript解释器:就是执行javascript代码的代码(引擎)。
    每个浏览器的Javascript解释器并不一样,一般都包含在各浏览器的内核中。
    浏览器内核一般包含两个引擎:页面排版引擎 和 JS引擎
    IE的 使用的自己的Trident 内核
    FireFox 是Gecko内核
    Opera 是Presto内核
    Safari 使用的Webkit 内核
    Chrome 是Google自己的 javascript V8引擎 而其页面排版采用的Webkit 内核

    编译语言
    常见:java、c、c++ 等

    Java 是编译型和解释型语言的结合体 由 Java 语言编写的程序需要经过编译来生成字节码(也就是 .class 文件),但这种字节码不是可执行性的,所以再由 Java 解释器( JVM )来解释执行。JAVA 虚拟机,即 JVM ( Java Virtual Machine )负责解释行字节码文件。所有平台上的 JVM 向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。
    
     JAVA 的执行过程: 在 Java 开发环境中进行程序代码的输入,生成 .java 的 Java 源文件。再由 Java 编译器对源文件编译成字节码(.class 文件),最后再由 JVM 将字节码解释成机器码执行并显示运行结果。 JAVA 语言既不是纯粹的编译语言,也不是纯粹的解释性语言。所以运行 JAVA 程序必须经过编译 、运行两个步骤。

    *这里写图片描述*

    展开全文
  • 编译型语言、解释型语言与脚本语言三大类型详解

    万次阅读 多人点赞 2016-01-22 09:54:53
    一、编译型语言 定义:指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这个过程叫做编译;编译好的可...
  •  编译型语言就是把源代码通过编译器编译成适合不同处理器的机器码,这种语言 包括, C语言 C++, 汇编。    解释型语言, 通过解释器把源代码转换成适合处理器的自己机器码,其中读取和解析非常耗时,所以运行...
  • 什么是编译型语言和解释型语言

    万次阅读 多人点赞 2018-08-02 08:41:28
    什么是编译型语言和解释型语言 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。 ...
  • Java到底是编译型语言还是解释型语言?

    万次阅读 多人点赞 2017-05-19 09:08:47
    一、你可以说它是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。  二、你可以说它是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就...
  • 解释型语言和编译型语言

    千次阅读 2019-06-22 16:04:52
    解释型语言和编译型语言 编程语言从执行原理上可分为编译型语言和解释型语言。 比如常见的C语言、C++等都是编译型语言 Java、Python等都是解释型语言 计算机不能直接理解机器语言以外的语言,因此需要将我们写的代码...
  • 编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。 解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度慢相对于C/C++ 等都是编译型语言,而Java,C#等都是...
  • 编译型语言与解释型语言的真正区别

    万次阅读 多人点赞 2018-10-20 14:06:52
    编译型语言与解释型语言的真正区别 一、编译型语言与解释型语言的必需知识点 二、Python和Java解释型语言的主流执行方式 三、进而可推之解释性语言和编译型语言的优缺点 一、编译型语言与解释型语言的必需知识点...
  • 解释型语言和编译型语言的区别

    万次阅读 多人点赞 2017-02-23 09:42:15
    解释型语言和编译型语言的区别 首先,我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级...
  • 编译型语言与解释型语言的优缺点

    千次阅读 2019-03-09 15:21:48
    编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。 解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编C/C++ 等都是编译型语言,而Java,C#等都是...
  • 首先我们需要了解一下程序语言的大体分类,通过分类进行纵向横向的选择性学习,深入提高。     相信大部分同学在没有来到大学之前已经有过编程接触史了吧,有搞过scratch少儿编程,还是机器人...
  • 1 编译型语言和解释型语言的含义  大家都知道,代码语言级别主要有机器语言、汇编语言、和高级语言。而高级语言主要又分为编译型语言和解释型语言,下面我们主要讨论这两种语言的含义。  编译型语言指使用专门的...
  • 编译型语言 在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候就不用再进行翻译了。 易混点 Java不是也有一个编译过程吗?为什么还说Java为解释型语言呢? Java虽说是有一个...
  • 什么是编译型,什么是解释性,JSP,ASP都属于解释性语言 ... 编译型 = 先把程序整个转化为可直接运行的格式 ...JSP 和ASP是解释的,java是jvm解释执行的,虽然有JIT,但还是不能算...编译型语言和解释型语言 http:
  • 1、C++和C都是属于编译型语言,本来的.c文件都是用高级语言编写的,计算机是不能识别高级语言的,所以,必须要通过编译,链接等手段,将.c文件转换成可执行文件,可执行文件就是纯二进制文件,然后计算机才能够执行...
  • 几天前我的一个刚接触JavaScript的朋友问我JavaScript是编译型语言还是解释型语言。从一个初学者那里得到这样的问题让我有些惊讶,因为所有初学者都知道JS是一个解释型语言;特别是当你之前使用像Java这样的语言的...
  • 编译型语言与解释型语言的区别及各自的优缺点

    万次阅读 多人点赞 2017-04-18 15:19:21
    编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。 解释型语言,是在运行的时候将程序翻译成机器语言,所以运行速度相对于编C/C++ 等都是编译型语言,而Java,C#等都是...
1 2 3 4 5 ... 20
收藏数 268,161
精华内容 107,264
关键字:

编译型语言