精华内容
下载资源
问答
  • 编译理解

    2018-10-24 17:06:47
    一、定义 编译: “““ 编译器是一种翻译程序,它用于将源语言(即用某种程序设计语言写成的)程序翻译为目标语言(即...通常有两种方式进行这种翻译,一种是编译,另一种是解释。后者并不生成可执行文件,只是...

    一、定义

    编译:

    “““

    编译器是一种翻译程序,它用于将源语言(即用某种程序设计语言写成的)程序翻译为目标语言(即用二进制数表示的伪机器代码写成的)程序。后者在windows操作系统平台下,其文件的扩展名通常为.obj。该文件通常还要经过进一步的连接,生成可执行文件(机器代码写成的程序,文件扩展名为.exe)。通常有两种方式进行这种翻译,一种是编译,另一种是解释。后者并不生成可执行文件,只是翻译一条语句、执行一条语句。这两种方式相编译比解释运行的速度要快得多。

    ”””

    “““

    在汇编里称link,在C里叫build,它的作用是生成可执行的exe文件。由于一个程序的源码可由多个文件组成。这些文件在第二步中分别编译,生成各自的目标文件(*.obj),这一步的作用便是将这些obj文件,以及程序中需要的其它库文件(dll除开),统一到一个文件中来,形成单个的exe文件。此exe文件便可以在操作系统下直接运行了。

    ”””

    程序员程序——(编译)——伪机器代码——(链接)————机器代码

    build文件:连接/生成,描述编译工具链,生成可执行(execute)文件

    交叉编译:在一个平台上生成另一个平台上的可执行代码

    bazel:google推出的一款工程编译工具

     

    编译的五个过程

    词法分析

    语法分析

    语义分析与中间代码产生

    优化

    目标代码生成

    三、编译的目的

    编译目标为不同平台(32位/64位的Linux/ios/Windows)及不同模式(发布模式/调试模式/个人测试模式)

    举个例子:将服务器或pc上训练好的模型,与数据打包,push到手机上,使用编译好的目标平台的工具加载并运行模型

    四、相关的环境变量

    LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,与之相对应的,LD_LIBRARY_PATH是程序运行期间用到的库。

    五、CMAKE

    https://www.cnblogs.com/cv-pr/p/6206921.html

     

     

    参考链接:

    https://blog.csdn.net/sundingh/article/details/78714245

    https://www.cnblogs.com/jojodru/p/7744630.html

    https://blog.csdn.net/janeqi1987/article/details/74346986

    展开全文
  • 理解 js 编译过程理解

    千次阅读 2018-08-20 20:34:13
    理解编译型语言】 【解释型语言】 编译型语言:是相对于解释型语言存在的,编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。 解释型语言:是相对于编译...

    理解 【编译型语言】 和 【解释型语言】

    编译型语言:是相对于解释型语言存在的,编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。

    解释型语言:是相对于编译型语言存在的,解释型语言首先将源代码翻译成中间代码,再由解释器对中间代码进行解释运行。像JavaScript/Python等都是解释型语言。 (js其实是先编译再运行,只不过编译范围为当前作用域。)

    两种方式只是翻译的时间不同.
    打个比方:我有一篇中文演讲稿,但是演讲现场有外国人。我可以事先把整个稿子翻译成英文给他们(编译型语言); 也可以通过同声传译的方法一句一句边读边翻译给他们(解释型语言).

    JavaScript运行三部曲(主要是预编译)

    1. 语法分析
      js引擎检查你的代码有没有什么低级的语法错误

    2. 预编译
      预编译简单理解就是在内存中开辟一些空间,存放一些变量与函数
      遇到函数时 预编译什么时候发生?
      遇到函数的时候其实只有在执行函数的时候才会预编译那一部分

    3. 解释执行
      执行代码

    通过实例理解预编译

    首先要知道变量声明 var… 和 函数声明 function…

    <script>
        var a = 1; // 变量声明
        function b(y){ // 函数声明
            var x = 1;
            console.log('so easy');
        };
        var c = function(){ // 是变量声明而不是函数声明!!
            // ...
        }
        b(100);
    </script>
    <script>
        var d = 0;
    </script>
    

    引擎预编译处理代码过程:

    • 页面产生便创建了GO全局对象(Global Object)(也就是window对象)
    • 第一个脚本文件加载
    • 脚本加载完毕后,分析语法是否合法 (语法分析)
    • 开始预编译 (-- 预编译start --)
      • 查找变量声明,作为GO属性,值赋予undefined
      • 查找函数声明,作为GO属性,值赋予函数体
    // 伪代码
    GO/window = {
        // 页面加载创建GO同时,创建了document、navigator、screen等等属性,此处省略
        a: undefined,
        c: undefined,
        b: function(y){
            var x = 1;
            console.log('so easy');
        }
    }
    
    • 解释执行代码(直到执行函数b) 执行代码
    // 伪代码
    GO/window = {
        // 变量随着执行流得到初始化
        a: 1,
        c: function(){
            // ...
        },
        b: function(y){
            var x = 1;
            console.log('so easy');
        }
    }
    
    • 执行函数b之前,发生预编译
      • 创建AO活动对象(Active Object)
      • 查找形参和变量声明,值赋予undefined
      • 实参值赋给形参
      • 查找函数声明,值赋予函数体
    // 伪代码
    AO = {
        // 创建AO同时,创建了arguments等等属性,此处省略
        y: 100,
        x: undefined
    }
    
    • 解释执行函数中代码
    • 第一个脚本文件执行完毕,加载第二个脚本文件
    • 第二个脚本文件加载完毕后,进行语法分析
    • 语法分析完毕,开始预编译
      • 重复最开始的预编译步骤……

    理解代码执行过程中的LHS 和 RHS

    LHS(Left-Hand-Side)查询 和 RHS(Right-Hand-Side)查询, 其实就是js引擎解析变量时的两种处理方法。
    L 和 R 就是 赋值操作的左侧和右侧.

    // 伪代码
    a = b;
    

    当浏览器遇到上边代码的时候, 对 a 和 b 按照不同的方法处理
    对 a 执行LHS查询, 向上查询时, 找不到就创建一个全局变量;
    对 b 执行RHS查询, 向上查询时, 找不到的时候会报错
    这里写图片描述

    参考


    JavaScript预编译原理分析
    《你不知道的JavaScript》 这本书好像很厉害的样子, 我看人家都参考了

    展开全文
  • 如何理解编译

    2018-06-07 17:58:33
    作者:hillin ...要理解这个问题,先要看「正」编译的过程是怎样的。 你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言: 然后编...

    作者:hillin
    链接:https://www.zhihu.com/question/21853681/answer/74134768
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    要理解这个问题,先要看「正」编译的过程是怎样的。
    你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言:

    这里写图片描述

    然后编译器(compiler)将它翻译成机器所能理解的语言:

    这里写图片描述

    这中间的每一步都是一个「信息丢失」的过程。比如你说,我要把这些数排个序。然后你轻车熟路地写了个冒泡排序。你的原始动机其实已经一定程度上从你的代码里丢失了——有经验的人可能可以一眼看出你这段代码是在排序,而新手小明看到的只有一些for和if之类的东西。如果是更复杂的功能,那么可能过一段时间你自己都看不懂自己当时是想干什么。从程序语言到机器语言的过程其实也是一样的。这两个过程其实都是把「做什么」转换成「怎么做」的过程,转换完成之后,究竟一开始是要做什么,这个信息已经丢失了。
    所谓「反编译」,其实就是找回这些丢失的信息的过程。从这个角度上来说,你阅读一段代码的过程,其实就是在将它「反编译」成自然语言。如果要完美地反编译,那只存在一种可能,就是信息完全没有丢失——比如说你阅读的这段代码有充分的注释,或者它使用了一种你所知晓的模式(这也是为什么大家一再强调注释和设计模式的重要性)。对于从机器语言到程序语言的反编译过程,也是一样。

    比如说有比反编译更低级(非贬义)的过程,叫做反汇编:
    这里写图片描述

    严格来说汇编语言也是一种编程语言,不过我们在这里把它和我们常说的高级编程语言(包括C语言)区分开。

    这个步骤里,我在汇编和机器语言里使用的是双向实线箭头,因为它们是可以互相转换的。从汇编语言到机器语言的过程中没有丢失任何信息——因为两者的指令是一一对应的,因此反汇编可以轻松达成。

    这就是很多程序语言只能反汇编、不能(难以,下同)反编译的原因。一般我们管这种语言叫「编译语言」,又称「原生语言」。代表有C、C++等。

    那为什么有的语言可以反编译呢?这又要从机器语言说起。就像不同地域的人所用的语言不同一样,不同的机器说的语言也不尽相同。用行话说,叫「指令集不同」。比方说,你的电脑和你的手机,指令集一般是不一样的。一段程序要让不同的机器都能执行,只能分别翻译(编译)成相应的机器语言。这个过程太麻烦了,于是人们想了个办法,搞出了一种叫解释语言的东西(此处未考证解释语言是否就是因此发明的,只是帮助理解)。解释语言的整个流转过程是这样的:
    这里写图片描述

    解释语言有两种执行方式,这取决于执行端的「解释器」是如何工作的。一种是直接解释执行,中间就没有机器语言什么事情了,但这种方式效率很低。因此现代的解释语言基本上都会采用第二种方式,也就是经由图中上部的路径,先通过JIT编译的方式翻译成机器语言,然后再执行,保证执行效率。JIT编译大致可以理解为「我需要用到什么就编译什么」,这个过程常常是在执行过程中同步进行的。
    「解释器」的英文interpreter,其实就是名词「翻译」的意思。这好比你国外交部发了封文件到各国大使馆,再由大使馆的工作人员分别翻译成相应的语言,传达给目标国相关部门。代表性的解释语言如Javascript,它要在不同机器的浏览器上都能正确执行,所以采用这种方式。
    但是这样一来,程序代码就必须提供给每一台执行端机器了。这可是泄密啊。对于防止泄密,最直接的方式自然是加密。
    这里写图片描述

    有锁就有钥匙,同时也有开锁术;有加密也就有破解。这时候所谓的「反编译」,其实就是破解加密算法。这一点就不展开聊了。

    后来,人们觉得解释语言执行得实在有点慢,于是又想了一个办法:把一些可以前期做掉的工作先做掉,只留着那些跟目标机器有关的工作,到时候再说。于是程序被处理成了一种叫做「中间语言」,或者叫「字节码」的东西:
    这里写图片描述

    这个过程一般也叫做编译。中间语言词汇少,比较精炼,执行起来也更快。这些语言一般也会用上JIT技术,进一步把中间语言编译成机器语言(而非解释执行),执行效率也就跟那些原生的编译语言不相上下了。这种语言代表性的有C#、Java等。

    程序语言可以编译成中间语言,反过来,中间语言也可以在一定程度上反编译成程序语言。这是因为采用这种编译方式的编程语言为了保证它们的高级特性(比如说反射),在编译的过程中保留了源程序的绝大部分信息,只有很少的信息丢失;也正是因为丢失了这一部分信息,中间语言通常不能完美地反编译——最常见的就是反编译出来的程序中局部变量的名字都丢了,被替换成了由反编译器自动生成的名字。但这样反编译出来的程序,结构和功能都是完备的,可读性也有一定的保障。一般来说,我们所说的可以反编译的程序都是指这样一类语言写就的程序。

    中间语言可以被反编译;加密又会被破解,而且执行前还要解密,会带来额外的性能开销。有没有办法能让代码既能有效执行,又不被截获代码的人所利用呢?这时候人们从一些职业素养很差的程序员那里得到了启发。

    实现一个相同的功能,可以有无数种形式的代码。你恪尽职守,认认真真地写注释,准确地命名函数和变量, 严格按照规范进行缩进和换行;小明却相反,完全没有注释,变量全部用abcd乃至故意误导别人(var mySon = laowang.Son),缩进换行邋遢,尤其是在大括号前不换行,让大家很不满。于是老板想,我们先把小明开除掉,然后给你发奖金并要求大家按照你的方式写代码,并且开发一个工具,唤作「混淆器」,在发布时再把代码处理成小明写的那种样子:

    这里写图片描述

    这样代码即使被反编译和解密了,别人看也看不懂,不小心还会被带到坑里去。代码毕竟是写给人看的,只是偶尔让机器跑一跑,所以没有可读性的代码是没有价值的。这种方法一出,广受好评,于是变成了一种非常普遍的做法。注意图中省略了中间代码和JIT的步骤,混淆通常会跟这些技术一起使用。

    展开全文
  • 逆波兰式的翻译和计算。编译原理的实验报告,有利于新手对于逆波兰的基础理解。文件中给出了具体的代码和理解,还有结果截图显示。采用C语言编写,简单易懂。就一个实验报告!!
  • 编译:  1、利用编译程序从源语言编写的源程序产生目标程序的过程。  2、用编译程序产生目标程序的动作。... 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识10,编译程序把人们熟悉...

     编译

      1、利用编译程序从源语言编写的源程序产生目标程序的过程。

      2、用编译程序产生目标程序的动作。

    所以我们应先多加了解多种程序设计语言。

         

      编译程序是高级语言的支撑基础,是计算机系统中重要的系统软件之一。编译程序的功能是把高级语言源程序翻译成等价的第几语言目标程序。

      编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识10编译程序把人们熟悉的语言换成2进制的。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析语法分析;语义检查和中间代码生成代码优化目标代码生成。主要是进行词法分析语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。

      源程序是有一些基本符号构成的,我们在运行这个程序时 ,先编译,若某处有错误,就报错,无错误就运行。编译 程序在编译时,先将程序中的单词一个个分离出来,登记 在一个表中,这叫词法分析,然后检查语句格式,叫做语 法分析。然后检查类型是否一致,计算表达是的值叫语义分析。

      怎么学编译原理呢?

      一.百度上有这样一条回答:离散数学-》数据结构-》操作系统-》汇编原理-》编译原理,从这几个科目入手,学好学扎实,因为编译原理涉及的知识比较广。

      二.当然也有笔者回答出了一条路线:1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是:   1)可以体会到编译原理的实用性,提高学习兴趣   2)入门容易,消除编译原理学习的畏难情绪.   3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解.   4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的)   2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序.   3.回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破.   4.结合教材所附源码,进一步加深对教材的理解   这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和java与c的差异有关),可对照着看.

      

      现在,刚刚接触编译原理这一科目,还没学如何写一个编译器,所以,也是有点迷茫,有点空。我自己的思路差不多如下:首先,我们要确定自己要写一个什么语言的编译器,例如写一个C语言的编译器,那么,我们应该熟悉C语言的语法规则,先看懂源程序的词法,并判断源程序是否错误。接着,根据词法,去理解源程序中的语句,以及函数的功能,从而简化代码,减少计算机计算压力,接着把源程序的代码,一一编译成机器能看懂的机器语言也就是二进制语言,存放在某文档中。最后,将该文档内容导入运行程序,执行,输出结果,即编译完成。

      毫无科学依据的胡言乱语,估计老师忍不住要笑了吧。

    转载于:https://www.cnblogs.com/huangmp1024/p/4798177.html

    展开全文
  • 所谓代码块就是使用对于常见编译型语言(例如:Java)来说,编译步骤分为:词法分析->语法分析->语义检查->代码优化字节生成。 对于解释型语言(例如JavaScript)来说,通过词法分析语法分析得到语法树...
  • 在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。 一.预处理的工作方式   1.1....
  • 编译原理中间代码生成的赋值语句的翻译,对中间代码的理解更有帮助
  • 深入理解程序从编译到运行

    万次阅读 多人点赞 2017-10-17 10:47:18
    From:http://blog.chinaunix.net/uid-22327815-id-3540305.html 从Hello World说程序运行机制:http://www.sohu.com/a/132798003_505868 C/C++中如何在main()函数之前执行一条语句?...(深入理解计算机系统...
  • 小师妹已经学完JVM的简单部分了,接下来要进入的是JVM中比较晦涩难懂的概念,这些概念是那么的枯燥乏味,甚至还有点惹人讨厌,但是要想深入理解JVM,这些概念是必须的,我将会尽量尝试用简单的例子来解释它们,但...
  • 编译原理-语法制导翻译

    千次阅读 2018-03-19 13:37:57
    一、语法制导翻译的任务编译器的前端对输入流进行词法分析、语法分析之后,得到合乎词法规则语法规则的抽象语法树,他并不能给出程序正确的答案,需要进行语义分析和翻译,才能告诉后端该程序段是具体含义,由后端...
  • 深入理解JVM--解释执行和编译执行

    千次阅读 2018-12-21 18:13:24
    深入理解JVM--解释执行和编译执行概述工作方式比较即时编译编译对象触发条件编译过程 概述 在部分的商用虚拟机中,Java 程序最初是通过解释器( Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的...
  • 程序编译过程:编译(将代码翻译成等价的汇编代码)汇编(将汇编代码翻译为机器指令),经过编译和汇编生成.o文件,.o文件链接后生成可执行文件。 catkin_make 分为俩步:cmake make CMakeList.txt : 如何编译...
  • 解释Interpretion 与 翻译Translation/编译Complie 有时候,要搞清楚问题的因果. 首先上图, 这张图将是本篇文章的核心。 如有错误希望一定指出. 一. 引言 CPU 执行自己知晓的二进制指令. 同时,为了提高效率,...
  • 二进制翻译也是一种编译技术 ,它与传统编译的差别在于其...按照传统编译程序前端、中端后端的划分,我们可以理解为二进制翻译是拥有特殊前端的编译器。 package Com.TableTest; class Cat{ int size; void bark
  • 从hello world理解Linux的编译系统

    千次阅读 2013-12-07 11:26:52
    从hello world理解Linux的编译系统 本文将以一个简单的hello world程序由编写到运行的整个过程来解释Linux的编译系统的原理。  首先,用C语言写一个程序hello.c 内容如下: #include int main() { printf(...
  • 非常推荐的一篇文章:某天周末...编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了 Java翻译执行的是汇编指令,所以是编译语言 .
  • 编译执行解释执行

    万次阅读 多人点赞 2021-01-06 21:52:20
    一、编译和解释 编译:将源代码一次性转换成目标代码的过程 类似英语中的全文翻译。 执行编译过程的程序叫做编译器。 解释:将源代码逐条转换成目标代码同时逐条运行的过程。 类似英语中的同声传译。 ...
  • 编译和宏的理解

    2019-06-29 17:34:47
    程序的翻译环境执行环境: 翻译环境,在该环境下源代码被转换为可执行的机器指令。 执行环境,在该环境下用于实际执行的代码。 翻译环境: 组成一个程序的每个源文件通过编译过程分别转换成目标代码。 每一个...
  • Lua代码翻译及预编译字节码

    千次阅读 2017-04-04 17:37:16
    Lua在早期几乎都是被用来嵌入到其它系统中使用,所以源代码通常被编译成动态库或静态库被宿主系统加载或链接。但随着Lua的第三方库越来越丰富,人们开始倾向于把Lua作为一门独立语言来使用。Lua的官方版本里也提供了...
  • 编译执行解释执行的简单理解 编译执行 解释执行 编译执行,要先编译再执行,就是使用编译器来将我们的代码全部编译成机器可以识别的二进制代码,然后进行执行。因为先整体进行编译,所以这里会...
  • 编译-解释简单理解

    2019-08-15 13:03:15
    编译: 编译器把源码文件翻译成机器代(类比家里吃饭,把全部菜做好才开始吃) c++为例子 一个exe可执行文件有多个cpp文件编译、链接构成。每次编译cpp源码会转换成obj中间文件(代码、数据、名称)。 当exe内的所有...
  • 编译性语言、解释语言脚本语言的理解: 1.编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。(如C/C++) 2.解释型语言,是在运行的时候...
  • 编译原理属性文法语法制导翻译

    千次阅读 2018-06-15 12:31:47
    属性:代表与文法符号相关的信息,变量一样,可以进行计算传递。属性分类:综合属性继承属性综合属性:用于”自上而下“传递信息在语法树中,一个结点的综合属性的值,由其子结点的属性值决定S-属性文法:仅仅...
  • Java| 编译和编译

    万次阅读 多人点赞 2018-04-20 15:49:18
    什么是编程语言?... 在介绍编译和编译之前,我们先来简单介绍下编程语言(Programming Language)。编程语言(Programming Language)分为低级语言(Low-level Language)高级语言(High-level La...
  • 理解使用Gradle编译打包Android apk

    千次阅读 2016-12-09 09:46:29
    本篇的目的:理解Gradle构建过程,解读Android Gradle插件的配置,提供如何寻找解决问题方法的思路。阅读本文一定是要使用过Gradle生成apk,文中不会讲如何安装运行Gradle,如有需要可先看文末的参考文章。APK包是一...
  • 正确答案: A编译和解释题目:将高级语言编写的程序翻译成机器语言程序,采用的两种翻译方式是解析:编译和解释是将高级语言编写的程序翻译成机器语言程序的两种方式。举一反三的答案解析:[单选题]计算机软件系统...
  • 对于编译原理的理解

    千次阅读 2018-03-15 20:42:31
    编译原理 今天组长教育了一下整个程序的编译过程,感觉自己对于这块了解还是很少,有许多知识之前知道,现在忘记了,还有很多规则...预处理器读取.cpp文件,对其中的伪指令(#开头的指令)特殊符号进行处理,...
  • 理解:与动态类型语言恰好相反,在编程中定义变量时就要声明该变量的数据类型,在编译期间检查。C、C++、Java就是典型的静态类型语言。 强类型语言弱类型语言的区别 强类型语言/强制数据类型定

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,609
精华内容 45,843
关键字:

怎样理解翻译和编译