程序在编译阶段做了什么事
㈠ 精品赏析:一个.NET程序在编译和运行时都做了些什么
run-time)和运行原理 (CPU-specific binary or pseudo-code)的疑问。 这里是一个简单的回答:当你编译一个C#应用程序或任何一种CLS(Commmon Language Specification)兼容的语言时,它将首先被编译成一种称为IL (Intermediate Language)的伪代码(pseudo-code)。在这个应用程序第一次 被运行的时候,这种IL代码将被编译成机器代码,用于执行。也就是说从源代码 到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码 才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节: 1) 你用C#开发一些程序 2) 用C#编译器或CLS兼容的编译器编译成EXE 3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32 可执行文件的只读部分。 4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。 这个函数是.NET EE(execution engine)--.NET运行期引擎的入口函数。 5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系 统将会调用位于MSCorEE.DLL中的_CorExeMain函数。 6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里 可以有很多程序同时运行。 7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将 指示操作系统调用_CorExeMain函数。 8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。 9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler) 这一即时编译过程只在第
㈡ 程序编译连接的过程中各干了什么事情
呵呵,楼主应该看看《编译原理》。
我的空间里的一篇日志或许对楼主也有帮助。
链接是把程序代码与所需要的其他目标代码,或函数库,Run-time 库连接在一起。
比如 printf,程序代码里没有它内部实现的代码,只是说要调用这个功能。
连接程序会把它内部实现代码从 Run-time 库里提出来,放在一起,这样程序才可以单独执行。
对于使用了第三方函数库的代码来说,链接程序同样会在第三方函数库中提取相关内容,加在一个可执行文件(Exe 或其他)中。
另外,一些比较大的程序,可能会分若干个文件,它们互相调用彼此的函数。可以独立编译成若干个目标代码。如果这些函数有的缺失了,编译也可以通过。
这样做的好处是,对于大型程序,分成若干部分分别编译,加快了编译过程。同时,减少每个源码文件的行数。
比如,写一个计算程序。后台计算有一个文件,可以编译成功。前台界面有一个文件,也可以编译成功。它们分辨编译成两个不同的目标代码文件(obj 或其他)
然后经过链接过程
这个例子的话,可以认为有这个式子:
前台.obj + 后台.obj + .... + 第三方函数库 + Run-time 库 = Exe
链接的时候,才会检查这种相互依赖是否完整。
比如前台部分是否使用了有些函数,而这些函数在后台处理模块中并不存在?或者忘记写这个函数了?
或者是否调用了一个后台函数,而这个函数的参数与调用的时候根本不一致?
发生这些情况时,才会给出链接警告和错误。
㈢ C语言文件的编译与执行的四个阶段并分别描述
开发C程序有四个步骤:编辑、编译、连接和运行。
任何一个体系结构处理器上都可以使用C语言程序,只要该体系结构处理器有相应的C语言编译器和库,那么C源代码就可以编译并连接到目标二进制文件上运行。
1、预处理:导入源程序并保存(C文件)。
2、编译:将源程序转换为目标文件(Obj文件)。
3、链接:将目标文件生成为可执行文件(EXE文件)。
4、运行:执行,获取运行结果的EXE文件。
(3)程序在编译阶段做了什么事扩展阅读:
将C语言代码分为程序的几个阶段:
1、首先,源代码文件测试。以及相关的头文件,比如stdio。H、由预处理器CPP预处理为.I文件。预编译的。文件不包含任何宏定义,因为所有宏都已展开,并且包含的文件已插入。我归档。
2、编译过程是对预处理文件进行词法分析、语法分析、语义分析和优化,生成相应的汇编代码文件。这个过程往往是整个程序的核心部分,也是最复杂的部分之一。
3、汇编程序不直接输出可执行文件,而是输出目标文件。汇编程序可以调用LD来生成可以运行的可执行程序。也就是说,您需要链接大量的文件才能获得“a.out”,即最终的可执行文件。
4、在链接过程中,需要重新调整其他目标文件中定义的函数调用指令,而其他目标文件中定义的变量也存在同样的问题。
㈣ 编译程序的工作过程一般可以划分为哪5个基本阶段,还自始至终伴随进行哪两项工作
1、编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;中间代码生成;代码优化;目标代码生成。
2、编译程序的工作过程一般自始至终伴随进行信息表管理和出错处理两项工作。
主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
(4)程序在编译阶段做了什么事扩展阅读:
解释程序是一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同,但在运行用户程序时,它直接执行源程序或源程序的内部形式(中间代码)。因此,解释程序并不产生目标程序,这是它和编译程序的主要区别。解释程序的工作过程如下:
1、由总控程序完成初始化工作。
2、依次从源程序中取出一条语句进行语法检查,如有错,输出错误信息;如果通过了语法检查,则根据语句翻泽成相应的指令并执行它。
3、检查源程序是否已经全部解释执行完毕,如果未完成则继续解释并执行下一条语句,直到全部语句都处理完毕。
㈤ C语言源程序的编译过程包括哪三个阶段
编译:将源程序转换为扩展名为.obj的二进制代码
连接:将obj文件进行连接,加入库函数等生成可执行文件
运行:执行可执行文件,有错返回修改,无错结束
㈥ 描述一般的编译程序可分为哪些阶段,每个阶段的目的是什么
其目的是保证标识符和常数的正确使用,把必要的信息...综合部分 综合阶段必须根据符号表和中间语言程序产生...目标程序质量,也可以把一个逻辑步骤的工作分为几遍.
㈦ 计算机编译程序主要是做什么工作
编译程序就是将高级语言程序设计语言源程序翻译成计算机可执行代码的软件
㈧ 程序的编译期,链接期, 运行期各执行哪些操作
参考一下:
源文件的编译过程包含两个主要阶段,而它们之间的转换是自动的。第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中还有其他许多预处理指令
这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。
预处理器显示为一个独立的操作,但一般不能独立于编译器来执行这个操作。调用编译器会自动执行预处理过程,之后才编译代码。
编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对应于某个源文件的对象文件包含在其他源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。同样,也没有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作是由链接程序(有时称为链接编辑器)完成的
链接程序把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。这是链接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。
链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。动态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块—— 动态链接库或共享库。动态链接库中的函数链接是在程序调用函数时才建立的,在程序调用之前,该链接是不存在的。
动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享,这将节省相同函数占用的内存空间。另一个优点是动态链接库在调用其中的函数之前是不会加载到内存中的。也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间
㈨ 说说java文件编译时都做了哪些事情
java有反射机制,执行编译时会尝试找到JRE安装所在目录,然后找到jvm.dll,接着启动JVM进行初始化动作,产生3个类加载器,用来将所用到的类文件加载到内存中,会自动导入java.lang下的类文件和你想导入的类文件,查看你的代码中是否有未处理的可控式异常,JVM会查看你写的代码是否符合语法,.JVM会将你所写的java文件编译为与系统平台无关的字节码文件。
㈩ 什么是编译程序 编译程序的工作过程
编译程序是变成语言在计算机上面运行的一种方式。
比如你现在编写(编译型语言)了你个程序文件并要运行它,但是计算机是不认识这个文件里面的东西的(其实计算机只认识0和1这样的数字),所以这里就需要把你自己写的程序文件翻译一遍,翻译过后并生成一个计算机能够识别的文件,把你原来的源文件翻译成计算机能够识别的文件的过程就叫编译,其实计算机运行的真正文件是编译过后的编译文件。