摘要:鯤鵬開發套件 Kunpeng DevKit 可實現兩人天快速完成代碼遷移,提供全棧開發工具,集代碼遷移、編譯調試、性能調優、異常診斷等工具和功能於一體。
本文分享自華爲雲社區《【雲駐共創】鯤鵬DevKit實現兩人天高效遷移彙編代碼》,原文做者:Victue。編程
鯤鵬平臺,爲全世界的開發者提供了一種新的算力選擇。從硬件的開放,到系統軟件的開源,涵蓋從底層硬件、基礎軟件到上層行業應用的全產業鏈條,在國計民生的各個行業取得了重大效果或者進展。工欲善其事必先利其器,鯤鵬開發套件 KunpengDevKit 是華爲公司爲了廣大鯤鵬開發者打造的一把屠龍之刃,幫助開發者高效開發,一鍵遷移。segmentfault
鯤鵬開發套件 KunpengDevKit 提供全棧開發工具,集代碼遷移、編譯調試、性能調優、異常診斷等工具和功能於一體。將開發者的工做各個環節一一串聯,提供了一個方便、快捷和專業的工具包,經過鯤鵬 DevKit 能夠幫助用戶高效開發,一展宏圖。安全
真正的武林高手,內功很強,外功一樣很強!DevKit 產品設計和用戶體驗一樣優秀!架構
時間有限,本文着重分享彙編翻譯技術和 KunpengDevKit 產品體驗。框架
衆所周知,彙編語言歷史悠久,上手難度較高,是任何一種計算機或其餘可編程器件的低級語言。在不一樣的設備中,彙編語言對應着不一樣的機器語言指令集。函數
一種彙編語言專用於某種計算機系統結構,如 x86_64 或 aarch64 彙編。這意味着在某種程度上彙編語言能夠真正的操控硬件,能夠完成高級語言不能完成的任務。一樣,正由於彙編語言接近硬件平臺,因此彙編語言也是晦澀難懂、難以上手。工具
每個計算機平臺都對應着本身的計算機平臺,內存、寄存器等語法格式錯綜複雜。性能
彙編語言使用方式也多樣,單指令簡單嵌入彙編、多指令簡單嵌入彙編、全彙編文件。這至關於在咱們現代社會講古文古詩,全篇都使用文言文或者其中引用兩句古詩詞。開發工具
將代碼從一個平臺遷移到另外一個平臺,若是其中須要牽涉到彙編語言翻譯,其代碼遷移難度巨大。測試
目標是兩人天完成應用遷移,然而若是代碼中包含彙編語言,有可能 12 人都沒法完成遷移。不行,不能夠!華爲必須開發彙編遷移工具!
「代碼千萬行,彙編就幾行,遷移沒工具,開發淚兩行」
在使用匯編語言時,嵌入彙編的指令數大部分是小於三條指令,使用都較簡單,指令也比較集中。
全彙編文件中 SIMD 指令佔了絕大多數,指令相對集中。
能夠發現,經常使用匯編指令和 SIMD 指令佔了彙編語言大半江山。只要可以解決經常使用指令和 SIMD 指令,項目就成功了一大半。
目標是識別全部 X86 彙編,自動翻譯(大多數場景且性能儘可能不衰減)。
在開始時,對於經常使用的指令進行翻譯,然後隨着用戶規模的擴大和使用量的增長,根據用戶需求,逐步加入用戶所須要的指令。
第一個技術點:自動化
第二個技術點:技術複用
總體技術架構面向將來,擁有生命力。全部就有了下列設計原則
設計原則
W + 二
「二」,直接翻譯,實現從 X86-64 → AArch64
「W」,庖丁解牛,雖然操做較爲複雜,可是利用編譯技術的現有能力,加以改造爲翻譯所用,實現翻譯效率最優化。依據上文所述彙編複雜特性以及平臺便捷化目標,產生如下設計原則和設計方案
設計原則
設計方案
對於全彙編,識別方式較爲簡單,經過文件的後綴便可識別彙編文件,問題在於嵌入彙編的識別。咱們使用 Clang-Tidy 編譯技術實現該目標。
Clang-Tidy:基於 LLVM 的靜態語法檢查框架,提供語法(AST)解析能力。
基於 Clang-Tidy 工具集拓展彙編識別和替換規則,使得 AST 關鍵節點暴露。定位彙編代碼後便可隨心所欲,進行翻譯處理。
識別流程圖以下:
下面給出一個小案例:
基於規則的自動翻譯,即經過某種特徵匹配規則識別和轉換相應的代碼。
1.指令操做數映射
2.彙編語句特徵分析(綁定步驟 1)
3.規則庫規則匹配(綁定步驟 2)
4.根據規則進行代碼翻譯
首先對彙編語句進行語法解析,解析完之後能夠獲得各個特徵,再在規則庫中進行特徵規則匹配,即與語法結構進行匹配,在規則進行轉換時,相對應的語法結構也進行轉換,二者合一,即代碼翻譯完成。
對於複雜彙編,指令條數多,語法結構複雜,變幻無窮,也可能存在外部引用等問題。
1.指令組合沒法窮舉
2.彙編模塊引用外部變量
3.消除平臺間調用差別
4.SIMD 指令對等翻譯
上文中「W + 二」設計結構在複雜彙編翻譯中發揮重要做用。下「一」進行 SIMD 直接翻譯。
將 X86-64 一鍵翻譯爲 AArch64,而且提供兩種方案,舊的路徑依舊能夠在 X86 上執行,沒有任何問題,而且建立的新分支能夠運行在 Kunpeng 平臺上。生成代碼後,能夠一鍵替換掉舊代碼。提供一個 main 函數,能夠看做一個驅動,測試驅動能夠在 X86 和 Kunpeng 平臺同時運行。運行結果一致。保留 X86 平臺的兼容性,代碼在不一樣的平臺運行能夠保持 100%的兼容和正確。
簡單彙編翻譯:
複雜彙編翻譯:
天啦,這也太快了。朋友們,趕忙下載使用吧,一鍵翻譯,遷移你的應用至鯤鵬平臺。衝起來!
Kunpeng DevKit 功能強大,使用優雅。採用超級方便的一站式解決方案,幫助開發者加速軟件開發、遷移和算力升級。一站式開發套件、全流程效率提高。一站式遷移、編譯、測試、分析。
開發者依照我的經驗和習慣能夠大體分爲三類:
經驗較少的用戶,重度依賴自動化,但願全自動化遷移
有必定經驗,合理依賴自動化,但願本身主要遷移過程
經驗豐富,淺度依賴自動化,本身純手工遷移
鯤鵬 DevKit 針對上述三種不一樣類型的用戶,作了大量產品體驗層的設計。
第一類開發者,經過系統全面自動化能力,作到無感知遷移。提供動態二進制翻譯工具,自動的將 X86 平臺指令集翻譯成 Kunpeng 平臺指令集。整個過程透明、全自動,無需額外工做,整個應用便可應用在 Kunpeng 平臺上。
第二類開發者,但願參與整個應用遷移的過程和環節中,瞭解翻譯過程。鯤鵬 DevKit 自動識別問題、提供建議輔助決策、提供替換代碼─鍵修改,極簡體驗。
第三類開發者,可能存在開發者認爲自動化重構是一個黑盒子,不可信任,在這方面,困 DevKit 提供了透明展現等內容,使得用戶相信,該工具是安全的。
設計架構時,將人的思想行爲融入其中,使得工具的使用更加天然化、更加符合人類認知的思考,從總體到局部,從宏觀到微觀。
舉幾個小例子能夠說明上述體驗設計,一個是硬件調優 3D 可視化,基於認知模型、表現模型極簡抽象,從物理世界到虛擬世界的映射。
第二個例子是性能分析時,進程/線程擁塞的直觀可視化。
在系統設計時,運行大量的信息可視化表達,一目瞭然,清晰可見,優雅體驗。
無需多言,一圖流歸納!
鯤鵬 DevKit 產品從設計到功能都是極好的,能夠發現爲了鯤鵬的發展和壯大,華爲在此花了不少心思,但願各位開發者朋友們多多嘗試,或許鯤鵬比你我想象的更增強大、友好、便利。
「北冥有魚,其名爲鯤。鯤之大,不知其幾千裏也。化而爲鳥,其名爲鵬。鵬之背,不知其幾千裏也;怒而飛,其翼若垂天之雲。」