2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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:455619

评论

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

直播回顾 | 传统应用进行容器化改造,如何既快又稳?

BoCloud博云

云原生 容器云 应用

OSPO如何帮助保护你的软件供应链

安势信息

开源 DevOps 开源社区 SCA opensource

Executor

急需上岸的小谢

6月月更

一文读懂当今AI圈大热的“MLOps”

澳鹏Appen

人工智能 机器学习 大数据 数据标注 运维开发

如何方便的将小程序转换成APP

Geek_99967b

小程序 小程序容器

博云《应用上容器指南》首发!详解应用容器化改造

BoCloud博云

容器 云原生 容器云 应用

在万家灯火阑珊处,重新认识平板电脑

脑极体

养老金融政策频出,市场有多大?

易观分析

养老消费

俄航天局局长:外星生命或正在研究人类文明

Dylan

俄罗斯 外星人 航天局

工业互联网生态建设加速,小程序容器技术跨端开发特性助力突围

Speedoooo

跨端开发 软件安全 降本增效 敏捷迭代 多端运行

华为云Stack首席架构师:打造“称手”的数字化工具,答好政企IT数字化转型这道必选题

华为云开发者联盟

云计算 数字化转型 多云管理 华为云Stack

用FinClip实现App小程序微信授权登录详解

Geek_99967b

小程序 小程序容器

UI自动化测试框架搭建-优化企业微信通知

伤心的辣条

Python 程序员 软件测试 自动化测试 UI自动化

三星堆重大发现!信息量巨大

Dylan

三星堆 四川省 文物

Lazada的算法本土化实践:让东南亚没有难投放的广告

科技新知

换掉bpmn-js,让前端更熟悉工作流业务

相续心

前端 流程图 workflow

gRPC C++开发环境搭建

赖猫

c c++ gRPC

测试员该知道的软件测试流程,你都知道吗?

伤心的辣条

Python 程序员 软件测试 IT 自动化测试

力扣每日一练之二分查找Day7

京与旧铺

后端 6月月更

剑指offer系列——剑指 Offer 49. 丑数

未见花闻

6月月更

剑指 Offer 58 - II. 左旋转字符串

未见花闻

6月月更

ConcurrentHashMap 源码分析-扩容

zarmnosaj

6月月更

3 个技巧来破解你可以立即使用的 Flutter 生产力!

坚果

6月月更

想学好软件测试,这些软件必不可少

伤心的辣条

Python 程序员 程序人生 软件测试 自动化测试

想秀你就秀!环信MVP招募计划正式启动,诚邀您加入!

环信

IT 即时通讯 IM 技术分享

看完就会,从抓包到接口测试的全过程解析

伤心的辣条

程序员 自动化测试 接口测试 测试开发 Python自动化

信用卡业务愈卷愈烈,银行机构如何突围?

易观分析

信用卡业务

Notebook在复现数据科学研究成果中的丝滑使用

Baihai IDP

AI notebook 数据科学 科研成果

投稿开奖丨云服务器ECS征文活动(3月)大奖公布

阿里云弹性计算

DNS 云服务器 ECS DoH

让你驱动力开机工作了,不是在待机状态。

叶小鍵

实时数仓实战

鲸品堂

数据 实时数仓

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