如何汉化并编译 Python 源代码
如何漢化并編譯 Python 源代碼
- 前言
- 參考文章
- 我的工具
- 關(guān)鍵字漢化
- 其他源代碼漢化
- Linux 下編譯
- Windows 下編譯
- 漢化效果演示
前言
筆者是一名業(yè)余編程愛(ài)好者,年初偶然混進(jìn)中文編程OO群。因覺(jué)得中文編程乃大勢(shì)所趨,遂入了 Python 漢化(我稱之為“草蟒”項(xiàng)目)的坑。筆者孤陋寡聞,剛開(kāi)始漢化的時(shí)候只知道 GCC 且 GCC 不支持中文,所以沒(méi)有選擇漢化源代碼的方式,而是采用替換式表層漢化方法(中文編寫的程序,包括中文關(guān)鍵字和變量名等,先替換成英文,再交給解釋器執(zhí)行)。但近期從群里得知,Clang、VC 等編譯器支持中文,這讓我覺(jué)得從源代碼入手進(jìn)行漢化是完全可行的。
筆者在 Linux 和 Windows 系統(tǒng)下進(jìn)行了實(shí)驗(yàn)漢化。Python 漢化大致可以分為兩部分:關(guān)鍵字漢化和其他源代碼漢化。
參考文章
[1]:為Python添加中文關(guān)鍵字
[2]:Python internals: adding a new statement to Python
[3]:Visual Studio error C2001:常量中有換行符(解決辦法)
[4]:Changing CPython’s Grammar
[5]:Error C2001: Newline in constant when compiling
我的工具
關(guān)鍵字漢化
用 sublime 打開(kāi)源代碼 Gramma 目錄中的 Grammar 文件并添加中文關(guān)鍵字,保存為 unicode 編碼(下同)。示例如下:
if_stmt: ('if'|'如果') namedexpr_test ':' suite (('elif'|'不然') namedexpr_test ':' suite)* [('else'|'否則') ':' suite] while_stmt: ('while'|'只要') namedexpr_test ':' suite [('else'|'另外') ':' suite] for_stmt: ('for'|'取') exprlist ('in'|'于') testlist ':' [TYPE_COMMENT] suite [('else'|'另外') ':' suite] ...... with_stmt: ('with'|'管') with_item (',' with_item)* ':' [TYPE_COMMENT] suite ...... lambdef: ('lambda'|'雷鋒') [varargslist] ':' test ......注意:或許是 python 版本和所用編譯器的不同,漢化關(guān)鍵字需要加單引號(hào),這與參考文章[1]所述有所不同。
另外還要修改 Python/ast.c 文件。
其他源代碼漢化
漢化版必須支持英文版,所以不僅僅是漢化一些字符串,而是需要大量復(fù)制原來(lái)的代碼并加以漢化。筆者漢化了兩個(gè)函數(shù)以供演示效果,參見(jiàn)后面的圖片。這是一個(gè)復(fù)雜的系統(tǒng)工程,歡迎感興趣的讀者聯(lián)系我并加入漢化大業(yè)。
Linux 下編譯
參見(jiàn)源代碼目錄下的 README.rst,cd 到源代碼目錄,然后執(zhí)行以下命令:
./configuremake regen-grammar(重新生成 graminit.h 和 graminit.c)makemake test(比較耗時(shí),僅做實(shí)驗(yàn)的話這一步可省去)sudo make install(這一步也可省略)編譯成功,運(yùn)行 python 3.8.0,輸入中文關(guān)鍵字和函數(shù),正常執(zhí)行。
Windows 下編譯
Linux 平臺(tái)下的輕松成功給了筆者很大的信心,隨即轉(zhuǎn)戰(zhàn) Windows 平臺(tái)。之前只漢化了 while 等幾個(gè)關(guān)鍵字,這次漢化了更多關(guān)鍵字,并打算用 Parser/pgen 這個(gè) py 程序重新生成 graminit。結(jié)果讓我大吃一驚,無(wú)論中文關(guān)鍵字加不加引號(hào),或者用其他方式,都會(huì)報(bào)錯(cuò)。
轉(zhuǎn)念一想,無(wú)論哪個(gè)平臺(tái),用的 graminit 文件都是一樣的。何不在 linux 下生成漢化的 graminit 文件,然后在 windows 下使用呢?果然,這個(gè)辦法是有效的。WSL 真心不錯(cuò),否則要在兩個(gè)平臺(tái)之前切換還真麻煩。
開(kāi)始編譯。按照 PCBuild 下的 readme,在 Power Shell 中運(yùn)行 build.bat。(第一次運(yùn)行的話,會(huì)下載一些 externals,需要很長(zhǎng)時(shí)間。)沒(méi)執(zhí)行一會(huì),就顯示一大堆紅色警告:“error C2001: 常量中有換行符”。
問(wèn)度娘,原來(lái)是 VS 的問(wèn)題,奇數(shù)漢字不能正確解碼,偶數(shù)漢字可以。網(wǎng)上給出的解決辦法顯然都不行。那么把 VS 的編譯器換成 Clang 怎么樣?結(jié)果還是顯示同樣的錯(cuò)誤,而且還冒出其他錯(cuò)誤。
難道我磕磕碰碰找到的新漢化方法又走不通?
不甘心,看看外網(wǎng)上的人怎么說(shuō)。翻墻搜索半天,終于找到解決辦法:在 Visual Studio 里,給修改過(guò)的有漢字的文件的編譯命令加上一條:/utf-8。
重新編譯,生成解決方案,成功!
漢化效果演示
今天就分享到這里,有興趣的同學(xué)請(qǐng)聯(lián)系草蟒老吳。
歡迎轉(zhuǎn)載!
總結(jié)
以上是生活随笔為你收集整理的如何汉化并编译 Python 源代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言的指针初始化特别注意一点
- 下一篇: python汉化补丁包怎么安装_如何安装