overview
overview copied to clipboard
中文化 类C编程语言 需要什么样的关键字?
基于clang做中文编译,取得了一点成绩。 做出来是中英双语的,可使用中文关键字、中文符号,对原来的C,C++,Objective-C没有影响,安全兼容。 之前基于tinycc做的时候,有人嫌弃中文关键字选得不好。 目前还没动工,大家看看用些什么字词比较好? Java, JS, Python, Go 等其他语言也可以一起讨论一下。
----- 追加 ----- 关键词汉化待选列表整理在此wiki页
我的主张关键字还是应该与长期以来形成的一些习惯保持一致,就中文关键字来说,字符最好控制在2到4个个,不要太长也不要太短,还有就是各种语言虽然关键字不同,但是中文能统一是最好的。
其实问这个问题之前,我希望的都能找到一个字对应,最好了。比较适合懒癌患者。 当然做出大家肯定会不喜欢的
可以统计一下,哪些关键字用得多,就尽量短一些。
我的脑洞: int 整 char 字 float 浮 double 双
switch 切 case 例
if 如 else 另
return 回
break 破 continue 续
new 新 delete 删 namespace 名宇
this 此
try 试 throw 抛
while 、for 和 in 还有好多没想好 要是有人是中文系的就好了。
希望这个讨论不会太分神(因为太见仁见智, 就像推敲诗里的取字一样)妨碍编译器修改的进度 :) 好像你之前也提到过, 先改出来再说, 毕竟修改词汇是方便的事情. 只要还没有大规模推广, 就不用考虑太多向前兼容的问题.
话说回来, 也许需要一些例程, 囊括所有关键词, 写出来看看视觉效果. 比如(来源), 只包含了几个:
#include <iostream>
using 名字 std;
整 main () {
字 成绩 = 'D';
切(成绩) {
例 'A' :
cout << "牛!" << endl;
破;
例 'B' :
例 'C' :
cout << "不错" << endl;
破;
例 'D' :
cout << "及格" << endl;
破;
例 'F' :
cout << "从头来过" << endl;
破;
默认 :
cout << "没这种成绩" << endl;
}
cout << "你的成绩是" << 成绩 << endl;
回 0;
}
虽然够醒目了, 不过感觉有些不大自然. 当然, 英文关键词对于英文自然语言很多也是很不自然的 :) 不过那些英文关键词是好几十年前成型的, 相比现在可读性要求可能比较低, 咱们的起点可以考虑高一些.
切
其他含义用的比较多吧, 猜想你取的是"切换"之意. 个人脑洞一下, 也许, 不用特别拘泥于英文关键词本身的翻译, 而基于它的用途(代码中的作用)来寻找中文对应. 抛砖迎玉一下, 比如switch
, 感觉 岔 蛮形象的.
另外, 个人第一感觉回
后面跟的是回
到的位置, 因为回家
的印象太深了...平常说的函数返回值
已经有点约定俗成了, 要不还是用返回
?
要是有人是中文系的就好了。
@nlpguyz 不知你有没有认识有中文/翻译专业背景的一起讨论?
@htwx
还有就是各种语言虽然关键字不同,但是中文能统一是最好的。
要不把CTS的关键词中英对照贴一下? 或者分享一下相关的代码链接?
我赞成先作。作好了,可以随时改嘛。 现在主要是先搞出中文环境才是第一
int 整数型 char 字符型 float 浮点型 double 双浮点型
switch 开关/切换 case 情况
if 如果 else 否则
return 返回
break 断开 continue 继续
new 新建 delete 删除 namespace 命名空间
this 本体
try 尝试 throw 抛出
还可再商酌
我认为没有必要在使用中文的时候还是一个单字,使用中文的好处就在于能达到一种类似”所见即所得“的效果,能够让代码有自解释的作用。使用汇编、C、高级语言,都是为了对程序员友好,增强可读性和可维护性的,减少代码量是实现这两个目的的副产品,因此不要节省,像 @htwx 说的,2-4个字符都可以接受,中文也有这个能力。
中文编程的另一个重要目的就是不需要人有英文的思维和相关知识,只需要关心计算机技术、算法、业务逻辑等待。对于我们这些已经会了的人,在做中文关键字和语言的时候,就要去除脑子里的这些思维定式,像有些关键字不好翻译的时候,正说明我们没有真正的理解,而是在机械的模仿,记住了判断情况很多就用switch,循环就用for等等,至于它是什么意思,并没有转化为母语来理解记忆。
我建议先按语言把关键字列出来,容易翻译的先确定好,不好翻译的我们分任务自愿领取,专门去查询一下使用这个词的原因,一起讨论,确定适合中文用户理解的翻译。
@swizl
while 、for 和 in 还有好多没想好
while 就是 当 for item in items 就是 对于 item 在 items 中 这里就涉及到中文和英文的语法区别,从这里也可以看出来英文编程语言并非完全不是英语,它还是包含了英文语法的。可作为反驳这一观点的论据。
@hummerstudio in 是我最头痛的一个。改语法我还搞不定,"在...之中"我找不到一个前置用法的词。不过我感觉古文中很有可能有,可以找出了再用用,大家习惯就好了。
前面的关键字都很正式,对于有赖癌的我来说,有些太长了。 下面两个嘈点: 类型干吗都加“型”,每人知道只是型吗? 如 双浮点型,四个字,多少个拼音字母啊! 英文也只叫double,没叫double_float.
@hummerstudio 我想了一下,可以多弄几个同义词。不过要改一改,clang匹配的文本和kw的方式,加起来才方便。不然加一个词都得source全搜一般,4,5处加一加。
要不在wiki里建个页面, 类似这样列出关键词和待定的可能选项? 然后有不同想法的可以自己添到"待选关键词里". 不过也许需要一个大致同意的'风格", 比如是否带"型".
英文关键词 | 待选关键词 | 暂定 |
---|---|---|
int | 整 整型 整数 整数型 | |
char | 字 字符 字符型 | |
... | ... |
@swizl
"在...之中"我找不到一个前置用法的词。不过我感觉古文中很有可能有,可以找出了再用用,大家习惯就好了。 古文是”于“,如居于此,处于中等等。
我觉得中文关键字可以分为两类,一类是汉化已有语言的,不用要求完全符合汉语语法,汉化只是为了避免使用英文和混用导致的不一致性问题,这是中文编程的第一步(基于现有技术、时间限制和利用现有语言的需要),写中文关键字教程的时候可以提到原始英文,但写代码还是用中文来写。最终我们是希望能够按汉语语法来的,这个就需要我们自己来创造新语言了。
下面两个嘈点: 类型干吗都加“型”,每人知道只是型吗? 如 双浮点型,四个字,多少个拼音字母啊! 英文也只叫double,没叫double_float.
型不加感觉也可以。不要去想字母个数了,只想汉字个数吧!加上IDE的智能提示,其实效率会很高的!如何翻译可以再商酌,我查了下,像float
关键字在C#里对应的类是System.Single
,这样和double才是对应关系,float说不定是个历史遗留的关键字,后来CPU发展了,才出现double类型,这背后都是有发展脉络的,但是我们并不清楚,我认为我们翻译尽量符合实际意思,不一定直译。
在上述知识的背景下,float
翻译为单精度
,double
翻译为双精度
似乎更好。
@nobodxbodon 可以的。
wiki页已新建, 链接也添加到了顶楼
这是TS涉及到的
'string': '文字',
'number': '数字',
'symbol': '符号',
'function': '函数',
'boolean': '真假',
'null': '空',
'true': '真',
'false': '假',
'void': '无值',
'never': '不可及',
'object': '基对象',
'__type': '__类型',
'unknown': '未知的',
'untyped': `类型化`,
'__resolving__': '__解决中__',
'any': '通用型',
'arguments': '增强参数集',
'__computed': '__计算',
'__object': '__基对象',
'__function': '__函数',
'__jsxAttributes': '__jsx属性',
'arg': '参数',
'export=': '导出=',
'__export': '__导出',
'__index': '__索引',
'__new': '__新建',
'__call': '__调用',
'__constructor': '__构造器',
'__global': '__全局',
'__class': '__类',
'__missing': '__失踪节点',
'default': '默认',
'prototype': '原型',
'exports': '导出集',
'ThisType': '本对象类型类',
'Array': '数组类',
'Object': '基对象类',
'Function': '函数类',
'String': '文字类',
'Number': '数字类',
'Boolean': '真假类',
'RegExp': '正则表达式类',
'abstract': '抽象',
'as': '转为',
'break': '跳出',
'case': '为',
'catch': '捕获',
'class': '类',
'continue': '继续',
'const': '常量',
'constructor': '构造器',
'debugger': '调试',
'declare': '声明',
'delete': '删除',
'do': '开始',
'else': '否则',
'enum': '枚举',
'export': '导出',
'extends': '扩展',
'finally': '最后',
'for': '循环',
'from': '从',
'get': '取',
'if': '如果',
'implements': '实现',
'import': '引入',
'in': '在',
'instanceof': '类为',
'interface': '接口',
'is': '是',
'keyof': '键为',
'let': '变量',
'module': '模块',
'namespace': '名称空间',
'new': '新建',
'package': '包',
'private': '私有',
'protected': '保护',
'public': '公开',
'readonly': '只读',
'require': '需要',
'global': '全局',
'return': '返回',
'set': '置',
'static': '静态',
'super': '父构造器',
'switch': '假如',
'this': '本对象',
'throw': '抛出',
'try': '尝试',
'type': '类型',
'typeof': '类型为',
'var': '自由变量',
'while': '判断循环',
'with': '外扩',
'yield': '获得',
'async': '异步',
'await': '等待',
'of': '属于',
'IArguments': '所有参数接口',
'ReadonlyArray': '只读数组类',
这些是TS里JSDOC涉及的
export const 内置JSDoc标签名 = createMapFromTemplate({
"@type": "@类型",
"@typedef": "@自定义类型",
"@prop": "@属性",
"@property": "@属性",
"@arg": "@参数",
"@param": "@参数",
"@augments": "@增强参数集",
"@augment": "@增强参数",
"@return": "@返回",
"@returns": "@返回",
"@class": "@类",
"@constructor": "@构造函数",
"@template": "@模板",
})
@htwx orz 拜托一下, 最后一个特别长的(ES5)能不能换成一个代码链接啊? github的issue连个分页也没有, 这样五千多行贴出来之后, 看之后的评论的会比较累, 翻到底要个好几分钟, 呵呵
我这个翻译的不好但是很全面, 这个也是我还没发布的主因. 关键字和相关术语及常用的标识符最好形成一个业界统一的标准, 成立个标准组织.
这个歌CTS里面涉及到的内容实际很多包括了全部ES5 里面的方法属性 对象等等内容, 关键字及标识符汉化是很重要的, 我的这套汉化的不理想, 这也是我还没发布的主因. 关键字 根据我这些年的 经验 最好就是固定 2~3个汉字的范围内, 标识符 主要 分为:
模块名 名称空间名 函数名 类名 枚举名 接口名 装饰函数名 方法名 属性名 实参名 形参名 类型参数名 变量名 全局变量名 常量名 术语(HTML SVG ... ) 文件名 ....
最好要有一套方案 我的经验及建议是 关键字 最好2~3个之间, 中英文编程人员认同度高的(就是不要和英文原版差距太大), 要给人学了中文编程后很轻松的就可以去写英文编程, 不要造成太严重的割裂. 从我的这套代码写出来的效果看 1个字的 关键字很不可取,
1: 太短给鼠标选择带来困难. 2: 目前来看空格作为分割符是省略不掉的,用空格分割后1个字很不协调. 3: 在后期插件处理上1个字的关键字给插件编写带来一定的难度(主要是智能提示). 4: 名称尽量符号程序中的逻辑. 5:类似于 get set I of in is on from at obj err 等等类的 可以根据是在标识符开头\ 中间\ 结尾\ 独立 \大写\ 小写等特点 固定翻译.
@hummerstudio in 对应 '于' 不错,这个居然搞忘了。 主要是一些介词,比较难搞,像 of 之类。 如 sizeof, 之前翻成 "求大小" 还是不满意 不知道有没有跟 of 意思、用法都搭得 字词?
@htwx 大部分关键字都很好,但有一些看着就不爽,有一些还没统一起来。 也亏你,憋出这么多,不容易
is 是 这个应该是判断的吧,用 '为' 较好。有的语言有 yes,no的值,到翻译的时候,找什么对应去呢? in 在 虽然我之前也是这么翻的,但一直不爽。于 真的可以。
keyof 键为 感觉就不是一个意思,我也头疼 of。 求键 如何 typeof 类型为 同上
var 自由变量 var 不是Variable的缩写吗? "变量" 就可以了。
RegExp 正则表达式 正则 就行了,RegExp 也是缩写呀。哪天人家写全了,怎么翻?
for 循环 while 判断循环 也行,就是感觉意思没到
typedef 自定义类型 类型定义
空 null 无值 viod void 无值 我觉得两个意思弄反了, null 无, void 空
untyped 类型化 意思反了,未类型化
switch 假如 case 为 好吧,能自洽。感觉意思不一样
@swizl var 这个和 let 在ts 里挺冲突的 现在更推荐用 let 所以就把 var 翻译为 自由变量 意思比 let 变量 更灵活的意思 关于 of 是比较麻烦的 根据你的提醒 我感觉 翻译为 "求解" 在这种用法中更合适 类型求解 键型求解 怎么样 关于其他的都比我的强, 看来多讨论是有用的. 谢谢 错误处多指正,我这些都是机器翻译的,我本人是看着英语就困的人,不是假的是真的3个字母以上的英文 我要1天不输入10次以上就会忘, 2个月没打过英文 不管原来多熟悉也想不起来, 其他的就没这个毛病, 脑袋没感觉本. 我自称 "英语盲" 10年编程 离开 ide 不会写, 因为我只记住了关键字的 前2-3个 字母. 看着认识就是记不住字母顺序.
@htwx 刚看了一下,var 和 let 用法上还是有一点区别的,var 从JS继承的,在JS里被诟病过的,let应该有些优化。当然主要是原词语义要对应上,一个用过原版语言的人能很快识别。
我建议 var 变量 let 让/设
我上学的时候,英文也非常烂。主要是对英文比较抗拒。 工作之后,因为邮件、文档有的公司是英文,没办法必须抛弃抗拒的心态。 慢慢积累,才有一点提高的。
如 sizeof, 之前翻成 "求大小" 还是不满意 不知道有没有跟 of 意思、用法都搭得 字词?
@swizl 像之前提到的, 如果不拘泥于它的现有关键词, 而是基于它的实际含义, 那么也许字长
接近?
这种方式的坏处是一开始用惯sizeof的可能看起来不舒服, 不过感觉对于新手来说可能会更加易于理解.
另外, 在看到这个例子之前, 我也一直设想一个英文词在所有它所在的编程语言里都最好有同样的中文对应, 但是, sizeof在PHP里是求数组中元素个数的, 在Java里没有sizeof但核心库里有size, 也是求Collection中元素个数. 如果强求用词一致性, 似乎是延续了同一英文用词在不同编程语言中有不同含义这个问题. 是不是可以考虑基于在每种语言中的实际含义, 具体情况具体分析?
clang 折腾新成果 修改一个文件就能支持中文关键字了 https://github.com/llvm-mirror/clang/blob/master/lib/Basic/IdentifierTable.cpp
void IdentifierTable::AddKeywords(const LangOptions &LangOpts) ; 中用 AddKeyword 添加中文关键字 和 关键字enum 的对应关系
tok::PPKeywordKind IdentifierInfo::getPPKeywordID() const ; 在 switch 的 default 中可加 宏 的关键字,通过 字符 返回 宏关键字enum
就这么简单!
@swizl 恭喜! 期待早日看到代码示例, 或者新代码库.
来个最难翻译的 如果 class 翻译成2个汉字 怎么最好 @swizl @nobodxbodon @buyouyuan @hummerstudio 我翻译成 种类 肯定是最差的.
"类型"? 其实感觉也需要推敲一下. 之前在写Java入门的时候, 倒是纠结了一下"object"的说法. 主要是没想明白为什么一开始要译作"对象", 个人感觉"个体"更形象. 一个"类型"可以有很多"个体", 感觉挺顺的. 欢迎拍砖.
class type object Object 这2个都麻烦 C++ 的原则要比那个麻烦点 他内部可能会有对关键字字符代码的验证,例如 关键字的长度 和 关键字字符是否为 ascii 等等
觉得这个解释有点借鉴: class - 类别 type - 类型 不好意思之前写反了
至少比 种类 强 听你的就叫 类别了, 那个最后 也改成 善后 或 收尾, 一会在把整理好的 关键字表 在发一遍. 号召大家继续改. 这个对语言读和理解起来太重要了.
导入 { 某某类 } 来自 "某某模块"; 引入 { 某某类 } 来自 "某某模块"; 引用 { 某某类 } 来自 "某某模块"; 使用 { 某某类 } 来自 "某某模块";
基于 clang 的 中文编译前端 cnlang,提交上库了。so easy!