一、为什么写X语言规范
到目前为止,已经大概清楚如何实现词法分析和构造抽象语法树(AST),对于如何实现执行也有一点思路,但是因为AST部分代码还没完成,所以就算我想赶紧写代码验证思路,也做不到。现在已经验证了如何实现AST,能做的就是把词法分析和构造抽象语法树(AST)先实现了。因此,在做这部分之前,先写下一个规范文档,用于指导代码的编写,保证编写的代码不与规范冲突。
二、X语言规范的整体要求
在定义X语言规范之前,我告诉自己,尽量不要造另类的特性,尽量遵循C系习惯,因为我觉得这会导致学习成本极高,这不是我的初衷。我喜欢C语言的简洁,我享受C语言的高效,但我总得在内存管理上小心翼翼,就像手握神器但时刻担心神器的反噬。
三、为什么要这样要求
我喜欢C++语言的RAII,我享受C++语言的智能指针,但我也在众多C++特性中偶尔迷失。我喜欢Java语言的规范性,我享受Java语言的健壮,但我也厌恶Java的过分设计(这或许不是Java语言的原罪,而是带动Java语言发展的那些框架造的孽)。我喜欢Javascript语言无类型约束的自由,我也享受Javascript语言带来的异步快感,但我也慢慢感受到Javascript语言的臃肿。我喜欢Python语言的快速开发,几行代码就完成了其他语言需要几十行代码的功能,我喜欢Python语言的应有尽有,几乎所有东西都有现成的,我讨厌Python语言带来与C系违和的语言特性,比如使用tab对齐。我喜欢Go语言的简洁,我享受Go语言的高效(开发效率大于运行效率),但我也厌恶Go的简陋(如map)。还有很多别的语言也是如此,如Rust。
如果非要选择哪个语言更完美,我选Java,哪个语言性能最好,我选C,哪个语言介乎两者之间,我选C++(C++11以上)和Rust。总体而言,我更适应C系编程语言,切换到非C系语言,总是要适应一两天才能满血归来,我更多时候记住基础特性,非常用的特性有时还是要查看下才马上想起来。
这就是为什么要求自己尽量不要造另类的特性,尽量遵循C系习惯的原因。
四、X语言规范
关键字定义:
编号 | 分类 | 关键字 | 说明 |
1 | 包 | package | 声明包 |
import | 导入包 | ||
2 | 条件 | if | 判断语句 |
else | 判断语句 | ||
else if | 判断语句 | ||
3 | 循环 | for | 循环语句 |
continue | 跳过当前到下一次循环执行 | ||
break | 跳出整个循环 | ||
4 | 分支 | switch | 分支语句 |
case | 匹配分支条件 | ||
break | 跳出分支条件 | ||
default | 默认分支 | ||
5 | 变量修饰 | const | 不可变常量声明 |
let | 变量声明 | ||
static | 静态成员(变量/常量/函数) | ||
private | 仅内部可访问(包内/引用类型内) | ||
6 | 引用类型 | class | 定义类型 |
interface | 接口 | ||
implement | 实现接口 | ||
this | 对象自身 | ||
function | 成员函数定义 | ||
7 | 并发 | go | 并发入口定义 |
wait | 等待并发完成 |
对比C/C++语言,整体看上去还是很简洁、很相近,但做一些说明:
- 支持包
参考Java支持声明包和导入包;
- 循环语句
只支持for,不支持while和do while,使用for (true)替代,支持for in和for :循环;
- let
支持基本数据类型和高级类型,参考Python内置数组()、列表[]和字典{}类型;
可在包内和在类内定义变量和常量,可后置声明具体数据类型;
参考Go所有类型都有默认值,引用类型默认null;
4. const
可在包内和在类内定义常量,可后置声明具体数据类型;
5. static
允许声明成员函数或成员变量为静态的,适用工具类;
6. private
默认包内定义的包变量和包常量都是public的,如果不想外部查看可声明为private;
默认类内定义的成员变量、常量、函数都是public的,如果不想外部查看可声明为private;
因为不支持继承,所以不存在protected关键字,默认public,所以不用写也不能写;
Go语言通过首字母大小写区分可见性,还是让很多人难以接受;
7. class和interface
不强制类必须实现接口的所有接口,默认所有接口都是空实现,只支持实现接口;
强制类必须实现接口所有接口,是不明智的,缺乏灵活,在某些场景下是受限的;
不支持继承,通过组合复用已有类型。反对使用过长继承链,过长继承链让整个系统维护变成一个灾难;
但一旦语言支持继承,就无法控制,因此在语言层面拒绝继承,使用组合,虽然带来一些复用类时还要写代码的成本,但可接受也更可控,这部分成本代码完全可由IDE帮助完成;
8. go和wait
不直接暴露线程,支持类似Promise和Future模式和Timer模式;
喜欢Go中的go,不喜欢底层实现mxn模型,其性能上限受限于mxn模型;
9. class<T>
参考Java支持泛型;
五、总结
总的来说,X语言足够简洁,又足够现代化,期待能尽早分享更多实现代码出来。希望大家能够给予更多关注、点赞和收藏。我发现,有一部分粉丝对X语言的表示关注,但相对而言,更多粉丝更多关注《实现一个高性能的TCP网络库C实现》。这就是理想与现实的冲突,写X语言真的是我的兴趣所在,高性能TCP网络库实现可能是大家工作需要,我也准备先切回整理TCP网络库实现的文章,这部分都是已写好的代码,就是没写文章而已。无论如何,感谢大家的关注、点赞和收藏。您们的关注、点赞和收藏也是我的动力。