.NET 8 AOT 与 LLVM 什么关系?
前言
.NET8的AOT为了支持各个平台,比如MacOS,Linux等平台,ILC(AOT Compiler)的目标文件用的是LLVM生成的。本篇看下。
公众号:jianghuht,欢迎关注
详述
为了更为细致的让大家了解LLVM在AOT里面的作用,这里用一个例子演示下。以下以最新版的.NET8.0/windows11为蓝本演示。
第一步:在nuget上面下载一个ILC组件,名称:runtime.win-x64.Microsoft.DotNet.ILCompiler
第二步:找到这个包在你当前电脑的路径,一般为如下,这个路径有个objwriter.dll:
C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.0\tools
第三步:操作objwriter.dll
新建一个.NET8控制台应用程序,把这个objwriter.dll放入到控制台bin/x64/debug/net8.0目录下。Main写入如下代码:
[DllImport("objwriter.dll")]
private static extern IntPtr InitObjWriter([MarshalAs(UnmanagedType.LPUTF8Str)] string objectFilePath, string triple = null);
[DllImport("objwriter.dll")]
private static extern void FinishObjWriter(IntPtr objWriter);
[DllImport("objwriter.dll")]
private static extern void EmitIntValue(IntPtr objWriter, ulong value, int size);
private IntPtr _nativeObjectWriter = IntPtr.Zero;
static void Main(string[] args)
{
IntPtr objectWriter = InitObjWriter("Demo.obj", "x86_64-pc-win32-windows");
EmitIntValue(objectWriter, 0x10, 4);
FinishObjWriter(objectWriter);
}
objwriter.dll通过LLVM_Project项目构建,应用于.NET8 ILC AOT里面。
以上代码运行之后,就会在控制台的bin/x64/debug/net8.0目录下面看到生成的目标文件Demo.obj。这个就是ILC调用LLVM生成的当前Windows平台(InitObjWriter的参数:x86_64-pc-win32-windows表示的是Windows目标文件)上面的目标文件,此后通过引导程序BootStrap(关于.NET8 AOT引导程序参考:.Net8的AOT引导程序BootStrap)链接下,即可生成独立的可执行文件。
以上就是LLVM在.NET8 AOT里面的简单应用。
题外话
微软从.NET7.0开始,就有意识的分离.NET里面的各个耦合度极高的组件。举个例子,比如说在.NET Framework里面GC和CLR分离是不可想象的,但是在.NET8.0里面,GC不仅和CLR分离,JIT也可以和CLR分离。进行独自定制。这些.NET核心组件通过动态链接库,也即是DLL的形式分发出来,可以让开发人员进行自由定制。
这里稍微列举下:
1.ILC的可移植性目标文件组件:objwriter.dll(本文所述)
2.分离的可定制GC组件:clrgc.dll(参考:自定义GC垃圾回收)
3.分离的可定制JIT组件:clrjit.dll(参考:自定义JIT即时编译)
4.分离的可定制CLR组件:coreclr.dll(参考:目前空白)
5.可自定义的运行时宿主组件:hostfxr.dll(参考:自定义宿主组件)
以上都可以进行自由定制,你在各个平台上(MacOS/Linux)看到的动态链接库DLL,都是有自定制进行各种平台的自由分发,比如国内外大热的Risc-V支持的新平台,比如国内的Arm64指令集平台等。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一个 38 岁程序员,在技术圈自由游曳
程超,一个 38 岁的程序员,面对互联网世界的暗流涌动,显得游刃有余。 最近,他正在忙着研究生毕业答辩,不过其生活节奏仍然非常规律:每天早上六点起床,跑步五到十公里;然后学英语背单词,已经坚持了七百六十多天;接着送孩子上学,再去上班,上班路上看技术文档或是练听力;晚上回去看看书,直到零点。 从事互联网行业 16 年,程超深耕支付、交易、订单等业务,颇擅长DevOps、AIOps、基础架构、稳定性建设、高并发等技术。因此,热衷于分享知识的他,在技术圈留下了不少足迹,除了用“小程故事多”的网名发布了诸多的技术博文之外,还主导了《高可用可伸缩微服务架构》一书,并合著有《深入分布式缓存——从原理到实践》,此外还翻译了《Spring5设计模式》。 此外程超还被多个技术社区所认可,获得过“腾讯云 TVP”“阿里云MVP 成员”“云智慧最有价值专家”等称号。 我们很想知道:在忙碌的工作之外,程超是如何达成这许多成就的;在职业生涯转折点,他的选择是什么;关于写作、出书、翻译,他有哪些心得可以分享;面对 AI 等新技术的到来,他又做了什么。为此,我们采访了程超,看看他如何在技术圈自由游曳。 程超,高级研...
- 下一篇
开源软件无法通过“更低价”获取市场
Lago 是一个用于基于计量和使用量的开源计费工具,提供了开源(自己本地部署)和 SaaS 版本。Lago 是专门针对处理复杂计费逻辑场景打造的低代码工具,用户可以直接使用 UI 或 API,来创建计费指标和计划。 来源:https://github.com/getlago/lago/wiki/Open-Source-does-not-win-by-being-cheaper Lago 联合创始人发表文章《Open Source does not win by being cheaper》探讨了开源软件的竞争优势。正如标题所言,她认为开源软件无法通过“更低价”取胜——迎合价格敏感的人反而是一种失败。 因为开源软件优势在于灵活性、透明度、安全性、数据可移植性以及持续性。 开源软件使得组织能够快速整合新技术到其技术栈中,相比传统方法,团队可以更快地将开源软件连接到他们每天使用的其他工具上。这种灵活性使得开发团队能够根据需要构建完美的工具,而不是被迫改变他们的工作方式以适应不灵活的专有工具。 开源软件使得组织能够掌控自己的安全性,因为所有人都可以彻底检查源代码,这样漏洞就能更快地得到修复,从...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- 2048小游戏-低调大师作品