C# 运行流程
转载 https://www.cnblogs.com/qcloud1001/p/9816956.html
从编译原理说起
一句话介绍编译器:编译器是将用某种程式语言写成的源代码(源语言),转换成另一种程式语言(目标语言)等价形式的程序。通常我们是将某种高级语言(如C、C++、C# 、Java)转换成低级语言(汇编语言、机器语言)。
编译器以流水线的形式进行工作,分为几个阶段:源代码 → 词法分析 → 语法分析 → 语义分析 → 目标代码 → 链接 → 可执行文件。现代编译器还会更复杂,中间会增加更多的处理过程,比如预处理器,中间代码生成,代码优化等。


虚拟机是什么
虚拟机(VM),简单理解,就是可以执行特定指令的一种程序。为了执行指令,还需要一些配套的设施,如寄存器、栈等。虚拟机可以很复杂,复杂到模拟真正的计算机硬件,也可以很简单,简单到只能做加减乘除。
在编译器领域,虚拟机通常执行一种叫中间代码的语言,中间代码由高级语言转换而成,以 Java 为例,Java 编译后产生的并不是一个可执行的文件,而是一个 ByteCode (字节码)文件,里面包含了从 Java 源代码转换成等价的字节码形式的代码。Java 虚拟机(JVM)负责执行这个文件。
虚拟机执行中间代码的方式分为 2 种:解释执行和 JIT(即时编译)。解释执行即逐条执行每条指令,JIT 则是先将中间代码在开始运行的时候编译成机器码,然后执行机器码。由于执行的是中间代码,所以,在不同的平台实现不同的虚拟机,都可以执行同样的中间代码,也就实现了跨平台。
int run(context* ctx, code* c) {
for (cmd in c->cmds) {
switch (cmd.type) {
case ADD:
// todo add
break;
case SUB:
// todo subtract
break;
// ...
}
}
return 0;
}
总结一下,虚拟机本身并不跨平台,而是语言是跨平台的,对于开发人员来说,只需要关心开发语言即可,不需要关心虚拟机是怎么实现的,这也是 Java 可以跨平台的原因,C# 也是同样的。推而广之,理论上任何语言都可以跨平台,只要在相应平台实现了编译器或者虚拟机等配套设施。
C# 是什么,IL 又是什么
C# 是微软推出的一种基于 .NET 框架的、面向对象的高级编程语言。微软在 2000 年发布了这种语言,希望借助这种语言来取代Java,更多详细的介绍可以参看 C# Wiki。
C# 是一个语言,微软给它定制了一份语言规范,提供了从开发、编译、部署、执行的完整的一条龙的服务,每隔一段时间会发布一份最新的规范,添加一些新的语言特性。从语法层面来说,C# 是一个很完善,写起来非常舒服的语言。
C# 和 Java 类似,C# 会编译成一个中间语言(CIL,Common Intermediate Language,也叫 MSIL),CIL 也是一个高级语言,而运行 CIL 的虚拟机叫 CLR(Common Language Runtime)。通常我们把 C#、CIL、CLR,再加上微软提供的一套基础类库称为 .Net Framework。

C# 天生就是为征服宇宙设计的,不过非常遗憾,由于微软的封闭,这个目标并没有实现。当然 C# 现在还过得很好,因为游戏而焕发了新的活力,因为 Unity3D,因为 Mono。
.Net Framework vs Mono
Mono 是跨平台的 .Net Framework 的实现。Mono 做了一件很了不起的事情,将 CLR 在所有支持的平台上重新实现了一遍,将 .Net Framework 提供的基础类库也重新实现了一遍。

以上,Compile Time 的工作实际上可以直接用微软已有的成果,只要将 Runtime 的 CLR 在其他平台实现,这个工作量不仅大,而且需要保证兼容,非常浩大的一个工程,Mono 做到了,致敬!
Unity3D 中的 C
Unity3D 内嵌了一个 Mono 虚拟机,从上文可以知道,当实现了某个平台的虚拟机,那语言就可以在该平台运行,所以,严格的讲,Unity3D 是通过 Mono 虚拟机,运行 C# 通过编译器编译后生成的 IL 代码。
Unity3D 默认使用 C# 作为开发语言,除此之外,还支持 JS 和 BOO,因为 Unity3D 开发了相应的编译器,将 JS 和 BOO 编译成了 IL。
小结
C# 在 Windows 下,是通过微软的 C# 编译器,生成了 IL 代码,运行在 CLR 中。
C# 在除 Windows 外的平台下,是通过 Mono 的编译器,生成了 IL 代码,运行在 Mono 虚拟机中,也可以直接运行将已经编译好的 IL 代码(通过任意平台编译)。
理论上,你创造了一门语言,并且实现了某一平台下的编译器,然后实现了所有平台下符合语言规范的虚拟机,你的语言就可以运行在任意平台啦。
C# 运行流程的更多相关文章
- react-native start 运行流程
在CMD下键入 C:\Node_JS\MyAwesomeProject>react-native start 运行流程: C:\Users\Grart\AppData\Roaming\npm\r ...
- 1、CC2541蓝牙4.0芯片中级教程——基于OSAL操作系统的运行流程了解+定时器和串口例程了解
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- java里的分支语句--程序运行流程的分类(顺序结构,分支结构,循环结构)
JAVA里面的程序运行流程分三大类: 1,顺序结构:顺序结构就是依次执行每一行代码 2,分支结构:分支结构就是按不同的条件进行分支 3,循环结构:一段代码依条件进行循环执行. 其中,分支结构有两大类: ...
- servlet运行流程
servlet运行流程 (2013-06-19 19:16:43) 转载▼ 首先Servlet被部署到Web容器中,当客户端发送调用这个Servlet的请求到达Web容器时,Web容器会先判 ...
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Struts2框架的运行流程
Struts2的运行流程 1.浏览器发送请求到控制器(如Struts2中的核心控制器StrutsPrepareAndExecuteFilter): 2.控制器调用Action的execute方法: 3 ...
- 转:[gevent源码分析] 深度分析gevent运行流程
[gevent源码分析] 深度分析gevent运行流程 http://blog.csdn.net/yueguanghaidao/article/details/24281751 一直对gevent运行 ...
- Struts2运行流程分析
一.Struts2运行流程图: 二.运行流程分析: 1. 请求发送给StrutsPrepareAndExecuteFilter 2.StrutsPrepareAndExecuteFilter询问Act ...
- Struts2的运行流程以及关键拦截器介绍
Struts2的运行流程 1.ActionProxy是Action的一个代理类,也就是说Action的调用是通过ActionProxy实现的,其实就是调用了ActionProxy.execute()方 ...
- hibernate的运行流程
首先了解什么是对象关系映射,ORM(Object/Relationship Mapping):对象关系映射.对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.是通过使用描述对象 ...
随机推荐
- SpringBoot之AOP使用
说到SpringBoot,难免会想到Spring.对于Spring,我曾用其开发过很多大大小小的项目.当使用SpringBoot之后,给人最直观的感受,用古人一句话:”大道至简”. SpringBoo ...
- 记一次phpmyadmin 4.8.1 远程文件包含漏洞(BUUCTF web)
题目很简单,一个滑稽 打开源码,发现存在source.php文件 于是访问文件,发现出现一串php源码 提示存在hint.php,于是访问发现一句话 flag not here, and flag i ...
- 深入SaltStack
[译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...
- DVT JetBrains License Server(JetBrains授权服务器)2018 v1.1 最新版 含32位/64位
DVT JetBrains License Server是JetBrains系列软件授权服务器,支持2017版本得jetbrains pycharm,JetBrainswebstorm,JetBrai ...
- grpc使用记录(二)简单同步服务实例
目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...
- Running MYSQL 5.7 By Bash On Ubuntu On Windows:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@PC-RENGUOQIANG:/usr/sbin# /etc/init.d/mysql start * Starting MySQL database server mysqld [ OK ...
- svn 清除用户名和密码
- spring data jpa使用@Transactional注解开启事务后失败不回滚
如题,在数据库批量操作方法上使用@Transactional注解,其中一条数据抛出异常了,却死活不回滚. 批量操作方法是公有的,spring也是默认支持事务的,排除代码层面问题,那么就看看数据库是否支 ...
- Struts2访问Servlet
知识点: servlet是单例的,Action是多例的,一次请求,创建一个Action的实例 结果页面分为全局和局部两类(局部优先级更高) result标签:name : 默认succestype : ...
- svg轻松实现文字水印
1. 水印图片生成采用svg,这样可以运行时生成名字或其他信息的图片 svg模板 <svg xmlns="http://www.w3.org/2000/svg" xmlns: ...