黃玉坤, 裴喜龍, 徐志宇, 王建民
1(江西財(cái)經(jīng)大學(xué) 信息管理學(xué)院, 南昌 330032)
2(同濟(jì)大學(xué) 電子與信息工程學(xué)院, 上海 200092)
3(中國(guó)科學(xué)院 軟件研究所, 北京100190)
近年來(lái), 伴隨著云計(jì)算、物聯(lián)網(wǎng)、人工智能技術(shù)不斷進(jìn)步, 智能設(shè)備迅速發(fā)展, 數(shù)據(jù)無(wú)處不在, 最終實(shí)現(xiàn)萬(wàn)物互聯(lián). 移動(dòng)終端和智能設(shè)備廣泛普及, 異構(gòu)計(jì)算開(kāi)始興起, 邊緣計(jì)算應(yīng)用爆發(fā)式增長(zhǎng)[1,2]. 邊緣計(jì)算是物聯(lián)網(wǎng)中重要的一環(huán), 它將算力下沉到邊緣側(cè), 大大減少云端算力壓力, 節(jié)約帶寬, 且能快速響應(yīng)端設(shè)備請(qǐng)求.面向萬(wàn)物互聯(lián)的邊緣計(jì)算具有豐富的場(chǎng)景和應(yīng)用[3,4],如何應(yīng)對(duì)不同場(chǎng)景下對(duì)算力的差異化需求, 對(duì)邊緣計(jì)算平臺(tái)軟硬件體系的開(kāi)放性、靈活性、可定制、可擴(kuò)展性等方面提出了挑戰(zhàn).
在物聯(lián)網(wǎng)碎片化環(huán)境中, RISC-V架構(gòu)具有廣泛的發(fā)展前景. RISC-V是一種開(kāi)源的指令集架構(gòu)(instruction set architecture, ISA), RISC-V指令集架構(gòu)的開(kāi)放性、模塊化、高度可定制性的特點(diǎn)使得其成為體系結(jié)構(gòu)和軟件系統(tǒng)創(chuàng)新的理想實(shí)驗(yàn)平臺(tái)[5,6]. RISC-V的發(fā)展十分迅速, 涌現(xiàn)了大量采用RISC-V指令集架構(gòu)的開(kāi)源或商用處理器和SoC, 如鯤鵬、PulSAR等[7]; 除了硬件的微架構(gòu)設(shè)計(jì)、邏輯設(shè)計(jì)外, 在軟件生態(tài)方面也日漸成熟,如UCB提供了RISC-V的開(kāi)源編譯器GCC、LLVM[8],開(kāi)源仿真器Spike、QEMU, 社區(qū)也實(shí)現(xiàn)了支持RISC-V架構(gòu)的openEuler[9]開(kāi)源操作系統(tǒng)和 FreeBSD、Debian等操作系統(tǒng)的移植. 在一個(gè)系統(tǒng)級(jí)的方案中, 芯片是核心和基礎(chǔ), 但構(gòu)筑在芯片之上的整個(gè)系統(tǒng)軟硬件方案,才是最終與應(yīng)用直接接口的關(guān)鍵.
在邊緣計(jì)算領(lǐng)域中, 采用RISC-V架構(gòu)的操作系統(tǒng)無(wú)論是內(nèi)核的架構(gòu)還是應(yīng)用組織的方式, 都在不斷的發(fā)生著創(chuàng)新和變化. openEuler是一個(gè)基于RISC-V指令集架構(gòu)的開(kāi)源Linux發(fā)行版本, 具有開(kāi)放、靈活、不斷演進(jìn)和架構(gòu)包容的軟件生態(tài)體系. openEuler的目標(biāo)是從系統(tǒng)軟件的角度, 打通不同算力, 讓開(kāi)發(fā)者可以在其之上進(jìn)行技術(shù)創(chuàng)新, 使其適應(yīng)多樣性的計(jì)算場(chǎng)景,支撐邊緣側(cè)應(yīng)用的運(yùn)行需求. 因此, 基于RISC-V指令集架構(gòu)的openEuler操作系統(tǒng)是一個(gè)很好的構(gòu)建邊緣計(jì)算應(yīng)用的創(chuàng)新平臺(tái).
然而, 邊緣計(jì)算應(yīng)用對(duì)底層軟件工具鏈的要求也非常高, 包括對(duì)一些主流的算法庫(kù)和程序開(kāi)發(fā)框架的支持, 這對(duì)上層開(kāi)發(fā)者的使用體驗(yàn)以及市場(chǎng)的接受度和認(rèn)可度有直接的影響. 理想狀態(tài)下, 應(yīng)用開(kāi)發(fā)者應(yīng)該可以在無(wú)需了解芯片底層硬件的細(xì)節(jié)和指令集架構(gòu)的情況下進(jìn)行應(yīng)用程序的開(kāi)發(fā), 這需要擴(kuò)展操作系統(tǒng)功能、增強(qiáng)底層軟件開(kāi)發(fā)環(huán)境和工具鏈. 另外, 不同的應(yīng)用場(chǎng)景和應(yīng)用模式, 對(duì)面向邊緣計(jì)算的軟件開(kāi)發(fā)框架等基礎(chǔ)設(shè)施也提出了需求.
在云計(jì)算和邊緣計(jì)算的軟件架構(gòu)中, 廣泛采用了XaaS模式, 即Paas平臺(tái)即服務(wù)、IaaS基礎(chǔ)設(shè)施即服務(wù)、SaaS軟件即服務(wù)等模式. 在邊緣計(jì)算中實(shí)現(xiàn)面向XaaS的軟件架構(gòu)能夠?qū)⑦吘壎伺c云端進(jìn)行融合. COMO(C++ component model)技術(shù)[10,11]是一個(gè)改進(jìn)C++構(gòu)件技術(shù)的開(kāi)源項(xiàng)目, 它可以將細(xì)粒度的計(jì)算(機(jī)器指令或軟件程序)抽象成構(gòu)件服務(wù), 并提供XaaS服務(wù)架構(gòu), 有利于對(duì)軟件系統(tǒng)在編譯階段和運(yùn)行時(shí)的動(dòng)態(tài)演進(jìn).
RISC-V架構(gòu)相比其他成熟的商業(yè)架構(gòu)的最大的不同在于它是一個(gè)模塊化的架構(gòu). ISA在CPU軟件和CPU硬件設(shè)計(jì)者之間, 提供了一個(gè)抽象層(接口).RISC-V架構(gòu)不僅短小精悍, 而且其不同的部分還能以模塊化的方式組織在一起, 從而試圖通過(guò)一套統(tǒng)一的架構(gòu)滿(mǎn)足各種不同的應(yīng)用. 基于虛擬原型(virtual prototype)擴(kuò)展和配置RISC-V是基于RISC-V的計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)的重要手段[12,13].
COMO技術(shù)可以在系統(tǒng)服務(wù)和軟件服務(wù)抽象的接口層面保持構(gòu)件的一致性. COMO同樣采用虛擬原型的設(shè)計(jì)方法, 把程序分為元數(shù)據(jù)和邏輯兩層, 元數(shù)據(jù)則是程序的原型抽象, 這一特性使得COMO構(gòu)件可以在支持RISC-V架構(gòu)的系統(tǒng)中與底層硬件的接口層保持統(tǒng)一的模塊化結(jié)構(gòu). 結(jié)合RISC-V架構(gòu)及openEuler的模塊化設(shè)計(jì)的技術(shù)特點(diǎn), COMO提供了一個(gè)面向XaaS模式的ServiceManager軟件開(kāi)發(fā)框架, 使得COMO可以在云計(jì)算、邊緣計(jì)算及其結(jié)合的應(yīng)用場(chǎng)景提供一個(gè)統(tǒng)一的構(gòu)件化程序運(yùn)行環(huán)境和開(kāi)發(fā)模型. COMO在ISC-V指令集和openEuler操作系統(tǒng)上的系統(tǒng)架構(gòu)如圖1所示.
圖1 COMO在RISC-V指令集和openEuler操作系統(tǒng)上的系統(tǒng)架構(gòu)
本文的主要工作是在基于RISC-V架構(gòu)和openEuler操作系統(tǒng)的軟硬件平臺(tái)上移植COMO構(gòu)件程序運(yùn)行與開(kāi)發(fā)環(huán)境, 為面向云計(jì)算與物聯(lián)網(wǎng)的邊緣計(jì)算應(yīng)用提供面向XaaS服務(wù)的構(gòu)件化程序開(kāi)發(fā)模式; 并通過(guò)一個(gè)簡(jiǎn)單的實(shí)例介紹COMO的ServiceManager框架在邊緣計(jì)算中的應(yīng)用. 基于RISC-V和openEuler系統(tǒng)之上的QEMU模擬器進(jìn)行了COMO運(yùn)行與開(kāi)發(fā)環(huán)境移植的實(shí)驗(yàn), 證明了COMO構(gòu)件技術(shù)與RISC-V指令集架構(gòu)和openEuler操作系統(tǒng)的兼容性和可行性. COMO構(gòu)件技術(shù)與RISC-V指令集系統(tǒng)和openEuler操作系統(tǒng)的結(jié)合, 為openEuler生態(tài)圈注入了新的特性和活力,同時(shí), 借助RISC-V硬件技術(shù)和openEuler生態(tài)圈的發(fā)展, COMO構(gòu)件技術(shù)能夠獲得更多機(jī)會(huì)得到推廣和使用.
由于COMO、openEuler、RISC-V都處于研發(fā)的起步和發(fā)展階段, 從無(wú)到有地研發(fā)一個(gè)計(jì)算環(huán)境比開(kāi)發(fā)一個(gè)應(yīng)用要難得多. 在一個(gè)新的體系架構(gòu)的計(jì)算機(jī)上開(kāi)發(fā)軟件系統(tǒng), 首先要在上面運(yùn)行起較完整的開(kāi)發(fā)環(huán)境, 本文采用openEuler的RISC-V鏡像作為實(shí)驗(yàn)環(huán)境[14]. 目前支持“openEuler on RISC-V”的硬件平臺(tái)有:(1) NutShell (果殼, UCAS) COOSCA 1.0; (2) SiFive HiFive Unleashed. 然而現(xiàn)在RISC-V還不普及, 在實(shí)際的硬件平臺(tái)上進(jìn)行移植工作之前, 利用RISC-V的QEMU進(jìn)行COMO移植的仿真, 可以以較低的硬件成本和時(shí)間成本驗(yàn)證COMO移植的可行性和COMO構(gòu)件在openEuler on RISC-V上運(yùn)行的兼容性.
工作的第一步需要通過(guò)QEMU仿真出RISC-V硬件. 本文的實(shí)驗(yàn)環(huán)境是X86的Ubuntu 18.04, 以及自己編譯RISC-V版的QEMU[15-17].
從官方資源庫(kù)下載openEuler RISC-V 移植版, 并通過(guò)wget下載互聯(lián)網(wǎng)資源.
通過(guò)下列命令啟動(dòng)虛擬機(jī).
$qemu-system-riscv64-nographic -machine virt-smp 8 -m 2G-kernel fw_payload_oe.elf-drive file=oe-rv-rv64g-30G.qcow2, format=qcow2, id=hd0-object rng-random, filename=/dev/urandom, id=rng0-device virtio-rng-device, rng=rng0-device virtio-blk-device, drive=hd0-device virtio-net-device, netdev=usernet-netdev user, id=usernet, hostfwd=tcp::12055-:22-append 'root=/dev/vda1 rw console=ttyS0 systemd.default_timeout_start_sec=600 selinux=0 highres=off mem=4096M earlycon'
RISC-V沒(méi)有X86平臺(tái)上的基本輸入輸出系統(tǒng)BIOS, 所以openEuler操作系統(tǒng)的引導(dǎo)加載程序是基于OpenSBI項(xiàng)目的OpenSBI RISC-V, 后者實(shí)現(xiàn)了Supervisor二進(jìn)制接口[18]. 如果虛擬機(jī)正常工作, 則顯示結(jié)果如圖2所示. RISC-V上openEuler成功啟動(dòng)后的界面如圖3所示.
圖2 qemu-system-riscv64起動(dòng)界面
圖3 RISC-V上openEuler啟動(dòng)成功
COMO的組成部分包括: (1)工具部分, C++構(gòu)件化需要的構(gòu)件定義語(yǔ)言(componentdefinition language,CDL)編譯器cdlc、構(gòu)件編譯環(huán)境; (2)與Java基礎(chǔ)類(lèi)庫(kù)對(duì)應(yīng)的Libcore核心庫(kù). openEuler在RISC-V上的基礎(chǔ)類(lèi)庫(kù)支持不夠完整, 所以這里把第2部分做了部分裁剪. 這樣做的好處是能得到一個(gè)精簡(jiǎn)的COMO, 使得精簡(jiǎn)COMO可以在計(jì)算能力更弱的環(huán)境中運(yùn)行. 下面以RISC-V為開(kāi)發(fā)機(jī), 進(jìn)行本地編譯.
一個(gè)軟件, 如果能在與目標(biāo)機(jī)體系結(jié)構(gòu)及操作系統(tǒng)等硬件、軟件一致的環(huán)境中編譯自己, 那比較容易實(shí)現(xiàn)開(kāi)發(fā)、調(diào)試、測(cè)試的集成化. 可是openEuler在RISC-V上還很弱小, 這個(gè)環(huán)境的可安裝包也不完整,于是只能從編譯COMO所需要的環(huán)境開(kāi)始構(gòu)建, 即以RISC-V為開(kāi)發(fā)機(jī), 進(jìn)行本地編譯, 除了cmake, 其它COMO所依賴(lài)工具都是從源碼開(kāi)始構(gòu)建的.
從源碼開(kāi)始安裝cmake, 遇到了C/C++編譯器版本上的問(wèn)題. 通過(guò)驗(yàn)證, 這個(gè)問(wèn)題可以在openEuler發(fā)行版上解決, 從源頭治理一個(gè)生態(tài)往往成本是最小的,解決軟件包(庫(kù))的版本依賴(lài)是所有操作系統(tǒng)開(kāi)發(fā)商都要面對(duì)的困難. 最后決定從openEuler的發(fā)行軟件包中安裝cmake.
通過(guò)yum安裝cmake等軟件時(shí), 遇到了“Cannot download repomd.xml”錯(cuò)誤, 這是軟件的安裝源有問(wèn)題引起的, 可以用非正式(preview)的源, 并在.repo文件中加sslverify=0解決.
/etc/yum.repos.d/oe-rv.repo[base]name=base baseurl=https://isrc.iscas.ac.cn/mirror/openeuler-sig-riscv/oe-RISCV-repo/enabled=1 gpgcheck=0 sslverify=0
在git clone COMO源碼倉(cāng)庫(kù)時(shí), 遇到“SSL certificate problem”問(wèn)題, 可通過(guò)下列命令解決.
git config --global http.sslVerify false
在“openEuler on RISC-V”環(huán)境中編譯COMO, 選COMO本地Linux編譯環(huán)境: como_linux_riscv64.
由于COMO倉(cāng)庫(kù)中缺省的構(gòu)件描述語(yǔ)言編譯工具cdlc是面向openEuler X86平臺(tái)的, 所以在編譯COMO前, 首先要編譯出COMO工具鏈, 所用的COMO環(huán)境是: Comotools.
在Comotools環(huán)境中編譯完成cdlc后, 發(fā)布cdlc工具鏈:
cp ./out/host/como/tools/cdlc/cdlc ./tools/cdlc
編譯COMO前, 需要安裝并配置dbus開(kāi)發(fā)包.
$yum install dbus-devel
$ cp ./lib64/dbus-1.0/include/dbus/dbus-arch-deps.h/usr/include/dbus-1.0/dbus
在搭建完成openEuler on RISC-V和COMO的build環(huán)境之后, 下一步的工作是COMO的代碼移植.
將COMO代碼移植到openEuler平臺(tái)上需要關(guān)注以下問(wèn)題.
(1) ELF格式的約定
openEuler是一種Linux操作系統(tǒng), 它的可執(zhí)行文件及動(dòng)態(tài)鏈接庫(kù)等二進(jìn)制文件是ELF格式的, COMO的元數(shù)據(jù)存放在ELF格式文件的“.metadata”段中, 所以COMO在openEuler上沒(méi)有發(fā)行文件格式上的問(wèn)題.
COMO采用與Java類(lèi)似的元數(shù)據(jù)與代碼編譯結(jié)果放在一起的發(fā)行方式, 構(gòu)件存儲(chǔ)為ELF格式文件. 傳統(tǒng)的基于PE/ELF可執(zhí)行文件格式的線性符號(hào)表導(dǎo)出為標(biāo)志的軟件運(yùn)行時(shí)資源共享機(jī)制, 在計(jì)算能力已經(jīng)大大發(fā)展的時(shí)代, 顯得臃腫. COMO的類(lèi)、接口、方法等定義信息是通過(guò)元數(shù)據(jù)表達(dá)的, 不產(chǎn)生導(dǎo)出符號(hào), 所以其發(fā)行文件的導(dǎo)出符號(hào)表很簡(jiǎn)潔.
(2) RISC-V EABI參數(shù)對(duì)齊
各種約定的一致性是評(píng)價(jià)一個(gè)操作系統(tǒng)成熟度的重要指標(biāo). COMO代碼中, 反射機(jī)制構(gòu)造調(diào)用棧的一段匯編代碼是與平臺(tái)相關(guān)的, 它要求把從RPC等渠道得到的COMO方法調(diào)用參數(shù), 遵守RISC-V ABI規(guī)范形成調(diào)用棧. ABI定義了調(diào)用C/C++程序傳參數(shù)方法.
嵌入式系統(tǒng)上的RISC-V的ABI標(biāo)準(zhǔn)是EABI,Linux上的RISC-V的ABI標(biāo)準(zhǔn)是UABI[19,20]. COMO采用了RISC-V EABI參數(shù)對(duì)齊規(guī)則: 如果參數(shù)可以完全放在寄存器內(nèi), 則放在寄存器內(nèi), 否則把寄存器內(nèi)擺放不下的參數(shù)放在棧里. 無(wú)論參數(shù)是在寄存器里, 還是在棧上, 所有參數(shù)傳遞時(shí)要數(shù)據(jù)對(duì)齊. XLEN這個(gè)參數(shù)是指數(shù)據(jù)總線寬度, 可能的值是32或64.
1)對(duì)于XLEN=32的系統(tǒng), 數(shù)據(jù)總線寬度8 B.
2)對(duì)于XLEN=64的系統(tǒng), 數(shù)據(jù)總線寬度16 B.
EABI函數(shù)調(diào)用參數(shù)所用寄存器, 如表1所示. 浮點(diǎn)數(shù)參數(shù)也通過(guò)整數(shù)寄存器(x10-x11、x12-x17)或者棧傳遞.
表1 EABI函數(shù)調(diào)用參數(shù)所用寄存器
(3) COMO在RISC-V上的移植
COMO是采用C++ 11 (-std=gnu++11)標(biāo)準(zhǔn)實(shí)現(xiàn)的, 但有少部分用匯編寫(xiě)的程序是與計(jì)算機(jī)體系結(jié)構(gòu)相關(guān)的, 以下代碼需要用RISC-V匯編重寫(xiě):
?
另外還需要?jiǎng)?chuàng)建一個(gè)RISC-V的CMake編譯腳本文件:
build/como_linux_riscv64.cmake
為了驗(yàn)證COMO構(gòu)件技術(shù)在RISC-V指令集架構(gòu)和openEuler操作系統(tǒng)上的兼容性、可行性和實(shí)用性,搭建基于RISC-V和openEuler上的QEMU模擬器的實(shí)驗(yàn)環(huán)境并實(shí)現(xiàn)COMO技術(shù)的移植, 利用COMO的協(xié)同計(jì)算能力, 組成一個(gè)邊緣計(jì)算集群, 實(shí)現(xiàn)多臺(tái)RISC-V節(jié)點(diǎn)協(xié)同計(jì)算, 實(shí)驗(yàn)軟硬件架構(gòu)如圖4所示.
圖4 COMO技術(shù)的ServiceManager框架實(shí)現(xiàn)集群式RISC-V協(xié)同計(jì)算
COMO構(gòu)件技術(shù)能夠方便實(shí)現(xiàn)程序框架模型, 但它本身不強(qiáng)調(diào)對(duì)某一框架的支持. ServiceManager是COMO面向服務(wù)的開(kāi)發(fā)框架之一. ServiceManager提供了Server的Name和Handle之間對(duì)應(yīng)關(guān)系的查詢(xún)能力, 它主要包含的功能: (1) 注冊(cè), 當(dāng)一個(gè) Server 創(chuàng)建后, 應(yīng)該將這個(gè) Server 的 Name 和 Handle 對(duì)應(yīng)關(guān)系記錄到 ServiceManager 中. (2) 查詢(xún), 其他應(yīng)用可以根據(jù)Server 的 Name 查詢(xún)到對(duì)應(yīng)的 Service Handle.
為了驗(yàn)證“openEuler on RISC-V”的網(wǎng)絡(luò)通信能力,基于IP通信, 實(shí)現(xiàn)了一個(gè)COMO ServiceManager版本的應(yīng)用程序, 該程序位于COMO源碼中的samples/democomponent目錄, 由Client和Component兩部分組成. Component實(shí)現(xiàn)了一個(gè)COMO構(gòu)件, Client實(shí)現(xiàn)了如何對(duì)這個(gè)構(gòu)件進(jìn)行調(diào)用. 類(lèi)似于OSGi, Service-Manager框架實(shí)現(xiàn)了一個(gè)優(yōu)雅、完整和動(dòng)態(tài)的組件模型, 構(gòu)件無(wú)需重新引導(dǎo)就可以被遠(yuǎn)程安裝、啟動(dòng)、升級(jí)和卸載. 本實(shí)驗(yàn)中, 客戶(hù)端和服務(wù)管理程序都運(yùn)行在Master結(jié)點(diǎn), 服務(wù)提供者運(yùn)行在Workers結(jié)點(diǎn), 通過(guò)FindService找到COMO構(gòu)件的服務(wù), 不需要知道它的提供者在哪個(gè)結(jié)點(diǎn)運(yùn)行, 就可以調(diào)用它的服務(wù).
運(yùn)行起來(lái)的COMO示例程序效果如圖5所示, 這個(gè)示例演示了一個(gè)宿主程序通過(guò)反射機(jī)制調(diào)用COMO構(gòu)件編寫(xiě)的服務(wù)組件的過(guò)程.
圖5 COMO示例的運(yùn)行結(jié)果
隨著云計(jì)算、物聯(lián)網(wǎng)等技術(shù)的興起和廣泛應(yīng)用,邊緣計(jì)算作為云計(jì)算的補(bǔ)充和延伸, 可充分利用邊緣算力. 但是, 邊緣計(jì)算因?yàn)槠錀l件受限的軟硬件部署限制, 對(duì)服務(wù)器在環(huán)境適配性、程序運(yùn)行環(huán)境的部署和程序運(yùn)行的效率上有更嚴(yán)苛要求. 面對(duì)海量邊緣應(yīng)用場(chǎng)景, 硬件指令集架構(gòu)ISA、軟件基礎(chǔ)平臺(tái)的操作系統(tǒng)和其上的軟件開(kāi)發(fā)框架、程序編譯、運(yùn)行的工具鏈等基礎(chǔ)設(shè)施尤為重要.
本文完成了基于RISC-V和openEuler上的QEMU模擬器的實(shí)驗(yàn)環(huán)境搭建和COMO運(yùn)行與開(kāi)發(fā)環(huán)境的移植, 證明了COMO構(gòu)件技術(shù)與RISC-V指令集架構(gòu)和openEuler操作系統(tǒng)的兼容性和可行性. 實(shí)驗(yàn)應(yīng)用實(shí)例表明, 在一個(gè)以RISC-V指令集架構(gòu)和openEuler操作系統(tǒng)為軟硬件平臺(tái)的集群上可以成功運(yùn)行COMO構(gòu)件技術(shù)和其所支持的ServiceManager框架編寫(xiě)的面向服務(wù)的應(yīng)用程序, 為云計(jì)算和物聯(lián)網(wǎng)為主要應(yīng)用場(chǎng)景的邊緣計(jì)算提供了一個(gè)簡(jiǎn)單、有效和可行的面向XaaS計(jì)算模式, 以及一個(gè)與C++語(yǔ)言無(wú)縫銜接的構(gòu)件化程序設(shè)計(jì)開(kāi)發(fā)模式.
由于現(xiàn)在RISC-V的發(fā)展還不夠成熟, 不能完全靠RISC-V環(huán)境把COMO完整編譯出來(lái), 因此提供交叉編譯支持就很必要. 本文下一步的工作方向是, 嘗試使用Clang/LLVM編譯器, 把COMO裁成多個(gè)比較小的模塊集合. 但這個(gè)嘗試目前還處于交叉編譯環(huán)境定義階段. 隨著交叉編譯環(huán)境的完善, 逐步發(fā)現(xiàn)openEuler上Clang/LLVM應(yīng)該做的工作. Clang/LLVM是現(xiàn)在使用較多的編譯器[21], 所以這個(gè)嘗試是很有意義的.
希望COMO能在這個(gè)新的工具鏈建設(shè)中發(fā)揮一定作用, 并在與openEuler與RISC-V社區(qū)共同發(fā)展的過(guò)程中壯大自己.