机器码-字节码-CLR-JIT-托管代码-非托管代码-unsafe-GC-fixed
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的更多相关文章
- JVM 内部原理(七)— Java 字节码基础之二
JVM 内部原理(七)- Java 字节码基础之二 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- JVM 内部原理(六)— Java 字节码基础之一
JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...
- 【计算机基础】IL代码-CLR平台上的字节码【什么是字节码?它与虚拟机的关系?】
字节码(英语:Bytecode)将虚拟机可以读懂的代码称之为字节码.将源码编译成虚拟机读的懂的代码,需要虚拟机转译后才能成为机器代码的中间代码 叫做字节码. 字节码主要为了实现特定软件运行和软件环境. ...
- JVM总括三-字节码、字节码指令、JIT编译执行
JVM总括三-字节码.字节码指令.JIT编译执行 目录:JVM总括:目录 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲 ...
- 第六章 字节码执行方式--解释执行和JIT
注:主要参考自<分布式java应用:基础与实践><深入理解Java虚拟机(第二版)> 1.两种执行方式: 解释执行(运行期解释字节码并执行) 强制使用该模式:-Xint 编译为 ...
- 字节码执行方式--解释执行和JIT
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.两种执行方式: 解释执行(运行期解释字节码并执行) 强制使用该模式:-Xint 编译为机器码执行(将字 ...
- 源代码 VS 汇编代码 VS 目标代码 VS 字节码 VS 机器码
1.源代码(source code) 源代码就是平时我们开发的代码:比如C.Java.Python.Shell...等 public class HelloWorld { public static ...
- [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析
[WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...
- java编译过程(字节码编译和即时编译)
Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...
随机推荐
- 【pytorch 代码】pytorch 网络结构可视化
部分内容转载自 http://blog.csdn.net/GYGuo95/article/details/78821617,在此表示由衷感谢. 此方法需要安装python-graphviz: con ...
- 3ds Max学习日记(十二)——用Maxscript将每一帧动画导出成obj
参考链接: is there a way to through maxscript to make the time slider go to a spacific frame? 最近老师布置了要用m ...
- arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...
- java开源工具包-Jodd框架
java开源工具包-Jodd框架 / 2019-07-24 Jodd是一个Java工具包和微型框架,Jodd 工具包含一些实用的工具类和小型框架,增强了 JDK 提供很多强大的功能,可以帮助实现 ...
- 026_如何在MAC下输入主要国家货币符号?
由于出国旅游啥的经常会记录一些东西,不避免的会遇到各种货币符号 一. 人民币: ¥(sogo输入法切换到中文模式,然后"shift键 + 4"即可) 美元: $(sogo输入法切换 ...
- ISO/IEC 9899:2011 条款6.10.2——源文件包含
6.10.2 源文件包含 约束 1.一个#include指示符应该指定一个能被实现处理的头文件或源文件. 语义 2.一个预处理指示符如下形式 # include <h-char-se ...
- 泡泡一分钟:Efficient Trajectory Planning for High Speed Flight in Unknown Environments
张宁 Efficient Trajectory Planning for High Speed Flight in Unknown Environments 高效飞行在未知环境中的有效轨迹规划链接: ...
- .py .pyc .pyd .pyw文件区别
- Python - Django - AJAX 实现 POST 请求
index.html: <input type="text" id="i1">+ <input type="text" i ...
- [LeetCode] 97. Interleaving String 交织相错的字符串
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1and s2. Example 1: Input: s1 = ...