还在用 JS?过来看看 GS

162 天前
 heroisuseless

什么是 GS ? GS 是我自创的一门编程语言,全名叫“GreatScript”,是一门类型化语言,可以编译成 JavaScript 。简单来说,就是又一门 TypeScript 。

GreatScript 的生态位跟 Typescript ,CoffeeScript ,ReScript 相同,那么,GS 究竟有什么优点,从而在众多类型化语言中脱颖而出呢?

答案就是写出来的代码少,在某些情况下,写出来的代码甚至比 JS 还少!而做到这样的关键,就是对 JS 代码进行大刀阔斧的改革,与其他类型化语言不同,JS 并不是 GS 的子集,GS 是对 JS 取其精华去其糟粕,它的优点是:

至于我为什么要造一个 GS ,说起来也算是一个副产品,我最初的打算是做一个用自制编程语言写自制操作系统的项目(很肝),自制编程语言起名叫 zlang ,自制操作系统起名叫 zos ,z 的意思是我的姓名的首字母,没有其他特别的含义,后来这个项目烂尾了(很正常),我只做到了用自制编程语言在自制操作系统上打印出一串“Hello World”,b 站录制了两期视频后,就彻底不干了,但是我自认为我设计的 zlang 还不错,而且现在我是一名前端程序员,而前端又向来以娱乐圈著称( bushi ),于是我就琢磨着能不能把我的 zlang 移植到前端上,如果用的人多的话,我也算一个前端创始人了,于是就有了 GS 。

附一个我的 b 站链接: [ [自制编程语言+操作系统 2 ] 在空无一人的赛道狂奔...-哔哩哔哩] https://b23.tv/6HjF8Fz

为了适配 JS ,GS 还是与 zlang 有一点点的不同,所以我又取了一个单独的名字而不叫 zlang ,那么 GS 到底长什么样呢?我弄了一个 GitHub 仓库,语法写到 readme 上了:

https://github.com/HeroIsUseless/greatscript.github.io/blob/main/index.md

目前这个仓库里就一个 readme ,不过我已经实现了 zlang 的编译器了,改一改就能用于 GS ,做一个 demo 不算太难,不过做一个完整的编译器就不容易了。

下面展示一段相同功能的 JS 与 GS 的代码片段:

使用 React 的情况:

可以看到 GS 甚至比 JS 更简约,这就是 GS 的最突出的特点之一,虽然现在 GS 还处于“刚创建一个文件夹”的水平,不过我相信由于 GS 的简约特性,将来一定会有大批拥趸的。

3278 次点击
所在节点    分享创造
27 条回复
iikebug
162 天前
这种语法歧义太多了;
1 、return 就让人很迷惑,不想 rust 那样可以区分,在示例代码上我区分不出来有没有 return:
2 、导出导入也迷惑,不想导出内部变量,你这怎么区别;

语法不是越简洁越好的,一眼过去清晰明了才是最好的语法
HelloWorld556
162 天前
我也相信由于 GS 的简约特性,将来一定会有大批拥趸的。
debuggerx
162 天前
个人很讨厌隐式返回这个看似简洁的语言特性,代码的可读性比书写时的一点便利性重要多了,鼓吹这种东西的所谓“新语言”,有一个算一个,在我这里统一作为大聪明看待。
zhangkui
162 天前
AnyScript ? 加油!!!
Leviathann
162 天前
怎么不叫 ColonScript
grimbedroom
162 天前
rust 是末尾句不带符号视为 return ,你这个是什么思路,直接末尾句吗
heroisuseless
162 天前
@iikebug 我也有设计 return ,看我贴的视频链接就知道,return 被我设计成了提前返回,当然在最末尾调用一个 return 也是没有任何问题的
heroisuseless
162 天前
@grimbedroom 是的,直接末尾句,我也有设计 return ,可以看我贴的视频
heroisuseless
162 天前
@debuggerx 这里借鉴的 Haskell ,另外,我也有设计 return ,在视频里说明了。
另外,代码可读性我认为比 JS 要强,如果按照什么编程语言都不会的人来看,是变量/函数/类都有各自毫不相干的定义方式好,还是用一种统一的定义方式好?
我这里将常量/变量/函数/类都用冒号定义,以求简约,协调,不会的人一看也能举一反三。
说实在的,我设计的这个编程语言自认为很优美,很协调,从变量定义可以拓展出函数定义,从函数定义能拓展出类定义,匿名函数定义,类型定义,这一切都是相互关联的,反观类 C 语言,你很难找到变量定义和函数定义,类定义的区别,这代表毫不相干的定义你要学好几次。
heroisuseless
162 天前
@iikebug 导入导出还在设计中,在我的设计中,整个文件是一个实例(大括号括起来的那种),普通的变量常量函数都是 public 的,保护变量用.做前缀,私有变量用..做前缀,例如:

a : {
b: 1
.c: 2
..e: 3
}

这样你从语法层面上就调用不了保护变量和私有变量,硬要调用,那就变成了 a..b ,a...c ,这在语法层面就是错的。
另外,在文件系统中,.开头的文件往往是隐藏文件,我的灵感由此而来。
happyxhw101
162 天前
函数式编程语言不需要 return, 因为它们是函数式的,像 scala 这种,GS 不使用 return ,就有点 ”画虎不成反类犬“
Leon6868
162 天前
```
const viewList = []
export function ContView(){}
```

这种 JS 如何转为 GS ?
K120
162 天前
简约是你自己给自己定义的一个标签, 在我看来这更难懂,理解更费劲。
Leon6868
162 天前
JS 最被诟病的就是类型安全,这也是为什么 typescript 在大型项目中非常重要。你把变量、函数和类一起定义,真的不是开历史倒车吗?对于如此优雅的设计,你该如何设计 Lint 呢?
ayase252
162 天前
coffeescript.org

之前不是没有人尝试过
heroisuseless
162 天前
@Leon6868
```
viewList : []
ContView() : () # 默认导出
```
heroisuseless
162 天前
@Leon6868 虽然都是用冒号定义的,但是变量/函数/类的定义方式还是有些许不同
定义一个常量:
```
a : 0
```
定义一个函数:
```
f() : (...) # 变量名后面有括号就是函数
```
定义一个结构体:
```
s : {...} # 用大括号定义
```
定义一个类:
```
c() : {} # 变量名后有括号,并且右边是大括号
```
定义一个类实例:
```
d : c()
```
所以还是很有统一性,并且各自的定义还是有清晰的区别的
heroisuseless
162 天前
如果一门语言,有 JS 没有的类型安全,但是写出来的代码居然比 JS 还少,你就喜欢上这个语言了
现在介绍一下变量如何使用:
```
x! : 0 # 变量定义
x? : x + 1 # 变量赋值
y! : String | Person | 0 # 带类型定义,目前要求前几个可以是值也可以是类型,最后一个必须是值
z! : Int | undefined # undefined 既是类型也是值
```
函数怎么用呢?
```
add(a: Int, b: 0) : Int | ( # 变量如果仅用类型定义,那么它是必传参数,如果是用值定义的,那么它就是可选参数
a + b
)
```
绝活:实例解构:
```
c! : 0
{a, b!, c?} : data # 这里定义了一个常量 a ,定义了一个变量 b ,赋值了一个变量 c
{x: 0, b: 1} : data # 如果解构出来的是 undefined ,那么就赋予默认值
```
Leon6868
162 天前
@heroisuseless #17 这种呢?

```
export const viewList = []
function ContView(){}
```
YANGTEKE
162 天前
突然想起来之前站里的一个叫前端之虎的大哥,有点意思

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1010934

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX