有没有这样一门语言,保留 Rust 其他特性但提供 GC 能力? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sy20030260
V2EX    Rust

有没有这样一门语言,保留 Rust 其他特性但提供 GC 能力?

  •  
  •   sy20030260 2022-08-08 17:32:49 +08:00 6680 次点击
    这是一个创建于 1159 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先我还是很喜欢 Rust 的所有权系统的,我觉得这是当下最为优雅的无 GC 内存管理方案。但不可否认的是,如果我们面向的是业务开发而非底层开发,大多数情况并不是不能接受 GC 带来的性能损耗。但所有权管理带来的陡峭学习曲线,对于技术团队搭建无疑是个巨大挑战(应该没人会否认培养一个成熟 Rust 工程师的难度要远远高于 Java/Go 吧)

    所以有没有这样一门语言,在移除所有权系统并提供 GC 的前提下,保留 Rust 的以下特点(按重要性排列):

    1. 完整的泛型和标准集合类库
    2. 优雅的空值检查和错误处理
    3. 支持高阶函数等函数式编程范式
    4. 模式匹配
    5. 支持 Trait 或其他类似的 Duck typing
    6. 异步友好:支持协程和消息通道
    7. 宏编程
    8. 无虚拟机,原生编译

    前五点可以认为是必要项,后三点属于加分项

    第 1 条附言    2022-08-08 18:14:00 +08:00
    补充下两点:

    1. 主要使用场景是服务端开发,但定位为通用语言以及支持 WASM 在我看来是个很有利于长期生态发展的选项
    2. 强类型!强类型!强类型!
    44 条回复    2022-11-16 12:10:36 +08:00
    zhangxzh
        1
    zhangxzh  
       2022-08-08 17:38:05 +08:00 via Android   1
    可以关注下 kotlin native 的发展
    libook
        2
    libook  
       2022-08-08 17:51:12 +08:00
    JS ?

    1. 弱类型可不可以。
    2. 不知道咋样才算优雅,至少有简单成熟的方案可以检查空值,以及是不是有 try/catch 就方便一些。
    3. 函数式编程是完全可以的,lambda 表达式啥的都有,可以确认一下是不是能满足所提到的“高阶函数”表达方法。
    4. 有模式匹配。
    5. 非常 Duck typing ,比如一些处理数组的方法实际上是基于迭代器,一个对象只要实现迭代器就可以用这些。
    6. 支持异步编程,引擎可以同时提供非阻塞,引擎底层用了协程进行优化,对开发者透明。
    7. 不支持宏。
    8. 依赖虚拟机。
    hxsf
        3
    hxsf  
       2022-08-08 17:52:50 +08:00 via iPhone
    所有类型都包一层 mutex arc ?
    qmzhixu
        4
    qmzhixu  
       2022-08-08 17:53:15 +08:00
    c#
    icyalala
        5
    icyalala  
       2022-08-08 17:55:02 +08:00
    dotnet AOT
    2kCS5c0b0ITXE5k2
        6
    2kCS5c0b0ITXE5k2  
       2022-08-08 17:55:07 +08:00   2
    @libook js 还是端走吧. 错误处理都一团糟
    kera0a
        7
    kera0a  
       2022-08-08 17:57:46 +08:00
    啥用途?后端业务开发么?
    不说用途的话 Swift 都能勉强符合

    插眼蹲一个答案,最近想写个后端工具,想学门新语言
    novolunt
        8
    novolunt  
       2022-08-08 17:58:39 +08:00   1
    sy20030260
        9
    sy20030260  
    OP
       2022-08-08 18:07:26 +08:00
    @libook 感谢提醒,忘记最重要的一点了...必须强类型
    @kera0a 感谢提醒,主要是服务端
    libook
        10
    libook  
       2022-08-08 18:15:11 +08:00
    @emeab #6 我用 JS 做了很多年后端系统了,没觉得错误处理一团糟,因为本身就是跟 Java/C 等一样的设计,除非你觉得 Java 的错误处理也是一团糟,或者你其实根本不了解 JS 怎么用。
    des
        11
    des  
       2022-08-08 18:16:12 +08:00 via iPhone
    前一阵不是火了一个语言 zig 嘛,你看看符合不符合你的要求?
    libook
        12
    libook  
       2022-08-08 18:22:58 +08:00
    @sy20030260 #9 JS 套个 TS ?

    其实我还是觉得,找个自己舒服的语言也仅限于自己做做个人项目,要是涉及到企业生产的话,最好还是要看生态,比如 Java 一类的主流服务端技术栈,至少不需要自己造很多轮子,可以让产品快速迭代。
    很多时候开发人员个人喜好往往要为生产效率让路的,比如 Go 就是一个以开发者体验为代价来解决一些工业生产上的问题的方案。

    甚至一个较大规模项目的不同部分,受限于各种技术栈的擅长领域的不同,需要同时采用几种不同的技术栈来实现。

    当然扯这些稍微有点跑题了。
    TWorldIsNButThis
        13
    TWorldIsNButThis  
       2022-08-08 18:23:41 +08:00 via iPhone
    @libook js 有 pattern matching ?
    那提案才 stage 1
    icyalala
        14
    icyalala  
       2022-08-08 18:25:01 +08:00
    所以 C# 也能用于服务端开发,也是通用语言,也能编译成 wasm ,也是强类型,也能编译成原生
    tairan2006
        15
    tairan2006  
       2022-08-08 18:35:56 +08:00
    C#吧
    libook
        16
    libook  
       2022-08-08 18:36:31 +08:00
    @TWorldIsNButThis #13 有草案就差不多相当于有了吧,至少现在有 babel 方案,如果愿意用的话。ES 的特性迭代挺快的,没准很快就能进 Stage2 了(但也说不准)。
    ecnelises
        17
    ecnelises  
       2022-08-08 18:40:54 +08:00 via iPhone
    鉴于 Rust 本来就受 OCaml 启发很大,Rust with GC 大约可以看作 OCaml 换个马甲。而 OCaml 也基本能满足楼主说的每点要求。
    MakHoCheung
        18
    MakHoCheung  
       2022-08-08 18:48:08 +08:00
    Duck typing 、宏编程我不懂,其他的 Swift 都符合。不过 Swift 6 要加入所有权
    Alexonx
        19
    Alexonx  
       2022-08-08 19:28:57 +08:00
    仓颉?(笑
    LeegoYih
        20
    LeegoYih  
       2022-08-08 19:32:41 +08:00
    平行宇宙的 Go
    404neko
        21
    404neko  
       2022-08-08 20:28:45 +08:00
    你快去搞一个
    sy20030260
        22
    sy20030260  
    OP
       2022-08-08 22:06:32 +08:00
    @ecnelises 涨知识了。但是简单看了下,感觉风格上和 Rust 区别还挺大的,如果说 Rust 是 70% 的 OOP + 30% 的 Functional Programming 的话,OCaml 更像是 70%的 FP + 30% 的 OOP ?
    Al0rid4l
        23
    Al0rid4l  
       2022-08-08 22:42:11 +08:00
    最接近需求的应该就是.NET 6 吧, 要抽象用 F#, 要底层控制更多用 C#, 支持 AOT, 甚至 unsafe 也能给你
    WebKit
        24
    WebKit  
       2022-08-08 23:34:43 +08:00 via Android
    @MakHoCheung swift 不是只能苹果设备上用吗?
    WebKit
        25
    WebKit  
       2022-08-08 23:37:17 +08:00 via Android
    感觉 kotlin 不错。就是需要 jvm 不过,现在也可以编译原生了。发展几年了,目前也不错
    Leviathann
        26
    Leviathann  
       2022-08-09 00:15:21 +08:00
    @sy20030260 Rust 生命周期标记的那个奇怪的单引号+字母的记法,就是来自 OCaml
    OCaml 的泛型参数前面必须有单引号
    而且 Rust 之父是 OCaml 的粉丝,第一版的 rustc 就是 OCaml 写的
    cmdOptionKana
        27
    cmdOptionKana  
       2022-08-09 00:46:52 +08:00
    语言倒是其次,缺少第三方库是要命的。语言再怎么爽,生态没搞起来就只能玩一玩,根本不实用。
    tnychn
        28
    tnychn  
       2022-08-09 03:11:13 +08:00   1
    dcsuibian
        29
    dcsuibian  
       2022-08-09 05:20:54 +08:00 via Android
    这就是为什么有这么多编程语言,我称之为语言杂交学
    LeeReamond
        30
    LeeReamond  
       2022-08-09 05:57:51 +08:00
    我觉得培养一个成熟的 rust 程序员成本可能很高,但培养一个动态语言+rust 扩展程序员的成本非常低。这样你可以同时享受到动态语言的强大末端描述能力,和 99%的 rust 好处。
    Aloento
        31
    Aloento  
       2022-08-09 06:26:48 +08:00
    @icyalala 非常赞同,尤其是 dotNet Native AOT ,是无虚拟机的纯本机代码,不能动态生成 IL
    ktqFDx9m2Bvfq3y4
        32
    ktqFDx9m2Bvfq3y4  
       2022-08-09 07:30:41 +08:00
    @Aloento #31
    @icyalala #14

    在 V 站吹 C#没用,Mac 占有率低成那样都能吹得风生水起,C#市场占有率也只是在国内比 Java 差一个档次却被踩得不成样。不如在外默默写 C#,啥都不说。
    ymmud
        33
    ymmud  
       2022-08-09 08:08:41 +08:00
    haskell
    MakHoCheung
        34
    MakHoCheung  
       2022-08-09 09:10:17 +08:00
    cclin
        35
    cclin  
       2022-08-09 10:48:37 +08:00 via Android
    尝试下 scala 吧,应该都满足
    KDr2
        36
    KDr2  
       2022-08-09 10:49:10 +08:00
    Haskell.
    icyalala
        37
    icyalala  
       2022-08-09 10:52:32 +08:00
    @Chad0000 其实我不怎么写 C#,只是恰好觉得 C# 比较符合楼主列的条件...
    @MakHoCheung Swift 没有 GC ,本质还是所有权那套,只是默认有编译器 ARC
    DonkeyBenjamin
        38
    DonkeyBenjamin  
       2022-08-09 16:50:37 +08:00   1
    虽然很多人推荐 C#, 但是感觉写起来风格差挺远的,远没有 rust 爽
    推荐 Gleam, Elixir + Rust 的缝合怪
    hez2010
        39
    hez2010  
       2022-08-09 17:02:21 +08:00
    看了一下你这条件感觉最符合的就是 C# 了,配合 .NET 7 的 NativeAOT 也能做到无虚拟机原生编译。
    qbug
        40
    qbug  
       2022-08-11 11:37:50 +08:00
    @libook 那 Rescript 应该就是最佳选择了,类 Ocaml 语法编译成 JS 跟 TS 类似但定位是子集而不是超集,有 Facebook 大厂背书,创始成员之一是国人。
    xgdgsc
        41
    xgdgsc  
       2022-08-24 14:51:43 +08:00 via Android   1
    Julia
    mizuBai
        42
    mizuBai  
       2022-11-13 09:02:36 +08:00 via iPhone
    @xgdgsc Julia 除了预热的时候达不到 rust 的速度,几乎完全符合这个问题了
    itfanr
        43
    itfanr  
       2022-11-16 12:07:36 +08:00
    c#11 + .Net7
    itfanr
        44
    itfanr  
       2022-11-16 12:10:36 +08:00
    @DonkeyBenjamin 嗯 炒鸡喜欢 rust 的风格 一个字:舒服
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4070 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:13 PVG 08:13 LAX 17:13 JFK 20:13
    Do have faith in what you're doing.
    ubao 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