欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何汉化并编译 Python 源代码

程序员文章站 2024-03-14 20:46:35
...

前言

笔者是一名业余编程爱好者,年初偶然混进中文编程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。
重新编译,生成解决方案,成功!

汉化效果演示

如何汉化并编译 Python 源代码
如何汉化并编译 Python 源代码
如何汉化并编译 Python 源代码
今天就分享到这里,有兴趣的同学请联系草蟒老吴。
欢迎转载!