年终盘点MoonBit: 大模型时代下的编程语言和开发者平台

302 阅读13分钟

引言

2023年,AI在编程领域崛起,如ChatGPT和Github Copilot,正在改变开发者获取信息和编写代码的方式。AI技术也预示了行业赛道和市场未来的转变。当ChatGPT面世之后,Stackoverflow这一备受欢迎的开发者社区遭受了冲击,网站流量明显下降,导致社区不得不宣布裁员近三分之一,这一现象反映了AI正在尝试替代传统开发工具的地位。原因在于,在代码生成方面,GPT-4、Copilot等底层技术已经日趋成熟,即便是与GPT-4训练数据无直接相关的新领域,经过微调后它所生成的代码质量非常出色,可以解决各种实际问题。

同时,已有的编码工具优化迭代正潜移默化改变了组织与个人开发者的工作模式,海量用户的涌入促使工具需要不断更新以满足用户需求;Github CEO Thomas Dohmke在今年6月发布的博客《The economic impact of the AI-powered developer lifecycle and lessons from GitHub Copilot》提到:“Copilot已被超过一百万开发者启用,并被超过 20,000 家组织采用。它已生成超过三十亿行被接受的代码,成为全球使用最广泛的AI开发者工具。”

程序语言是程序员的兵刃、链接软硬件的桥梁,不仅定义了开发者编写软件的方式,也直接影响着软件的性能、可靠性和扩展性,从大型机时代的Fortran,到个人计算机时代的C语言,再到互联网时代的Java和Python,语言的潮流也顺应着时代的发展。2023年作为进入人工智能时代拐点,如何更好的开发AI模型AI原生应用是当下编程语言和开发者工具平台面临的重要机遇和挑战。

MoonBit是专为AI云原生设计的开发平台,利用当下开源大模型,采用AI推断+形式化语言采样的方法为开发者提供一整套端到端的解决方案,下面让我们分别从技术方面和相关生态对MoonBit做个总结与回顾。

MoonBit 的 2023

MoonBit在2023年的五月正式对外开放内测,在过去一年内不断地进行改进,已经在核心功能方面取得了不小的进展,具体体现在以下几个方面:

1、语言方面

语言方面从0到1几乎实现了现代语言的大部分特性,包括比较复杂的泛型、模式匹配、代数数据类型和高阶函数的支持,允许用户自定义trait等。

支持泛型与高阶函数

MoonBit增加对泛型与高阶函数的支持,完整的例子可以参考playground的 012_avl_tree.mbt。

语法上,通过类型构造器的 [] 来定义泛型,比如定义一个AVL树:

enum T[U] {
  Empty
  Node (T[U], U, T[U], Int)
}

那么对这个泛型类型做操作的函数也需要加上对应 [] 到函数名字后面,比如:

fn height[U](self: T[U]) -> Int {
  match self {
    Empty => 0
    Node(_, _, _, h) => h
  }
}

我们可以使用高阶函数,如:

fn add(self: T[U], x: U, compare: (U, U) -> Int) -> T[U] {
  match self {
    Empty => Node(Empty, x, Empty, 1)
    Node(l, v, r, _) as t => {
      let c = compare(x, v)
      if c == 0 {
        t
      } else if c < 0 {
        bal(l.add(x), v, r)
      } else {
        bal(l, v, r.add(x))
      }
    }
  }
}

如果需要用到泛型类型的trait,比如高阶函数 Compare,则需要把冒号以及具体的接口名放到泛型后面,比如我们要用到类型的Compare,可以这样写:

fn add[U: Compare](self: T[U], x: U) -> T[U] {
  match self {
    Node(l, v, r, _) as t => {
      let c = x.compare(v)
      ..
}

如果函数需要用到超过1个trait,也可以用加号链接起来,比如下面例子的[U:Compare+Debug]:

fn remove[U:Compare+Debug](self: T[U], x: U) -> T[U] {
  ..
}

允许用户自定义trait

MoonBit允许用户自定义trait,通过 trait 关键词来定义自定义接口,比如:

trait Number {
  op_add(Self, Self) -> Self
  op_sub(Self, Self) -> Self
  op_mul(Self, Self) -> Self
  op_div(Self, Self) -> Self
  op_neg(Self) -> Self
}

fn f[X: Number](x: X, y: X) -> X {
  x * x + (- y / x - y)
}

fn init {
  debug(f(1, 2))
  debug(f(1.0, 2.0))
}

上面的代码片段定义了一个叫作 Number 的trait,它可以用来表示实现了算术操作的类型。对于任何类型 X ,只要 X 实现了 Number 指定的五个算术操作,函数 f 就能在 X 上工作。用户可以对整数、浮点数,以及其他自定义的支持算术的类型,例如向量和矩阵,调用 f 。

支持模式匹配

MoonBit 支持功能强大的模式匹配,包括对数组的带通配符的模式匹配等:

fn init {
  let a : Array[Int] = [1, 2, 3, 4]
  match a {
    [ hd, .. ] => debug(hd) // 1
    [  ] => println("empty")
  }

  match a {
    [ .., tail ] => debug(tail) // 4
    [  ] => println("empty")
  }

  let b: Option[Array[Option[Int]]] = Some([ Some(7), None ])

  match b {
    Some([ Some(x), .. ] as arr) => {
      debug(x) // 7
      debug(arr[1]) // None
    }
    _ => println("otherwise")
}

支持代数数据类型

enum Result[T, E] {
  Ok(T)
  Err(E)
}

fn get_ok[T, E](self: Result[T, E]) -> T {
  match self {
    Ok(x) => x
    Err(_) => abort("unhandled Err")
  }
}

2. 工具方面

构建系统

moon checkmoon build执行加速

MoonBit在语言设计之初就充分考虑IDE、构建系统、语言设计的协同,实现类型检查和推断的高度并行化和增量化。

当进行多个包的编译时,MoonBit的构建系统采用了高效的调度方法。它首先对各个编译任务进行分析和排序,确定编译的依赖关系。然后系统会并行地执行编译任务,充分利用多核处理器和并行计算的优势,让多个包同时进行编译。

在这个过程中,MoonBit的构建系统还会应用增量编译的技术,它会检测代码变更,只重新编译发生变化的部分,而不是对整个包进行重新编译。这种增量编译的策略可以大幅减少不必要的重复工作,提高编译效率。

从编译速度上也可以看到,MoonBit编译626个包(package)只需要1.06s,比起Go语言快了2倍,比起Rust快了接近9倍。

image.png

调试系统的支持:MoonBit Debugger(调试器)

MoonBit在今年已推出了调试器(Debugger)功能,这是相对于其他语言通常在成熟阶段才拥有的功能。目前,该功能已支持源码映射、基于源码设置断点、输出sourcemap等,在浏览器中进行源码调试。这项功能的推出不仅减轻了开发者在代码调试方面的负担,还显著提升了开发和调试的流畅性。

工具链多平台灵活切换支持:

MoonBit目前已支持多个工具链平台的无缝交互,今年,我们实现了对Intel芯片的Mac工具链下载,包括支持Apple Silicon MacOS、Intel MacOS、x86-64 Ubuntu 20.04以及Windows平台。这意味着MoonBit具备跨多个操作系统和硬件架构的兼容性和可移植性。MoonBit能够适应各种不同的操作系统和处理器类型,为用户提供多平台的编程环境。

image.png

链接地址:*www.moonbitlang.cn/download/*

包管理

MoonBit 作为一门从 0 到 1 的编程语言,对于其生态建设尤为重视。关键之一在于构建一个高效且功能丰富的包管理系统。在此基础上,我们已经初步搭建了一个平台mooncakes.iomooncakes.io 是一个中心化的MoonBit包管理。在这里,用户可以轻松上传分享、使用以及探索各种MoonBit模块。

image.png

为此,MoonBit的构建系统moon集成了与 mooncakes.io 进行交互的命令,让用户可以免去手动下载和配置依赖的困扰。与其他大多数包管理器不同,MoonBit的依赖解析使用与Go类似的最小版本选择算法,可以精确地确定需要构建哪些依赖,不会隐式地升级新版本,从而为开发者打造稳定可重现的构建体验。

mooncakes.io 托管了所有用户发布的MoonBit模块,这些模块也可以称之为“月饼”。用户发布到 mooncakes.io 的内容以模块为最小单位,每个模块下可以有多个包。每个用户在 mooncakes.io 有自己独立的命名空间,用户上传的模块的名称格式为 <username>/<package_name>。在 mooncakes.io 发布的模块版本根据语义化版本2.0.0定义,月兔将根据兼容性解析具体的版本。

除此之外,mooncakes.io 还是一个文档托管平台,当用户成功发布一个模块之后,mooncakes.io 会自动构建该模块的文档页面。我们希望这样一个中心化平台能为用户提供简单、一致的使用体验。

为进一步增强用户体验,我们还提供与 mooncakes.io 深度整合的工具链。

更详细的介绍请戳:mp.weixin.qq.com/s/dBA4dA2fK…

3. 提供对IDE支持

MoonBit提供对IDE的支持不仅包含了现代IDE的所有功能,并且具有一个创新的特点:它可以在云端/边缘端完整运行,这在现今大多数语言的CloudIDE中可能是首次。与其他CloudIDE不同,MoonBit无需依赖容器。

现今大多数编程语言的IDE是为桌面操作系统设计的,未能很好地适应云原生环境和边缘端的需求。MoonBit则通过采用高度并行化的架构和对分离编译的原生支持,突破这一限制,使得CloudIDE可以直接在边缘端运行。它的快速语义分析技术可处理大量的代码库,并且在更大规模的代码库中也能在百毫秒级别完成IDE响应。

MoonBit平台的一个显著特点是高度重视IDE的发展。这一点我们从之前开发的ReScript上获得了经验教训。许多编程语言在很长一段时间后才会有社区人员帮助开发相应的IDE,这导致IDE与语言设计的不匹配,带来了许多不必要的工作。为了避免这种情况,MoonBit平台将语言和IDE的设计、构建系统进行了整合,确保IDE的高效性。

社区生态进展

在过去的 2023 年,MoonBit 月兔语言在国内外社区获得了积极的反馈。在国内,刘汝佳(前国际信息学奥林匹克竞赛国家队教练)对MoonBit进行了高度评价,他评价道:“MoonBit是我见过的第一个从一开始就严肃的统筹和平衡诸多元素的语言:语法优美性、实用性、编译速度、代码体积、后端生态和与AI的交互等。再加上宏波本人在PL方面的造诣、经历和极大的热情,我对MoonBit抱有很大的期待。”同时,他还花了几周的时间用MoonBit实现了任天堂模拟器,可以玩几十款游戏。

nes精剪版 - HD 1080p.gif

MoonBit团队于2023年8.18日在Twitter进行海外首发之后就引起了国际技术社区的关注,迅速登上了HackerNews的头条(HackerNews:硅谷最具影响力的科技社区之一)。全球各大技术爱好者纷纷在社区留言和评价,部分开发者在试用后对其编译速度之快感到难以置信。MoonBit 通过自动内存管理使编程更加简便,从而与 Rust 区分开来。“我已经可以想象下一个‘100 秒’视频了” ,“以这个速度,可能只需要 500 毫秒(就可以完成编译)”。

image.png

image.png

国际知名的 Scala 和函数式编程专家 John A De Goes 在试用 MoonBit 后表示:MoonBit 看起来非常适合在 @GolemCloud(WasmCon 2023 的金牌赞助商、领先的 WebAssembly Paas 平台)上构建应用,并表示有兴趣尝试一下。Rob Palmer(JavaScript 标准委员会联席主席)也在Twitter上高度评价MoonBit。

image.png

image.png

此外,MoonBit在社区建设中进行了积极的探索。MoonBit在官网搭建了论坛,这个论坛为MoonBit用户提供了一个分享经验、提出反馈和解决问题的空间。截至目前,论坛的页面浏览量已达到80000+次。

同时MoonBit还开发了一门课程《现代编程思想》,这门课程主要讲授程序设计与实际应用。课程介绍多种编程范式,包括函数式编程、命令式编程与面向对象编程等。这门课程适合广泛的受众,从编程初学者到有经验的开发者。这门课程目前已累计有2万人次观看。

image.png

未来规划和展望

2024年,MoonBit在编程语言方面将保持相对稳定,并将更多关注于提升用户体验,语言本身的变动则可能相对较少。MoonBit将主要集中精力在包管理、AI技术微调等方面的改进,而其主要作用则在AI、云计算以及社区发展的整合上。

MoonBit的目标是改善编程语言的可用性。具体来说,MoonBit未来的发展主要集中在以下三个方向:

  1. 社区生态与包管理: 在高校推动MoonBit的应用,并努力构建完善的社区生态和包管理体系。
  2. 云计算部署与开发工具完善: 注重实时开发、编译、调试,期望实现即时部署至云端的完整工具和产品。
  3. AI的优化和边缘端应用: 专注于微调和优化AI效果,期望在客户端边缘端实现更佳的应用效果。同时,致力于构建服务器,让用户能够开发AI Agent应用。

在人工智能的新纪元中,MoonBit希望更好地结合当下的趋势。传统编程语言都是在Pre-AI的年代发展,当时的AI没有那么的完善与成熟。而MoonBit诞生于AI崛起的时代,MoonBit可以充分利用开源大模型,通过特定领域的LLM来辅助用户生成高效的代码。

AI方面的发力点主要集中在两个领域:

  • AI代码生成: 基于项目相关的代码,推动AI更精准、更高效地生成代码,跨越代码层面的能力提升。
  • AI应用开发便捷性: 提供端到端的开发支持,深入探索直接部署AI智能应用的可能性。

MoonBit的愿景远超程序设计语言,而是构建一个全方位的开发生态系统。MoonBit团队负责人宏波认为:MoonBit不仅是一个语言,更是一个端到端的解决方案,充分利用最新的AI技术,提供全面的服务。在未来,MoonBit将深度融合AI技术,扩展在云计算和边缘计算领域的应用。MoonBit将利用大模型的预测和自学习能力,为编程工作流程带来变革。