V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sy20030260
V2EX  ›  Rust

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

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

    首先我还是很喜欢 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
    Chad0000
        32
    Chad0000  
       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   ·   实用小工具   ·   5932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:39 · PVG 10:39 · LAX 18:39 · JFK 21:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.