精华内容
下载资源
问答
  • 怎样理解翻译和编译
    2022-04-06 19:30:59

    在ANSI C的任何一种实现中,存在两个不同的环境。

    第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

    第2种是运行环境,它用于实际执行代码。


    🍔 程序的翻译环境

    我们使用C语言写出来的代码并不能直接被机器识别运行,而是要经过翻译,生成能让机器理解的可执行文件才能在运行环境中运行生成运行结果。

    在VS2022中,我们所使用的VS2022集成开发环境就是我们代码的翻译环境。

    源文件经过翻译的一系列操作生成可执行文件的过程如下图:
    在这里插入图片描述

    组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。

    每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。

    链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

    由上图我们可以知道,程序的翻译分为两个部分,编译和链接。那么编译和链接过程中又做了什么呢?请看下图:
    在这里插入图片描述


    🍔 程序的运行环境

    程序执行的过程:

    1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
    2. 程序的执行便开始。接着便调用main函数。
    3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
    4. 终止程序。正常终止main函数;也有可能是意外终止。

    此处推荐一本书:《程序员的自我修养》 该书详细介绍了程序翻译与运行过程中发生的活动。

    更多相关内容
  • 实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。其中包含C++实现代码、测试用例等基本报告内容。
  • 逆波兰式的翻译和计算。编译原理的实验报告,有利于新手对于逆波兰的基础理解。文件中给出了具体的代码和理解,还有结果截图显示。采用C语言编写,简单易懂。就一个实验报告!!
  • 编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度; 缺点: 对代码运行效率几乎没有任何优化措施; 解释执行效率较低,所以需要结合下面的JIT编译; 前端编译器:Oracle ja...

    导读

    将源代码翻译为目标代码的过程,称为编译过程。

    在这里再次把JDK、JRE、JVM三者是什么解释一下:

    JDK是java开发工具包,包括: bin、db、include、jre、ilb文件。其中:

    bin是JDK的编译器(javac.exe);db是自带的数据库;Include是java和JVM交互的的头文件;Jre是java运行的环境,jre文件里面的bin文件可以看成jvm,lib文件则是jvm工作时所需要的的类库,jvm和lib一起称为jre.

    1.前端编译

            java前端编译是指:通过javac编译器(JDK的bin文件)把*.java文件转换为*.class文件的过程 。

    优点:

    许多Java语法新特性("语法糖":泛型、内部类等等),是靠前端编译器实现的,而不是依赖虚拟机;

    编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度;

    缺点:

    对代码运行效率几乎没有任何优化措施;

    解释执行效率较低,所以需要结合下面的JIT编译;    

    前端编译器:Oracle javac、Eclipse JDT中的增量式编译器(ECJ)等;

    前端编译过程如下图:

    2.后端编译

             后端编译也称为及时编译(just-in-time compiler), 通过Java虚拟机(JVM)内置的即时编译器(Just In Time Compiler,JIT编译器),在运行时(文件加载内存中运行)把Class文件字节码编译成本地机器码的过程;            

    2.1 为什么需要后端编译(及时编译)呢?

            Java程序最初都是通过解释器进行执行,解释一句,执行一句,效率很低。当发现某个方法或者代码块被运行得非常频繁,即多次执行字节码需要重复翻译为本地代码时,我们可以这些代码就被认为是热点代码,为了提高这些热点代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,当再次需要执行只写代码时,直接调用就行了,而不需要再次编译或者解释了。所以出现了及时编译。

    2.2 怎么样才被认为是热点代码呢?

            JVM中会设置一个阈值,当方法或者代码块的在一定时间内的调用次数超过这个阈值时就会被编译,存入codeCache中。当下次执行时,再遇到这段代码,就会从codeCache中读取机器码,直接执行,以此来提升程序运行的性能。整体的执行过程大致如下图所示:

    后端编译描述如下图: 

    参考文章链接地址:

    Java | 聊一聊编译过程(编译前端 & 编译后端) - 知乎

                                      基本功 | Java即时编译器原理解析及实践 - 美团技术团队

    展开全文
  • 第一步,用一个编译程序把高级语言翻译成机器语言程序; 第二步,运行所得的机器语言程序求得计算结果。 1.几种基本的翻译程序 1.1翻译程序 通常所说的翻译程序是指这样的一个程序,它能够把某一种语言程序(称为源...


    要在计算机上执行用 高级语言(或汇编语言)编写的程序,必须通过特定的途径来进行,也就是要通过 翻译程序把用高级语言(或汇编语言)编写的程序翻译成为机器语言构成的程序,计算机才能执行。
    在计算机上执行一个高级语言程序一般要分为两步:
    第一步,用一个编译程序把高级语言翻译成机器语言程序;
    第二步,运行所得的机器语言程序求得计算结果。

    1.几种基本的翻译程序

    1.1翻译程序

    通常所说的翻译程序是指这样的一个程序,它能够把某一种语言程序(称为源语言程序或源程序)转换成另一种语言程序(称为目标语言程序或目标程序)
    在这里插入图片描述

    1.2汇编程序(Assembler)

    如果源语言是某种汇编语言,而目标语言是某种计算机的机器语言,这样的一个翻译程序就称为汇编程序。
    在这里插入图片描述

    1.3编译程序(Compiler)

    如果源语言是某种高级语言,而目标语言是某种低级语言(汇编语言或机器语言),这样的一个翻译程序就称为编译程序。在这里插入图片描述

    1.4解释程序(Interpreter)

    这是另外一种类型的翻译程序,在翻译过程它按照高级语言源程序在计算机上执行的动态顺序对源程序的语句逐条翻译(解释),边解释边执行直至结束,它不产生目标程序,它的工作结果就是源程序的执行结果,这样的一个翻译程序就称为解释程序。在这里插入图片描述

    1.5总结

    编译程序与其他几种翻译程序的区别在于源语言和目标语言的不同,编译程序的源语言是某种高级语言,功能是将其翻译成某种低级语言。
    根据不同的用途,编译程序可进一步分类:
    (1)诊断编译程序(Diagnostic Compiler): 专门用于帮助程序开发和调试的编译程序。
    (2)优化编译程序(Optimizing Compiler): 着重于提高目标代码效率的编译程序。
    (3)交叉编译程序(Cross Compiler): 如果一个编译程序产生不同于其宿主机的机器代码。
    (4)可变目标编译程序(Retargetable Compiler): 不需重写编译程序中与机器无关的部分就能改变目标机。

    2.编译程序的运行过程

    编译程序的工作过程一般可以划分为五个阶段:
    1.词法分析——2.语法分析——3.语义分析——4.中间代码产生、优化——5.目标代码生成。
    在这里插入图片描述

    2.1词法分析(Lexical analysis)

    此阶段的任务是: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词。在词法分析阶段的工作中所依循的是语言的词法规则(或称构词规则)。描述词法规则的有效工具是正规式,识别词法规则的有效工具是有限自动机。在这里插入图片描述

    2.2语法分析(Syntax Analysis)

    此阶段的任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如“短语”、“子句”、“句子”(“语句”)、“程序段”和“程序”等。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。
    语法分析所依循的是语言的语法规则。语法规则通常用上下文无关文法描述。词法分析是一种线性分析,而语法分析是一种层次结构分析。
    例如,在很多语言中,符号串 z:=X十0.618*Y 代表一个“赋值语句”,而其中的 X+0.618*Y代表一个“算术表达式”。因而,语法分析的任务就是识别 X+0.618*Y为算术表达式,同时,识别上述整个符号串属于赋值语句这个范畴。

    2.3语义分析与中间代码产生(Semantic Analysis and Intermediate Generator)

    此阶段的任务是:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
    语义处理:
    ①变量的存储分配 ②表达式的求值 ③语句的翻译(中间代码的生成)
    中间代码
    中间代码是一种独立于具体硬件的记号系统。
    常用的中间代码:三地址码(四元式、三元式、间接三元式),逆波兰式,树形表示等。所谓“中间代码”是一种含义明确、便于处理的记号系统,它通常独立于具体的硬件。这种记号系统或者与现代计算机的指令形式有某种程度的接近,或者能够比较容易地把它变换成现代计算机的机器指令。

    2.4优化(Optimization)

    优化的任务:对产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
    优化的主要方面有:公共子表达式提取、循环优化、删除无用代码等等。有时,为了便于“并行运算”,还可以对代码进行并行化处理。优化所依循的原则:程序的等价变换规则。

    2.5目标代码生成(Code Generation)

    这一阶段的任务是:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。
    目标代码的三种形式:
    1.汇编语言代码 2.能够立即执行的机器语言代码 3.待装配的机器代码模块

    3.表格管理 (symbol-table manager)

    编译程序在工作过程中需要保存一系列的表格,以登记源程序的各类信息和编译各阶段的进展状况。合理地设计和使用表格是编译程序构造的一个重要问题。在编译程序使用的表格中,最重要的是符号表。它用来登记源程序中出现的每个名字以及名字的各种属性。

    4.出错处理(error handler)

    一个编译程序不仅应能对书写正确的程序进行翻译,而且应能对出现在源程序中的错误进行处理。
    源程序中的错误通常分为语法错误和语义错误两大类。
    语法错误是指源程序中不符合语法(或词法)规则的错误,它们可在词法分析或语法分析时检测出来。例如,词法分析阶段能够检测出“非法字符”之类的错误;语法分析阶段能够检测出诸如“括号不匹配”、“缺少;”之类的错误。
    语义错误是指源程序中不符合语义规则的错误,这些错误一般在语义分析时检测出来,有的语义错误要在运行时才能检测出来。语义错误通常包括:说明错误、作用域错误、类型不一致等等。

    5.编译前端与后端

    编译过程划分为前端和后端的目的:在多种源语言和多种目标语言的开发过程中,可以灵活搭配前端和后端,消除重复开发的工作量,提高编译系统的开发效率。
    前端主要由与源语言有关但与目标机无关的那些部分组成。这些部分通常包括词法分析、语法分析、语义分析与中间代码产生,有的代码优化工作也可包括在前端。
    后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标代码生成等。通常,后端不依赖于源语言而仅仅依赖于中间语言。

    展开全文
  • 重新理解Linux交叉编译编译流程

    万次阅读 多人点赞 2022-03-12 23:18:42
    文章目录一、背景二、gccarm-linux-gcc的常用选项二、交叉编译的四个流程及实例说明1、预处理(preprocessing)2、编译(compilation)3、汇编(assembly)4、链接(linking) 参考书籍 1、编译原理 2、嵌入式Linux应用...

    参考书籍
    1、编译原理
    2、嵌入式Linux应用开发

    一、交叉编译背景

    当我们开发目标是一个嵌入式设备时,便需要在PC机上编译出能在该嵌入式设备上运行的可执行文件,这里编译主机与目标运行主机不是同一个设备,那么该过程就称为交叉编译;而编译是指一个源代码文件(这里指的是编译性程序源文件,与之对应的是解释性程序),如C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等4步才能变成可执行文件,注意在日常交流中通常使用“编译”统称这4个步骤。

    当我们在 Windows下利用IDE工具,即集成开发环境(比如 Visual studio、keil、IAR、Eclipse等等)进行开发时,只需要单击几个按钮即可编译,因为IDE工具已经将各种编译工具的使用封装好了。

    Linux下也有很优秀的集成开发工具,但是更多的时候是直接使用编译工具;比如嵌入式开发中,运行在PC平台上的编译工具链为gcc、ld、objcopy、objdump等,它们编译出来的程序在x86平台上运行。要编译出能在 ARM 平台上运行的程序,则须使用交叉编译工具 arm-linux-gcc、arm-linux-ld、arm-linux-objcopy、arm-linux-objdump等;PC与ARM的编译工具使用方法一致,单纯就是名字不一样。

    小插曲:关于开发工具的使用,搭建开发环境和熟悉工具使用是进行开发的第一步,也是一道难关,尤其面对多种多样的工具和环境,让人抓狂;其实这也无可厚非,因为各种系统、产品本身具有自己的特点以及软件工具的限制(知识产权),显然要做到一个工具通吃是不现实的,而一般在学习网络教程/公司企业工作时所使用的工具,有可能会直接采用某官方发布的软件,也有可能经过二次开发/封装而来,面对这种情况,我们其实不用去抗拒,学习开发工具本身就是开发过程中必要的一部分,熟练掌握一套工具后,同类的工具上手也会很快的,因此要积极对待。

    上图更好理解:
    在这里插入图片描述

    二、gcc和arm-linux-gcc的常用选项

    1、查询gcc帮助

    先来简单认识下编译工具的使用,我们先看操作,再看原理,以gcc为例子(与arm-linux-gcc使用一致),查询使用帮助:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sVGTABYv-1647098293080)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312211258526.png)]

    2、常用gcc选项介绍

    gcc选项很多,一般大型开发项目都会使用很多控制选项,这里仅介绍简单常用选项:

    -v:查看gcc编译器的版本,显示gcc执行时的详细过程
    -o <file>         Place the output into <file> (指定输出文件名为file,这个名称不能跟源文件名同名)
                               
    -E                       Preprocess only; do not compile, assemble or link(只预处理,不会编译、汇编、链接)
                               
    -S                       Compile only; do not assemble or link(只编译,不会汇编、链接)
                               
    -c                       Compile and assemble, but do not link(编译和汇编,不会链接 )
    

    3、生成一个可执行文件的三种方法

    以hello.c文件为例
    在这里插入图片描述

    1)方式1

    gcc -E -o hello.i hello.c
    gcc -S -o hello.s hello.i
    gcc -c -o hello.o hello.s
    gcc -o hello hello.o
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6Djo2jB-1647098293085)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312215503760.png)]
    gcc会对.c文件默认进行预处理操作,-c再来指明了编译、汇编,从而得到*.o文件(object file 即我们常说的目标文件),再通过gcc -o hello hello.o将.o文件进行链接,得到可执行应用程序。

    小结:
    1)输入文件的后缀名和选项共同决定gcc到底执行哪些操作。
    2)在编译过程中,除非使用了-E、-S、-c选项(或者编译出错阻止了完整的编译过程),否则最后的步骤都是链接。

    2)方式2 - 开发项目中常用的方式

    gcc -c -o hello.o hello.c
    gcc -o hello hello.o
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgbLRjoG-1647098293087)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312215956177.png)]

    3)方式3

    gcc -o hello hello.c  输出hello,然后./hello来执行该应用程序。
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQGKkt0b-1647098293087)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312220125123.png)]

    注:如果不指定输出文件名,则默认生成a.out

    gcc hello.c  输出一个a.out,然后./a.out来执行该应用程序。
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuF8bn91-1647098293088)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312220207527.png)]

    二、交叉编译的四个流程及实例说明

    1、预处理(preprocessing)

    问:什么是预处理?

    C/C++源文件中,以“#“开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个".i"文件,也就是说还是源代码文件;

    问:为什么需要预处理?

    一般预处理都是些简单的替换、拷贝和选择,这些涉及多个文件,预处理的结果是将每个源文件所需要的代码都放在自己文件里,然后方便下一步处理(ps:因为编译时,编译器每次读入一个文件,输出一个文件,不支持同时处理多个文件 - 来源于“编译原理”);

    对比hello.i与hello.c文件内容:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W3zylFPg-1647098293089)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312220805414.png)]
    对比hello.i与hello.c大小:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uCFeUudT-1647098293091)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312220946568.png)]
    明显hello.i大很多,原因是从其他文件拷贝了很多代码过来。

    2、编译(compilation)

    问:什么是编译?

    编译就是把C/C++代码(比如上述的“.i”文件)翻译成汇编代码,这部分涉及复杂的编译器原理,有兴趣可以自行去看书深究;

    问:为什么要翻译成汇编,而不直接生成机器码?

    1、其一由于最开始的底层开发语言是汇编,而高级语言是在底层语言基础上发展的,自然而然会将成熟的工具(汇编器)利用起来,同时实现软件分层可以有效地减弱编译器编写的复杂性,“编译”所拆分的四大步骤也是如此道理;

    2、其二有一个好处是方便优化和调试,汇编语言是机器指令的助记 符,一个汇编指令就对应一条机器指令,因此汇编语言更贴近机器特性,因此比高级语言调试起来更有优势;

    查看hello.s文件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JSnlKdLy-1647098293091)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312223635993.png)]

    3、汇编(assembly)

    问:什么是汇编

    汇编(注意这里的汇编指的是编译器的一个编译动作,不是汇编语言)是利用汇编器将第二步输出的汇编代码翻译成符合一定格式的机器代码,就是我们熟悉的目标文件(*.o),在Linux系统上一般表现为ELF格式文件;如果开发代码是汇编,则汇编+链接就可以生成可执行文件了;

    查看hello.o,需要用readelf工具查看
    在这里插入图片描述

    问:什么是反汇编文件?

    反汇编文件是由可执行文件逆向解析而来,内容是按照实际内存分布来排布的,包含地址信息,一般用来调试分析用,非常有用;

    生成反汇编文件
    在这里插入图片描述

    查看
    在这里插入图片描述

    问:汇编文件与反汇编文件的区别?

    反汇编文件比汇编文件多了调试信息,如物理地址、机器码等,而汇编文件单纯只是汇编代码;

    4、链接(linking)

    问:什么是链接?

    链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,即将各个ELF文件重新排序成一个ELF文件,最终生成可以在特定平台运行的可执行程序。

    查看hello,需要用readelf工具
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGs8jYuz-1647098293094)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312225906363.png)]

    问:什么是系统库文件?

    系统库文件:一个应用程序要运行在系统上,就需要系统标准启动文件,提供给系统用的;注意裸机bootloader、linux内核等程序是不能使用启动文件以及标准库文件(因为启动文件和库文件的使用是需要系统支持)。

    一般gcc自动加入的系统标准启动文件有:crt1.o、crti.o、crtbegin.o、crtend.o、crtn.o
    对于一般应用程序,这些启动是必需的。

    通过查看gcc详细编译过程可以看到

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEIwa5uz-1647098293094)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312231007888.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xhohe0DU-1647098293095)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312231106971.png)]

    问:什么是标准库文件?

    很好理解,即库文件,如果代码用到标准库函数,而gcc集成了常用的库,链接时自动检索加入;

    问:什么是动态链接?

    动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。
    动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。

    gcc默认使用动态库链接

    问:什么是静态链接?

    静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,
    不过静态链接生成的程序体积较大。

    gcc静态链接需加入选项-static
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHJZ7ZQE-1647098293095)(C:\Users\Anson\AppData\Roaming\Typora\typora-user-images\image-20220312231622957.png)]
    很明显静态链接比动态链接生成的可执行文件大很多。

    最后,编译原理还有很多值得深究的问题,比如ELF格式是什么?系统如何支持动态链接的?边实践边学习,由浅及深,通过现象理解本质才能不急不躁。

    展开全文
  • javac.exe把.java文件编译为.class字节码文件,java.exe解释并执行.class文件,并启动Java虚拟机(JVM),JVM开始调用操作系统命令执行对应的指令,配合硬件,完成整个Java程序的调用
  • 编译原理中间代码生成的赋值语句的翻译,对中间代码的理解更有帮助
  • 理解解释以及编译

    2022-04-22 11:32:08
    1什么是解释和编译 1解释 2编译执行 3理解概念 2”解释“编译“的对比 两者的区别 在接触程序设计的时候我们经常听到两个概念“解释”“编译”。 计算机编程语言可以这两个概念来分一下类。 1解释型:...
  • 编译运行时区别

    千次阅读 2021-06-15 15:35:53
    编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字病句一样.如果发现啥错误编译器就告诉...
  • 编译执行解释执行

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

    2021-12-24 21:47:19
    文章目录1.解释与编译的基本概念2.解释与编译的特性3....计算机不能直接理解高级语言,只能直接理解机器语言(低级语言)所以必须把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。 1.解释
  • 赋值语句、(多维)数组引用的翻译以及其SDT。
  • 编译代码的一些理解

    千次阅读 2021-10-29 13:54:55
    编译代码的一些理解 ARM Cortex-M底层技术—编译内核的原理及其应用 参考网址: https://www.cnblogs.com/39950436-myqq/p/11545140.html 1. 编译链接的定义 不管我们编写的代码有多么简单,都必须经过「编译 -->...
  • 本书比较全面、系统地介绍了编译程序构造的一般原理基本实现方法,内容包括词法分析、语法分析、属性文法与语法制导翻译、语义分析与中间代码产生、符号表与运行时存储空间组织、优化与目标代码生成、并行编译技术...
  • 编译和链接

    千次阅读 2022-03-27 18:38:56
    1.编译和链接合并到一起的过程称为构建。 例如“gcc hello.c”命令就包含了非常复杂的过程。 2.生成程序被隐藏了的过程——预处理、编译、汇编、链接。 预处理(预编译): 首先将源代码文件(.c)相关的头文件...
  • 关于程序的编译和解释!

    千次阅读 2020-07-05 20:39:38
    程序的编译和解释,你知道是什么吗? 如果你不清楚,或者了解的有点模糊,那么今天这篇文章也许会帮到你,不妨来看一看,花不了你几分钟的时间,却可以让你get到一些新的...
  • 编译原理-语法制导翻译

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

    千次阅读 多人点赞 2021-10-19 21:05:44
    文章目录 前言 一、程序的翻译环境执行环境 二、预处理 预定义符号介绍 预处理指令 #define 宏函数的对比 ###的介绍 #undef 条件编译 #include 总结 前言 C语言终于复习完了,这一个多月的学习,使用C语言编程...
  • Lua代码翻译及预编译字节码

    千次阅读 2017-04-04 17:37:16
    Lua在早期几乎都是被用来嵌入到其它系统中使用,所以源代码通常被编译成动态库或静态库被宿主系统加载或链接。但随着Lua的第三方库越来越丰富,人们开始倾向于把Lua作为一门独立语言来使用。Lua的官方版本里也提供了...
  • 首先理解一下何为解释型语言和编译型语言计算机高级语言类型主要有编译解释型两种:编译型语言:在程序运行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序时,就不用再进行翻译了。...
  • while,复合语句过程调用语句的翻译 while: S的chain可以理解为回填while语句之后的第一个四元式,对于之前的if……else也可以这样理解 W的语义子程序需要保留四元式号,Wd需要回填TC,S需要生成循环 S1可能是带...
  • 点赞关注,不再迷路,你的支持对我...(联系方式在 GitHub)前言经过前面几篇文章的积累,相信你已经掌握了 静态的 Class 文件的结构,也理解了虚拟机类加载字节码执行的 动态过程;这篇文章,我们来聊一聊 Java ...
  • 编译期:检查是否有语法错误,如果没有就将其翻译成字节码文件。即.class文件。 运行期:java虚拟机分配内存,解释执行字节码文件。 从以下代码开始说明,欢迎大家指正 可以思考下,第一行跟第二行在编译时期有什么...
  • 编译原理(整体理解

    千次阅读 2020-12-12 18:14:56
    整个过程其实就像你把一篇英语文章翻译成中文一样,首先要明白的词法分析是一个程序,一个程序要有输入输出,输入的是字符流,不能称之为单词,就像英语中的几个字母组成字符串,我们怎么能称之为单词,赋予这个...
  • 1.1.1 摘要我们知道计算机不能直接理解高级语言,它只能理解机器语言,所以我们必须要把高级语言翻译成机器语言,这样计算机才能执行高级语言编写的程序,在接下来的博文中,我们将介绍非托管托管语音的编译过程。...
  • 我们无需理解里面复杂的过程,我们仅仅可以把编译过程理解为将TypeScript翻译成能够被浏览器执行的JavaScript代码即可。 这个“翻译”的过程也非常简单。我们仅仅需要执行一个简单的命令即可。命令如下: egret ...
  • 一、编译执行 编译执行就是源代码经过编译器编译处理,生成目标机器码,即机器能直接运行的二进制代码,下次运行时无需重新编译。 这种代码不具备可移植性、但执行速度快, C、C++这类语言属于编译型语言。 二...
  • 编译器告诉计算机该怎么理解我们编写的代码。我们编写的高级语言大致分为两种: 解释型:像Python,可以写一句执行一句; 编译型:像C,需要经过编译成.exe文件才能运行。 因此,编译器又分两种: interpreter,...
  • 非常推荐的一篇文章:某天周末...编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了 Java翻译执行的是汇编指令,所以是编译语言 .

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,866
精华内容 50,346
热门标签
关键字:

怎样理解翻译和编译