国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

.Net8的AOT是如何被C++操控運行的

開發 前端
C++和AOT無論是Roslyn,或者ILC或者引導程序BootStrap都是通過C++來啟動運行的。1.Roslyn的運行實質上是運行在虛擬機CLR上面的2.ILC同上3.BootStrap它本身就是cpp項目而llvm本身就是一套超級底層的C/C++項目,可以看到在一整套的AOT編譯運行流程中,C++始終操控C#的運行。

前言

.Net目前有兩條線,一條是正宗的.Net虛擬機CLR調用JIT的即時編譯,另外一條就是通過ILC編譯成本地的機器碼也即是AOT。上一篇【C++是如何運行C#/.Net的?】說的是前者,本篇來看下后者。

概括

前情提要:本篇以最新的.Net8 PreView5為藍本,進行的描述。

1.不同簡要比較

AOT相當于一個全新的縮減.Net版本,它和即時編譯器也即JIT機器碼照樣不同,這里舉一個例子,比如以下代碼:

static void Main(string[] args)
{
    Program pm = new Program();
}

簡單的一個對象實例化,即時編譯里面:

call        JIT_TrialAllocSFastMP_InlineGetThread (07FFC4C650650h)  
 mov         qword ptr [rbp+20h],rax  
 mov         rcx,qword ptr [rbp+20h]  
 call        Program..ctor() (07FFBECC2C078h)

可以看到它先分配內存,然后調用默認的構造函數.ctor

那么AOT呢?

00007FF72AD459E8 48 8D 0D E1 55 17 00 lea         rcx,[repro_Program::`vftable' (07FF72AEBAFD0h)]  
00007FF72AD459EF E8 9C 0A C9 FF       call        RhpNewFast (07FF72A9D6490h)

它這里很明顯用了虛函數表指針作為參數,調用了RhpNewFast。完全是不一樣的。

2.整體過程AOT的編譯如下:C#源碼-》Roslyn(DLL)->ILC(Obj)->Link(Exe)寫好了C#源代碼之后,Roslyn會接管C#源代碼把它編譯成中間語言MSIL,存放在托管的動態鏈接庫即DLL里面。ILC會接管托管的DLL把它生成目標文件.Obj,然后用NativeAot的引導程序也即Bootstrap引導Link.exe工具鏈接.Obj目標文件生成可執行文件。

3.細節生成的目標文件也即Obj依舊是通過開源界三大編譯器之一的LLVM來生成的.在Windows/Linux/MaoOS上的動態鏈接庫分別是:

objwriter.dll(pe)/libobjwriter.so(elf)/libobjwriter.dylib(Mach-O)

他們分別封裝了各個平臺的llvm后端代碼生成來完成了Obj目標文件的生成。

4.C++和AOT無論是Roslyn,或者ILC或者引導程序BootStrap都是通過C++來啟動運行的。1.Roslyn的運行實質上是運行在虛擬機CLR上面的2.ILC同上3.BootStrap它本身就是cpp項目而llvm本身就是一套超級底層的C/C++項目,可以看到在一整套的AOT編譯運行流程中,C++始終操控C#的運行。

5.核心代碼

為了更為透徹的了解到ILC調用Objwriter.dll動態鏈接庫操控llvm生成obj目標文件。在WinX64平臺上,這里演示一段簡單的代碼,步驟如下:

一.首先在nuget上面下載一個ILC編譯器,也即是:

runtime.win-x64.Microsoft.DotNet.ILCompiler

二.找到nuget目錄,里面有個objwriter.dll一般的在如下路徑:

C:\Users\Administrator\.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\7.0.8\tools

三.新建一個C#控制臺項目名字Obj,把上面的路徑找到的objwriter.dll放入到

Obj項目bin/Debug/net7.0目錄下面。

四.Obj項目bin/Debug/net7.0目錄下面新建一個Demo.obj目標文件

五.Program.cs里面填寫如下代碼:

internal class Program
{
    [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);
    }
}

運行這段代碼之后,打開Demo.obj可以看到文件里面寫入了一段內容,這就是ILC編譯器往obj目標文件里面寫入被JIT編譯后的機器碼的核心部分代碼的原型。這里因為封裝了llvm的細節,又因托管省略了大部分,看起來比較簡潔。綜合起來實際上的代碼高達百萬行之巨,暫不贅述此部分。

以上代碼GitHub下載地址:

https://github.com/tangyanzhi/jianghupt/releases/download/llvm/Obj.rar

責任編輯:武曉燕 來源: 江湖評談
相關推薦

2023-07-11 00:17:58

.Net8AOTC

2023-09-11 08:40:34

AOTVMP代碼

2023-11-17 13:42:06

.NET8C#工具

2023-07-14 08:29:55

AOT.Net程序

2023-11-28 12:01:06

C++STL

2023-11-17 08:52:32

.NET8C#

2025-04-02 07:40:30

2023-10-07 10:16:18

.Net8GC內存

2024-10-11 14:42:59

2019-08-28 14:21:39

C++C接口代碼

2020-07-31 18:33:56

C++編程語言

2009-10-10 14:07:56

2024-08-30 09:21:28

2023-12-15 17:09:28

.NET8Primitives性能

2025-04-01 04:03:00

.NET8C#CPU

2025-08-07 00:10:15

2024-11-07 12:33:47

2023-11-06 10:03:01

.Net8類型轉換

2024-04-01 08:23:20

代碼Javajavascript

2010-01-26 15:51:06

C++變量
點贊
收藏

51CTO技術棧公眾號

日本在线一区| 嫩草影院网站在线| 久久久久久999| 视频一区中文| 亚洲狠狠婷婷综合久久久| 91看片淫黄大片一级| 国产乱理伦片a级在线观看| 中文字幕欧美日韩| 欧美在线二区| 国产三级日本三级在线播放| 精品久久国产97色综合| 精品视频日韩| 免费看日本毛片| 91福利社在线观看| 久久丝袜视频| 亚洲一区二区三区精品在线观看| 亚洲另类春色国产| 日日av拍夜夜添久久免费| 国产精品我不卡| 亚洲精品国产第一综合99久久 | 欧美优质美女网站| 欧美午夜在线播放| 制服诱惑一区| 91国模大尺度私拍在线视频| 久久亚州av| 国产树林野战在线播放| 欧美日韩中文精品| 狠狠操综合网| 色婷婷狠狠18| 日韩在线国产精品| 强制捆绑调教一区二区| 国产精品影院在线| 国产精品色悠悠| 亚洲国产精品v| 成人国产网站| 欧美精品一区二区性色a+v| 污视频在线观看免费| 日本精品久久久久久久| 亚洲一区在线看| 国产一区二区三区亚洲| 啊啊啊国产视频| 欧美激情xxxx| 一区二区三区高清| 亚洲精品一区二区妖精| 国产丝袜在线精品| 日韩电影免费观看高清完整版| 国产日韩欧美一区二区三区四区| 亚洲国产一区视频| 亚洲人成精品久久久| 99sesese| 欧美肥老妇视频| 国产午夜精品久久| 成人在线免费电影网站| 欧美乱做爰xxxⅹ久久久| 精品视频偷偷看在线观看| 一本不卡影院| 1769视频在线播放免费观看| 91欧美日韩一区| 精品久久久久久久久久久| 国产精品一区二区av交换| 一本色道久久加勒比88综合| 国产精品美女免费看| 亚洲精品日产精品乱码不卡| 日韩母乳在线| 91福利免费| 日本精品视频网站| 亚洲一区影音先锋| 婷婷亚洲最大| 国产在线观看免费网站| 国产视频精品网| 日韩一区二区电影网| 免费在线观看日韩欧美| 久久男人天堂| 成人免费在线网| 欧美精品在线免费| 亚洲欧美在线视频| 欧美激情欧美| 免费观看成人高潮| 影音先锋在线亚洲| 色一区av在线| 成人免费在线观看入口| 偷拍欧美精品| 自由的xxxx在线视频| 大胆欧美熟妇xx| 国产精品精品国产一区二区| 欧洲亚洲精品久久久久| 久久精品xxxxx| 日本三级视频在线观看| 国产又大又黄又猛| 日本一区二区不卡高清更新| 51久久精品夜色国产麻豆| 亚洲人永久免费| 中文字幕国产精品久久| 电影一区中文字幕| 美女xx视频| 亚洲最大的免费| 亚洲精品美女免费| 久久久亚洲精品一区二区三区 | av成人在线观看| www亚洲成人| 91中文字幕在线观看| 欧美电影精品一区二区| 成人免费视频视频| 精品一区在线| 成人video亚洲精品| 国产曰肥老太婆无遮挡| 青草青草久热精品视频在线观看| 日韩欧美国产成人| 老司机精品视频在线| 国产精品视频一区视频二区| 91在线九色porny| 五月天色一区| 国内精久久久久久久久久人| 91福利小视频| 成人午夜av影视| av中文一区| 国产精品xx| av最新网址| 青青草原亚洲| 91成人性视频| 日韩欧美的一区| 国产精品福利一区二区| 午夜在线播放视频欧美| 91久久精品无嫩草影院| 免费观看久久久久| 北条麻妃在线视频| 91在线在线观看| 日韩视频免费大全中文字幕| 欧美日韩一区二区三区| 波波电影院一区二区三区| 中文在线日韩| 欧美久久一区二区三区| 黄色免费网站在线| 91国内视频| 少妇视频在线观看| 精品国产一区二区三区| 久久五月激情| 成人美女视频在线观看18| 亚洲综合色自拍一区| 欧美无砖专区一中文字| 日韩精品免费看| 57pao成人国产永久免费| 五月天久久狠狠| av成人天堂| 波多野结衣欧美| 亚洲国产综合在线| 欧美片网站yy| 欧美极品少妇xxxxⅹ免费视频| 91国产免费看| 国产成人精品电影| 亚洲高清免费视频| 国产高清不卡一区| 亚洲网站视频| 亚洲天堂日韩在线| 成人综合网站| 日本视频不卡| 自拍偷拍电影| 少妇高清精品毛片在线视频| 亚洲 国产 欧美一区| 91人成网站www| 欧美精品激情blacked18| 国产网站欧美日韩免费精品在线观看| 色一情一伦一子一伦一区| 亚洲国产成人午夜在线一区| 国产在线国偷精品免费看| 亚洲国产清纯| 亚洲另类春色校园小说| 4438五月综合| 国产高清视频色在线www| 国产天堂在线| 最新地址在线观看| 高清国语自产在线观看| av免费网站观看| 99视频超级精品| 日韩电影av| 丁香花在线影院| 成黄免费在线| 国产成人天天5g影院在线观看| 欧美精品一区二区三区涩爱蜜| 99re99| 亚洲国产精品三区| 少妇性饥渴无码a区免费| 99色这里只有精品| 大片在线观看网站免费收看| 99精品久久久久久| 亚洲精品国产精品国产自| 羞羞在线观看网站| heyzo欧美激情| 亚洲免费伊人电影| 国产精品精品久久久久久| www.97.| 一区二区三区午夜视频| 在线不卡中文字幕播放| 色女孩综合网| 视频二区欧美毛片免费观看| 免费毛片在线看片免费丝瓜视频| 午夜老司机在线观看| 国产精品久久久久久亚洲调教| 中文字幕电影在线| 欧美阿v一级看视频|