如何汉化并编译 Python 源代码

前言

笔者是一名业余编程爱好者,年初偶然混进中文编程OO群。因觉得中文编程乃大势所趋,遂入了 Python 汉化(我称之为“草蟒”项目)的坑。笔者孤陋寡闻,刚开始汉化的时候只知道 GCC 且 GCC 不支持中文,所以没有选择汉化源代码的方式,而是采用替换式表层汉化方法(中文编写的程序,包括中文关键字和变量名等,先替换成英文,再交给解释器执行)。但近期从群里得知,Clang、VC 等编译器支持中文,这让我觉得从源代码入手进行汉化是完全可行的。
笔者在 Linux 和 Windows 系统下进行了实验汉化。Python 汉化大致可以分为两部分:关键字汉化和其他源代码汉化。

参考文章

[1]:为Python添加中文关键字
[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

我的工具

  1. Windows 10 + Visual Studio 2019(须选装 python 开发支持)
  2. WSL Ubuntu + Clang
  3. 从 python 网站下载的 3.8.0 版源代码

关键字汉化

用 sublime 打开源代码 Gramma 目录中的 Grammar 文件并添加中文关键字,保存为 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 版本和所用编译器的不同,汉化关键字需要加单引号,这与参考文章[1]所述有所不同。
另外还要修改 Python/ast.c 文件。

其他源代码汉化

汉化版必须支持英文版,所以不仅仅是汉化一些字符串,而是需要大量复制原来的代码并加以汉化。笔者汉化了两个函数以供演示效果,参见后面的图片。这是一个复杂的系统工程,欢迎感兴趣的读者联系我并加入汉化大业。

Linux 下编译

参见源代码目录下的 README.rst,cd 到源代码目录,然后执行以下命令:

    ./configure
    make regen-grammar(重新生成 graminit.h 和 graminit.c)
    make
    make test(比较耗时,仅做实验的话这一步可省去)
    sudo make install(这一步也可省略)

编译成功,运行 python 3.8.0,输入中文关键字和函数,正常执行。

Windows 下编译

Linux 平台下的轻松成功给了笔者很大的信心,随即转战 Windows 平台。之前只汉化了 while 等几个关键字,这次汉化了更多关键字,并打算用 Parser/pgen 这个 py 程序重新生成 graminit。结果让我大吃一惊,无论中文关键字加不加引号,或者用其他方式,都会报错。
转念一想,无论哪个平台,用的 graminit 文件都是一样的。何不在 linux 下生成汉化的 graminit 文件,然后在 windows 下使用呢?果然,这个办法是有效的。WSL 真心不错,否则要在两个平台之前切换还真麻烦。
开始编译。按照 PCBuild 下的 readme,在 Power Shell 中运行 build.bat。(第一次运行的话,会下载一些 externals,需要很长时间。)没执行一会,就显示一大堆红色警告:“error C2001: 常量中有换行符”。
问度娘,原来是 VS 的问题,奇数汉字不能正确解码,偶数汉字可以。网上给出的解决办法显然都不行。那么把 VS 的编译器换成 Clang 怎么样?结果还是显示同样的错误,而且还冒出其他错误。
难道我磕磕碰碰找到的新汉化方法又走不通?
不甘心,看看外网上的人怎么说。翻墙搜索半天,终于找到解决办法:在 Visual Studio 里,给修改过的有汉字的文件的编译命令加上一条:/utf-8。
重新编译,生成解决方案,成功!

汉化效果演示

IDLE 图 1
IDLE 图 2
IDLE 图 3
今天就分享到这里,有兴趣的同学请联系草蟒老吴。
欢迎转载!

发布了1 篇原创文章 · 获赞 1 · 访问量 268
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览