还在用 JS?过来看看 GS - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
heroisuseless

还在用 JS?过来看看 GS

  •  
  •   heroisuseless 2024 年 1 月 23 日 4353 次点击
    这是一个创建于 824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    什么是 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 站链接: [ [自制编程语言+操作系统 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 的简约特性,将来一定会有大批拥趸的。

    27 条回复    2024-01-24 17:13:05 +08:00
    iikebug
        1
    iikebug  
       2024 年 1 月 23 日
    这种语法歧义太多了;
    1 、return 就让人很迷惑,不想 rust 那样可以区分,在示例代码上我区分不出来有没有 return:
    2 、导出导入也迷惑,不想导出内部变量,你这怎么区别;

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

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

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

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

    之前不是没有人尝试过
    heroisuseless
        16
    heroisuseless  
    OP
       2024 年 1 月 23 日
    @Leon6868
    ```
    viewList : []
    ContView() : () # 默认导出
    ```
    heroisuseless
        17
    heroisuseless  
    OP
       2024 年 1 月 23 日
    @Leon6868 虽然都是用冒号定义的,但是变量/函数/类的定义方式还是有些许不同
    定一个常量:
    ```
    a : 0
    ```
    定义一个函数:
    ```
    f() : (...) # 变量名后面有括号就是函数
    ```
    定义一个结构体:
    ```
    s : {...} # 用大括号定义
    ```
    定义一个类:
    ```
    c() : {} # 变量名后有括号,并且右边是大括号
    ```
    定义一个类实例:
    ```
    d : c()
    ```
    所以还是很有统一性,并且各自的定义还是有清晰的区别的
    heroisuseless
        18
    heroisuseless  
    OP
       2024 年 1 月 23 日
    如果一门语言,有 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
        19
    Leon6868  
       2024 年 1 月 23 日
    @heroisuseless #17 这种呢?

    ```
    export const viewList = []
    function ContView(){}
    ```
    YANGTEKE
        20
    YANGTEKE  
       2024 年 1 月 23 日 via iPhone
    突然想起来之前站里的一个叫前端之虎的大哥,有点意思
    codingguy
        21
    codingguy  
       2024 年 1 月 23 日
    变量赋值用冒号代替等号的目的是啥?然后解构里面的赋值又换回了等号,但是对象里的键值对又是冒号分隔(破产女孩疑惑脸.jpg )
    js 为了区分变量常量进化出来的 const ,let 你又给改回去了,开倒车属于是
    heroisuseless
        22
    heroisuseless  
    OP
       2024 年 1 月 23 日
    @Leon6868 抱歉,之前的回答有点不太准确
    在 GS 中,一个文件可以看作一个实例(大括号包裹的那种),内部定义的东西默认是 export/public 的
    如果不想导出,则在变量名前加一个“.”:
    ```
    viewList : []
    .ContView() : ()
    ```
    那么有.作为前缀的,就是不导出的,protected 的,如果是 private 的,则可以用..定义:
    ```
    ..ContView() : ()
    ```
    nomagick
        23
    nomagick  
       2024 年 1 月 23 日
    一塌糊涂
    keepRun
        24
    keepRun  
       2024 年 1 月 23 日
    有想法是好事,得鼓励。
    不过是否是更好值得商榷
    a132811
        25
    a132811  
       2024 年 1 月 24 日
    这是逆 ECMA/TC39  标准而行呀。es 不是不想简化,是要兼容,而且这些年语法上渐近的精进了不少了。

    Deno 走 web 标准,做得很好,但是就因为跟 node/npm 不兼容,推广起来老费劲了
    changwei
        26
    changwei  
       2024 年 1 月 24 日 via Android   1
    目前对于 js 改造最好的语言我觉得是 rescript ,原 po 可以参考一下他的设计
    jones2000
        27
    jones2000  
       2024 年 1 月 24 日
    又是强制类型的。js 的好处就是什么类型都可以,天马行空。一上来就强制类型,直接被阉了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     937 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 64ms UTC 19:25 PVG 03:25 LAX 12:25 JFK 15:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86