0. 机器码 直接由机器码对应平台的CPU执行的指令集, 因此无法在其他指令集的CPU上运行. 无法跨平台. 由本地代码编译得到. (托管代码通过JIT生成)

1. 字节码 即 bytecode 是一种中间码. 一般由JIT编译器解释编译成机器码再在本机上执行. 可以跨平台.

2. CLR = 公共语言运行库CLR (Common Language Runtime) .net 框架下多种语言的统一运行框架(虚拟机). 和Java VM 类型的运行时环境. 相当于所有的.net 语言(C#, VB.NET, ASP之类的) 的底层引擎. 可以协调这类语言的统一运行机制.

  框架可以把上述语言都转换为IL(中间语言 Intermediate Language). 然后再由JIT编译器(Just In Time Complier 即时编译器) 边执行边解释编译成机器码执行. 从而形成大一统的环境, 实现运行时根据平台编译生成机器码的跨平台的特性.

图片From https://www.cnblogs.com/msxh/p/7819645.html

3. IL(中间语言 Intermediate Language) 一种用于 .net框架下所有语言统一转化得到的语言. 可以由JIT解释执行, 实现跨平台.  如上述链接

4. 托管代码 = managed code =  公共语言运行库CLR (Common Language Runtime) 环境下执行的代码, 基于.net framework的代码. 受CLR的托管. 不需要程序员关心GC之类的内容.

通俗说就是.net平台下的开发, 都属于托管代码. 比如我们写的Unity的C#. 编译结果是bytecode(字节码)

  优点: 程序猿不需要关心GC, 指针之类的头疼事情, 有丰富的封装, 框架提供的类库之类的.

  缺点: 有便利就失去了灵活性和自主性, 严格按规矩办事. 学会和各种.net框架版本友好相处.

5. 非托管代码 = Native Code = 本地代码 即: 没有.net虚拟机(或者JVM) 管理执行的代码. 编译结果是特定平台的机器码. 不能一次编译跨平台执行. 每个平台需要单独编译.

 直接由OS执行. 由程序员自己管理(GC等), 直接和OS打交道的开发. 比如我们写的C++ Native DLL.

https://baike.baidu.com/item/native/13128691

https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81

  优点: 运行效率高. 高度灵活性, 高度自治, 执行各种底层操作. 只有想不到, 没有做不到.(依赖OS)

  缺点: 刀尖上跳舞, 注意安全. 需要工具自己造(找).

6. unsafe = 不安全代码 = .net 托管代码中实现一些CLR不支持的(无法管理, 不保证安全), 非托管代码才有的功能. 比如指针. 必须用unsafe关键字包起来才可以使用.用于告诉CLR和程序员自己, 这块代码是非安全的.

 不安全代码并不是说"不安全", 只是从设计者(程序员)的角度来看是清楚的, 安全的. 必须用关键字包起来是避免程序员无意识间使用到了非安全的编码方式.

 也可以标识出非安全的代码段, 提供一些非安全的编程特性(fixed). 避免CLR按管理一般托管代码的方式去管理该段代码, 引起不符合程序员的设计思路的后果.

   也许是为了实现CLR类型安全的目标吧,默认情况下,C#没有提供指针的使用算法,但是有些情况下也可能需要指针这样直接访问内存的东西(虽然目前我还没有用过),但是有时候程序员非常清楚程序的运行状况,需要使用指针直接访问内存以便于提高性能或者调试、监控程序运行的内存的使用状况,以便于采取相应的措施。还有一些情况是当我们需要调用外面DLL中的函数又不能使用DllImport 时,也需要指针来传递这些函数。

引用自:https://www.cnblogs.com/lgx5/p/7353346.html

Unsafe code is in fact a "safe" feature from the perspective of both developers and users. Unsafe code must be clearly marked with the modifier unsafe, so developers can't possibly use unsafe features accidentally, and the execution engine works to ensure that unsafe code cannot be executed in an untrusted environment.

引用自: MS DOC:  https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/unsafe-code

7. fixed = 固定变量, 锁定指针对应变量的内存地址, 避免CLR GC移动该变量的位置.

fixed 语句设置指向托管变量的指针,并在执行该语句期间"固定"此变量。这样就可以防止变量的重定位

引用自:https://www.cnblogs.com/lgx5/p/7353346.html

https://www.cnblogs.com/DswCnblog/p/5329576.html

机器码-字节码-CLR-JIT-托管代码-非托管代码-unsafe-GC-fixed的更多相关文章

  1. JVM 内部原理(七)— Java 字节码基础之二

    JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  2. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  3. 【计算机基础】IL代码-CLR平台上的字节码【什么是字节码?它与虚拟机的关系?】

    字节码(英语:Bytecode)将虚拟机可以读懂的代码称之为字节码.将源码编译成虚拟机读的懂的代码,需要虚拟机转译后才能成为机器代码的中间代码 叫做字节码. 字节码主要为了实现特定软件运行和软件环境. ...

  4. JVM总括三-字节码、字节码指令、JIT编译执行

    JVM总括三-字节码.字节码指令.JIT编译执行 目录:JVM总括:目录 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲 ...

  5. 第六章 字节码执行方式--解释执行和JIT

    注:主要参考自<分布式java应用:基础与实践><深入理解Java虚拟机(第二版)> 1.两种执行方式: 解释执行(运行期解释字节码并执行) 强制使用该模式:-Xint 编译为 ...

  6. 字节码执行方式--解释执行和JIT

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.两种执行方式: 解释执行(运行期解释字节码并执行) 强制使用该模式:-Xint 编译为机器码执行(将字 ...

  7. 源代码 VS 汇编代码 VS 目标代码 VS 字节码 VS 机器码

    1.源代码(source code) 源代码就是平时我们开发的代码:比如C.Java.Python.Shell...等 public class HelloWorld { public static ...

  8. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  9. java编译过程(字节码编译和即时编译)

    Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...

随机推荐

  1. devops 运维平台相关知识

    1.https://choerodon.io/zh/community/ (代码 https://github.com/choerodon/choerodon) 猪齿鱼 2.https://www.o ...

  2. arcgis python 获得硬件id

    import time import wmi, zlib def get_cpu_info(): tmpdict = {} tmpdict["CpuCores"] = 0 c = ...

  3. NLP自然语言处理

    转:https://blog.csdn.net/qq_17677907/article/details/86448214 1.有哪些文本表示模型,它们各有什么优缺点?   文本表示模型是研究如何表示文 ...

  4. 【mybatis源码学习】ResultMap查询结果映射

    一.ResultMap包含的元素 constructor - 用于在实例化类时,注入结果到构造方法中 idArg - ID 参数:标记出作为 ID 的结果可以帮助提高整体性能 arg - 将被注入到构 ...

  5. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

  6. SEO前端篇(二)关键词

    首先要SEO的关键词最好放在网站首页index,并且网站域名选用顶级域名,最好是.com.现在很多后缀的域名不能备案,选择域名的时候一定要慎重. 域名解析的主机IP最好选择站点资源少的区域,可以用 爱 ...

  7. 大名鼎鼎的UniDAC手工安装

    第一次开博,该写点什么.由于懒,很多事情,都不想动.不过,懒不能解决遗忘的毛病.还是动手,记录一下吧. 好了,言归主题. UniDAC 的手工安装. 现在Delphi,已经发展到了XE6,支持多种移动 ...

  8. [LeetCode] 247. Strobogrammatic Number II 对称数II

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  9. JIT(just in time)即时编译器

    JIT(just in time) 前端vs后端 在编译原理中,通常将编译分为前端和后端.其中前端会对程序进行词法分析.语法分析.语义分析,然后生成一个中间表达形式(称为IR:Intermediate ...

  10. mysql查询之 用户行程的取消率,人流量高峰时段

    1.用户行程的取消率 Trips 表中存所有出租车的行程信息.每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键.Status 是枚举类 ...