还在用JS?过来看看GS

什么是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 个赞

人才啊。
但是不想用也不想学。。
社区支持、参考代码、GPT兼容性、第三方模块,都没法和js ts比吧。

谨慎看好

先打过rescript再说

TypeScript 的目标是涵盖整个 JavaScript 功能集;
ReScript 仅涵盖 JavaScript 的一个精选子集;
GreatScript则彻底抛弃JavaScript的历史包袱。
这就是区别所在

嗯嗯,然后呢?

不用看好,就我一个人的话,这个东西八成最后变成一个玩具

一个最大的问题:类型声明用冒号,变量赋值也用冒号。容易造成二义性,parser 不好写,也加重读代码的心智负担。

1 个赞

声明时会赋予一个值,赋值时也是赋予一个值,那么声明和赋值实际上是统一的,而且实际上,只有变量才有赋值操作,例如定义一个变量:

x! : 0

赋值一个变量:

x? : 1

那么是不是可以理解成,变量x在第一次赋值时用“!”,在第二次,第三次赋值时用“?”,表示变量x的值变化过多次?
照这么说来,GS实际上只有赋值这么一个概念,区别只有首次赋值和二次赋值的区别而已。

有没有一种可能,代码量少会导致你的语言推广遇到问题,很多地方是有代码量 KPI 的…

js 的再包装而已,‘彻底抛弃JavaScript的历史包袱’,应该是:‘彻底抛弃JavaScript语法的历史包袱’。我期待的新语言,应该是突破 js 的,在保留 js 优点的同时,能够实现 js 无法实现的功能,有着 js 无法比拟的性能。

我这个GS目前就是在对标ReScript,ReScript有存在的理由,我这个就有存在的理由。
并且如果一门语言,有 JS 没有的类型安全,但是写出来的代码居然比 JS 还少,我觉得人很难不喜欢这个GS的。

不错,不管结果如何,设计一门语言总能让自己技术得到很多提升 :+1:

代码量一般是按行算的
GS一般不会减少行数

这个GS我设计好几年了,最近才大成
但也仅仅是设计的大成,代码一行没动呢

有這種KPI 的單位蠻慘的
顯然是被一群不懂編程的人進行粗暴管理 :face_holding_back_tears:

你根本就没有理解我的意思,我先简单解释下我想表达的意思。

在你的文档中有这么一段:

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预期来看,我自然是会把泛型设计的比当前要简约最好,最差的情况是照搬。

另外,对于定义而言,我还是计划用 : ,统一 常量/变量/函数/类的定义。