zoukankan      html  css  js  c++  java
  • 编译型语言,解释型语言和即时编译器(JIT)

    我们先了解一下计算机的基础知识。

                    (不想看的可以跳过)

    计算机是我们拥有的最通用的工具。它们能够执行惊人的计算任务,无论物理位置如何,都可以轻松地交换信息,简化了许多日常任务。

    但是,计算机不是像我们一样的“智能”设备。人类必须毫无疑问地告诉他们应该做什么,他们的母语与我们所说的完全不同。

    因此,人类的语言与计算机的母语之间存在巨大的语言障碍。(就像你看不懂手语一样)

    所以,为了更好地与我们的计算机进行通信,我们希望它们完成的工作,我们开发了多种编程语言来简化通信过程。

    到目前为止,计算机尚无法确定自己应该做什么,我们创建的程序,是计算机可以理解和遵循的指令集

    为了更好地与我们的计算机进行通信,我们希望它们完成的工作,我们开发了多种编程语言来简化通信过程

    在这种情况下,高级或低级是指语言的本质在多大程度上反映了基础系统。换句话说,编程语言的级别是指该语言与计算机的本地语言有多相似。

    级别越高,相似度越小

    一个低层次的语言通常与机器代码非常相似,因此更适合诸如设备驱动程序之类的程序或非常需要访问硬件的高性能程序。通常,该术语保留给机器代码本身和汇编语言,尽管许多语言提供了底层元素。由于低级语言受其所访问硬件的所有细微差别的影响,因此,用低级语言编写的程序通常很难移植到其他平台。
    一种高级语言重点更多地放在人的大脑容易理解的概念上,例如对象或数学函数。与低级语言相比,高级语言通常更容易理解,并且与低级语言相比,用高级语言开发程序通常花费的时间更少。作为折衷方案,通常需要牺牲对所生成程序实际功能的某种程度的控制。但是,并非不可能将某种语言的高级功能和低级功能混合在一起。

    -----------------------------------------------------------------------------------------------------------------------------------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线---------------------------------------------------------------------------------------------------------------------------------------------

    接下来步入正题:

    编译型语言程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。

    解释型语言解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,看起来省了道编译工序。但是,在运行程序的时候,解释性语言必须先解释再运行。一般来说,现有的解释性语言都是采用的逐行解释一句,执行一句这样的方式来构建的。这样解释性语言每执行一次就要翻译一次,效率比较低。

    特征:

            解释型语言没有编译,只有运行;在运行程序的时候才翻译,每运行一次,要翻译一次,并且逐行解释,效率较低。

           编译型语言就是直接编译成机型可以执行的,只翻译一次。

      (如果对如何随机型执行,请看即时编译器)

    优点:

        解释型:可移植性好,只要有运行相应需要的解释环境,可以在不用的操作系统上运行,修改调试也非常方便

        编译型:相比解释执行编译执行效率高,占用资源小,适合复杂程序

    缺点:

        解释型:逐行执行解释,浪费计算机资源,效率低

        编译型:兼容性差,编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译.

    用途:

      解释型:一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用

      编译型:由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时采用
    -----------------------------------------------------------------------------------------------------------------------------------------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线---------------------------------------------------------------------------------------------------------------------------------------

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

    关于即时编译器,以下用Java这个非凡的语言举例:

    在Java编程语言和环境中,即时编译器是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。当你写好一个Java程序后,源语言的语句将由Java前端编译器(javac或者Eclipse JDT中的增量式编译器)编译成字节码,而不是编译成与某个特定的处理器硬件平台对应的本地指令代码。字节码是可以发送给任何平台并且能在那个平台上运行的独立于平台的代码。
    过去,大多数用任何语言写的程序在每个电脑平台上都必须重编译,甚至有时需要重写。Java最大的优点之一就是你只需要写和编译一次程序。在任何平台上,Java都会将编译好的字节码解释成能被特定的处理器所理解的指令(即一次编译,到处运行)。尽管如此,Java虚拟机一次只能处理一条字节码指令。在特定的系统平台上使用Java即时编译器(包括C1,C2 两个即时编译器)能把字节码编译成特定系统的代码(虽然这个程序最初已经在这个平台上被编译过)。一旦代码被JIT编译器(重)编译后,它在电脑上通常就会运行地更快。
    由于JIT编译器在每个平台上都不一眼,并且涉及一系列的优化,所以开发成本很高。(想想微软大公司)

    这有两个图片以供参考:

    https://baike.baidu.com/pic/%E8%A7%A3%E9%87%8A%E5%9E%8B%E8%AF%AD%E8%A8%80/8888952/0/6a600c338744ebf8709b8c6bddf9d72a6159a7f8?fr=lemma&ct=single#aid=0&pic=6a600c338744ebf8709b8c6bddf9d72a6159a7f8

     

    https://baike.baidu.com/pic/%E5%8D%B3%E6%97%B6%E7%BC%96%E8%AF%91%E5%99%A8/18428531/0/adaf2edda3cc7cd93debc1d53001213fb90e91fc?fr=lemma&ct=single#aid=0&pic=adaf2edda3cc7cd93debc1d53001213fb90e91fc

    特点:

    在性能和可移植性之间取得平衡,把解释型语言与编译型语言以综合。不用重写,可在不同平台(Windows,linux等)上执行。

    -------------------------------------------------------------------------------------------------------------------------------------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线------分割线----------------------------------------------------------------------------------------------------------------------------------------

    有一个简单的比喻

    假如有一个英国歪果仁想了解中国,请了一个中国导游,导游只会中文,但歪果仁不会中文。

    解释型:请一个翻译,逐字逐句的给歪果仁翻译中文为英文。

    编译型:导游把他要说的全写下来,翻译官直接翻译为英文写在纸上,给歪果仁看,可回放。

    即时编译器:拿出百度翻译,把导游写在纸上的翻译为英文,也可以是其他语言。

    计算机母语:01001101011101101之类的(无知的我不知道)

    编译型语言:c,c++……

    解释型语言:Perl、Python、basic,php,asp,jsp,Java,c#……

    如有错误,请评论说出!!!

     

  • 相关阅读:
    MySQL数据库开发的36条原则
    su和sudo的区别与使用
    利用modelarts和物体检测方式识别验证码
    华为云大咖说-庄表伟:架构师的基本功——管理篇
    【玩转MLS系列】基础教程
    Java程序性能优化
    洛谷P4551 最长异或路径
    POJ 2001 Shortest Prefixes
    线段树区间修改
    接毒瘤
  • 原文地址:https://www.cnblogs.com/Srand-X/p/12636646.html
Copyright © 2011-2022 走看看