琪琪色原网站,琪琪色影院,琪琪色原网站影音先锋_是全亚洲更新最快

为 Python 3.9 版本添加中文关键字 — 写在草蟒 39x 发布之前

2020年11月19日

Python 3.9.0 已发布一月有余。作为 Python 汉化版,草蟒当然会及时跟进。

Python 新版本的最大变化之一是用基于 PEG 的新解析器替代了原来的 LL(1)。据称新解析器的性能与旧解析器大致相当,但 PEG 在设计新语言特性时的形式化比 LL(1) 更灵活,Python 3.10 及之后版本将开始使用这种灵活性。

由于采用了新解析器,关键字(保留字)的添加(汉化)自然与之前的版本有所不同。下面是详细步骤和踩坑记录。

老吴使用的系统和工具:Windows 10,Windows Terminal(非必需,但强烈推荐使用),Visual Studio 2019 免费版,WSL + gcc 10.1。

  1.  从 Python 官方网站下载 3.9.0 版本源代码。
  2. 打开 Windows Terminal,在 PowerShell 中 cd 到 PCbuild 目录。按照 ./PCbuild/readme.txt 中的说明,首先运行 build.bat。正式 build 之前会下载所需的外部依赖,源代码目录会多出一个文件夹 externals. 结果是成功 build 出一个 32 位 python.exe。
  3. 打开 /Grammar/python.gram 文件,添加中文保留字。作为试验,笔者仅添加了一个保留字 '函',对应英文的 'def'。语法文件中有三个出现 'def' 的地方需要添加 '函'。
        | &('def' | '函' | '@' | ASYNC) function_def
    ......
        | ('def' | '函') n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block {
    ......
        | ASYNC ('def' | '函') n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block {

     

  4. 从 Windows Terminal 打开 WSL,cd 到源代码目录,运行 ./configure。
  5. 按照  第 24 节的说明,在 WSL 中运行 make regen-pgen 以生成 Parser/parser.c。这里出现了第一个坑,提示不认识 ':=' 这个符号。这是海象运算符,Python 3.8 才引入的,我的 WSL 默认 python3 版本较低,所以需要给这个 make 命令加一个参数 PYTHON_FOR_REGEN=python3.8(这个参数值依具体情况而定,前提当然是已经安装了 python 3.8.x)。
  6. 加上参数后运行上述 make 命令,仍然提示错误:AssertionError: '函' is not a know literal,这是第二个坑。搜索这个错误信息,找到一个文件  Tools/peg_generator/pegen/c_generator.py,发现出错地方上面有个 re.match(r"[a-zA-Z_]\w*\Z", val),怪不得,改成 re.match(r"[a-zA-Z_\u4e00-\u9fa5]\w*\Z", val) 以使它能匹配中文。再次 make,成功生成 parser.c。
  7. 在 VS 2019 中打开 pcbuild.sln。根据之前的汉化经验,现在包含汉字的 parser.c 这个文件的编译命令须加上 /utf-8。设置好编译目标后,点击 pythoncore 这个项目,重新生成,成功得到 python39.dll。
  8. 双击打开 PCbuild/win32 目录中 python.exe,用 '函' 写一个函数并运行,结果并不像预期的那样成功执行,而是提示语法错误。这个坑耗费老吴半天时间才解决。那么,问题出在哪里呢?在上述步骤中,只有 parser.c 这个文件发生了改变,应该还是这个文件的问题。但打开看看,'函' 已被当作关键字处理,似乎没什么问题。
    static KeywordToken *reserved_keywords[] = {
        (KeywordToken[]) {{NULL, -1}},
        (KeywordToken[]) {
            {"函", 532},
            {NULL, -1},
        },
        (KeywordToken[]) {
            {"if", 510},
            {"in", 518},
            {"as", 520},
            {"is", 526},
            {"or", 533},
            {NULL, -1},
        },
        (KeywordToken[]) {
            {"del", 503},
            {"try", 511},
            {"for", 517},
            {"not", 525},
            {"def", 531},
            {"and", 534},
    

     

  9. 为了查清问题所在,老吴想到先不忙着添加中文关键字,而是添加英文关键字,比如给 def 取个别名 fn,看成不成。重复上述步骤,结果是成功。相应的 parser.c 的前几行如下:
    static KeywordToken *reserved_keywords[] = {
        (KeywordToken[]) {{NULL, -1}},
        (KeywordToken[]) {
            {NULL, -1},
        },
        (KeywordToken[]) {
            {"if", 510},
            {"in", 518},
            {"as", 520},
            {"is", 526},
            {"fn", 532},
            {"or", 533},
            {NULL, -1},
        },
        (KeywordToken[]) {
            {"del", 503},
            {"try", 511},
            {"for", 517},
            {"not", 525},
            {"def", 531},
            {"and", 534},

     

  10. 比较上述两段代码,细心的读者应该已经知道答案啦。这里先卖个关子,答案过几天在评论里揭晓   (>‿◠)

保留字的完整汉化还涉及到 ast、tokenizer 等的修改。老吴瞄了一眼,这部分的修改应该与草蟒 380 的汉化大致相同。草蟒 39x 已排上日程。

老吴尚未在 WSL 中编译添加了中文保留字的 python,但相信没问题。

草蟒(Python 汉化版)中文编程语言旨在给编程“去魅”,让普通人也能亲近编程、喜欢编程,借助编程这个强大的工具给自己的工作和生活带来便利,例如随心所欲地操纵 excel 表格和数据,再也不用去记忆和编写极不人道的 excel 函数(更不用说 VBA,连他亲爹微软都不要了)。

展开阅读全文
2 收藏
分享
加载中
精彩评论
感觉意义不大啊,这么几个关键字都看不懂 还是不要学编程了
2020-11-19 16:41
3
举报
这点上,不光是编码非母语造成问题,连思考和讨论都有问题。语言是表达思维的,用不熟悉的语言抑制人们思考。再加上半生不就的命名,这整个就是个灾难。
2020-11-20 13:24
2
举报
保留字只是编程语言的冰山一角。工作中,我接触过一些以英语为母语的普通老外(非 IT 业者),VBA 或 python 对他们来说就像计算器一样经常使用。普通中国人,尤其是白领,如果会一门像日常计算器那样简单易用、无师自通的编程语言,必定会减少很多 996 的日子。然而,在目前的英文编程霸权环境下,普通中国人的这个需求被抑制了。草蟒的存在,就是要正视并满足这个需求,为普通中国人提供一门像计算器一样简单高效的编程语言。
2020-11-19 17:53
2
举报
不是理解问题,是视觉布局问题。毕竟是要写要看的,视觉上不顺眼也是缺陷。
2020-11-20 13:19
1
举报
干点其他的不好吗。。。
2020-11-19 19:50
1
举报
最新评论 (21)
感谢分享中文编译python的经验,我也讨厌英文.
2020-11-19 20:43
0
回复
举报
`草蟒老吴`和`吴烜2020`居然不是一个人?
2020-11-19 20:26
0
回复
举报
我都不知道该怎么区分这两个人.
2020-11-19 20:30
0
回复
举报
区别如此之大,怎么会是一个人?哈哈
2020-11-19 20:37
0
回复
举报
我一直把你们两个当成一个人.唉,真是.
2020-11-19 20:46
0
回复
举报
干点其他的不好吗。。。
2020-11-19 19:50
1
回复
举报
感觉意义不大啊,这么几个关键字都看不懂 还是不要学编程了
2020-11-19 16:41
3
回复
举报
保留字只是编程语言的冰山一角。工作中,我接触过一些以英语为母语的普通老外(非 IT 业者),VBA 或 python 对他们来说就像计算器一样经常使用。普通中国人,尤其是白领,如果会一门像日常计算器那样简单易用、无师自通的编程语言,必定会减少很多 996 的日子。然而,在目前的英文编程霸权环境下,普通中国人的这个需求被抑制了。草蟒的存在,就是要正视并满足这个需求,为普通中国人提供一门像计算器一样简单高效的编程语言。
2020-11-19 17:53
2
回复
举报
这点上,不光是编码非母语造成问题,连思考和讨论都有问题。语言是表达思维的,用不熟悉的语言抑制人们思考。再加上半生不就的命名,这整个就是个灾难。
2020-11-20 13:24
2
回复
举报
那中国直接英文为母语不简单吗
2020-11-22 01:09
0
回复
举报
没忍住,还是要说一说。中文的字某种意义上对应英文的字母。一个“函”,在理解上,类似现有命名中简写的坏习惯,不好。在视觉感官上,太单了,即缺乏平衡感,又太过于醒目。
2020-11-19 13:46
1
回复
举报
保留字嘛,就像皇帝的名号,要尽量偏僻,以免影响普通百姓说话取名
2020-11-19 13:57
0
回复
举报
这我知道,中文编程,保留字最好符号化。但实在是看着别扭。
2020-11-19 14:06
0
回复
举报
也许“命”更易理解一点?
2020-11-19 16:26
0
回复
举报
不是理解问题,是视觉布局问题。毕竟是要写要看的,视觉上不顺眼也是缺陷。
2020-11-20 13:19
1
回复
举报
klang ( )的设计作者是尽量用两字的关键词(代码库未更新,但他一直在做)。
各种设计都会有不同角度的思量吧,发展到一定程度也许会趋同,不过现在百花齐放挺好,个人感觉。
2020-11-20 14:01
0
回复
举报
是挺好的,就是思考的太浅,还属于中文化范围。仅仅是对已有的应用,没有对编程更深的试探。
2020-11-20 14:11
0
回复
举报
打算同时维护多个草蟒版本(对应3.8 3.9 等)吗?
2020-11-19 12:40
0
回复
举报
三点八,三点九,不对得是 叁点捌 叁点玖
2020-11-19 13:46
0
回复
举报
有意思么?小学三年级都知道小数,但都知道file open read print么?
2020-11-19 16:33
0
回复
举报
是的,有此打算
2020-11-19 13:50
0
回复
举报
更多评论
21 评论
2 收藏
分享
返回顶部
顶部