C C++ Java C# JS编译、执行过程的原理入门分析
你可以说它是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有。
你可以说它是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了。
现在的JVM为了效率,都有一些JIT优化。它又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。
(3)输入 => 目标程序 => 输出。
C#一共编译了两次,第二次发生在运行时,也就是你点击exe文件之后。
- HelloWorld.cs
- //HelloWorld.cs by Cornfield,2001
- //csc HelloWorld.cs
- using System;
- class HelloWorld
- {
- public static void Main()
- {
- Console.WriteLine("Hello World !");
- }
- }
需要指出的是,我们一般使用C#编写生成一个HelloWorld的exe文件,其实,内部存放的并不是机器可以解读的机器码,不要被后缀名exe欺骗了。
- // Microsoft (R) .NET Framework IL Disassembler. Version 1.1.4322.573
- // Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
- .assembly extern mscorlib
- {
- .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
- .ver 1:0:5000:0
- }
- .assembly Class2
- {
- // --- 下列自定义属性会自动添加,不要取消注释 -------
- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
- // bool) = ( 01 00 00 01 00 00 )
- .hash algorithm 0x00008004
- .ver 0:0:0:0
- }
- .module Class2.exe
- // MVID: {A9D4A2DC-A401-4F5F-B16F-B3D40F584E59}
- .imagebase 0x00400000
- .subsystem 0x00000003
- .file alignment 512
- .corflags 0x00000001
- // Image base: 0x070c0000
- //
- // ============== CLASS STRUCTURE DECLARATION ==================
- //
- .class public auto ansi beforefieldinit Test
- extends [mscorlib]System.Object
- {
- } // end of class Test
- // =============================================================
- // =============== GLOBAL FIELDS AND METHODS ===================
- // =============================================================
- // =============== CLASS MEMBERS DECLARATION ===================
- // note that class flags, 'extends' and 'implements' clauses
- // are provided here for information only
- .class public auto ansi beforefieldinit Test
- extends [mscorlib]System.Object
- {
- .method private hidebysig static void Main() cil managed
- {
- .entrypoint
- // 代码大小 72 (0x48)
- .maxstack 4
- .locals init (int32[] V_0,
- int32 V_1,
- int32 V_2)
- IL_0000: ldc.i4.5
- IL_0001: newarr [mscorlib]System.Int32
- IL_0006: stloc.0
- IL_0007: ldc.i4.0
- IL_0008: stloc.1
- IL_0009: br.s IL_0015
- IL_000b: ldloc.0
- IL_000c: ldloc.1
- IL_000d: ldloc.1
- IL_000e: ldloc.1
- IL_000f: mul
- IL_0010: stelem.i4
- IL_0011: ldloc.1
- IL_0012: ldc.i4.1
- IL_0013: add
- IL_0014: stloc.1
- IL_0015: ldloc.1
- IL_0016: ldloc.0
- IL_0017: ldlen
- IL_0018: conv.i4
- IL_0019: blt.s IL_000b
- IL_001b: ldc.i4.0
- IL_001c: stloc.2
- IL_001d: br.s IL_003b
- IL_001f: ldstr "arr[{0}]={1}"
- IL_0024: ldloc.2
- IL_0025: box [mscorlib]System.Int32
- IL_002a: ldloc.0
- IL_002b: ldloc.2
- IL_002c: ldelem.i4
- IL_002d: box [mscorlib]System.Int32
- IL_0032: call void [mscorlib]System.Console::WriteLine(string,
- object,
- object)
- IL_0037: ldloc.2
- IL_0038: ldc.i4.1
- IL_0039: add
- IL_003a: stloc.2
- IL_003b: ldloc.2
- IL_003c: ldloc.0
- IL_003d: ldlen
- IL_003e: conv.i4
- IL_003f: blt.s IL_001f
- IL_0041: call int32 [mscorlib]System.Console::Read()
- IL_0046: pop
- IL_0047: ret
- } // end of method Test::Main
- .method public hidebysig specialname rtspecialname
- instance void .ctor() cil managed
- {
- // 代码大小 7 (0x7)
- .maxstack 1
- IL_0000: ldarg.0
- IL_0001: call instance void [mscorlib]System.Object::.ctor()
- IL_0006: ret
- } // end of method Test::.ctor
- } // end of class Test
- // =============================================================
- //*********** 反汇编完成 ***********************
- // WARNING: Created Win32 resource file Class2.res
(1)用户执行编译器输出的应用程序(PE文件),操作系统载入PE文件,以及其他的DLL(.NET动态连接库)。
(2)操作系统装载器根据前面PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到mscoree.dll(.NET平台的核心支持DLL)的_ CorExeMain()函数入口。
(3)CorExeMain()函数开始执行PE文件中的中间语言代码。这里的执行的意思是通用语言运行时按照调用的对象方法为单位,用即时编译器JIT将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。
程序的执行过程中,垃圾收集器负责内存的分配,释放等管理功能。
程序执行完毕,操作系统卸载应用程序。
C C++ Java C# JS编译、执行过程的原理入门分析的更多相关文章
- java代码的编译执行过程
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 动图+源码,演示 Java 中常用数据结构执行过程及原理
阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想 ...
- 【JS】js引擎执行过程
概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...
- C#编译执行过程
前言 大家好,我是卫斯理(Wesley).喜欢武侠的朋友可能知道小说中也有个卫斯理,他是位冒险家,财力充沛,极富冒险精神,并且有着超强的好奇心,对奇异的事情总有"打破沙锅问到底"的 ...
- C程序编译执行过程
C程序编译执行过程 认识C编译执行过程,是C学习的开端. 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码. 连接-- ...
- go 编译:交叉编译&编译执行过程
1. 交叉编译 编译Windows程序和mac程序 GOOS=windows GOARCH-amd64 go build main.go 转自:https://www.cnblogs.com/mafe ...
- c语言编译执行过程
<h4>认识C编译执行过程</h4>认识C编译执行过程,是C学习的开端.简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标 ...
- 四、Struts2的执行过程和原理
执行过程和原理(可能面试题) 学习目标:熟知struts2的执行过程(下图记住).源码可以不看 a.过滤器的初始化 .StrutsPrepareAndExecuteFilter是一个过滤器,过滤器就有 ...
随机推荐
- Arcgis api for javascript学习笔记(4.5版本)-三维地图并叠加天地图标注
1.三维地图实现 在官网的demo中就有三维地图的实现,如下图所示 <!DOCTYPE html> <html> <head> <meta charset=& ...
- 「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创
创建目录 首先,创建一个叫做 sshd_ubuntu 的目录,用于存放我们的 Dockerfile .脚本文件.以及其它文件. $ mkdir sshd_ubuntu $ ls sshd_ubuntu ...
- Facebook巴特尔与谷歌移动广告 急于打开中国市场
随着Facebook(62.5, -0.69, -1.09%)即将设立了销售办事处在北京发酵消息.谷歌(556.33, 2.43, 0.44%)似还差点自觉保护国内市场. 6月5日,谷歌在深圳举行了面 ...
- Android--数据持久化存储概述
Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...
- IT引导学生成长的文章链接(十二)
链接:IT学子成长指导类文章链接(1)(2)(3) (4) (5)(6)(7)(8)(9)(10)(11) "IT学子成长指导"类我收藏过的好文(十二期:至2014年4月26日) ...
- UWP 中的各种文件路径(用户、缓存、漫游、安装……)
原文 UWP 中的各种文件路径(用户.缓存.漫游.安装……) UWP 提供了多种不同文件路径访问方式,对应到不同的文件路径中.可能我们只是简单用 ApplicationData.Current 获取一 ...
- 1.跟着微软 https://docs.microsoft.com/zh-cn/dotnet/core/ 学习.net core
10分钟快速使用 安装之后 打开cmd 第一步. dotnet new console -o firstApp 第二步. cd firstApp 第三部.dotnet run 这样就运行了hello ...
- 方阵的迹(trace)及其微分(导数)
trace 的一个十分重要的性质在于线性性, Tr(A+B)=Tr(A)+Tr(B)Tr(cA)=cTr(A) 1. 基本性质 Tr(A)=Tr(AT) Tr(AB)=Tr(BA) Tr(ABC)=T ...
- python3 基本使用多线程
#coding=utf-8 import threading #进口threading from time import sleep import time def task1(): print (& ...
- 在运行Hfile的MR如果任务client结束OOM
在运行MR将HDFS转换成HFile什么时候.例如,会发生以下的异常: 14/07/09 18:02:59 INFO mapred.JobClient: map 83% reduce 0% 14/0 ...