跨平台语言运行原理
在任何一个平台(操作系统+硬件体系)上,编写和运行程序的三个最根本的需求是库、编译器/解释器(如将c#编译为IL即DLL或者java编译为class字节码)、运行环境(如CLR或者JVM)
。库以类和方法(函数)的形式提供常用的例程,简化大型程序的编写。.NET框架也不例外,包含了许多类库。另外,把程序转换成可执行形式以及运行执行文件时,编译器和运行环境是必不可少的。
简而言之跨平台就需要你语言在编译后的中间结果后,在任意目标平台上实现可以运行这个中间结果的程序即可。
.net相关历史介绍
2002年微软发布的.net framework
(至今更新到4.8),只针对window平台
,其主要包含管理代码执行的 CLR (公共语言运行时)
和为构建应用程序提供丰富类库的 BCL (基础类库)
2016年微软发布.net core
,完全开源,实现了跨平台,.net core
因此需要针对不同平台打包CLR(通用语言运行时)
, 其包含 CLR
的跨平台实现 CoreCLR
和一个相比 BCL
更简化
的类库 CoreFX
,最新是.net core 3.1
之后被更名为.net5
2020年微软发布.net5.0
,整合了.net core,实现大一统
mono
Mono 是一个第三方的 .NET Framework 开源实现,它是跨平台的,但是它的实现进度远远落后于官方实现。
类库:包含了.NET类库的一部分,落后给官方实现
编译器:高级语言转为IL 的⼯作实际上可以直接⽤微软已有的成果,这个是通用的,肯定落后官方
运行时:Mono是将 CLR 在其他平台实现,就是跨平台,这个⼯作量不仅⼤,⽽且需要保证兼容,⾮常浩⼤的⼀个⼯程,Mono 做到了,致敬!
dotnet5.0+跨平台实现demo
c#demo
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!输入Q退出。");
while (true)
{
string str = Console.ReadLine();
if (str.ToLower() == "q")
{
break;
}
else
{
Console.WriteLine("输入Q退出。");
}
}
}
}
}
linux上安装.net5以上版本后运行这个程序
root@debiantest1:/data/demo1# dotnet ConsoleApp1.dll
Hello World!输入Q退出。
参考 https://www.cnblogs.com/zhupengfei/p/16086032.html
后续同样使用mono linux平台的CLR也可以运行dll、exe程序
备注一些补充概念
1.IL/CIL
编译器编译
: 使用C#书写的脚本会经过Mono或者.net平台的C#编译器
打包的中间语言,实际就是exe或者dll文件(重要)
2.CLR
用于运行IL的