-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
简单易用的中文编程(脚本)语言原型 #33
Comments
@wkgcass 还望你多多指点, 时日不多, 弯路能少走一点都好. |
想象中的代码样子(非常不严谨), 空格只为表示分词, 实际可能不需要:
|
|
确实, 如果不能创建一个Java对象, 就只能调用静态方法了. 考虑把OO作为第二阶段迭代的内容. 第一个迭代越短越好 :)
你觉得楼上的写法会不会好点? 语法还没总结, 现在有点乱.
赞! 请问有代码可供学习吗?
编译成bytecode感觉是额外的工作量吧? 刚看了一下What takes more time? Building an interpreter or a compiler?, 对于快速开发和原型验证来说, 从解释器开始比较省工的样子.
语法希望能尽量从简. 自洽还是想尽量做到为好, 请教这方面有什么心得? |
之前我在学习Lisp的时候,根据自己的一些对于编程的理解,折腾出一个不成型的编程语言,它的设计目标之一就是支持全中文的编程模式,也基本上达到了这个目标。 最初有这个想法的时候,是试用Python实现的,这是最初的版本。后来因为找工作的缘故,所以又学了Java并用其改写之,语言设计上也有一些变动。通过这个小项目也找到了工作,可却是做Rails开发的工作。 目前是跟一个加拿大外包过来的外卖项目,技术上主要是web相关的那些东西。工作以后,这个项目闲置了有一段时间了。后来被拉进我们这个中文编程组里面,又有兴趣重新折腾一下这些代码。最近的计划是准备用coffeescript重写一遍,然后发布到npm上去。 现有的代码主要的一个缺陷是求值器没有实现尾递归优化,这对于lisp这一类使用递归取代循环的语言可以说是很严重的,所以这个语言目前没有任何实用的可能,主要的用途,是用来展现下语言设计上的一些想法。 |
语言最终看上去大概是这个样子,以下是一段实现快速排序算法的代码:
这个语言用以实现完全中文化的途径是这样的。语言的核心是一组元算子与一些字面量的混合体,所有的成型代码都是由语言核心的这些元素衍生定义出来的,通过中文化语言核心的表示法,并在编程的过程中继续使用中文化的标识符命名,那么由此而来,整个语言的所有代码,除了一些括号引号之类无所谓语言差别的内容,便都是中文化的了。 举例如下。在这个语言中,定义是算子 define,而二元加法的算子是 add,匿名函数的算子是 lambda,现在我们建立一个三元的加法算子,用英文代码的表述是:
在这里,我们只需将 define add lambda 三个元算子中文化,如改写为 定义 加 算子 这三个名词,其余的符号一应改为中文,则得到了:
所谓元算子,就是不由其他算子定义的算子,是固化在语言设计中的那些,嗯,也可以叫做函数,如果这样好理解一些的话。 一个更复杂的例子如下
大概是这样一个样子。 当时准备面试的时候,还写过挺长的一个说明文档,更加详细些,我回去找找,然后在此粘贴一下。 |
@NeR000 哦! 类Lisp的语法? 期待啊! 以前一个学期的课就是用Scheme逐步实现一个Scheme语言子集的非常初步的编译器, 还是挺怀念的. 上面的例子里 lambda 有的对应"算法", 有的是"算子", 是笔误吗? 以前也考虑过设计类lisp语法的, 因为当时很深的印象就是语法的简约. 不过后来被它(们)在商业上的冷遇吓住了. 不知你对顶楼列出的那些目标有什么看法? |
我在试图将这个语言中文化的过程中,遇到的一个主要的困难其实是,目前中文中的词汇,并不能很好的表达我们使用英文编程时那些概念。最明显的,我们都知道map与reduce操作,我们也知道他们的用法,但是,用中文中如何表达这个两个词汇呢,我想了许久都没有找到合适的。再比如apply函数,其实就是表达 在我前文提到的语言中,主要就是以下词汇表中词汇,直接粘过来Java代码了。
将以上这些名词中文化之后,这个语言在表现上就是完全中文化的,这些其实也就是一般语言中的那些关键字一类的东西。 |
关键词的中文化确实是个需要推敲的话题. 之前也聊到对C/Lua的中文关键词进行一致化的问题. 相信集思广益能够总结出合适的. 'apply'的话, '应用'/'施展'/'套用'如何? |
@NeR000 的提议感觉还不错,可以考虑一下 但是中文和“标点符号”的相性似乎都有点差(你想,古代人为啥标点符号最多是个“.”),特别是全/半角切换麻烦。所以这点还得再考虑下。 add :: Int -> Int -> Int
add a b = a + b
add 1 2
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n - 1) 换成中文写出来就是这样:
(其实还是感觉有点怪怪的,毕竟现在不管数学还是计算机科学,所有变量都是字母+数字代替) |
之前做lua和c的中文关键字时,也纠结过命名问题。一开始想找个贴切的、大家都能接受的词,后来想想纠结个球,先做出来再说,有更合适的词以后再改。众口难调的话,自己喜欢什么词,自己拿代码改去。 |
apply是application的动词形式。application是指,将一个函数应用在某个参数上这一过程。(详见 |
Atom高亮其实就是一个cson文件,里面配置正则表示的语法规则(当然还有少许显式的状态机配置) 编译到字节码有几个很大的好处,那就是自然而然的让JVM帮你处理异常、GC、优化代码。 |
@wkgcass 多谢高亮示例.
第一版的目标可能就是这样了. 可能更像shell脚本语言的子集. 打算先从抽象语法树开始, 暂时不定具体词法. |
第一版打算在24号前, 开发非常小的一个功能集:
|
我把一小段Python代码,翻译成了中文,个人觉得应该比较有代表性,比较符合中文使用习惯。
@nobodxbodon 已经添加入GitHub,感谢! https://gist.github.com/qingseshaohua/9717f2750468f1a0801c235673a86567 如果有翻译这块的问题,我想我能帮上一些忙。 |
@qingseshaohua 多谢! 这样和周蟒/中蟒的方向可能比较近吧. 关于分享代码, 可以试试创建github gist: https://gist.github.com/ 比如https://gist.github.com/rfyodorov/2ae5dbf7e1c5d2685b4e |
@nobodxbodon
易语言需要改进或者添加的地方:
这些都是大的问题,小的细节太多了,说不完,下次有机会再说吧 |
@qingseshaohua 赞! 多谢分享. 由于本人对Java相对熟悉一点, 所以从开始就打算用Java实现这个原型. 这样对unicode和64位系统, 以及非windows系统的支持应该是与生俱来的. 副作用就是依赖JRE. 最好是做可执行包避免用户额外安装JRE, 有额外工作量. 另外, 打算把解释器和运行环境都集成在IDE里. 这样绕过了生成独立运行程序的一步, 也让代码分享更有意义. 缺点就是, 所有的源码都需要用这个IDE运行. 安装和运行它有额外的开销(硬盘几十-几百兆, 内存可能几百兆)
这些恐怕要慢慢积累, 其实大多数提到的库都已经实现了, 只不过接口是英文的. 我们主要的工作量就是把这些接口进行中文封装, 以及文档翻译. 另外可以从Java调用系统 API, 可能优先考虑JNA
现在还在考虑是依赖现有IDE开发插件还是重新开发一个. 两种可能都费工不小. 释义和自动补全确实非常重要. 不过, 还不确定是否能够在三个月内实现.
这个原型主要应用目标可能还是一些简单任务. 比如: |
模块化直接抄C的#include就好了。第一版就可以加上去了吧 |
别这么搞啊。。。命令行吧,你反正又不显示图片 |
|
这个设计有点像Wolfram语言,https://www.zhihu.com/question/22860404 |
我觉得迄今为止, 我们研究的都是虚拟机语言.在别人已有的某一条件基础上进行探讨和开发.这势必会产生强烈的依赖性.这为中文编程带来了无法自主的后果. |
其实这个项目是比较急功近利的. 以我对自己的了解, 如果是自己八百年都不会用的工具, 恐怕是不大有动力维持的. 由于现在工作还时不时要做一些文件处理之类的琐事, 而我又对shell或者perl脚本不熟, 所以打算从这个方面的功能入手. 期望值请尽量放低一些, 最有可能做出来的是非常不通用的一个工具集而已. 如果自己能够用上那么几次而且还算顺手, 就已经谢天地了. 在像样的原型建立之前, 恐怕任务分配比较难, 毕竟自己都没有一个很清晰的路线图, 属于走一步看一步的阶段. 欢迎各位建议一些日常常用而又不大找得到好用的工具的文件处理用例, 尽量一起考虑. 当然很希望看到的是其他中文编程语言的创造. 成型的各种领域和用户群的英文编程语言应该不下百种, 未成型的实验语言应该不下千/万种. 中文编程语言的尝试还是太少太少了(当然在下也是孤陋寡闻, 肯定有很多尝试不知道). 转一篇有点共鸣的文章: 编程语言:变革创业思维的工具. 工具就应该是用户随着自己的需要创造出来的. 所有用户都有这个资格创造适合自己的工具. 而适合自己的往往也会适合其他一些人. 如果足够好用, 别人也会开始用, 这样的发展应该是比较自然和合理的. |
@nobodxbodon LISP系语言代码量都不大的= =递归到底。。。 |
@wkgcass 嗯, 记得以前编译基础课用Scheme写Scheme子集的解释器, 开头被震惊到了, 好像没多少行就实现了最基本的功能. 不过好像其他功能上去之后还是会变大不少吧. |
如楼上所说, 打算从最最基本的语言开始, 不考虑演进, 只实现变量赋值、条件判断、函数调用, 和四则运算. 尽量用最简单的代码实现, 主要为演示和学习用. 名字暂取"圈"语言. |
这个方向的进展如下: |
今年内预计不会在此方向继续探索. 打算写一个索引页把这些帖子分类. |
重拾《 两周自制脚本语言 》- 支持中文标识符 再次尝试. 下面几步:
|
调研IDE支持时发觉, 代码补全等等需要与语法分析结合. 另外, 调试器接口和与IDE的集成(Eclipse或vscode)工程不小. 上面最后一项, 调用Java库, 可参看Latte语言实现以及https://tomassetti.me/generating-bytecode/. |
早先算是开了个头: 实践"两周自制脚本语言"一书
昨天也被 @qingseshaohua 提醒一个很重要的方向是让更多人能够容易用编程的方式解决自己的问题. 因此打算在3个月内试着做一个原型出来.
由于时间精力非常有限, 打算尽量把工作量减到最小. 有所为, 有所不为. 下面是一些初步设想.
The text was updated successfully, but these errors were encountered: