返回资讯中心
外部精选
软件工程
#开发者实时流

Micron 语言发布编译器、解释器与 IDE,定位为 C 的系统编程替代方案

来源标题:Micron – a Pascal/Oberon-derived systems language with the power of C

Micron 项目推出该语言的编译器、解释器和 IDE。Micron 基于 Pascal/Oberon 语法,名称是 MicroOberon 的缩写,支持直接调用 C 代码而无需包装层,并按模块需求划分从 level 0 到 level 5 的语言层级。

Hacker News 最新birdculture2026/11/8 · 今天22 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

这个项目实现了 Micron 编程语言的编译器、解释器和 IDE,语言规范见这里;下面还有一些代码示例。

Micron 是一门系统编程语言,语法类似 Oberon+,能力范围则与 C 相当。「Micron」这个名字是「MicroOberon」的缩写。

Micron 旨在成为系统编程中 C 的实用替代方案。它把 Oberon 的模块化、严格性和简洁性与 C 的灵活性结合起来:同一门语言既可用于启动代码、驱动程序、操作系统内核,也可用于普通应用,并且调用 C 时不需要包装层。预处理器被语言概念所取代,这些概念大体上能替代预处理器原有的功能,另外还显式支持泛型编程、内联以及在编译期运行的过程。因此,设计重点始终是简洁,以及以切实可行的投入取得最大的效果。

Micron 支持语言层级:模块声明自己需要的层级,从 level 0(用于硬件初始化的内联代码,不使用栈),到 level 1(栈帧、递归、外部 C 过程),到 level 3(堆、指针、异常),到 level 4(类型扩展和动态派发),直到 level 5(垃圾回收)。一个模块只能导入相同或更低层级的模块,因此以 level 1 编写的内核不会意外依赖堆。未指定该属性时,默认为 level 3。

除规范之外,还有一本免费的教科书,讲解 Micron 的每项特性如何使用,以及为什么这样设计。第三部分完整走查了 Micron System——它是 Wirth 和 Gutknecht 的 Project Oberon 操作系统的移植版,只需一条命令即可在模拟的 RISC-V 机器上编译、链接并启动。

自 2024 年 1 月项目启动以来,已有大量基准测试、虚拟机和规模可观的操作系统迁移到 Micron。以下参考资料包含约 130 kSLOC 可运行的 Micron 代码。

Are-we-fast-yet 仓库包含同一套基准测试的四种不同实现,用于对比:过程式、混合式、基于接口和面向对象。

Oberon System 3 向 Micron 的迁移目前可在模拟的 RISC-V 机器上运行;对 Raspberry Pi Zero 2 的支持尚在进行中。

目前提供以下预编译版本:下载、解压并运行即可。命令行选项在 micc 手册中有说明。

这里是书中讨论的 Micron System 的预编译版本,在 Linux x86_64 上只需输入 ./rv32vm --elf --ram 4 --disk disk.img system.bin 即可运行(需要 SDL2)。更多信息见 Readme.md。

Micron 区分大小写,但每个保留字和预声明标识符都有全小写和全大写两种形式,含义完全相同;最后一个示例采用 Oberon 风格,其余示例均采用书中使用的全小写风格。语句分隔符是可选的。

module Bits [level = 1] var a: array 4 of int32 p: ^int32 u, u1: uint32 begin println(band(0F0FH, 00FFH)) // 15 println(bor(1, 4)) // 5 println(bxor(5, 1)) // 4 println(shl(1, 5)) // 32 println(shr(0FFH, 4)) // 15, logical println(asr(-16, 2)) // -4, arithmetic u1 := 0FFFFFFFFH println(cast(int32, u1)) // -1, same bits u := usig(-1) println(u) // 4294967295, same bits a[0] := 10; a[1] := 20; a[2] := 30 p := @a[0] p := ptroff(p, 1) // advance by one int32 println(p^) // 20 inc(p) println(p^) // 30 end Bits

该文件位于 examples 子目录中,可用 ./micc Bits.mic --run 编译并运行。

module Clib [level = 1] procedure abs(x: int32): int32; extern C procedure toupper(c: int32): int32; extern C procedure write(fd: int32; const buf: ^[]char; n: uint32): int32 extern C "write" var s: array 3 of char begin s := "ok" if write(1, @s, 2) # 2 then return end println(abs(-5)) println(toupper(sigl(ord('a')))) // 65 end Clib

无对象的抽象

module Shapes [level = 2] type Shape = interface // a contract, satisfied structurally proc area(): integer proc print() end Rect = record w, h: integer end Circle = record radius: integer end procedure Rect.area(): integer // type-bound procedure, bound statically begin return self.w * self.h end Rect.area procedure Rect.print() begin print("rect "); print(self.w); print("x"); print(self.h) end Rect.print procedure Circle.area(): integer begin return 3 * self.radius * self.radius // coarse end Circle.area procedure Circle.print() begin print("circle r="); print(self.radius) end Circle.print procedure describe(s: Shape) // accepts any type with area and print begin s.print(); print(" area="); println(s.area()) end describe var r: Rect c: Circle begin r.w := 4; r.h := 3 c.radius := 5 describe(@r) // rect 4x3 area=12 describe(@c) // circle r=5 area=75 end Shapes

泛型编程

module Stack(T; const CAP: uint32) var a: array CAP of T n*: integer procedure push*(x: T) begin a[n] := x; inc(n) end push procedure pop*(): T begin dec(n) return a[n] end pop begin n := 0 end Stack module UseStack import si := Stack(integer, 10) cs := Stack(char, 4) begin si.push(3); si.push(4) cs.push('x') println(si.pop() + si.pop()) // 7 println(cs.pop()) // x end UseStack

编译期编程

module Comptime const KB = 1024 BUFSIZE = getenv(uint32, "BUFSIZE", 16 * KB) // micc -D BUFSIZE=... WORDS = BUFSIZE div size(integer) DEBUG = getenv(boolean, "DEBUG") // false unless -D DEBUG procedure width(n: uint32): uint32 invar // callable at compile time begin if n < 2 then return 1 else return 1 + width(n div 2) end end width const INDEXBITS = width(WORDS - 1) // 12, computed by the compiler var buf: array WORDS of integer index: array INDEXBITS of boolean begin println(len(buf)) // 4096 println(len(index)) // 12 <* if DEBUG then > println("debug build") < else > println("release build") < end *> end Comptime

Oberon 风格

MODULE Sorter; PROCEDURE Sort*(a: ^[]INTEGER; n: UINT32);

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →