中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解clingrootsys原理剖析中的pme

發布時間:2021-12-03 18:02:40 來源:億速云 閱讀:142 作者:柒染 欄目:大數據

如何理解clingrootsys原理剖析中的pme,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

動態語言中的動態類型語言

一般會誤以為動態語言就是解釋語言。因為解釋系統能動態執行代碼也往往意味著其被歸為動態語言。但實際上動態語言現在最常見的技術形式反而是一種稱為“動態類型的動態語言”,它往往依賴前端而不是后端。這造成的結果是:靜態語言系統和經典的編譯->運行系統也能產生“動態語言”。 比如在編譯器實現中,實際上類型系統可以提出元類型,封裝有類型的基本信息,然后喂給后端的是元類型/對象產生的子類型/子對象樹的形式就可以 – 一個較原來復雜一點的數據結構,然后其它過程保持不變喂給后端。運行期的類型信息照樣在運行期可保留甚至動態演變。這難道不是動態語言嗎? (這種邏輯也可以工作在庫級和工具鏈級,即語言系統實現的外部,比如pme,它的實現只要binding就可以了—而binding實際上是另一種編譯器意義上的前端翻譯,就行了,而執行時是現成的,比如qtmoc為qtcpp源碼模式生成的字典,這就是為什么binding也能生成一種動態語言系統,后端執行時可以是靜態的,但主要喂給它的是如PEM這樣的業已包含類型系統–元類型系統,會將類型系統保持到運行期就可以了) 你可能會為編譯過程的這些種種感到迷惑,但實際上這里面所有的技術,跟傳統靜態編譯語言系統 – 你學到的最簡單的編譯原理實現,是一個外觀的。而編譯前端,解釋前端,binding,這三個詞都包含了轉譯。目標碼可以是平臺碼也可以是中間碼,供運行。所有這些,都不能改變所有用編譯原理實現的語言系統共享同樣的產品外觀(都有該有的部分,只是呈現出了不同的形式)。回到系列文章第一篇的文頭那些話,用這些通讀所有復雜語言系統的定性你才能不致迷糊。

Pme為靜態語言模擬了動態語言特征

Pme, poperty,method,event,是對反射機制的一種實現,加了反射機制實際上在靜態類型之上加了一門新的語言,和庫級運行時,可在運行時查詢到整個活動對象樹,及每個類的場景圖,成員屬性。PME是組件的一種通用實現方式。 而且,這種兼具object io特性的pme機制,可為運行時通過外在的編輯器改變objectlvl的程序邏輯提供了可能。借助PME組件的并持久化將成員屬性什么的持久到XML等載體。下一次需要時又可加載進來(僅限代碼中的成員數據)。 而只有在cling/rootsys這種大環境中,pme與JIT合作,這種動態性才得到最佳發揮,DLL加載終于通過JIT,變成了語言系統的功能。而不再停留在作為操作系統的一種機制,而pme模塊可以動態加載,這在開發上體現為,pme DLL體內的邏輯是固定的。可改變的程序邏輯是DLL外的那部分。那個定制腳本部分和你的APP邏輯部分,可以是JIT CPP源碼(這里除了PME支持的代碼中的成員數據外,整個代碼都可持久,The interpreted and JITted C++ shares the same virtual memory space as the app itsel。)。有沒有感覺有腳本的樣子?直到這里,cling/rootsys開始有了同時能模擬了腳本語言式的解釋效果和動態加載效果,可謂嘆絕。

Cling/rootsys中的pme字典生成

如果說cling call into raw dll靠的是符號,受JIT和操作系統DLL機制支持,而call into PME模塊靠字典信息非符號,動態加載pme組件和發現組件里的OBJ樹需要PME支持,因此需要自實現。這是為何呢 這實際上最重要的還是因為jit call into native libs只是使符合變得可見而已。而加載DLL中的資源,是普通的native langsys的功能,于是作為僅僅是執行引擎向OS的傳手,llvm也可以而已。但其rootsys libs的pme是庫級的,cling代碼可以直接call into native libs,但不能call into rootsys libs,因為它們是有pme dicts as bindings的(不能直接通過加載的方式使其為cling可見必須通過對cling的封裝變成rootcling才可以)。因此,cling除了jit,和pme,還需要一個手動或自動添加字典binding信息使pme module和普通raw c dll(那種業已解析為簡單符號可直接加載的模塊)變得一樣。的方式,比如一個手動/自動DICT生成器。生成到raw cpp code傳給LLVM后端。 帶著這些觀點,繼續來看看cling/rootsys中的對應物,即其對pme模塊的支持-aclic。 ACliC只是將pme模塊形成加了pme字典的dll的工具。cling is faster building compiled code, but ACLiC can reuse it. Cling產生jit碼是高速編譯器產生的類解釋器效果,而aclic可以在庫級反射層面利用它。前面提過,將raw cpp改造成類似qtcpp的新語言系統,所有模塊必須經過字典封裝,這個過程也稱binding。Rootsys即是這樣的一門新語言系統。 在實現上,aliac是以patch cling的方式加上去到rootcling的。因此.L ++的方式產生so文件,只用于為pme模塊產生dict 模塊并鏈接好。

附:對于qtcling,有mocng,是基于clang的qt moc.exe重實現,這也可以作為cling的patch組件,類似aliac的方式加到qtcling,使之具備發現源碼中有pme邏輯即自動生成dict模塊的功能,to give it the ability to produce “automic dict generator for qt extending cpp syntaxs” 來完成對整個qt libs的從源碼級的重新編譯封裝,最終完成整個qtcling語言系統的構建。

關于如何理解clingrootsys原理剖析中的pme問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芦溪县| 东兰县| 伊川县| 武胜县| 永德县| 邹平县| 平和县| 广平县| 康乐县| 海丰县| 定南县| 陇西县| 抚顺县| 来宾市| 陆川县| 波密县| 宜兰市| 七台河市| 雅江县| 加查县| 文化| 保定市| 大埔区| 临西县| 安新县| 黎城县| 新晃| 应城市| 通化市| 大庆市| 庐江县| 蛟河市| 夏河县| 浮梁县| 棋牌| 信丰县| 娱乐| 韶山市| 和平区| 莱州市| 新晃|