为什么不用英语编程?自然语言和编程语言有什么区别?

时间:2013-10-09 03:30:48

标签: language-agnostic programming-languages nlp

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

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

另一个问题是背景。但律师有办法解决这个问题。 (这个问题不是关于降低编程复杂性,而是关于使用自然语言指导计算机的简明理由和障碍。)

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

3 个答案:

答案 0 :(得分:6)

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

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

歧义

一个原因是含糊不清。你有没有看过餐馆的菜单,看到你的汉堡你可以得到"凉拌卷心菜和薯条或沙拉"?这是什么意思?我可以同时获得凉拌卷心菜和薯条,或者另一种选择是沙拉吗?或者我总是得到凉拌卷心菜,我必须在薯条或沙拉之间做出选择?英语充满了这些东西。

我曾经在这上课,我喜欢用来解释歧义的例子如下。我让学生们写了一段以句子结尾的故事"汤姆问克里斯是否可以帮助他#34;。大约有一半时间写的故事表明学生将这句话解释为汤姆要求克里斯提供帮助。另外一半时间人们都认为汤姆会提供借给克里斯的手。

如果你考虑一下,有很多人用英语写程序。他们称之为产品经理,他们使用的编译器是软件工程师。这里的问题是软件工程师必须注入他自己对问题的许多理解,才能理解描述的真正含义。相信我,有一个来回的很多。即使是非常简单的业务要求,我也必须澄清含糊之处。

上下文

我不同意律师有办法解决背景问题。在某些情况下,我们不断在法庭上持续争论一些受过最多教育的人,关于各种法律的含义。有时,这涉及争论很久以前法律的背景。有时涉及将其应用于以前不存在的新上下文,如Internet。我们有成千上万的律师致力于消除这些问题的歧义,这一事实证明它不能像编译器这样简单的计算机程序来处理。这太困难了。

简明

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

实施

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

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

已完成

结帐BabelBuster。这里的想法是采用C并将其转换为非常严格的英语的一小部分,以便可以用C编写程序然后将其转换为英语。在DeCSS DVD解密论证期间,MPAA试图获得可以解密其DVD被宣布为非法的程序。 BabelBuster以一个非常有趣的想法进行了反击。创建一种方法将英语转换为C语言中的工作代码,从而将C语言自由保护,从而使C代码也只是一种应该受到保护的语言。因此,应该能够发布破坏DeCSS的代码。无论您在哪一方面,这都是与您的问题相关的有趣工作。

BabelBuster的问题在于你需要用非常非常有限的英语部分编写你的程序。但是有可能做到这一点。

结论

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

答案 1 :(得分:1)

主要有三个原因。

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

致程序员,

windows++

更具可读性
You should now increment the number of windows by one.

例如,俄罗斯方块是一种相当简单的代码游戏。如果你设法为一台计算机做一个足够详细的英语解释(记住,计算机是愚蠢的,所以你必须拼写出来的话),我会非常惊讶,而不是简短的小说。

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

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

答案 2 :(得分:0)

只要使用了受限制的英语语言子集,就可以自动translate structured English into code

作为一个概念验证,我开发了一种名为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