C#是怎么跑起来的
解释流程前,需要了解一些基本的概念。
基本概念解释:
CPU :中央处理器,计算机的大脑,内部由数百万至数亿个晶体管组成,是解释和运行最终转换成机器语言(二进制代码)的地方。机器语言是通过CPU内存的寄存器来处理的,不同的类型的CPU,其内部的寄存器的数量、种类以及寄存器存储的数值范围都是不一样的。根据功能的不同,大致分为8类:

对于程序员来说,CPU是具有各种功能的寄存器的集合体,其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。
需要注意的是CPU的种类是特别重要的参数,CPU只能解释其自身固有的机器语言(指令集),不同的CPU能解释的机器语言的种类也是不同的。如CPU的主要厂商是Intel 和 AMD,前者基于x86指令集,后者基于ARM指令集,其中的区别大家有兴趣可以移驾:https://zhuanlan.zhihu.com/p/95028674
同时要买CPU可以参照核心/线程,主频,多级缓存等参数来选择。
内存:计算机的主存储器(主存),负责存储指令和数据,通过控制芯片等与CPU相连,由可读写的元素构成,每个字节都带有一个地址的编号,CPU可以通过该地址读取主存中的指令和数据,也可以写入数据。指令和数据是有时效性的,会随着计算机的关机而自动清除。
操作系统:程序员并不需要编写操作指令来完成计算机硬件的相关操作,比如键盘鼠标显示器的输入输出等等,也不需要关系内存和IO的不同的构造,因为这些都是通过操作系统的指令来完成的,操作系统克服了除了CPU以外的其他相关硬件的差异,一种操作系统只能支持特定的cpu(比如windows操作系统主流版本支持x86架构的CPU,ARM架构适合嵌入式的liunx操作系统,liunx一般也是用x86),同时操作系统需要为不同的机型分别提供不同的版本。同样的机型,也可以安装不同的操作系统,而应用软件则必须根据不同的操作系统类型来专门开发,因为操作系统的类型不同,应用程序向操作系统传递的指令途径(API)是不同的。以下列举windows对程序员有意义的一些特征:
- 32/64位版本操作系统,数字表示处理效率最高的数据大小
- 通过API函数集来提供系统调用,API通过各个dll文件来提供,各个API的实体都是C语言编写的函数
- 提供采用了图形用户界面的用户界面
- 通过WYSIWYG实现打印输出
- 提供多任务功能,通过时钟分割技术来实现多任务功能,就是多个应用程序“同时运行”(短时间间隔内多个程序切换运行)
- 提供网络功能及数据库功能
- 通过即插即用实现设备驱动的自动设定
运行环境:操作系统 + 硬件。每次下载一个软件的时候,都会让你选择基于什么的运行环境(操作系统+硬件:如基于windows7 版本以上,需要1G以上内存,500M以上的磁盘空间)来下载不同的安装包,代码需要在特定的运行环境中才能执行。
代码运行的流程:
C#是一门高级编程语言,作用是编写程序,而程序是指示计算机每一步动作的一组指令,由指令和数据构成(如:WriteLine("hello") 程序中,WriteLine 是指令,"hello"是数据),需要转换成能够被CPU可以直接识别并使用的机器语言(二进制码)。程序(代码)是存放在硬盘和磁盘等媒介上的,而被CPU执行的程序需要在内存中存储(从磁盘中复制到内存)。而内存是保存命令和数据的场所,通过地址来标记和指定。
用编程语言写好的程序,是需要运行环境才能跑起来,运行环境需要操作系统和计算机硬件支持,如果运行环境不同,程序是无法运行的,例如,MacOs,windows,linux系统上的运行的应用程序基本上不能拿在另一个操作系统中运行的。因为不同的操作系统提供出来的API是有差异的,因此,将同样的代码移植到其它的操作系统中,就必须重写应用中利用API的部分,像键盘的输入,鼠标的输入,显示器的输出,文件的输入和输出等外围设备进行输入输出的功能,都是操作系统提供出API供程序员调用。同类型的操作系统下,不管硬件如何,API基本上没有差别。因而,针对某特定操作系统的API所编写的程序,在任何硬件上都可以运行。当然,由于CPU种类不同,机器语言也不相同,因此本地代码当然也是不同的。这种情况下,就需要利用能够生成各CPU专用的本地代码的编译器,来对源代码进行重新编译了。那么有没有方法可以让程序员写的代码,在不同环境下执行呢,经验告诉你肯定是可以的,实现原理是只需要根据不同的环境开发出不同的CLR运行时就可以实现跨平台,像java语言,对应就有不同环境的Java虚拟机JVM。
C#写的代码是怎么样变成CPU可以执行的机器码呢,流程图如下:

C# 源代码文件经过编译器生成程序集文件,文件包含了以下内容
- 标准的Windows PE32或者PE32+头,能在windows的32位或者64位版本上运行,如果是PE32+的文件,只能在64位版本上运行
- CLR头。包含使这个模块称为托管模块的信息,头部包含要求的CLR版本,一些标识flag,托管模块入口方法等等
- 元数据,包含2种元数据表,一种描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员。
- IL中间语言代码,编译器编译源代码生成的代码。
微软创建了好几个面向“运行时”的语言编译器,能够将 C++/CLI,C#,Visual Basic ,F#等语言编译成供CLR运行的IL语言,承载了多语言的特点,后面可以只开发出面向CLR编程的高级语言。
其中:C#源码编译为程序集的过程为编译时,程序集被JIT编译器编译为本地代码,被操作系统调度CPU所执行的过程被称为运行时。CLR 中的JIT编译器将IL编译成该平台下的CPU指令
.NET 平台下面,微软官方只开发了Windows下面运行的CLR,没有开发其他平台的CLR,所以不能做到跨平台,但是在非官方的渠道下,Xamarin公司为了能把.Net做成跨平台,开发了mono虚拟机,虚拟机包含了一个实时编译引擎,该引擎可用于x86, SPARC, PowerPC, ARM等处理器,后被微软收购。后来微软由于战略的更改,拥抱开源和跨平台,重新开发和定义了.Net FrameWork的新一代版本---DotNetCore。如果需要将Core代码在各个平台上运行(跨平台),需要在官网上下载不同环境的运行时,如下图中的3个平台的运行时:

附java跨平台的实现:
CLR是.NET的核心组件,它在操作系统的顶层,负责管理程序的执行,功能如下:

C#是怎么跑起来的的更多相关文章
- jq跑马灯效果
这几天公司产品有个无缝循环滚动的广告跑马灯要做,最开始想到的是<marquee>标签,但在PC端正常,在安卓广告屏上却怎么都跑不动,后来用的css3的animation,结果也是PC端及其 ...
- fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
andrew,20130601,guilin 本文记录在树莓派(fedora)上部署ASP.NET MVC2 的过程. 本文共分为六部分,分别是前置条件,Apache的安装,Mysql的安装,安装mo ...
- 如何让我们的PHP在Jexus中跑起来
最近一段时间,经常看到不少的朋友在问,应该怎么设置才能够让Jexus支持PHP.其实,Jexus在很早之前就已经是可以支持PHP,像Apache或Nginx一样充当PHP的Web服务器的.不过由于没有 ...
- [Intel Edison开发板] 03、Edison开发IDE入门及跑官方提供的DEMO
一.启动Eclipse爱迪生开发板IDE eclipse开发环境在iss-iot-win_03-14-16中,但是一定每次都是点bat脚本启动,否则就会少东西(windows->preferen ...
- JavaScript的基准测试-不服跑个分?
原文:Bulletproof JavaScript benchmarks 做JavaScript的基准测试并没有想的那么简单.即使不考虑浏览器差异所带来的影响,也有很多难点-或者说陷阱需要面对. 这是 ...
- Android-TextView跑马灯效果
要实现跑马灯还是比较简单的. 同时有几个需要注意的点,先上代码: public class MTView extends TextView { public MTView(Context contex ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统
系列目录 这一节我们来跑通整个系统,验证的流程,通过AOP切入方式,在访问方法之前,执行一个验证机制来判断是否有操作权限(如:增删改等) 原理:通过MVC自带筛选器,在筛选器分解路由的Action和c ...
- 在CentOS 7上安装.NET Core R2跑Hello World
前言 在上个月.NET Core出了最新版本预览版,只是在Window系统上试验了一下.原本想等发布正式版的时候在linux系统上试试,可能还需要一段时间,刚好有空可以折腾一下. 由于之前安装的Ubu ...
- jQuery+CSS3文字跑马灯特效
jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向. 效果展示 http://hovertree.com/te ...
- 洛谷P2256 一中校运会之百米跑
题目背景 在一大堆秀恩爱的**之中,来不及秀恩爱的苏大学神踏着坚定(?)的步伐走向了100米跑的起点.这时苏大学神发现,百米赛跑的参赛同学实在是太多了,连体育老师也忙不过来.这时体育老师发现了身为体育 ...
随机推荐
- 使用Azure API Management, Functions, Power Apps和Logic App构建应用
ASP.NET OpenAPI 可以非常方便的将我们的Web API项目自动文档化,除了自动文档化以外,我们还可以利用Azure API Management将Open API自动文档化了的Web A ...
- 为了效率,我们可以用的招数 之 strlen
如果要你写一个计算字符串长度的函数 strlen,应该怎么写?相信你很容易写出如下实现: 1 int strlen_1(const char* str) { 2 int cnt = 0; 3 4 if ...
- Python代码简化
让代码更Pythonic 当然不要过分追求简洁,不然阅读的人就遭殃了, 部分逻辑复杂的情况还应按照清晰的逻辑脉络去写方便阅读, 毕竟我们是用代码实现功能然后维护,而不是单单的炫技. ######### ...
- 墙裂推荐:这可能是CAP理论的最好现实解释
这篇文章蓝本:http://ksat.me/a-plain-english-introduction-to-cap-theorem 经过小码甲意译.原创配图, 干到让你怀孕. 你可能经常听到CAP定理 ...
- Qt中检查槽函数connect是否正确
环境:VS2017+Qt插件 一般情况下VS+QT环境下运行的QT程序输出信息需要在调试模式的输出栏可以看到,由于太多信息所以导致查看不方便(当然也可以在筛选选项中筛选信息). 有更方便查看输出信息的 ...
- 计算机网络——RIP协议:距离向量算法
路由信息协议(RIP)是内部网关协议(IGP)中使用最广泛的一种协议,它是一种分布式.基于距离向量的路由选择协议,其特点是协议简单.它要求路由器周期性地向外发送路由刷新报文.路由刷新报文主要内容是由若 ...
- Oralce注入 bypass waf出数据
发存货: 探测banner 版本号: ' and (SELECT banner FROM v$version where rownum=1) like 'O%' and '1'like'1 rownu ...
- [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo
2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...
- 什么是响应式web设计
什么是响应式web设计 现在开发一个产品,基本上都会需要兼顾 PC端和 移动端. 一般有两种思路: 1.为每个终端做一个特定的版本,并给2级域名,根据终端环境调用不同的版本代码. 2.一个网站能够兼容 ...
- 【Java】说说你对ThreadLocal的理解
思路: 0.ThreadLocal是什么?有什么用? 1.ThreadLocal用在什么地方? 2.ThreadLocal的一些细节 3.ThreadLocal的最佳实践 一.ThreadLocal用 ...