日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

基于roslyn的动态编译库Natasha

發(fā)布時(shí)間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于roslyn的动态编译库Natasha 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?

人老了,玩不轉(zhuǎn)博客園的編輯器,詳細(xì)信息轉(zhuǎn)到:https://mp.weixin.qq.com/s/1r6YKBkyovQSMUgfm_VxBg

?

?

?

關(guān)鍵字:Github, NCC, Natasha,Roslyn, .NET Core2.0,.NET Core2.1,.NET Core2.2,.NET Core2.3, standard2.0, 動(dòng)態(tài)編譯,運(yùn)行時(shí)腳本,高性能。

?一、 前言

?

????????對(duì)于開(kāi)源貢獻(xiàn)者,Emit和表達(dá)式樹(shù)不是陌生的字眼,IL的動(dòng)態(tài)特性為封裝工作帶來(lái)了極大的方便,會(huì)Emit的開(kāi)發(fā)者可以說(shuō)駕馭了大部分的高性能、高動(dòng)態(tài)的編程技巧??v觀ef、dapper、json.net等第三方常用庫(kù),哪個(gè)能脫離emit而獨(dú)善其身,也正因如此,幸福了一批批懶癌患者,包括我這個(gè)懶癌中晚期患者(這里給各位病友問(wèn)好),與此同時(shí)本人對(duì)封裝有著莫名其妙的執(zhí)念,就在兩支怪力的驅(qū)使下走上了對(duì)emit的不歸路.

?

舊版Natasha始于2016年,當(dāng)時(shí)是對(duì)Emit進(jìn)行的封裝,中途經(jīng)有檸檬的提醒完善了UT和兼容性等工作,后由Victor.X.Qu補(bǔ)充了文檔,后經(jīng)ORM實(shí)戰(zhàn)。

?

?

二、Emit非銀彈

?

????????經(jīng)歷過(guò)重重思考和實(shí)踐,Emit不是動(dòng)態(tài)的最佳實(shí)踐,簡(jiǎn)單的從以下幾個(gè)角度來(lái)講:

?

    • 調(diào)優(yōu):

?

    • dup?: emit中的dup指令優(yōu)化在是由開(kāi)發(fā)者控制的,在熟悉指令操作的同時(shí)又給開(kāi)發(fā)者帶來(lái)了額外的優(yōu)化工作。

      ?

    • if/while/for?:不得不說(shuō)IL可以透過(guò)代碼看本質(zhì),指令就是這樣的,在條件分支上,標(biāo)簽跳轉(zhuǎn)的形式使得邏輯執(zhí)行靈活多變。這樣除了棧的操作之外,還要關(guān)注標(biāo)簽的位置和跳轉(zhuǎn)語(yǔ)句的優(yōu)化,另外還要清晰的記得你的各個(gè)分支。

      ?

    • 并發(fā)字典與算法優(yōu)化?:這一點(diǎn)是出自我的極端,在對(duì)象成員的賦值/加載等操作面前,并發(fā)字典像是一場(chǎng)災(zāi)難,賣(mài)盡氣力優(yōu)化的動(dòng)態(tài)執(zhí)行,卻被某些數(shù)據(jù)結(jié)構(gòu)所糟蹋。至于算法與動(dòng)態(tài)編譯結(jié)合起來(lái),應(yīng)該沒(méi)幾個(gè)病友做過(guò),各位如果有興趣的話可以慢慢體會(huì)。

      ?

?

    • 兼容性:

?

    • 結(jié)構(gòu)體?: 類(lèi)與結(jié)構(gòu)體在操作指令上有著諸多的不同,開(kāi)發(fā)者不僅僅要熟悉對(duì)類(lèi)的操作指令,還要對(duì)結(jié)構(gòu)體做出兼容,諸如ldflda、 ldloca、Constrained等指令,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)并不是一件省心的事。

      ?

    • 類(lèi)型轉(zhuǎn)換?: .NET中的類(lèi)型轉(zhuǎn)換不僅僅有指令級(jí)的轉(zhuǎn)換,standard還提供了諸多方法支持不同類(lèi)型之間的轉(zhuǎn)換,因此你還需要花一些功夫去處理這些。

      ?

    • 語(yǔ)法糖?: 一切語(yǔ)法糖在emit面前都要還原,比如可空類(lèi)型語(yǔ)法糖,對(duì)象比較語(yǔ)法糖,類(lèi)型比較語(yǔ)法糖等等,無(wú)疑會(huì)大大增加兼容工作的負(fù)擔(dān)(core3.0的可空引用我還沒(méi)有做測(cè)試)。

      ?

?

    • 構(gòu)建難度:

?

    • 深度克隆?: 深度克隆是動(dòng)態(tài)編程的一個(gè)典型實(shí)戰(zhàn),如果各位病友堅(jiān)持用EMIT挑戰(zhàn)的話,可以沒(méi)病走兩步,走兩步。

      ?

    • 深度構(gòu)建?:一旦遇到了動(dòng)態(tài)構(gòu)建動(dòng)態(tài)場(chǎng)景,那么這個(gè)復(fù)雜度難以想象。

      ?

    • 猜錯(cuò)誤?: Emit并沒(méi)有很好的友情提示,沒(méi)有語(yǔ)法檢查,而被程序鍛煉成老獵手一定要付出很多代價(jià)。

      ?

?

    • 維護(hù)升級(jí):

?

    • 后續(xù)開(kāi)發(fā)?:接手emit代碼是一件令人糾結(jié)的事,當(dāng)量變引起質(zhì)變的時(shí)候,從興奮到苦不堪言這種事情并不是沒(méi)有發(fā)生過(guò),尤其是現(xiàn)在.NET開(kāi)源工作者都比較獨(dú)立,沒(méi)有凝聚力和氛圍,人的生命以及精力是有限的。

      ?

    • 傳承??:由上面諸多信息也可見(jiàn),在新技術(shù)的沖擊下,在令人不安的環(huán)境下,在孤獨(dú)的夜里,傳承也是個(gè)問(wèn)題。

      ?

?

?

盡管表達(dá)式樹(shù)已經(jīng)幫我們做了一些工作,但復(fù)雜場(chǎng)景和使用習(xí)慣仍然封印著開(kāi)發(fā)者的大腦。

?

?

三、狙擊暴君

?

??????? Roslyn到如今已經(jīng)耳熟能詳了,編譯被當(dāng)作成服務(wù)對(duì)外開(kāi)放,讓不少開(kāi)發(fā)者從中受益,但由于文檔不全,實(shí)例不充分,從開(kāi)始一直到2018年期間,對(duì)于懶癌開(kāi)發(fā)者來(lái)說(shuō),基于Roslyn開(kāi)發(fā)都是一件憋手的事情(例如一些必備操作文檔,在2019年今年5月份才提上日程)。Natasha使用Roslyn做為編譯引擎,不僅僅在動(dòng)態(tài)構(gòu)建上進(jìn)行了人性化升級(jí),還在功能上進(jìn)行了簡(jiǎn)化。您不僅可以使用Natasha輕松的構(gòu)建類(lèi)、結(jié)構(gòu)體、方法、接口、抽象類(lèi),還可以輕松的繼承類(lèi)、重載方法、實(shí)現(xiàn)接口、抽象類(lèi)等等,技術(shù)較新,僅支持.standard2.0。

?

????????項(xiàng) 目 地 址:https://github.com/dotnetcore/Natasha

??????? Nuget索引:DotNetCore.Natasha ?(正式版1.0.0.0)

?

(娜塔莎)(原型蘇聯(lián)紅軍第25步兵師的中尉柳德米拉·帕夫利琴科,一名出色的女狙擊手)

?

?

使用Natasha你需要關(guān)注:

?

  • 在您的工程文件里添加這個(gè)節(jié)點(diǎn):<PreserveCompilationContext>true</PreserveCompilationContext>

    ?

  • 了解wiki中反解器的概念及使用。? ??

    ?

  • 注意命名空間,自動(dòng)補(bǔ)充命名空間目前尚未支持,需要您手動(dòng)操作,使用using方法添加。

    ?

  • 想盡一切辦法拼接字符串,目前符合CSharp7.3或以下C#版本的都行。

    ?

  • 編譯模式有區(qū)分:StreamComplier內(nèi)存流編譯/FileComplier文件流編譯, 文件流編譯的內(nèi)容,可以被動(dòng)態(tài)調(diào)用。當(dāng)你想動(dòng)態(tài)編譯類(lèi)B的時(shí)候使用類(lèi)A,那類(lèi)A就需要使用文件流編譯,相當(dāng)于dll動(dòng)態(tài)加載到運(yùn)行時(shí)。

    ?

  • 使用Natasha中的Operator來(lái)構(gòu)建你的動(dòng)態(tài)內(nèi)容。

  • ?

    四、性能

    ?

    ????????這幾年隨著.NET架構(gòu)引擎的不斷升級(jí),dynamic、emit執(zhí)行性能已經(jīng)得到了大幅度提升,roslyn也不例外,之前官方給過(guò)性能測(cè)試截圖,上面顯示是比emit快一點(diǎn),個(gè)人的基準(zhǔn)測(cè)試要等下一個(gè)benchmark版本,從耗時(shí)的角度來(lái)說(shuō)roslyn <= emit (roslyn有指定release模式編譯),所以大家根本不用關(guān)心性能問(wèn)題。

    ?

    ?

    五、使用案例

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/NMSLanX/p/11284573.html

    總結(jié)

    以上是生活随笔為你收集整理的基于roslyn的动态编译库Natasha的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。