写点什么

C# 是如何执行的?你应该知道这些

  • 2019-10-28
  • 本文字数:1812 字

    阅读完需:约 6 分钟

C# 是如何执行的?你应该知道这些

为什么 Unity3D 可以运行 C#,C# 和 Mono 是什么关系,Mono 和 .Net Framework 又是什么关系?我们深入的来聊一聊这个话题!

从编译原理说起

一句话介绍编译器:编译器是将用某种程式语言写成的源代码(源语言),转换成另一种程式语言(目标语言)等价形式的程序。通常我们是将某种高级语言(如 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 代码(通过任意平台编译)。


理论上,你创造了一门语言,并且实现了某一平台下的编译器,然后实现了所有平台下符合语言规范的虚拟机,你的语言就可以运行在任意平台啦。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/pe0VR5wke9UB-a5BDmVRGQ


2019-10-28 16:454914

评论

发布
暂无评论
发现更多内容

如何构建 Sidecarless 模式的高性能服务网格

阿里巴巴云原生

阿里云 云原生 asm

华为云828企业节:助力精细化运营,提升开发效率

mecchi

小程序 云主机 云服务器 网站建设 云电脑

08.25 北京站|阿里云 Serverless 技术实践营( AI 专场)开放报名

阿里巴巴云原生

阿里云 Serverless 云原生

面部表情识别技术在社交互动中的应用

数据堂

Sentieon安装时 jemalloc error 解决办法

INSVAST

代码 教程分享 基因

Sentieon | 应用教程: 使用DNAscope对HiFi长读长数据进行胚系变异检测分析

INSVAST

教程分享 Hifi DNAscope

数据分析实战│时间序列预测

TiAmo

数据挖掘 算法 数据分析

茶桁的AI秘籍 - 人工智能数学基础篇 导言

茶桁

人工智能 数学 math

PrecisionFDA:多组学样本错标校正挑战赛

INSVAST

数据分析 PrecisionFDA

面部表情识别的技术挑战与解决方案

数据堂

八月更新 | CI 构建计划触发机制升级、制品扫描 SBOM 分析功能上线!

CODING DevOps

一文读懂 Nuxt.js 服务端组件

树上有只程序猿

React nuxt

提升UMI分析精度和计算效率:Sentieon UMI分子标记处理模块

INSVAST

umi 基因数据分析 技术服务

Sentieon发布RNAseq加速分析方案

INSVAST

数据分析 基因测序 RNAseq

Sentieon数据质控QC模块介绍

INSVAST

数据分析 QC 质控工具

面部表情识别技术的神经科学基础

数据堂

微服务引擎 MSE 全新升级,15 分钟快速体验微服务全栈能力

阿里巴巴云原生

阿里云 微服务 云原生

富士胶片公司完成阿里云 PolarDB 数据库开源产品兼容适配

阿里云数据库开源

polarDB PolarDB for PostgreSQL 阿里云PolarDB

Apache Dubbo 和 Apache RocketMQ 邀您参与,ASF 亚洲峰会 5 张门票免费送

阿里巴巴云原生

阿里云 云原生

Sentieon | 每周文献-Gene Editing(基因编辑)-第六期

INSVAST

数据分析 基因测序 基因编辑

如何构建适合自己的DevOps软件测试改进方案

DevOps和数字孪生

DevOps

Sentieon软件应用之公共卫生机构

INSVAST

公共卫生 基因数据分析

小灯塔系列-中小企业数字化转型系列研究——协同OA测评报告

向量智库

Sentieon | 每周文献-Epidemiology(流行病学)-第五期

INSVAST

基因测序 基因数据分析 流行病学

What's new in Pika v3.5.0

apache/dubbo-go

数据库 redis kv Redis 7 KV存储

C# 是如何执行的?你应该知道这些_文化 & 方法_易立_InfoQ精选文章