10

看到这个问题后,我开始思考盲人程序员面临的各种挑战,以及其中一些挑战如何适用于有视力的程序员。特别是,大声阅读源代码的问题让我停下来。我一生大部分时间都在编程,我经常辅导同学编程,最常见的是 C++ 或 Java。

试图用语言表达 C++ 表达式的基本语法是特别令人恼火的说话者必须将惯用语翻译成英语,或以口头表达的方式完整说明代码,使用明确而缓慢的术语,例如“开括号”、“按位与”等。这些解决方案都不是最优的。

一方面,惯用的翻译只对可以反翻译成相关编程代码的程序员有用——这在辅导学生时通常不是这种情况。反过来,教育(或只是让某人加快项目进度)是大声朗读源代码的最常见情况,并且出错的余地很小。

另一方面,字面规范的速度非常慢。说“磅,包括,左尖括号,iostream,右尖括号,换行符”比简单地输入要花费更长的时间#include <iostream>。事实上,大多数有经验的 C++ 程序员只会将其理解为“包含 iostream”,但同样,缺乏经验的程序员比比皆是,有时需要文字规范。

所以我有一个想法来解决这个问题。

在 C++ 中,有一组有限的关键字—63 — 和运算符—54,不考虑命名运算符,并将复合赋值运算符和前缀与后缀自动递增和递减视为不同。只有几种类型的文字、相似数量的分组符号和分号。除非我完全弄错了,否则就是这样。

那么,简单地为这些不同的概念中的每一个赋予一个简洁、独特的发音(包括一个用于空格的,在需要的地方)并从那里开始是不可行的吗?编程语言比自然语言更规律,所以发音可以标准化。任何语言的说话者都能够口头传达 C++ 代码,并且由于语言的规律性和固定性,可以优化语音到文本的软件以高度准确地接受 C++ 语音。

所以我的问题是双重的:第一,我的解决方案是否可行;其次,还有其他人有其他潜在的解决方案吗?我打算从这里获取建议并使用它们来制作一份正式的论文,其中包含我的解决方案的示例实现。

4

3 回答 3

4

不用创建新的“词”来描述它们,对于诸如“包含”之类的内容,您可以在大声说出时简单地在其前面加上“关键字”。您也可以使用众所周知的单词/短语来表达其他部分。与任何新程序员一样,无论如何您都必须逐字地描述所有内容,所以我认为这不需要特别注意。我认为创造新词是更难的方法......

因此,例如:

#include <iostream>;

int main()
{
   if (1 < 2)
     return 1;
   else
     return 0;
}

可以读作:

(keyword) include iostream new-line (keyword) int main no params start block if number 1 (operator) less than number 2 new-line (keyword) return number 1 new-line (keyword) else new-line (keyword) return数字 0 结束块

将 () 中的单词视为可选的描述性单词,最有可能在更复杂的代码中使用。如果您希望他们实际编写描述性词,则可以使用“文字”一词​​。例如

(关键字)如果文字数(运算符)小于文字关键字

变成

if (number < keyword)

其他词也可以被赋予定义的含义,例如当您希望它们在下一行继续时“分割线”,而不关闭任何当前打开的括号等。

我个人觉得这种方法使用起来很简单,也很容易教。YMMV,一如既往。

当然,这并不能解决国际化问题,但在最坏的情况下,会导致在非英语语言中使用“新词”,这并不比您提供的建议解决方案差。

于 2010-01-28T08:09:58.240 回答
4

作为一个盲人开发者,我从 13 岁就开始编程,我发现这个问题真的很有趣。首先,正如其他人所提到的,学习一门能够理解代码的新语言并不是一个实际的解决方案,因为学习口语可能需要更长的时间才能学习实际的编程语言。

阅读问题/答案我又想到了两点:

  • 首先,你会惊讶于“思考时间”的重要性。我以前用 C/C++/Java 编程,现在使用 C# 作为我的主要语言,并且认为自己非常有竞争力。但是当我用 Python 做几个项目时,我发现减少的标点符号剥夺了我的“思考时间”——下意识地,我正在使用标点符号来消化我刚刚听到的内容——令人着迷……然而,情况是标识符有点不同,因为听众并不熟悉这些标识符 - 我个人发现很难听带有首字母缩写词变量(RGXRatio,RGVRatio)的代码,因为我没有时间弄清楚它的含义. 另一方面,
  • 要考虑的另一件事是音频流的长度是最终结果,但不是根本原因。音频如此长的原因是因为音频是一种一维媒体,而阅读文本是一种二维媒体,能够跳转并跳过不相关/熟悉的文本。它不适用于面对面的讲座,但如果有用于控制语音的键盘命令会怎样。在文本文档中,我的屏幕阅读器可以让我跳到下一行,但是如果这适应了编程语言的语义会怎样。一些研究,例如谷歌的 TV Raman,包括使用不同的声音来突出语法,以及使用音频提示来标记元数据,如大写字母。

我知道最初的问题与课堂讲座特别相关,但如果像我一样你必须听完整的源代码文件,我也发现代码的结构有很大的不同。我个人像阅读故事一样阅读代码 - 从左到右,从上到下。所以当它是自下而上编写时,很难追踪不熟悉的代码。

于 2010-04-17T21:28:11.387 回答
3

那么,简单地为这些不同的概念中的每一个赋予一个简洁、独特的发音(包括一个用于空格的,在需要的地方)并从那里开始是不是可行的?编程语言比自然语言更规律,所以发音可以标准化

也许吧,但你已经忘记了你的目标。前提是听的人还不知道该语言。如果他这样做了,我们可以简单地说“包含 iostream”,当我们的意思是 时#include <iostream>,或者说“vector of int” std::vector<int>

你的前提是听的人对语言不够熟悉,无法理解你大声读出的内容,除非你准确地读出了它所说的内容。

现在,发明一种全新的语言来描述源代码中出现的原语并不能解决问题。相反,你仍然必须读出每个句法标记(是的,发音更简单、更“标准化”,但仍然必须大声读出),听的人仍然不会理解你,因为如果他们不理解对 C++ 的了解不足以理解“包含 iostream”,他们也不会理解您的标准化发音。如果你要教他们你的发音,为什么要麻烦,当你可以直接教他们理解 C++ 语法时呢?

还有一个根本问题是 C++ 代码往往包含很多句法标记。像这样简单的一行:

std::vector<int> v;

我数了9个令牌。其中任何一个都不能省略。如果听的人对代码和语法的理解不足以理解高级描述,例如“声明一个 int 的向量,命名为 v”,那么您将不得不以某种形式读出所有 9 个标记。即使您想出比“命名空间解析运算符”和“小于号”更简单的名称,您仍然必须列出 9 个令牌名称。这是很多工作。

简而言之,不,我认为这行不通。首先,它仍然太麻烦,其次,它假设听者的先验知识,而这样做的动机是听者是学生,没有先验知识,无法理解高级描述的代码。

于 2010-01-28T08:54:16.193 回答