zoukankan      html  css  js  c++  java
  • 编译性语言&解释性语言

    计算机是不能理解高级语言。当然也就不能直接执行高级语言了。计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言。不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列)执行的,不管是编译型语言还是解释型语言。而不论什么高级编程语言程序的源码都是一个字符序列,这个字符序列究竟层的01序列是通过编译器或解析器经过多次转换完毕的。

    编译 vs 解释

    翻译的方式有两种:一种是编译,一种是解释。
    两种方式翻译的时间不同。

    • 编译型语言写的程序在被执行之前。须要一个专门的编译过程,把程序编译成为机器语言的文件。比方exe文件,以后要执行的话 就不用又一次翻译了。直接使用编译的结果即可了(exe文件)。因为翻译仅仅做了一次。执行时不须要翻译。所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在执行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

    一个完整的编译系统与 一个用C编写的程序hello.c的编译过程
    编译过程

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

    编译型与解释型两者各有利弊。
    编译型因为程序执行速度快,同等条件下对系统要求较低。因此像开发操作系统、大型应用程序、数据库系统等时都採用它,像C/C++、Pascal /Object Pascal(Delphi)等都是编译语言。

    一些网页脚本、server脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言。如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。

    解释型语言每句代码仅仅有在执行时,系统才知道这句代码是否有错(除Java那种先编译后解释性语言)。

    换句话说,因为编译型语言在执行前进行了编译,编译器对全部代码都进行了检查。这样就不会产生一些低级错误。比如使用了不存在的名字,或者使用了错误的名字。

    而JavaScript就可能会出现这些问题。

    但随着硬件的升级和设计思想的变革,编译型和解释型语言越来越笼统,主要体如今一些新兴的高级语言上。而解释型语言的自身特点也使得编译器厂商愿意花费很多其它成本来优化解释器。

    JAVA

    JAVA语言是一种编译型-解释型语言。同一时候具备编译特性和解释特性(其所谓的编译过程仅仅是将.java文件编程成平台无关的字节码.class文件,并不是像C一样编译成可执行的机器语言)。

    作为编译型语言。JAVA程序要被统一编译成字节码文件——文件后缀是class。此种文件在java中又称为类文件。java类文件不能再计算机上直接 执行,它须要被java虚拟机翻译成本地的机器码后才干执行,而java虚拟机的翻译过程则是解释性的。java字节码文件首先被载入到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为java语言的解释执行。是由java虚拟机完毕的。而在现实中。java开发工具JDK提供了两个非常重要的命令来完毕上面的编译和解释(翻译)过程。两个命令各自是javac.exe和java.exe。前者载入java类文件,并逐步对字节码文件进行编译。而还有一个命令则相应了java语言的解释(javac.exe)过程。在次序上。java语言是要先进行编译的过程,接着解释执行。

    字节码的设计并不专门针对不论什么一种特定的处理器硬件平台相应的指令代码(比方。Intel的Pentium微处理器或IBM的System/390处理器)。字节码是能够发送给不论什么平台并且能在那个平台上执行的独立于平台的代码。非常相似于机器指令的指令编码。因而通过Java的虚拟机就能够非常easy的直接将字节码转换成相应于特定 CPU的机器码,从而得到较高的性能。

    这样的转换的效率比其它解释性语言如Basic、Perl等要高得多,甚至在非常低档的CPU上也能顺利执行。

    只是 Java毕竟是解释性的语言。它解释执行的意义在于能够实现程序一经编译便可在众多不同的计算机上执行的跨平台执行。尽管这比C程序慢了很多,但在大多数应用中都是能够接受的。并且,如今Java也已经有了专门的代码生成器。能够非常easy使用JIT编译技术将字节码直接转换成高性能的本机代码。值得一提的是,Java执行时系统在提供这个特性的同一时候仍具有平台独立性,因而“高效且跨平台”对Java来说不再矛盾。

    “理解字节码以及理解Java编译器怎样生成Java字节码与学习汇编知识对于C/C++程序猿有一样的意义。

    当前已经有非常多种Java虚拟机产品,包含了自由软件和商业软件。 假设在Java虚拟机之中执行Java字节码并不理想,则能够使用一些工具比如GNU Compiler for Java将Java代码或Java字节码编译成机器码并由硬件直接执行。 而有一些处理器能够直接执行Java字节码,这样的处理器名为Java处理器

    C#

    C#语言是编译型语言,但其“编译”过程比較特殊,详细说明例如以下:

    C#程序在第一次执行的时候,会依赖其.NET Frameworker平 台,编译成IL中间码),然后由JIT compiler翻译成本地的机器码执行。

    从第二次在执行同样的程序。则不须要再执行以上编译和翻译过程,而是直接执行第一次翻译成的机器码。所以对于 C#来说。通常第一次执行时间会非常长,但从第二次開始。程序的执行时间会快非常多。

    那么,C#为什么要进行两次“编译”呢?事实上。微软想通过动态编译(由JIT compiler工具实现)来实现其程序执行的最优化。假设代码在执行前进行动态编译执行,那么JIT compiler能够非常智能的依据你本地机器的硬件条件来进行优化,比方使用更好的register,机器指令等等,而不是像原来那样,build一份程序针对全部硬件的机器跑,没有充分利用各个机器的条件。

    脚本语言

    注:脚本语言一般都有相应的脚本引擎来解释执行。

    他们一般须要解释器才干执行。

    JAVASCRIPT,ASP,PHP,PERL都是脚本语言。C/C++编译、链接后,可形成独立执行的exe文件。

    JIT (JIT compiler。just-in-time compiler,即时编译器)

    JIT编译器能够将MSIL编译成为各种不同的机器代码。以适应相应的系统平台,终于使得程序在目标系统中得到顺利地执行。

    在Java编程语言和环境中,即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(包含须要被解释的指令的程序)转换成能够直接发送给处理器的指令的程序。

    JIT编译器分为:经济编译器和普通编译器。

    JVM (Java Virtual Machine。Java虚拟机)

    JVM是一种用于计算设备的规范。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

    Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。

    一般的高级语言假设要在不同的平台上执行,至少须要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上执行时不须要又一次编译。Java语言使用Java虚拟机屏蔽了与详细平台相关的信息。使得Java语言编译程序仅仅需生成在Java虚拟机上执行的目标代码(字节码),就能够在多种平台上不加改动地执行。

    Java虚拟机在执行字节码时。把字节码解释成详细平台上的机器指令执行。这就是Java的能够“一次编译。到处执行”的原因。

    參考链接

    1. 编译性语言、解释性语言和脚本语言的差别
    2. Java字节码
    3. 解释型语言和编译型语言的差别
    4. JIT编译器
    5. JVM

    问题

    如今Java也已经有了专门的代码生成器,能够非常easy使用JIT编译技术将字节码直接转换成高性能的本机代码。

    值得一提的是,Java执行时系统在提供这个特性的同一时候仍具有平台独立性,因而“高效且跨平台”对Java来说不再矛盾。

    此处的JIT编译技术是像JVM一样,在不同平台上运用不同的JIT编译器将.class 翻译成相应的本机代码吗?下次还须要再翻译吗?还是以后直接能够执行了?

    补:
    Java是一门高级语言。

    而不同厂商的设计下的体系结构相应一套适应于其硬件的机器指令。

    为了在跨平台。发明了JVM。而为了加快执行速率,又提出了自己的中间语法表示,即byte code。

    对字节码边读取边解释边执行自然比不上编译后的可执行程序。因为採用面向对象设计,我们把数据和方法绑定在了一起。仅仅要数据还在堆上,那么其方法也就可能用到。即下一条待执行的语句调用某个对象的方法的几率存在,为此引入JIT。将经常使用字节码相应的机器码进行缓存。
    详情见例如以下两篇端blog:
    Javac编译与JIT编译
    小谈JVM及JIT

    能够发现,JIT技术的引入使得JVM跑起来更加的臃肿。

    本质上是以空间换时间。

  • 相关阅读:
    html的URL参数传值问题
    html背景图片拉伸至全屏
    Laravel 用户验证Auth::attempt fail的问题
    HTML中meta的应用
    ubuntu升级php版本
    Laravel 目录结构分析
    css颜色渐变在不同浏览器的设置
    谷歌浏览器(Chrome)离线包的下载方法!
    RAD Studio 10 up1欢迎页证书不可用
    MySQL
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7257101.html
Copyright © 2011-2022 走看看