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. 升级pip后,出现ImportError:cannot import name main

    升级pip后,出现ImportError错误,如下图: 解决方法: sudo gedit /usr/bin/pip 进去后修改为 from pip import __main__ if __name_ ...

  2. 在本地搭建hyperledger fabric 网络

    参考了官方文档,直接就可以了https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 很好用 ➜ ~ cd $GOP ...

  3. GIS地理处理脚本案例教程——批量栅格分割-批量栅格裁剪-批量栅格掩膜-深度学习样本批量提取

    GIS地理处理脚本案例教程--批量栅格分割-批量栅格裁剪-批量栅格掩膜-深度学习样本批量提取 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 关键 ...

  4. Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别

    UTF-8是使用1~4个字节,一种变长的编码格式,字符编码.mb4即 most bytes 4,使用4个字节来表示完整的UTF-8. mysql的 utf8 编码最大字符长度为 3 字节,如果遇到 4 ...

  5. Tomcat Response encode

    Character Encoding - Apache Tomcat - Apache Software Foundation https://cwiki.apache.org/confluence/ ...

  6. jdk1.7 64位官方下载

    平时要新装一个系统环境,或者下载最新的jdk,就需要到oracle官网去下载一个jdk,而目前生产环境都是1.7的环境下开发完成的,需要下载1.7版本的jdk,oracle官方网站的默认下载页面是1. ...

  7. Spring cloud微服务安全实战-7-9自定义日志采集的格式和内容

    怎么来控制输出的日志的格式.并且从日志里面提取出来我想要的一些信息. 整个的message是一个大的json格式字符串. 虽然是可以通过关键字搜索到.但是日志看起来并不舒服. 在我们的控制台,日志实际 ...

  8. Nginx 配置 HTTPS SSL

    配置文件如下:[可以在阿里云上申请免费证书] #user nobody; worker_processes 1; events { worker_connections 1024; } http { ...

  9. JVM 线上故障排查基本操作--内容问题排查

    内存问题排查 说完了 CPU 的问题排查,再说说内存的排查,通常,内存的问题就是 GC 的问题,因为 Java 的内存由 GC 管理.有2种情况,一种是内存溢出了,一种是内存没有溢出,但 GC 不健康 ...

  10. 通过自定义EasyNVR的Logo、标题、版权等相关信息构建属于自己的摄像机网页视频直播服务

    随着互联网基础设施建设的发展,4G/5G/NB-IoT各种网络技术.物联网技术的大规模商用,视频随时随地可看.可控.可回溯的诉求越来越多,互联网思维.架构和技术引入进传统监控行业里,成为新形势下全终端 ...