什么是GS?GS是我自创的一门编程语言,全名叫“GreatScript”,是一门类型化语言,可以编译成JavaScript。简单来说,就是又一门TypeScript。
GreatScript的生态位跟Typescript,CoffeeScript,ReScript相同,那么,GS究竟有什么优点,从而在众多类型化语言中脱颖而出呢?
答案就是写出来的代码少,在某些情况下,写出来的代码甚至比JS还少!而做到这样的关键,就是对JS代码进行大刀阔斧的改革,与其他类型化语言不同,JS并不是GS的子集,GS是对JS取其精华去其糟粕,它的优点是:
- 比JS多类型标注
- 比TS代码量更少
- 比JS更简约直观
至于我为什么要造一个GS,说起来也算是一个副产品,我最初的打算是做一个用自制编程语言写自制操作系统的项目(很肝),自制编程语言起名叫zlang,自制操作系统起名叫zos,z的意思是我的姓名的首字母,没有其他特别的含义,后来这个项目烂尾了(很正常),我只做到了用自制编程语言在自制操作系统上打印出一串“Hello World”,b站录制了两期视频后,就彻底不干了,但是我自认为我设计的zlang还不错,而且现在我是一名前端程序员,而前端又向来以娱乐圈著称(bushi),于是我就琢磨着能不能把我的zlang移植到前端上,如果用的人多的话,我也算一个前端创始人了,于是就有了GS。
附一个我的b站链接:
https://www.bilibili.com/video/BV1jk4y1979n
为了适配JS,GS还是与zlang有一点点的不同,所以我又取了一个单独的名字而不叫zlang,那么GS到底长什么样呢?我弄了一个GitHub仓库,语法写到readme上了:
https://github.com/HeroIsUseless/greatscript.github.io/blob/main/index.md
目前这个仓库里就一个readme,不过我已经实现了zlang的编译器了,改一改就能用于GS,做一个demo不算太难,不过做一个完整的编译器就不容易了。
下面展示一段相同功能的JS与GS的代码片段:
可以看到GS甚至比JS更简约,这就是GS的最突出的特点之一,虽然现在GS还处于“刚创建一个文件夹”的水平,不过我相信由于GS的简约特性,将来一定会有大批拥趸的。
1 个赞
kasusa
(Kasusa)
2
人才啊。
但是不想用也不想学。。
社区支持、参考代码、GPT兼容性、第三方模块,都没法和js ts比吧。
TypeScript 的目标是涵盖整个 JavaScript 功能集;
ReScript 仅涵盖 JavaScript 的一个精选子集;
GreatScript则彻底抛弃JavaScript的历史包袱。
这就是区别所在
不用看好,就我一个人的话,这个东西八成最后变成一个玩具
一个最大的问题:类型声明用冒号,变量赋值也用冒号。容易造成二义性,parser 不好写,也加重读代码的心智负担。
1 个赞
声明时会赋予一个值,赋值时也是赋予一个值,那么声明和赋值实际上是统一的,而且实际上,只有变量才有赋值操作,例如定义一个变量:
x! : 0
赋值一个变量:
x? : 1
那么是不是可以理解成,变量x在第一次赋值时用“!”,在第二次,第三次赋值时用“?”,表示变量x的值变化过多次?
照这么说来,GS实际上只有赋值这么一个概念,区别只有首次赋值和二次赋值的区别而已。
Qingwa
(青小蛙)
11
有没有一种可能,代码量少会导致你的语言推广遇到问题,很多地方是有代码量 KPI 的…
crows
(crows)
12
js 的再包装而已,‘彻底抛弃JavaScript的历史包袱’,应该是:‘彻底抛弃JavaScript语法的历史包袱’。我期待的新语言,应该是突破 js 的,在保留 js 优点的同时,能够实现 js 无法实现的功能,有着 js 无法比拟的性能。
我这个GS目前就是在对标ReScript,ReScript有存在的理由,我这个就有存在的理由。
并且如果一门语言,有 JS 没有的类型安全,但是写出来的代码居然比 JS 还少,我觉得人很难不喜欢这个GS的。
不错,不管结果如何,设计一门语言总能让自己技术得到很多提升 
这个GS我设计好几年了,最近才大成
但也仅仅是设计的大成,代码一行没动呢
Duah
(我 ♥ 沙雕動畫)
17
有這種KPI 的單位蠻慘的
顯然是被一群不懂編程的人進行粗暴管理 
NeverMind
(NeverMind)
18
你根本就没有理解我的意思,我先简单解释下我想表达的意思。
在你的文档中有这么一段:
| JAVASCRIPT |
GREATSCRIPT |
| no types |
point() : {x: Int, y!: Int} |
那我暂且理解为你所设计的这个语言是带类型系统的,且类型声明的方式是类似 ts 那样 [Identifier] : [Type]。
而文档中对变量赋值的语法规则是:
| JAVASCRIPT |
GREATSCRIPT |
| const x = 5; |
x : 5 |
| var x = y; |
x! : y |
| let x = 5; x = x + 1; |
x! : 5, x? : x + 1 |
暂且不关心变量的可变与不可变,如果我没理解错的话,在你所设计的语言中,: 将用来表达 = 的语义。
那么问题来了,对于下面这段带类型的 ts 代码,你该如何用你所设计的语言表达,表达出来的代码是否会产生二义性:
const o: Object = Object;
const b: true = true;
const string = "string";
const s: string = string;
另外还有稍复杂一些的场景,涉及函数参数类型、返回值类型、泛型:
type NodejsFunction<T = any> = (callback: (err: Error, data: T) => void) => void;
const promisify = <T = any>(fn: NodejsFunction<T>) =>
new Promise<T>((resolve, reject) => {
fn((err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
我想说,近些年讨论较多的新兴语言 Rust、Kotlin、Swift 之流偏好 [Identifier] : [Type] 的形式不是没有原因的。你所设计的这个语言采用这一点是挺好的,但居然把 = 的语义合并到 : 中,说好听点是不合适,说难听点就是为创新而创新。
首先十分感谢你对我自制编程语言的琢磨和研究。
对于第一个问题,GS对类型的细粒度只到某一种类型,而到不了某一个类型的具体几个值,对于GS而言,代码可能是这样的:
o: Object # 在GS中,Object被看作“模版”,所以o是模版
b: true # b的值是true,类型是boolean,类型无法是true
s: 'string'
对于只能取值有限值的变量,这里推荐用枚举,在实际应用中也应该用枚举,不然会有“魔法数字”的问题。
我在发布我的自制编程语言语法后,有很多的反馈都是说用 : 来代替 = 作为变量赋值实在太奇怪了,对于我本人来说,我希望GS的目的是更少的代码量 & 更简约的语法,那么对于变量赋值而言:
a = 1
a? : 1
用冒号赋值,既不简约,也不降低代码量,确实不符合我对GS的预期,我计划是统一定义与赋值,但是对于所有编程语言来说,用 = 赋值几乎变成了一个约定俗成的语法,用 : 赋值看似减少了语法数量,实际上是逆使用者的一般认知。
至于泛型,目前确实还没考虑这个,就GS预期来看,我自然是会把泛型设计的比当前要简约最好,最差的情况是照搬。
另外,对于定义而言,我还是计划用 : ,统一 常量/变量/函数/类的定义。