大声朗读源代码

时间:2010-01-28 07:49:04

标签: c++ c language-agnostic speech blind

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

尝试口头传达C ++表达式的基本语法是唯一加重。演讲者必须使用明确但缓慢的术语,例如“开括号”,“按位和”等等,给出英语的惯用翻译或者口头缩写的完整规范。这些解决方案都不是最佳的。

一方面,惯用翻译只对程序员有用,后者可以将其转换回相关的编程代码 - 在辅导学生时通常不会这样。反过来,教育(或简单地让某人加快项目速度)是最常见的情况,其中大声朗读源,并且错误的余地非常小。

另一方面,文字规范加速缓慢。说“磅,包括,左尖括号,iostream,直角括号,换行符”比单纯键入#include <iostream>需要更长的时间。实际上,大多数经验丰富的C ++程序员只会将其视为“包含iostream”,但同样,缺乏经验的程序员比比皆是,有时需要字面规范。

所以我已经有了解决这个问题的潜在解决方案的想法。

在C ++中,存在一组有限的keywords - 63 - 和operators - 54,对命名运算符进行折扣并处理复合赋值运算符,并将前缀与后缀自动递增和递减视为不同。只有几种类型的文字,相似数量的分组符号和分号。除非我完全错了,否则就是这样。

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

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

3 个答案:

答案 0 :(得分:4)

而不是创建新的“单词”来描述它们,对于诸如“包含”之类的东西,你可以在大声说出时用“关键字”作为前缀。您可以使用通常已知的单词/短语来说出其他部分。和任何新的程序员一样,你必须逐字地描述一切,所以我认为不需要特别注意。我认为创造新词是更难的方法......

所以,例如:

#include <iostream>;

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

可以读出:

  

(关键字)包括iostream new-line   (keyword)int main no params start   阻止如果数字1(运算符)小于   2号新行(关键词)返回   数字1换行(关键字)否则   new-line(关键字)返回0号结束   块

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

  

(关键字)if literal number(operator)   少于文字关键字

变为

if (number < keyword)

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

我个人认为这种方法使用起来非常简单,易于教学。 YMMV一如既往。

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

答案 1 :(得分:4)

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

阅读问题/答案还有两点发生在我身上:

  • 首先,你会惊讶于“思考时间”的重要性。我以前用C / C ++ / Java编程,现在使用C#作为我的主要语言,并认为自己非常有竞争力。但当我用Python做了几个项目时,我发现减少的标点符号让我失去了“思考时间” - 下意识地说,我用标点符号来消化我刚才听到的内容 - 引人入胜......然而,情况是标识符有点不同,因为听众并不熟悉这些标识符 - 我个人觉得很难用缩写变量(RGXRatio,RGVRatio)来监听代码,因为我没时间弄清楚它的含义。另一方面,匈牙利符号和初始下划线使代码难以收听,因为变量的长度(就发言时间而言)比对这些变量执行的更重要的操作要长得多。
  • 要考虑的另一件事是音频流的长度是最终结果,但不是根本原因。音频是如此之长的原因是因为音频是一维媒体,而阅读文本是一种2D媒体,能够跳过并跳过相关/熟悉的文本。它不适用于面对面讲座,但如果有用于控制讲话的键盘命令会怎样。在文本文档中,我的屏幕阅读器让我跳到下一行,但是如果这适应了编程语言的语义呢?一些研究,例如谷歌的T V Raman,包括使用不同的语音进行语法高亮,以及音频提示来标记像大写字母这样的元数据。

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

答案 2 :(得分:2)

  

那么简单地将一个简洁,独特的发音归于这些不同的概念(包括一个用于空白,需要它的地方)并从那里开始就不可行了吗?编程语言比自然语言更常规,因此发音可以标准化

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

你的前提是听的人对语言不够熟悉,无法理解你所读出的内容,除非你完全读出所说的内容。

现在,发明一种全新的语言只是为了描述源代码中出现的原语并不能解决问题。相反,你仍然必须读出每个语法标记(更简单,更“标准化”的发音,是的,但它们仍然需要大声朗读),并且听的人仍然< / em>不会理解你,因为如果他们不能很好地理解C ++“包括iostream”,他们也不会理解你的标准化发音。如果你要教他们你的发音,为什么还要麻烦,当你只是教他们直接理解C ++语法时呢?

还有一个根本问题,即C ++代码往往由很多的句法标记组成。像这样简单的一行:

std::vector<int> v;

我算了9个代币。其中没有一个可以省略。如果听的人不能很好地理解代码和语法以理解高级描述,例如“声明int的矢量,名为v”,那么你将必须以某种形式读出所有9个令牌。即使您提出的名称比“命名空间解析运算符”和“小于符号”更简单,您仍然需要列出9个令牌名称。这是很多工作。

简而言之,不,我认为它不起作用。首先,它仍然过于繁琐,其次,它假定听力人员的先前知识,这时的动机是听力的人是学生没有先前的知识使得它成为可能了解代码的高级描述。