网站分析实例,网络推销平台有哪些,wordpress制作插件,中卫建设厅网站纯C/C的程序通常运行在一个非托管环境中#xff0c;类是由头文件#xff08;.h#xff09;和实现文件#xff08;.cpp#xff09;组成#xff0c;每个类形成了一个单独的编译单元#xff0c;当我们编译程序时#xff0c;几个基本组件会把我们的源代码翻译成二进制代码。… 纯C/C的程序通常运行在一个非托管环境中类是由头文件.h和实现文件.cpp组成每个类形成了一个单独的编译单元当我们编译程序时几个基本组件会把我们的源代码翻译成二进制代码。 首先是预处理器如果在项目中有头文件和宏表达式那么它将负责包含头文件和翻译所有的宏观表达式。
接下来是编译器它不是直接生成二进制代码而是生成汇编代码.s这基本上是所有现代的非结构化语言的共同基础。
然后汇编程序把汇编代码翻译成目标代码.o和.obj文件机器指令。
最后链接器它把所有彼此相关的目标文件和生成的可执行文件或库链接起来。
总而言之在一般情况下我们的代码首先翻译成汇编代码接着翻译成机器指令二进制代码。
托管环境的编译过程C#/Java 在托管环境中编译的过程略有不同我们熟知的托管语言有C#和Java接下来我们将以C#和Java为例介绍在托管环境中的编译过程。
当我们在喜爱的IDE中编写代码时第一个检测我们代码的就是IDE词法分析然后编译成目标文件和链接到动态/静态库或可执行文件进行再次检查语法分析最后一次检查是运行时检查。托管环境的共同特点是编译器不直接编译成机器码而是中间代码在.NET中称为MSIL - Microsoft Intermediate LanguageJava是字节码Bytecode
在那之后在运行时JITJust In Time编译器将MSIL翻译成机器码这意味着我们的代码在真正使用的时候才被解析这允许在CLR公共语言运行时预编译和优化我们的代码实现程序性能的提高但增加了程序的启动时间我们也可以使用NgenNative Image Generator预编译我们的程序从而缩短程序的启动时间但没有运行时优化的优点。JeffWong的补充Java是先通过编译器编译成Bytecode然后在运行时通过解释器将Bytecode解释成机器码C#是先通过编译器将C#代码编译成IL然后通过CLR将IL编译成机器代码。所以严格来说Java是一种先编译后解释的语言而C#是一门纯编译语言且需要编译两次。 .Net Framework就是在Win32 core上添加了一个抽象层它提供的一个好处就是支持多语言、JIT优化、自动内存管理和改进安全性另外一个完整解决方案是WinRT但这涉及到另外一个主题了这里不作详细介绍。
JIT编译的优点和缺点
JIT编译带来了许多好处最大的一个在我看来是性能的优势它允许CLR通用语言运行时扮演Assembler组件只执行需要的代码例如假设我们有一个非常大的WPF应用程序它不是立即加载整个程序而是CLR开始执行时我们代码的不同部分将通过一个高效的方法翻译成本地指令因为它能够检查系统JIT和生成优化的代码而不是按照一个预定义的模式。不幸的是有一个缺点就是启动的过程比较慢这意味着它不适用于加载时间长的包。
JIT的替代方案使用NGen
如果Visual Studio由JIT创建那么它的启动我们将需要等待几分钟相反如果它是使用NgenNative Image Generator编译它将创建纯二进制可执行文件如果只考虑速度的问题那是绝对是正确的选择。
在非托管环境中我们需要知道编译的过程分成编译和连接两个阶段编译阶段将源程序*.c*.cpp或*.h)转换成为目标代码(*.o或*.obj文件至于具体过程就是上面说的C/C编译过程的前三个阶段链接阶段是把前面转成成的目标代码obj文件与我们程序里面调用的库函数对应的代码链接起来形成对应的可执行文件exe文件。
托管环境中编译过程可以分为词法分析、语法分析、中间代码生成、代码优化和目标代码生成等等过程无论是.NET还是Java它们都会生成中间代码MSIL或Bytecode,然后把优化后的中间代码翻译成目标代码最后在程序运行时JIT将IL翻译成机器码。
无论是托管或非托管语言它们的编译编译过程是把高级语言翻译成计算机能理解的机器码。