Skip to Content

第一个程序

新建一个空目录,在里面建一个文本文件 helloworld.ms。MushScript 程序代码需要是扩展名为 .ms 的 UTF-8 文本文件。

helloworld.ms
func main() -> int { print("Hello, world"); return 0; }
$ mush run helloworld.ms Hello, world

程序打印一行字,然后退出。这是一个完整的开发流程:写文件 → 运行 → 看输出。

逐行说明

  • 第 1 行 func main() -> int:声明一个名叫 main 的函数。main 是约定的入口名:mush run 从这里开始执行。-> int 表示它返回一个整数。
  • 第 2 行和第 5 行:一对花括号,框出函数体。花括号不可省略,即使函数体只有一句话。
  • 第 3 行:调用 print,把括号里的内容打印出来,末尾自动换行。行尾的分号表示一条语句结束,每条语句都要有。
  • 第 4 行:return 0; 把 0 作为退出码返回给操作系统。这个数字成为程序的退出码(Exit Code),0 表示「一切正常」。

print 直接接受数字、布尔、字符串等任意值,不必先转成文本。

注释

注释有三种写法,编译器一律忽略:

// 行注释:到行尾为止 /* 块注释:可跨行, 而且 /* 支持嵌套 */,深度计数,配对才闭合 */ /// 文档注释:附着到下一声明,为语言服务提供文档说明
  • 块注释支持嵌套
  • /// 文档注释是独立于 // 的种类,语义是「给下一声明的说明」

第一次读错误信息

把 print 拼成 pritn 再运行,会见到一条编译错误:

$ mush run helloworld.ms error MS3001: Undefined name 'pritn'. --> helloworld.ms:3:5 | 3 | pritn("Hello, world"); | ^^^^^

错误信息固定三段:发生了什么错误(错误码加一句话说明)、在哪个文件的哪一行(--> 指到行:列)、一段源码摘录并把出错字符标出来。

一条真实错误常引发多条连锁诊断;先修第一条,其余往往随之消失。

只想检查代码能不能编译、不想真正运行,用 mush check helloworld.ms。它跑同样的编译过程,但不执行。

注意

  • 编译不通过时程序一行都不会执行,看到的输出永远来自完整编译通过的程序。
  • 入口函数写不写 public 都一样,因为 main 入口无视可见性修饰符,本参考手册统一省略。
  • 后续页面用「示例 + 输出」的方式展示行为,片段均可运行。
最后更新于 2026年10月7日