V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
heroisuseless
V2EX  ›  分享创造

还在用 JS?过来看看 GS

  •  
  •   heroisuseless · 95 天前 · 3155 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。

    什么是 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  
       95 天前
    这种语法歧义太多了;
    1 、return 就让人很迷惑,不想 rust 那样可以区分,在示例代码上我区分不出来有没有 return:
    2 、导出导入也迷惑,不想导出内部变量,你这怎么区别;

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

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

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

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

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

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

    Deno 走 web 标准,做得很好,但是就因为跟 node/npm 不兼容,推广起来老费劲了
    changwei
        26
    changwei  
       94 天前 via Android   ❤️ 1
    目前对于 js 改造最好的语言我觉得是 rescript ,原 po 可以参考一下他的设计
    jones2000
        27
    jones2000  
       94 天前
    又是强制类型的。js 的好处就是什么类型都可以,天马行空。一上来就强制类型,直接被阉了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2696 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:03 · PVG 19:03 · LAX 04:03 · JFK 07:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.