中文编程的尝试历程小记

2015年3月

部分汉化coffeescript(nobodxbodon/coffeescript), 仅用于演示

2015年4月

开始讨论用中文编写汇编代码: 【图片】有筒子想用中文写汇编吗?_汇编吧_百度贴吧

2015年5月

开始讨论用中文编写Java代码: (技术探讨)这是用中文重命名Java自带类的最好方法吗?【java吧】_百度贴吧

开始汉化JDK最常用的类库: Java汉化开源项目求小伙伴【java吧】_百度贴吧 到6月发现原来设想的路线走不通, 由于default方法, 于是暂停. 2016年3月试图重开,但终发现力不能逮. 开始意识到需要改变思路 - 在高级语言中使用中文定义类/方法/变量名

2016年3-4月

用中文编写Java/Mysql, 基于Spring Boot的"进销存"项目: 业余小项目, 学用Spring boot (如对中文写代码本能排斥, 求放过)

2017年1月开始, 部分由于汇编吧中的顶贴, 重启中文编程的尝试. 从搜集中文编程的前辈和现状中(program-in-chinese by nobodxbodon), 发现多数高级编程语言已经支持中文代码. 一般编程语言的关键词不过几十个,业务逻辑主要还是靠类/变量/方法名来体现. 决定从一个实用项目入手(需有明确的用户群),在主流编程语言中实践编写中文代码,并总结中文代码风格. 于是在4个月前开始尽量用中文Java代码开发汇编编译器的项目(zhishi/assembler-in-chinese-v0 - Git@OSC - OSChina.Net),目标是实现中文助记符和标号(见首页的效果想象图).在此过程中发现不少中文代码风格特有的问题,部分小结在添加中文代码风格 · Issue #2 · nobodxbodon/program-in-chinese.


当时选择从汇编语言的编译器开始而不是设计并实现一个高级语言的考虑如下:

  1. 用Java进行中文开发,也是个新领域, 希望能够积累在主流语言中进行中文命名的实战经验(在出现主流的中文编程语言之前,这是必须的探索)
  2. 实现汇编语言编译器是对本人最可行的第一步. 在下没有设计编程语言的实际经验. 编译器的学习也是一些课堂知识. 有设计高级编程语言能力的高人是有的, 但对中文编程有兴趣的很可惜还没有碰到.
  3. 高级语言的推广很大程度上依赖于库的完备程度, 比如说, 用几行实现一个http server,当年就是个卖点. 在现在越来越"效率"优先的大风气下, 感觉用户和开发者很难有耐心让一个新编程语言逐渐积累实用库. 在这种背景下, 也许只有底层编程语言才有让中文编程发芽的土壤.

现在项目进度是, 实现了一部分语法和助记符的编译(附在最后); 64位PE文件生成刚开始,已经触及了所有官方文档包含的属性,但大多数还没有吃透(暂时用常量而非动态生成).


2017年7月26日, 中文编程Github讨论组创建.

2017年11月9日, 中文编程知乎专栏开通.


=====编译正确=======
addbyte.asm:2 add ax,5 --> [83, c0, 05]
addbyte.asm:3 add ax,strict byte 5 --> [83, c0, 05]
addbyte.asm:4 add ax,strict word 5 --> [05, 05, 00]
addbyte.asm:5 add ax,-128 --> [83, c0, 80]
addbyte.asm:6 add ax,strict byte -128 --> [83, c0, 80]
addbyte.asm:7 add ax,strict word -128 --> [05, 80, ff]
addbyte.asm:8 add ax,0x7f --> [83, c0, 7f]
addbyte.asm:9 add ax,strict byte 0x7f --> [83, c0, 7f]
addbyte.asm:10 add ax,strict word 0x7f --> [05, 7f, 00]
addbyte.asm:11 add ax,0x80 --> [05, 80, 00]
addbyte.asm:12 add ax,strict byte 0x80 --> [83, c0, 80]
addbyte.asm:13 add ax,strict word 0x80 --> [05, 80, 00]
addbyte.asm:14 add ax,0x100 --> [05, 00, 01]
addbyte.asm:15 add ax,strict byte 0x100 --> [83, c0, 00]
addbyte.asm:16 add ax,strict word 0x100 --> [05, 00, 01]
addbyte.asm:19 add bx,5 --> [83, c3, 05]
addbyte.asm:20 add bx,strict byte 5 --> [83, c3, 05]
addbyte.asm:21 add bx,strict word 5 --> [81, c3, 05, 00]
addbyte.asm:22 add bx,-128 --> [83, c3, 80]
addbyte.asm:23 add bx,strict byte -128 --> [83, c3, 80]
addbyte.asm:24 add bx,strict word -128 --> [81, c3, 80, ff]
addbyte.asm:25 add bx,0x7f --> [83, c3, 7f]
addbyte.asm:26 add bx,strict byte 0x7f --> [83, c3, 7f]
addbyte.asm:27 add bx,strict word 0x7f --> [81, c3, 7f, 00]
addbyte.asm:28 add bx,0x80 --> [81, c3, 80, 00]
addbyte.asm:29 add bx,strict byte 0x80 --> [83, c3, 80]
addbyte.asm:30 add bx,strict word 0x80 --> [81, c3, 80, 00]
addbyte.asm:31 add bx,0x100 --> [81, c3, 00, 01]
addbyte.asm:32 add bx,strict byte 0x100 --> [83, c3, 00]
addbyte.asm:33 add bx,strict word 0x100 --> [81, c3, 00, 01]
arithsmall.asm:2 and eax, 3584 --> [25, 00, 0e, 00, 00]
arithsmall.asm:3 and eax, 35 --> [83, e0, 23]
arithsmall.asm:4 and eax, strict dword 3584 --> [25, 00, 0e, 00, 00]
arithsmall.asm:5 and eax, strict dword 35 --> [25, 23, 00, 00, 00]
arithsmall.asm:6 and eax, strict byte 3584 --> [83, e0, 00]
arithsmall.asm:7 and eax, strict byte 35 --> [83, e0, 23]
arithsmall.asm:8 and ebx, 3584 --> [81, e3, 00, 0e, 00, 00]
arithsmall.asm:9 and ebx, 35 --> [83, e3, 23]
arithsmall.asm:10 and ebx, strict dword 3584 --> [81, e3, 00, 0e, 00, 00]
arithsmall.asm:11 and ebx, strict dword 35 --> [81, e3, 23, 00, 00, 00]
arithsmall.asm:12 and ebx, strict byte 3584 --> [83, e3, 00]
arithsmall.asm:13 and ebx, strict byte 35 --> [83, e3, 23]
genopcode.asm:2 mov al, 0 --> [b0, 00]
genopcode.asm:3 mov byte al, 0 --> [b0, 00]
genopcode.asm:4 mov al, byte 0 --> [b0, 00]
genopcode.asm:5 mov byte al, byte 0 --> [b0, 00]
genopcode.asm:7 mov byte [0], 0 --> [c6, 06, 00, 00, 00]
genopcode.asm:8 mov [0], word 0 --> [c7, 06, 00, 00, 00, 00]
genopcode.asm:9 mov dword [0], dword 0 --> [66, c7, 06, 00, 00, 00, 00, 00, 00]
genopcode.asm:11 mov eax, 0 --> [66, b8, 00, 00, 00, 00]
genopcode.asm:12 mov dword eax, 0 --> [66, b8, 00, 00, 00, 00]
genopcode.asm:13 mov eax, dword 0 --> [66, b8, 00, 00, 00, 00]
genopcode.asm:15 mov dword eax, dword 0 --> [66, b8, 00, 00, 00, 00]
genopcode.asm:16 mov bx, 1h --> [bb, 01, 00]
imm64.asm:7 mov rax, 0x1000              ; 32-bit imm --> [48, c7, c0, 00, 10, 00, 00]
imm64.asm:8 mov rax, 0x1122334455667788  ; 64-bit imm (larger than signed 32-bit) --> [48, b8, 88, 77, 66, 55, 44, 33, 22, 11]
mem64.asm:2 mov ax, [0]			; 66 8B 04 25 00 00 00 00 --> [66, 8b]
mixcase.asm:2 MOV AX,5 --> [b8, 05, 00]
riprel2.asm:5 	mov rax,[foo] --> [48, 8b]
ripseg.asm:5 mov rbx, [foo] --> [48, 8b]
shift.asm:3 shl al, 1 --> [d0, e0]
shift64.asm:2 shl rax, 5 --> [48, c1, e0, 05]
shift64.asm:3 shl rax, 32 --> [48, c1, e0, 20]
shift64.asm:4 shr rax, 5 --> [48, c1, e8, 05]
shift64.asm:5 shr rax, 32 --> [48, c1, e8, 20]
strict.asm:17 add eax, 4 --> [83, c0, 04]
xchg64.asm:2 xchg ax, ax --> [66, 90]
编辑于 2017-12-12