查看原文
其他

国产编程语言新拐点:聊聊从 Mojo 到 MoonBit 的思考|盘点

MoonBit 团队 InfoQ 2024-01-09

作者 | MoonBit 团队(主笔:张宏波、陈昱蓉、吴静纯)
策划 | 蔡芳芳

2023 年是生成式人工智能引领技术革命的一年。随着 AI 大语言模型(LLM)不断突破和开源社区活跃程度达到前所未有的高度,以 OpenAI 的 GPT-4、Meta-LLaMA 等为代表的重量级产品和服务相继发布,AI 技术的蓬勃发展给编程语言带来了新的挑战和机遇。编程语言作为时代演进的关键引擎,始终紧密契合着当下的技术发展与需求,从而随着时代的演变而不断适应变化。从大型机时代的 Fortran,到个人计算机时代的 C 语言,再到互联网时代的 Java 和 Python,每种语言都因适应当时的技术趋势而受到推崇。

2023 年作为进入人工智能时代拐点的一年 ,如何更好地开发 AI 模型和 AI 原生应用是当下开发者工具平台面临的重要机遇和挑战,基于此,今年也诞生了两门值得关注的新编程语言:Mojo 和 MoonBit。前者为 LLVM 之父 Chris Lattner 主导打造,结合了 Python 的可用性与 C 的性能,能够释放 AI 可编程性和可扩展性,更有利于在 AI 时代高效地开发模型。后者是前 OCaml 核心团队开发成员、ReScript 作者张宏波带领团队自研的工业级编程语言,专注为 AI 原生应用开发。

本文将结合 MoonBit 团队对大模型时代编程语言、开发平台发展趋势的思考,剖析 MoonBit 的设计目标、设计思路,盘点 MoonBit 在 2023 年取得的进展以及未来生态发展规划,希望能对关注编程语言动态的读者有所帮助。本文是 “2023 InfoQ 年度技术盘点与展望” 系列文章之一,由 InfoQ 编辑部、MoonBit 团队共同制作呈现。

未来已来:大模型正在改变开发者

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

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

资料图片来源:Github

AI的开发者生产力优势可能会使全球 GDP 增加超过 1.5 万亿美元。利用 30% 的生产力提升,预计到 2030 年全球将有 4500 万专业开发者,生成式 AI 开发工具到 2030 年可以为全球容量额外增加 1500 万“有效开发者”的生产力收益。

大模型给已有的开发工作“降本增效”

在 Andrej Karpathy 的博 [2]《Software 2.0》中,他探讨了人工智能如何改变软件开发方式:“Software 2.0 代表着我们可以用大量的数据和算力来解决以前需要大量人力和成本来解决的复杂问题。” AI 编码助手则是上述的具体实现。

资料图片来源:Github

调查数据显示,AI 编码工具不仅提高了整体生产力,还带来了技能提升的机会。75% 的开发者表示在使用 GitHub Copilot 时感到更加充实,在具体的生产数据方面,Copilot 能够完成高达 46% 的代码,帮助开发人员将编程速度提高了 55%。

未来的编码工作流程将呈现全新的面貌:AI 编码工具将可以大量生成短期的软件和测试解决方案,不再追求长期的可重复利用性,由于生产过程的高效自动化,未来的推理成本、推理延迟性都将大幅降低。另一方面,工程发展好坏并非在理论上有挑战,而是在工程实践中的持续优化和迭代,这主要体现在未来代码大模型将被提炼成中小型模型,从而实现在边缘设备运行的可能性。

在代码训练推理领域,实际上并不需要前后的历史知识和上下需要索引人文典故,可以预见的将来大模型会逐渐蒸馏成一个中小型模型,可能是 70 个亿的参数、10 个亿参数或者 100 亿参数,这种规模就已经非常有效果了。

相对较小的模型让在边缘设备、个人电脑上的大模型运行成为可能。此外,硬件架构的升级让消费级硬件能够运行更大规模的模型,目前强大的 Mac Pro 等已经可以承载数百亿参数的模型。随着这种参数量化的发展,更多模型将能在边缘设备上运行,这是功能上的进步,并不涉及理论上的难点。这种发展在未来几年内将变得更加普遍。

同时随着生成式 AI 的发展,编程语言之间的差异变得不再那么明显。随之带来的是编程语言的学习门槛降低目前学习一门新的编程语言,关键点之一在于掌握其生态系统,包括语法和库的使用。举个例子,区分成熟的 Java 工程师和专业的 Java 工程师的主要因素之一是对各种库的熟悉程度和使用直觉。

未来,生成式 AI 的存在可能极大地简化这一过程。例如,当需要进行 JSON 解析时,生成式 AI 可以自动推荐合适的库。这就像有一个助手在一旁,不仅帮助选择合适的工具,还可以解释不熟悉的代码片段。因此,学习新语言将变得更加直观和简单。

这种变化预示着未来的编程重点可能会从工具本身转移到端到端的体验上。在开发一个应用时,开发者可能只需阐述他们的想法,AI 接着就会生成相应的代码。例如,在开发一个天气预报应用时,开发者可以立即看到初步的 UI,并根据实时渲染的反馈进行调整,以优化应用的表现和功能。

在这样的工作流程中,编程工具本身变成了一个中介,而不是最终用户直接关注的焦点。这并不意味着工具的重要性降低了,而是其角色发生了转变。用户可能不再那么关注工具的具体细节,但理解这些工具的原理仍然至关重要,这对于高效使用 AI Agents、解决复杂问题以及进行创新来说都是不可或缺的。

大模型与程序员:协同合作大于替代

在目前基于 Transformer 框架的大型模型下,人工智能完全取代人类的可能性较低。如果把当下人工智能分类为人类认知系统中的系统 1(thinking fast)和系统 2(thinking slow),“系统 1”智能即条件反射式的智能,能够瞬间回答问题。与“系统 2”逻辑分析系统需要深度思考的智能相比,现在的 AI 更接近前者。这表现在无论问题的难度,每个 token 生成答案的速度都相似。另外,基于 Transformer 架构,随着上下文窗口增长,复杂度呈 n²上升,窗口无法做到很大,即使有可能实现 100 万 token 大小的模型,但其所能容纳的代码规模仍相对较小。因此,目前的 AI 不太可能完全取代人类,更可能是“L2 或 L3 级别”的辅助驾驶,而非完全自主的 L4 级别自动驾驶。

AI 编程工具的长远目标在于使 LLM 具备系统 2 的能力,构建框架进行深度思考和分析,做出更复杂、可靠的决策。一个典型例子是“chain of thoughts”系列研究,通过提示和 Python 代码模拟人类复杂推理,激发 LLM 的智能。

编程语言与开发平台的未来走向
大模型在大型开发项目上的主要难点
大型项目的挑战

伴随着大模型参数和数据的提升,AI 大模型也应该充分考虑到大型项目所面临的各项挑战和实际诉求。对于大模型“世界”来说,算法是“生产关系”,是处理数据信息的规则与方式;算力是“生产力”,能够提高数据处理、算法训练的速度与规模;数据是“生产资料”,高质量的数据是驱动算法持续迭代的养分。在这之中,算力是让大模型转动的前提。而庞大的计算需求和数据集的不断扩大都将成为大型项目需要克服的主要问题

大模型正对算力提出史无前例的要求,据英伟达的数据显示,使用基于 Transformer 模型的大型模型之前,算力需求每两年增长大约 8 倍。然而,自从采用了基于 Transformer 的架构后,算力需求大致是每两年提升约 275 倍。基于此,拥有 530 亿参数的 Megatron-Turing NLG 模型可能需要超过 10 亿 FLOPS 的算力来运行。这种算力需求的巨大增长意味着只有更大规模的算力平台才能训练如此庞大的模型。

图源 / NVIDIA Hopper Architecture In-Depth

上下文理解

随着开源环境的不断发展,技术应用的真正门槛可能不在于模型本身。欧洲和国内一些公司最近开源的模型已经足够实用,而真正挑战在于将技术应用于商业场景,需要更好地结合领域知识和实际应用。纯粹的大型模型本身可能不是主要障碍。大型模型用于编码领域时,主要挑战在于上下文理解能力的限制。即使模型具有百万 token 的能力,其上下文理解能力仍然相对有限。因此,面临的挑战之一是如何让大型模型更好地理解上下文通过代码分析来提取理论知识。

一种方式是使用“RAG”(Retrieval Augmented Generation)方法,可以仅提取函数签名等摘要信息,将大量代码压缩成更简短的形式。还有一种较极端方法是选择性地提取函数签名,仅保留关键函数的摘要,甚至可根据历史提交记录进行筛选,使摘要更加精简。此外,通过对编码历史的分析,可以根据领域知识缩短上下文。第二种方法是“Decoder correction”,即涉及模型的解码器部分,利用传统 IDE 的代码补全功能与大型模型相结合,以确保生成代码的可靠性。第三种方法是“back track”,即通过解释器快速生成解释结果,然后进行评价,若不准确则后退重新学习和生成新代码。这种方法模拟了人类思维模式,不断进行代码训练,但效率相对较低。

全新的 UI 交互

用户交互(UI/UX) :Github Copilot 凭借 VSCode 所提供的专属 UI API 在触达用户上有一定优势,但目前 LLM 的功能发掘仍在早期,留给初创公司进行创新的空间还很大。在未来,大型模型在开发平台上的应用将着重于用户体验和界面交互的优化。虽然类似于 Copilot 的工具在代码生成方面提供帮助,但当前仍需要将生成的代码从一个窗口复制粘贴到另一个窗口。理想情况下,用户能够在同一界面中创建、编辑、测试和展示代码,而无需频繁切换窗口。这种优化将极大地提高开发流程的效率和使用体验。比如 Cursor 提供的 copy to chat 允许用户快速导入代码段到 Chat 中以及复制 In-editor Chat 的体验:类似于 Notion 和飞书等文档协作工具中的关联文档功能。通过 @符号,开发者能够快递找到需要引用的相关文件。

AI 原生开发平台呼之欲出

当下主要占据市场的 AI 工具如 GitHub 的新产品 Copilot X 使用了 GPT-4 技术,得益于微软支持获得了 OpenAI 最新模型的内测权限。虽然最新的 CodeX 模型更新提升了代码接受率和减少了延迟,但在性能上并未领先。竞争对手的评估显示其产品能力与 Copilot 相近。同时,开源小型模型正在挑战 GPT-3.5 的性能,这对 GitHub 构建竞争优势形成挑战,市场竞争日渐加剧,当下 AI 工具对开源模型的部分依赖导致了模型更新滞后和生成效果问题。掌握自主研发 AI 原生平台才能为用户带来带来极致体验和增量永恒

同时,未来企业对代码完成工具的私有定制需求不断增长,尤其关注 Fine-tune 功能,利用内部数据进行模型优化。比如 Google 内部工具或性能优化代码,能够显著提升模型性能。此外,专有数据可减少模型参数、降低推理成本和延迟、确保在严格监管环境下对隐私和内容准则的遵守,模型的权限管理和私有化部署显得日益重要,但目前头部产品如 Github Copilot 还未涵盖这些功能,如何精准聚焦和满足客户对工具的定制化需求才是未来抢占市场的致胜之道。

随着人工智能模型的不断发展与普及,未来的编程环境可能会迎来根本性的变革,IDE(集成开发环境)可能会重构,以更好地与 AI 交互。例如,Copilot 已经展示了 AI 与 IDE 交互的早期 UI 元素,尽管目前仍处于相对早期阶段,但预示了未来这一领域可能会有更多的创新瞄准 LLM IDE First 这一赛道:传统 IDE 智能与 AI 智能的融合有望成为下一个商业风口

传统的 IDE 是软件开发的起点,也是通往 DevOps 流程的门户。在这个环境中,开发者编写、测试和调试代码,然后将其整合到 DevOps 工具链中。传统测试通常需要在 IDE 中编写多种测试代码和环境设置,而现在一些 DevOps 公司像 AtomicJar 这样的,已经简化了这个过程,甚至能自动生成测试图表和报告。截至 2022 年,全球 DevOps 软件工具市场的规模约在 183 亿美元左右,且以每年 15 至 20%的速度持续增长,然而,相较于 DevOps,IDE 这个超级入口目前仅有 VS Code 依靠免费开源政策来赢得市场高占有率,相对 deveOps 仍是前景较大的蓝海市场。

资料来源:IDC、共研产业咨询(共研网)

在这样的背景下,IDE、DevOps 及大模型的深度集成,将为软件开发过程带来新的变革。通过结合传统的 IDE 中的智能代码分析技术,程序员能够有效减少运维(Ops)阶段的负担和潜在错误。其次,大模型为开发者提供了更多自由,使他们能够根据自己的需求定制 DevOps 流水线。这种灵活性对于适应不断变化的项目需求至关重要。IDE、DevOps 和大模型的深度集成增强了 IDE 作为 DevOps 入口的作用,在软件开发的整个生命周期中扮演更重要的角色。这不仅提高了开发效率,也为企业创造了更大的商业价值。通过这种深度集成,IDE 成为一个更加强大和中心化的工具,有助于推动软件开发向更高效、更智能的方向发展。

MoonBit:为 AI 原生应用
打造的编程语言

传统的编程语言(如 Python)大多是为了和人更好地交互,大模型时代下大部分代码则将由 AI 生成,如何为大模型构建更好的上下文、在生成的代码过程中 RAG、对生成的代码进行验证测试、大模型下 IDE 新的用户交互方式等这些都给编程语言的发展带了机遇和挑战。MoonBit 编程语言的立项刚好和 ChatGPT 的发布处于同一时间,这使得我们有机会思考如何为 AI 设计一门新的编程语言,来取得极致的体验。

与前文提及的同样诞生于今年的新编程语言 Mojo 相比,MoonBit 在定位上有所不同。

2023 年 5 月,号称【a new programming language for all AI developers】的 Mojo 诞生,其作者是 LLVM 发起人 Chris Lattner。Chris 在创办「Modular AI」时意识到 AI 基础设施生态的碎片化、技术栈的部署复杂限制了 AI 的发展,因此认为需要一门全新的语言弥补研究和生产之间的差距。基于此,Mojo 选择了在 AI 具有主导地位的 Python 生态,通过接口 Python 语法的超集、直接调用 Python 库、广泛吸收许多现代的程序语言特性的方式逐渐地在 AI 界立足。

Mojo 通过重用 Python,优先支持调用 Python 库,让开发者能够充分利用庞大而完善的 Python 生态系统而无需从头开始构建,在与 Python 的速度对比上,Mojo 也实现了 35000 倍的性能提速。

Mojo 作者 Chris 曾提出:“提升人工智能的应用系统不能仅依赖于一种与特定处理器配合的加速器语言,我们需要一门能够全面应对并可以为 AI 模型加速的编程语言。”在更好地开发 AI 模型这个方向上,Mojo 可以作为一个典型的代表作品。

但随着算力的需求激增、软硬件以及训练成本的高昂、开发 AI 模型最终还是会依赖于拥有充足研究经费和旺盛科研需求的机构。落地到实际工业场景,我们需要的是利用 AI 大模型辅助开发人员生成更可靠准确的代码,融合传统 IDE 智能与 AI 智能,打造一门全新的编程语言,这是目前具有潜力的赛道和新的蓝海市场。

为 AI 设计的编程语言与工具链

MoonBit 作为一个 AI 时代下全新的开发平台,从一开始的顶层设计就考虑如何将传统 IDE 智能和大模型智能融合在一起。利用传统 IDE 智能修正大模型智能,MoonBit 通过局部重采样和全局重采样实现了智能代码生成的调整和修正

平坦化设计,适配 Transformer 架构

MoonBit 特别强调在顶层(toplevel)和局部(local)定义之间的清晰区分,并且要求在顶层定义时强制性标明类型签名。MoonBit 还采用了结构化接口实现(structural interface implementation),在这种方式中,一个类型通过实现其方法来实现一个接口,因此消除了额外嵌套代码块的必要性。现有的大模型基本都基于自回归的 Transformer 架构。这意味着随着上下文窗口增长,生成单个 token 的复杂度呈 n² 上升。也就是说,大模型的推理会越来越慢。一个没有嵌套的编程语言有着较好的可读性,同时也能够在各个层级(RAG,decoder correction,backtrack)做到 KV 缓存友好,实现更高的推理速度。

举个例子:在图 1a 中所示的例子中,一名程序员正在为类型 Llama 实现特性 Agent 中的方法 think。他们发现类型 Llama 缺少在特性 LLM 中定义的 generation 方法。由于他们处于一个嵌套代码块中,需要回到顶层来为类型 Llama 实现特性 LLM。然而,在大型语言模型(LLMs)的上下文中,修改几个函数之前的提示会导致相关 KV 缓存段的无效,这在图中以红色突出显示。经过这样的修改,所有这些函数都要重新评估,这不仅浪费了计算资源,更关键的是,延长了输出的延迟时间。

相比之下,如图 1b 所示,MoonBit 允许程序员和大型语言模型(LLMs)线性地开发他们的程序,无需频繁地来回跳转。通过结构化接口,实现接口的函数不限于特定的代码块。这允许几乎线性地生成接口及其各自的实现,从而有效地最小化 KV 缓存失误。

图一

快速实时的语义补全

局部重采样利用 AI 生成的代码进行实时调整,确保代码符合语法规范,而全局重采样进一步验证代码的语义正确性。这种方法基于深度领域知识,为开发者提供了更可靠、更准确的代码生成体验,减少了后续调试和错误修复的需要。MoonBit 团队还特意开发了基于 token 的实时语义分析工具,确保大模型输出更为准确。

与传统方法不同,MoonBit 的采样器同时收集和利用本地和全局上下文中的信息,并与解析器和静态分析器紧密合作。当大型语言模型(LLM)生成新的 token 时,它会利用来自解析器和静态分析器的实时反馈,从而确保每个生成的 token 不仅在语法上正确,而且没有明显的类型错误。传统方法缺乏这种合作,直接输出解码的 tokens,通常会导致生成错误的程序。

实验结果表明,MoonBit 采样器在编译率上取得了显著提升,性能损失仅约为 3%。对于涉及提示增强的任务,我们观察到平均每次提示增强延迟约 0.86 秒。然而,通常观察到,每种不同类型的提示增强通常只触发一次。这是因为模型通常在增强后从上下文中适应并学习。

融合传统的 IDE 智能和大模型智能

融合传统 IDE 智能与大模型智能的 MoonBit,在语言设计上也考虑到和大模型的智能融合。MoonBit 的设计理念强调清晰与简洁。这样的设计不仅降低了大模型对 MoonBit 的理解难度,也简化了在语言学习、提示工程以及微调训练过程中的工作量。MoonBit 的这一特性有利于构建有效的训练数据集,从而提高大模型的学习效率和最终性能。

此外,MoonBit 通过结构化接口和类型系统的明确性,允许大模型更加准确地识别代码的模式和结构,进而生成更加准确和高效的代码。这种明确性不仅有助于提升代码生成的质量,也为后续代码的维护和扩展提供了便利。

在 MoonBit 中,传统 IDE 的嵌入提示和代码自动补全将会得到增强,它们可以与大模型的预测能力相结合,为开发者提供即时的代码生成建议。这种智能融合充分发挥了传统 IDE 的强大功能,同时引入了 AI 的动态学习和自适应能力,创建了一个双向互补的开发环境。

随着时间的推移,我们可以预见,MoonBit 在语言设计的清晰性和简洁性将进一步推动 AI 在编程领域的应用,尤其是在自动化编码、代码审核和程序维护等方面。MoonBit 团队对大模型智能融合的持续创新,预示着未来编程工具将不断进化,以更好地适应人工智能时代的需求。

更好的静态分析、测试验证

在代码编写的过程中,静态分析扮演着至关重要的角色。它能在代码运行前发现潜在的错误和问题,从而提高代码的质量和可维护性。MoonBit 提供实时全局静态分析技术,生成类型正确且可编译的代码,显著提升了代码的可靠性。

以一个具体的例子来说明:假设在编写代码时,我们遇到一个变量 p,并希望补全其属性。当大型模型被用于代码补全时,它可能会提供几个选项,比如 x,y,co。尽管每个选项都可能是语法上正确的,但并非所有的补全都是在当前上下文中类型正确的。MoonBit 通过实时的静态分析技术,可以准确识别出 p 是 point 类型,并且知道 point 类型中有一个属性名为 cordx。因此,MoonBit 能够智能地推断出,基于 co 开头的代码补全是正确的选择。

这种全局的重采样技术使得 MoonBit 不仅能生成语法上正确的代码,而且还能确保类型的准确性,生成可以编译且更为可靠的代码。这一点相较于 Copilot 直接提供的补全选项,MoonBit 所提供的代码可靠性要高得多。通过这样的技术,MoonBit 不仅提升了开发效率,也增加了代码在实际编译和运行中的成功率。

端到端平台:AI 智能体的理想开发环境

AI Agent(AI 智能体)是一种能够感知环境、进行决策和执行动作的智能实体。在大型语言模型(LLM)的推动下,AI 智能体的能力得以拓展,使其能够自动化处理各种通用问题。不同于传统的 AI,AI 智能体的独特之处在于其具备通过独立思考、调用工具去逐步完成给定目标的能力。然而,开发 AI 智能体中的过程中面临着挑战:调取各种资源的过程需要很多处理交互逻辑的胶水代码。

MoonBit 月兔语言,作为一种超级胶水语言,提供了一个理想的环境来开发 AI 智能体。不同于传统的编程语言,MoonBit 月兔语言从一开始就提供全套开发、调试、部署一站式解决方案。MoonBit 不仅提供了通用程序语言设计,还涵盖了编译器、构建系统、集成开发环境(IDE)、调试器,部署工具等各个方面。这个全面的设计使得月兔(MoonBit)能够实现高度垂直整合,而且可以同时在云端和边缘端执行,更好地与各种资源进行交互,从而为用户提供极致的开发体验和性能。这使得 MoonBit 非常适合用来开发能够与各种资源进行高效交互的 AI 智能体。

更为重要的是,由于 MoonBit 支持实时可视化开发,同时编译速度极快,使开发者能够实时看到代码更改对应用(游戏)的实时影响。这里通过视频展示,你可以实时更改代码来实时定制你的马里奥游戏。在实时编程环境中,你可以灵活调整马里奥游戏的跳跃高度、实时创建多个马里奥角色或调整游戏结束的逻辑,从而实现高度自定义的游戏体验。

MoonBit 的 2023 总结和 2024 展望 核心功能进展

在过去一年里,MoonBit 编程语言在核心功能方面取得了不小的进展,具体体现在以下几个方面:

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 check、moon build 执行加速

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

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

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

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

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

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

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

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

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

包管理

MoonBit 作为一门从 0 到 1 的编程语言,对于其生态建设尤为重视。关键之一在于构建一个高效且功能丰富的包管理系统。在此基础上,我们已经初步搭建了一个平台,提升包的获取速度和编译效率,从而为开发者提供一个高效的工作环境。

此外,我们注重文档的管理和维护。为了让文档更加易于理解和使用,我们提供一系列的工具和指导,以帮助开发者创造高质量的文档。这些工具和指导不仅涵盖了文档的编写规范,还包括了如何有效地组织和展示信息,以确保每个包的文档都是清晰且易于导航的。

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 实现了任天堂模拟器,可以玩几十款游戏。

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

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

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

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

未来规划和展望

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 不仅是一个语言,也是一个端到端的解决方案,我们要利用好当下最新的 AI 技术,为用户提供全面的服务。

可以预见,在不久的将来,MoonBit 将与 AI 技术深度融合,进一步拓宽其在云计算和边缘计算领域的应用。MoonBit 将能够利用大模型的预测和自学习能力,为编程工作流程带来革命性的变革。让我们一同期待这场变革的到来!

参考链接:

【1】https://github.blog/2023-06-27-the-economic-impact-of-the-ai-powered-developer-lifecycle-and-lessons-from-github-copilot/

【2】https://karpathy.medium.com/software-2-0-a64152b37c35

【3】https://space.bilibili.com/1453436642?spm_id_from=333.1007.0.0


如果你觉得本文对你有帮助,或者你对编程语言在大模型时代的发展有自己的思考,欢迎在文末留言告诉我们!


InfoQ 2023 年度技术盘点与展望专题重磅上线!与 50+ 头部专家深度对话,探明 AIGC 创新浪潮下,重点领域技术演进脉络和行业落地思路,点击阅读原文链接收藏,更多精彩文章持续更新 ing~

另,InfoQ 年度展望系列直播将于 2024 年 1 月 2 日首场开播,持续输出精彩内容,关注 InfoQ 视频号,与行业技术大牛连麦~

今日好文推荐

数据库的下一场革命:S3 延迟已降至原先的 10%,云数据库架构该进化了

网游新规致腾讯网易市值半天蒸发5200亿;吴泳铭“爆改”淘天:管理层全换成有功绩的年轻人;字节年收入超腾讯、逼近Meta|Q资讯

创始人 3 天狂砍 5 万行代码后,应用程序更快、更易使用了

选择哪种编程语言已经不重要了,只提倡程序员下班后“多看看书”提升竞争力是误人子弟|独家专访亚马逊 CTO

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存