← 返回信息流
AI 资讯Hacker News·10 天前

Rapira (Рапира) – 苏联编程语言解释器

原标题:Rapira (Рапира) – Soviet programming language interpreter

速览

Rapira(俄语:Рапира)是苏联时期开发的一种编程语言及其解释器。它代表了冷战时期苏联在计算机科学与软件工程领域的独立探索。该语言的设计与实现反映了当时特定的技术约束与学术环境,具有重要的计算机历史研究价值。

AI 深度解读

Rapira (Рапира):苏联教育编程语言的现代重生

背景

Рапира (Rapira) 是一门诞生于 20 世纪 80 年代初的苏联教育编程语言。它由 G. A. Zvenigorodsky 设计,旨在作为 Школьница (Shkolnitsa) 学校计算系统的一部分,专门用于 Агат (Agat) 微型计算机。

在冷战时期的苏联,计算机教育面临着硬件资源稀缺和软件生态封闭的挑战。Рапира 的设计初衷是降低编程门槛,让学生能够通过俄语关键字和直观的逻辑结构学习计算思维。这门语言具有鲜明的时代特征:完全基于俄语关键字、大小写不敏感、支持特定的复合数据类型以及独特的过程参数传递机制。

如今,随着开源社区对计算机历史遗产的兴趣日益浓厚,开发者 Alexander Demin 使用 TypeScript 和 Bun 运行时构建了一个 Rapira 的解释器。这一项目不仅是对苏联早期计算机教育的致敬,也是通过现代 Web 技术让古老语言在浏览器和终端中重新焕发生机的尝试。

核心内容

该项目是一个完整的 Rapira 语言实现,包含解释器核心、命令行界面 (CLI) 和 Web 游乐场。以下是其核心功能的详细解读:

1. 语言特性与兼容性

解释器严格忠实于 1985 年的 Agat 方言标准,主要特性包括:

  • 纯俄语关键字:所有控制结构和关键字均使用俄语(如 ДЛЯ 表示循环,ВСЕ 表示结束块)。
  • 大小写不敏感:标识符不区分大小写。
  • 注释与分隔符:支持 (* ... *) 形式的块注释,使用分号 ; 作为语句分隔符。
  • 复合数据类型:支持三种复合类型:
    • 元组 (< >)
    • 集合 (<*>)
    • 记录 (¤ ¤)
  • 过程参数机制:采用独特的三箭头参数传递方案,包括 name(值传递)、name =>(引用传递)和 /<=> name(双向传递)。
  • 函数返回值:使用尾部的 РЕЗ: 关键字指定函数返回值。

2. 代码示例

Rapira 的语法直观且富有逻辑性。以下是一个计算阶乘 (factorial) 的经典示例,展示了其结构:

ФУНК ФАКТ (Н);
ИМЕНА: Р;
1 -> Р;
ДЛЯ И ОТ 1 ДО Н ::
    Р * И -> Р
ВСЕ
РЕЗ: Р
КНЦ;

ДЛЯ Н ОТ 0 ДО 6 ::
    ? "ФАКТ(", Н, ") = ", ФАКТ(Н)
ВСЕ;

3. 技术架构与实现

  • 解释器核心 (src/):包含词法分析器 (lexer)、解析器 (parser) 和树遍历求值器 (tree-walking evaluator)。
  • 命令行界面 (cli/)
    • 支持 rapira FILE.rap 运行程序。
    • 支持 rapira 进入多行 REPL 模式。
    • 支持 --svg PATH 将海龟图形 (turtle graphics) 捕获为 SVG 文件。
  • Web 游乐场 (web/)
    • 基于原生 HTML、CodeMirror 6 和 Web Worker 构建。
    • 支持亮色/暗色主题切换。
    • 示例代码从 tests/snippets/ 目录动态加载。
    • 构建输出位于 docs/ 目录,可直接部署至 GitHub Pages。
  • 海龟图形 (Чертёжник)
    • 暴露了苏联经典的“绘图员”执行器指令,如 ВПЕРЕД (前进)、НАЗАД (后退)、НАПРАВО (右转)、НАЛЕВО (左转) 等。
    • 底层与文档化的图形原语 (如 ЛИН, ПРЯМ, ОБЛ) 共享相同的 GfxEvent 流,确保 CLI 的 SVG 渲染器与 Web 游乐场的 Canvas 渲染器输出完全一致。

4. 开发与测试

  • 构建工具:推荐使用 Bun 进行本地开发,因为它原生支持测试和开发服务器。
  • 测试管道:位于 tests/snippets/,通过 bun test 运行,将 .rap 文件与对应的 .expected.txt.expected.svg 进行差异对比。目前包含 129 个测试用例,分布在 9 个文件中。
  • 文档规范
    • SPEC.md:实现契约,定义了词法结构、语句、运算符、内置函数以及已完成与暂缓实现的功能。
    • RAPIRA.md:1985 年原始规范 (Фг.00031-01 35 01) 的 Markdown 版本,源自 agatcomp.ru 的 KOI-8 编码源文件。
    • CLAUDE.md:针对该代码库的贡献者入门指南。

5. 使用方式

  • 无需克隆仓库直接运行 (需 Node.js ≥ 18):
    npx rapira FILE.rap
    npx rapira FILE.rap --svg out.svg
    npx rapira  # 进入 REPL,Ctrl-D 退出
    
  • 全局安装
    npm install -g rapira
    rapira FILE.rap
    
  • 本地开发
    bun install
    bun test
    bun run cli/index.ts examples/factorial.rap
    bun run dev  # 在 http://localhost:10000 启动游乐场
    

关键要点

  • 历史还原度高:该项目严格遵循 1985 年 Agat 方言标准,保留了俄语关键字、特定的语法结构(如三箭头参数)和复合数据类型,是对苏联计算机教育历史的忠实复刻。
  • 现代技术栈赋能:使用 TypeScript 编写核心逻辑,利用 Bun 运行时提供高性能的执行环境,并通过 CodeMirror 6 和 Web Worker 实现了流畅的 Web 端体验。
  • 图形渲染一致性:通过共享 GfxEvent 流,确保了命令行 SVG 导出与 Web 端 Canvas 绘制的输出完全一致,解决了跨平台图形渲染的难题。
  • 完善的测试与文档:项目包含 129 个测试用例,提供了从原始规范到现代实现契约 (SPEC.md) 的完整文档链,便于开发者理解和贡献。
  • 易于访问:提供了浏览器在线试玩 (https://begoon.github.io/rapira) 和终端一键运行 (npx rapira) 两种便捷方式,降低了体验门槛。
  • 开源许可:项目采用 MIT 许可证,由 Alexander Demin 维护,允许自由使用和修改。

意义与影响

Rapira 解释器的出现具有多重意义:

  1. 计算机历史遗产的保护:通过数字化手段,使原本局限于特定硬件(Агат 微型计算机)和封闭环境的苏联教育语言得以在通用计算平台上运行,为计算机历史研究者和爱好者提供了宝贵的实验环境。
  2. 教育价值的再发现:Rapira 的设计体现了早期编程教育的理念——使用母语关键字降低认知负荷。在现代编程教育中,这种“母语优先”的思路仍具有启发意义,尤其对于非英语母语的学习者。
  3. 开源社区的协作典范:该项目展示了如何将古老的技术规范转化为现代代码库。从 KOI-8 编码的原始文档到 Markdown 规范,再到 TypeScript 实现,这一过程体现了开源社区对技术细节的严谨态度和对历史文献的尊重。
  4. 技术多样性的展示:通过支持 Bun 和 Node.js 两种运行时,并兼容 CLI 与 Web 环境,该项目证明了现代 JavaScript/
查看原文 →github.com