在编程语言的历史长河中,许多设计因时代局限而被遗忘,但其核心理念却值得重新审视。Rapira(Рапира)是上世纪 80 年代初苏联为 "Школьница"(学生)教学系统设计的编程语言,运行于Агат(Agat)微型计算机上。近期,开发者 begoon 使用 TypeScript 与 Bun 运行时完成了该语言的现代解释器实现,使这一历史遗产重新进入技术社区的视野。
Rapira 的设计目标明确:面向 11 至 17 岁学生的结构化编程教学。与当时流行的 BASIC 不同,Rapira 完全摒弃了 GOTO 语句,强制采用过程式编程范式。这种设计选择体现了苏联计算机教育界对结构化编程理念的早期认同 —— 程序应由顺序、选择和循环三种基本结构组成,而非通过跳转指令编织的 "意大利面条代码"。
三箭头参数传递:显式数据流设计
Rapira 最独特的语法特征是其参数传递机制。过程定义使用三种箭头符号明确标注参数的流向:无箭头或=>前置表示输入参数,箭头后置name =>表示输出参数,双箭头<=> name表示输入输出参数。这种 "三箭头方案"(three-arrow scheme)将数据流方向可视化地嵌入语法层面,对初学者理解参数传递的语义具有显著的教育价值。
ПРОЦ ПОМЕНЯТЬ ( <=> А, <=> Б );
ИМЕНА: Т;
А -> Т;
Б -> А;
Т -> Б
КНЦ;
上述交换过程示例中,<=>明确告知学习者:А和Б的值将在过程执行期间被读取和修改。相比现代语言中隐式的ref或out修饰符,Rapira 的箭头符号更具直观性。
复合数据类型与统一操作符
Rapira 支持三种复合类型:元组(кортеж)<e1, e2, …>、集合(множество)<* e1, e2 *>和记录(запись)<¤ имя1: v1, имя2: v2 ¤>。语言设计的一个精妙之处在于操作符的重载统一性 ——+可用于数值相加、文本 / 元组连接或集合并集;*既表示乘法也表示集合交集。这种设计降低了语法复杂度,使学习者能够聚焦于数据操作的逻辑本质而非记忆特定函数。
记录类型采用<¤ … ¤>界定符,其中¤符号在苏联 KOI-8 编码中占据$的码位,因此现代实现也兼容<$ … $>的 ASCII 键盘输入形式。字段访问使用点号语法АНКЕТА.ФАМ,访问不存在的字段返回.пусто(空值),这种显式的空值处理避免了未定义行为导致的程序崩溃。
事件驱动的图形架构
Rapira 的图形子系统体现了跨平台设计的早期智慧。解释器核心不直接操作绘图表面,而是通过GraphicsSink接口发射类型化事件(GfxEvent)。CLI 环境将事件流渲染为 SVG,Web playground 则通过 Canvas 绘制,而原始Агат硬件直接驱动显示内存。这种架构解耦了语言语义与平台实现,使同一套图形原语(ЛИН画线、ПРЯМ画矩形、ОБЛ填充区域)能够在不同环境保持一致行为。
"Чертёжник"(绘图员)海龟图形系统作为 Rapira 的扩展,同样采用事件流设计。海龟状态(位置、朝向、笔状态)的变更被转换为line事件注入图形流,确保 CLI 的 SVG 渲染器与 Web 的 Canvas 渲染器输出完全一致。默认画布尺寸 256×256 像素对应Агат-7 高分辨率模式,坐标原点位于左上角,Y 轴向下 —— 现代主机通过坐标变换还原Аг特原生的左下角原点约定。
对当代编程教育的启示
Rapira 的现代复兴引发了对教学语言设计的深层思考。当前主流的 Python、JavaScript 等语言虽然功能强大,但其隐式类型转换、动态作用域等特性往往成为初学者的认知陷阱。Rapira 的显式设计 —— 从箭头参数到.пусто空值,从ЕСЛИ-ТО-ИНАЧЕ-ВСЕ的完整条件结构到ДЛЯ-ОТ-ДО-ШАГ的显式循环控制 —— 将程序执行的每一步可视化,降低了心智模型构建的难度。
对于嵌入式系统教育,Rapira 的受限环境设计具有特殊价值。在资源受限的Аг特计算机上,学生必须理解内存布局、文件指针定位(ПОЗИЦИЯ)和 I/O 流的概念。现代解释器通过InMemoryFileSystem在测试环境中模拟这些行为,使学习者能够在无硬件依赖的情况下掌握底层编程思维。
begoon 的实现选择 TypeScript 作为宿主语言,利用其类型系统精确映射 Rapira 的运行时语义。这种 "用现代类型安全语言实现历史教学语言" 的做法,本身就是对语言设计传承的最佳注解。尽管当前实现采用树遍历求值器(tree-walking evaluator)而非字节码虚拟机,性能受限,但对于教学场景而言,这种简单性恰恰是优势 —— 学生可以追踪每一行代码的执行路径,理解解释器的工作原理。
Rapira 的案例提醒我们:优秀的教学语言不在于功能丰富,而在于概念清晰。在图形化编程工具泛滥的今天,回归文本代码的显式结构,或许是培养计算思维的一条有效路径。
资料来源
- GitHub - begoon/rapira: TypeScript/Bun 解释器实现与 1985 年规范文档
- Rapira 语言规范(1985): Фг.00031-01 35 01 原始技术文档
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。