嘗試自動批量翻譯方舟編譯器原始碼中的識別符號

2021-09-28 11:31:59 字數 1580 閱讀 3047

在對方舟編譯器原始碼中的近百個識別符號/字串常量進行手工漢化後, 嘗試用批量替換+字典的方式對原始碼識別符號進行自動翻譯, 目標是自動翻譯後達到與手工相同的效果.

字典**於之前的手動提交. 批量替換之前基本沒有任何語法分析, 僅有不完全的注釋/字串識別處理. 階段小結如下.

處理的結果與之前的手動修改比較. 生成的diff大約30k, 大約60多處不同. 相對修改的上千處**來說, 比例很小.

同名識別符號

有些本地識別符號沒有被替換的, 如defaultoption中的mploptions. 在漢化過程中, 同名識別符號可能屬於不同類, 不一定使用同一中文翻譯, 這種情況暫時無法處理, 需要語法分析.

統計(diff中的出現次數, 下同): 4 8 5 3 1 3 2

ret是否全都是"返回"的語義需逐個檢查. 之前並非全域性替換.

統計: 7

還有optionparser中的parse, 也和compilerparse重名.

統計: 2 1

注釋與字串

一些識別符號在注釋/字串中也應翻譯, 如:assert(i == 0, "invalid operand idx in unarynode");中的unarynode.

統計: 15 11 1

當前預設不翻譯, 是為了避免不完整翻譯. 比如避免"error while exe, cmd: "這一字串被譯為"error while 執行, cmd: "

識別符號替換的硬傷:

-    loginfo::maplelogger() << "/* &" << globaltables::getgsymtable().getsymbolfromstidx(m.first.idx())->求名稱();

+ loginfo::maplelogger() << "/* &" << globaltables::getgsymtable().getsymbolfromstidx(m.first.idx())->getname();

此處由於字串中帶有/*, 因此被誤判為注釋因而getname未被翻譯

統計: 2 1 2

命名衝突

const

int 執行(

const 選項類 &mploptions,

const std::string &options)

const

;

其他多數情況下,mploptionsoptions都被翻譯成"選項", 並無衝突. 但這種情況下, 需要區別.

統計: 1

相比手工修改, 減少了不少低階錯誤(已在主庫修正). 比如手工替換時未注意大小寫, 以及未對整體識別符號進行替換等等.

使用程式進行原始碼自動修改有可行性, 即使工具很簡陋

在找到好用的c++原始碼分析器之前, 暫停改進此自動修改工具

編譯方舟編譯器

環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...

方舟編譯器編譯

目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...

方舟編譯器編譯過程

開發環境推薦ubuntu16.04 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g dev libc6 dev i386 lib32ncurses...