面向所有文化背景儿童的个人电脑
摘要
Ramsey Nasser的演讲探讨了编程语言的英语中心化特性,并介绍了一种基于阿拉伯语的编程语言,旨在促进计算教育的包容性。
<p><a href="https://lobste.rs/s/ikeag0/personal_computer_for_children_all">评论</a></p>
查看缓存全文
缓存时间: 2026/08/20 16:45
# 面向所有文化儿童的个人电脑——Ramsey Nasser 解构
来源:https://www.deconstructconf.com/2019/ramsey-nasser-a-personal-computer-for-children-of-all-cultures
### 演讲稿
(编者注:演讲稿无法完全呈现现场效果。此稿便于搜索和参考,但建议观看视频而非仅阅读文字!按一般阅读速度,阅读此稿比观看视频节省15%时间,但你会错过肢体语言和演讲者的幻灯片!)
\[掌声\] 大家好,我是Ramsey Nasser,游戏设计师、艺术家和教育工作者。本次演讲题为《面向所有文化儿童的个人电脑》。我想与各位探讨一个困扰我多年的编程领域问题,以及我认为可能的解决方向。
本次演讲部分基于我去年为论文集《殖民数字空间:技术作为文化实践》撰写的同名文章。该文已在线发布,部分内容比这里更详尽,建议有机会时阅读。感谢Josh Harley邀请我参与该论文集,并感谢\[听不清\]的支持。
标题呼应了艾伦·凯1972年那篇开创性论文《面向所有年龄段儿童的个人电脑》。文中凯描述了Dynabook——一款可编程的移动个人电脑,其设计理念后来启发了现代笔记本电脑和平板电脑的形态。这篇论文在诸多方面超越了时代,其中重点讲述了贝蒂和吉米(如图所示)通过编程和重编电子游戏共同学习物理的故事。
凯主张计算机编程不应仅是工程工具,而应成为"做中学"、赋能年轻创意心灵的利器。这一思想直接或间接启发了Smalltalk、Scratch、Squeak、Processing、Arduino等项目,以及Brett Victor(若各位熟悉)的工作。作为艺术家和教育工作者,我始终认为编程是赋能教育、表达创意的重要手段。
艾伦·凯的论文及其衍生工作极具启发性,但其叙述存在一个问题:稍作观察就会发现,当今所有编程语言都基于英语单词和标点符号。使用任何现代编程工具都需要一定的英语知识。
要高效运用这些工具,真正的英语熟练度不可或缺。这使得英语母语程序员比其他语言使用者更具优势,使完全公平的编程体验成为泡影。艾伦·凯的论文未触及此问题,当代编程语言设计讨论也鲜少涉及。
2012年我在纽约Eyebeam艺术科技中心驻留期间,通过创建名为\[ARABIC\]的编程语言,开始探索这种明显的偏见。我的目标是提供完全使用母语阿拉伯语的编程体验。\[ARABIC\]本质上是用阿拉伯语替代英语关键词的Scheme解释器。就设计而言,这是门相当平庸的语言。截图展示的是REPL会话中实现并学习斐波那契数列算法的过程——这是创建编程语言时的必经环节。
我想探索非英语编程体验的可能性,更想理解为何此类语言至今仍未出现。\[听不清\]今天早上的演讲提到要勇于尝试新事物,这正是我学习的最佳途径。我就是这样进入语言设计领域的。
\[ARABIC\]表面成功之处在于它作为语言能正常运行,提供阿拉伯语关键词,并拒绝非阿拉伯字符。但最终它无法使用现有库、API和SDK,因为这些资源并非阿拉伯语编写。因此,\[ARABIC\]及其同类语言终究只能是玩具。
思考\[ARABIC\]项目的失败,让我提出更宏大的问题:真正不偏重任何文化的编程体验究竟为何?我花大量时间研究字符编码,但最终聚焦于编程语言中的"名称"。
命名已被公认为难题。菲尔·卡尔顿的名言:"计算机科学只有两大难题——缓存失效和命名。"我认为后者确实如此,不仅因为好名字难找,更因为名称是文化(实践中即英语书面文化)嵌入编程系统的主要载体。
为解释我的观点,我们分析一个实例。这是C语言OpenGL图形教程的片段。完整程序用约300行代码创建窗口并渲染星空背景。具体细节无关紧要——注意几乎每行都充满英语单词。
那么,将此示例翻译为非英语编程语言需要什么?这可能吗?并非所有英语词汇功能相同,可分为几类逐一分析。首先是编程语言理论中的"关键字"。
大多数语言提供用户不可创建或修改的基础功能集合——通常是循环、条件语句等。这些功能通过关键字实现,它们是解释器或编译器特殊处理的标记。程序会专门识别这些标记并以不同方式执行。
作为程序员,你无法控制关键字。它们内置于语言中。要更改关键字需创建新的编程语言,这很困难但并非不可能。
事实上,\[ARABIC\]正是这样做的——提供非英语关键字。因此,这个问题在某种程度上是可解决的。
虽非正式术语,但本演讲将此类名称称为"本地标识符"。它们是程序员为自身函数、变量和数据结构赋予的名称。
程序员确实可以选择这些词汇。尽管历史上语言会对合法标识符施加限制(通常是ASCII字符集),使人受限于拉丁字符。
但若已为提供新关键字而创建新语言,完全可以放宽限制,允许使用Unicode字符表示任何语言。实际上,现代语言如Swift、C#和JavaScript(肯定还有其他)已支持Unicode标识符。因此,现在你就可以在这些语言中使用阿拉伯语函数名,没有任何阻碍。
关键字和本地标识符可通过重新设计语言本身解决。第三类名称则复杂得多,本演讲称之为"外部标识符"——这些是你未编写但必须使用的名称。
它们是库、SDK、框架提供的名称,是你构建软件时依赖的他人编写的有用代码。本例中的库是OpenGL和GLUT图形库。
没有代码共享,现代编程无法实现。但当今语言构建方式要求使用库时,必须使用库作者原始声明的完全相同名称。即使你的语言支持母语关键字和Unicode标识符,只要库作者选择英语名称(我见过的每个软件库都是如此),你就必须在程序中使用完全相同的英语名称。
设计新编程语言是有限问题——虽难但可行。而处理当前流通的所有库生态则不可能。想象你曾用过的每个库,当今流通的库可能达数十万、数百万个,有些可追溯数十年。
考虑操作系统SDK。若要编写POSIX或Win32程序,这些库都导出英语名称,若你想基于这些软件构建,就必须使用这些名称。因为编程中的名称与其指代的事物并非独立存在,以特殊方式成为事物固有部分。
从GLUT库的机器码和符号表转储中可见这一点。作者为函数分配的名称与实际构成函数执行体的机器码共同呈现在二进制文件中。编译器工具链(特别是名为链接器的部分)使用这些名称查找代码对象并构建可执行程序。
使用错误或不同名称将导致链接器错误,代码无法编译。我将以C语言为例说明,但这适用于我用过的每个编程系统。
即使为这些名称构建封装或翻译层,对计算机而言原始名称仍是真实名称。这就像当"podium"被定为英语中的"讲台"一词时,该词的发音和拼写就成为物体分子结构的一部分,无法分离。编程原理与此非常相似。
这不是对名称本身的批判,编程充满名称也非错误。计算机编程是用相对有限的大脑管理海量复杂性的实践。编程语言为人类思维提供工具,作为进入计算机科学广阔复杂性的接口。
最重要的工具之一就是命名能力。想象用内存偏移量替代函数名编程,那将是噩梦。部分嵌入式系统工程师会这样做,但这样构建的系统在规模和正确性上有限——若试图在脑中维护线性内存映射,而非使用有意义的名称。
名称对人类认知至关重要,且名称以强制方式嵌入代码,使你必须使用他人选定的名称。这两种现实结合成文化与政治问题,因为不存在中立的名称。大多数关于编程命名的讨论忽略了命名行为的文化深度。至少,文本名称属于某种而非所有文字系统,因此承载着命名者的书面文化。
历史上,命名领土是战争战利品之一。今天仍可见于埃及至阿富汗间十余座名为"亚历山大"的城市——这些城市是亚历山大大帝武力横扫中东的遗存。每个城市名称都诉说着持久暴力与战争的故事。
我的个人名字是我移民父母精心选择的,使其在西方(读作Ramsey)和故乡黎巴嫩(读作Ramsey)都能发音——这是他们在我出生前就构想的未来。这是母亲和婴儿时期的我,那时我就已对计算机持怀疑态度。
这个名称蕴含着父母对更美好生活的希望。命名是记录历史与语言的深刻人类行为,可以诗意美丽,可以暴力残酷,唯独不可能中立。
那么我们该怎么办?名称使人类心智有机会理解与管理计算的复杂性。现代编程通过构建现有系统成为可能,这意味着在任何新代码中使用他人选定的名称。由于每个名称都承载命名者的假设和世界观,当今每个程序员被迫熟悉过往程序员的书面文化。
如何构建不偏重任何书面文化的编程体验?我承认这难以想象,花了很多时间才形成解决方案的雏形。我认为存在一种可怕的压迫——它剥夺你想象解放的能力。但我确实有要分享的草图。首先列举可接受方案应具备的特征及其影响。
在我看来,可接受方案必须:第一,允许所有人使用有意义的名称。记住,对不同人而言有意义的名称可能不同,可能属于不同语言。这意味着该系统结构必须支持为自身赋予多个名称。如果每个事物只能有一个名称,某些人的名称就会压过其他人,我们将回到现状。
第二,可接受方案必须支持全球协作。例如印度编写的代码必须能被法国程序员使用而无需修改。目前这可行,因为我们强制所有人学习英语——而这正是我们要摆脱的。
第三点多少由系统目标定义:可接受方案必须不偏重任何文化。这意味着我们不能将某种书面文化视为本体并进行转换,因为那不是公平的编程体验。若觉得困难——这确实是艰巨任务,但我会假装并非如此。
基本思路是:将人类可读名称与机器友好的规范名称解耦。规范名称成为编译器工具链构建正确程序的真实依据,可读名称则服务于人类思维和便利。
这并非全新或突破性想法。多种系统中已有类似实现(无意双关),最突出的是git。在git仓库中,事物的规范名称是其哈希值——历史记录编码为哈希,引用编码为哈希,且都是内容哈希。哈希具有诸多特性……
相似文章
童年计算机
Susam Pal 回顾了他童年时期使用早期计算机、LOGO 编程以及经典游戏(如 Moon Bugs 和 Digger)的经历。
教孩子们Forth编程
一位程序员分享了他们教初中和高中生Forth编程语言的经验,解释了为什么选择它而不是Python或Scratch,以及他们如何为12节课的课程设计教学大纲。
"电脑已走向个人化"(阅读时间约 4 分钟)
Perplexity 推出了“Personal Computer”AI 平台,该平台摒弃了传统的操作系统模式,转而采用概率式目标达成机制。通过深度网页研究作为核心支撑,它能自主完成多步骤工作流程,彻底解决软件碎片化问题。
Λ Snap – 一种为儿童和成人设计的友好编程语言,用于计算机科学学习
Snap! 是一种广泛友好的编程语言,专为儿童和成人设计,作为严肃计算机科学学习的平台。
Easylang:一种简单的、基于浏览器的编程语言,传承了早期家用计算机 BASIC 的精神
Easylang 是一种简单的、基于浏览器的编程语言,其灵感源自早期家用电脑的 BASIC 方言,旨在让编程更易上手,同时带来怀旧的亲切感。