.NET8 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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2023 年最后一波工具安利「GitHub 热点速览」
2023 年还有两周就要接近尾声了,2023 年的热点速览还有一波工具好安利:比如上周推荐之后上了热榜的远程调试工具 page-spy-web,让调试像呼吸一般自然方便;还有轻量级的搜索引擎 orama,可以让你下载 B 站视频好好过个元旦的下载姬 downkyi,JS 格式化工具 biome,Meta 开源的 JS 库 stylex 也是颇受欢迎。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 1. 本周特推 1.1 远程调试:page-spy-web 1.2 搜索引擎:orama 2. GitHub Trending 周榜 2.1 语言学习:project-based-learning 2.2 自定义用户界面:stylex 2.3 Web 开发套件:biom...
- 下一篇
nginx+lua+redis实现灰度发布 | 京东云技术团队
前言: 授人以鱼不如授人以渔.先学会用,在学原理,在学创造,可能一辈子用不到这种能力,但是不能不具备这种能力。这篇文章主要是沉淀使用nginx+lua+redis实现灰度,当我们具备了这种能力,随时可以基于这种能力和思想调整实现方案:比如nginx+lua+(其他数据源)、nginx+(其他脚本语言) 一、灰度方案: 常见的灰度实现方案: 1. 请求路由:通过请求中的标识(如用户ID、设备ID、请求头等)来决定是否将请求路由到灰度环境。可以使用反向代理(如Nginx、Envoy)或API网关(如Kong、Apigee)来实现路由规则。 2. 权重控制:将流量按照一定的权重比例分配到不同的环境中。可以通过负载均衡器(如HAProxy、Kubernetes Ingress)或代理服务器(如Nginx、Envoy)来实现权重控制。 3. 特性开关:通过在代码中嵌入特性开关(Feature Flag)来控制功能的开启与关闭。可以使用配置文件、数据库、键值存储或特性管理平台(如LaunchDarkly、Unleash)来管理特性开关。 4. 分阶段发布:将功能的发布分为多个阶段,从内部测试到灰度...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池