-1

自然语言(如英语和法语)与 C++ 和 Perl 等编程语言之间的主要区别是什么?

我熟悉歧义问题,但不能使用交互式编译器或使用严格语法的自然语言子集来解决,但始终保留语言的本质吗?

另一个问题是上下文。但是律师有办法解决这个问题。(这个问题不是关于降低编程复杂性,它只是关于使用自然语言指导计算机的简洁原因和障碍。)

除了这两个之外,还有其他重大问题吗?或者这两者的后果是否比我上面提到的更大?交互式解决方案和律师语言在技术上是否不适合编程?

4

3 回答 3

6

这是一个非常有趣的问题,简而言之,是的,我们不使用英语编写程序有一些很好的理由。

之前有人说过,计算机科学给我们的最大礼物不是与计算机交谈的能力,而是现在存在用于描述算法的正式语言,我们现在拥有更好的工具来将这些想法传达给其他人。即使不涉及计算机。事实上,最好的软件工程师主要将他们的工作视为编写其他人可读的软件,以便尽可能容易地维护和添加新功能。这在像任何自然的口语语言一样大且形式自由的语言中是不可能的。

歧义

原因之一是模棱两可。你有没有看过餐厅的菜单,看到你的汉堡可以得到“凉拌卷心菜和薯条或沙拉”?这是什么意思?我可以同时吃凉拌卷心菜和薯条吗?或者另一种选择是单独吃沙拉?还是我总是吃凉拌卷心菜,我必须在薯条或沙拉之间做出选择?英语充满了这些东西。

我曾经在这方面教过一堂课,我喜欢用来解释歧义的一个例子如下。我让学生写一个以“汤姆问克里斯是否可以帮助他”结尾的一段故事。大约有一半的时间写的故事表明学生将句子解释为汤姆寻求克里斯的帮助。另一半时间,人们认为汤姆是在向克里斯伸出援手。

如果你仔细想想,确实有很多人用英语编写程序。他们被称为产品经理,他们使用的编译器是软件工程师。这里的问题是,软件工程师必须注入大量自己对问题的理解才能理解描述的真正含义。相信我,有很多来回。即使是非常简单的业务需求,我也必须澄清歧义。

语境

我不同意律师有办法解决上下文问题。在某些情况下,我们在该国一些受教育程度最高的人中不断在法庭上就各种法律的含义进行争论。有时这涉及争论很久以前制定法律的背景。有时涉及将它应用到一个新的、以前不存在的环境中,比如互联网。我们有成千上万的律师致力于消除这些问题的歧义,这一事实证明它无法通过像编译器这样的简单计算机程序来处理。这只是一个太难的问题。

简明

另一个问题是简洁的能力。数学很久以前就为数学中的许多不同概念发明了符号,因为如果有一种简洁且具有明确含义的特殊语法,它就会更容易阅读。数学家知道我说“f(x) = 3x+1”是什么意思。它的含义与“有一个名为 f 的函数,它有一个参数。将 f 应用于一个数字的值是给定数字的三倍以上的数字”。但是一旦你学会了语法,前者就更容易阅读了。编程语言也是如此。编程语言专门用于描述计算。

执行

编程语言的创建者故意创建非常小的语言。事实上,这些是英语的子集,还有一些额外的语法。以所有自由形式的方式理解所有英语的想法,更糟糕的是,增加词汇量是自然语言处理 (NPL) 的一项工作。一项非常艰巨的工作。如果您希望能够为程序分配明确的含义并让程序的行为永不改变,您需要定义良好的语法和语义。

这里的要点是,英语是一种非常庞大、非常灵活的语言,没有正式的规范。编程语言需要具有明确定义的语法和语义,以使算法具有明确和不变的含义。事实上,有人可以为英语的一个子集编写一个正式的语法并赋予它明确的含义。但这将是一项巨大的、巨大的工作。

它已经完成

查看BabelBuster。这里的想法是采用 C 并将其转换为非常严格的英语的一个非常小的子集,这样人们就可以用 C 编写一个程序,然后将其转换为英语。在 DeCSS DVD 解密辩论期间,MPAA 试图让可以解密其 DVD 的程序被宣布为非法。BabelBuster 以一个非常有趣的想法进行了反击。创建一种将受言论自由保护的英语转换为 C 中的工作代码的方法,从而表明 C 代码也只是一种应该受到保护的语言。因此,应该能够发布破解 DeCSS 的代码。无论您站在哪一边,这都是一项与您的问题相关的有趣工作。

BabelBuster 的问题是您需要用非常非常有限的英语子集编写程序。但有可能做到这一点。

结论

与所有自然语言一样,英语允许我们描述计算或算法,但语言冗长,提供多种方式来表达同一件事,取决于说话者的上下文,并且没有正式指定。如果你的目标是描述计算,你应该学习英语,选择一个最小的可行子集,你可以在其中说出你需要的一切。正式指定该子集中每个单词的含义。然后创建一些特殊的符号,以简洁地表达你所说的东西,就像数学所做的那样。如果你这样做,你最终会得到一种典型的编程语言,或者类似的东西。

于 2014-03-27T21:57:56.490 回答
2

主要有三个原因。

首先,正如 Gabe 所说——人们通过反复试验发现,用接近英语句子的东西进行编程只会迫使程序员输入更多无用的内容。(是的,COBOL 被明确设计为更“自然”地阅读。)

对程序员来说,

windows++

You should now increment the number of windows by one.

例如,俄罗斯方块是一个相当容易编码的游戏。如果您设法用比短篇小说更少的页数,对计算机做出足够详细的英文解释(请记住,计算机是愚蠢的,因此您必须将其全部拼写出来),我会感到非常惊讶。

第二个原因是计算机知道如何做的事情范围相当小,因此所需的语言结构的数量也是有限的。相比之下,自然语言需要能够表达人类的全部经验,这确实需要许多语言结构才能实现。例如,“根据他妻子的说法,如果没有下雨,John 会在昨天钓到鱼”在 C 中是不可表达的——也不需要这样。

第三,确实是模棱两可,正如你自己所指出的。有很多地方根本不允许软件错误。人们用明确的语言做了足够多的错误;允许模棱两可将是一场等待发生的灾难。在同一主题上,我们仍然无法足够好地解析人类语言——最先进的解析器仍然具有不可接受的高错误率。

于 2013-10-09T03:44:34.330 回答
0

只要使用英语语言的受限子集,就可以将结构化英语自动翻译成代码。

作为概念验证,我开发了一种名为EngScript的编程语言,它将英语句子句子翻译成 Python 源代码。

算术运算可以用简单的英语编写:

#print{3 to the power of 2}
#print{3 raised to the power of 2}
#Both of these statements print "9".

print{3 plus (the sum of 1 and 2)}
#This prints "5".

变量也可以用简单的英语初始化:

let x be (x plus 1)
if (x is not equal to 7) :
    print x
于 2014-02-04T06:34:38.640 回答