与“自然语言”的相似性是编程语言令人信服的卖点吗?

时间:2010-07-21 10:09:12

标签: programming-languages nlp

看看,例如AppleScript(还有很多其他人,其中一些人肯定相当不错)宣传他们使用自然语言隐喻。他们说,代码显然更具可读性,因为它可以/意图用类似英语的句子构建。我敢肯定,有些人比只使用英语句子编程更好。但是,我怀疑一种语言的可行性,这种语言过于苛刻(除了利基案例)。

那么,在一定的合理点之后,自然语言是一种好处还是一种错误?如果概念被推向极端会怎样 - 代码必然更具可读性吗?或者它可能是不必要的长,难以使用,并且就像在混淆的Perl,混淆的C和扭曲眼睛的Bash脚本logorrhea的规模上产生欢闹一样?

我知道一些像“告知”这样几乎都是纯英语的专业案例,但这些案例有一个他们不太可能冒险的利基。我听到并读到有关代码阅读更像英语句子会有多棒,但有没有讨论可能存在的缺点?如果日常语言如此清晰,简洁,干净,可爱,简洁,易懂,为什么我们首先要创造数学符号呢?

使用自然语言将复杂的指令准确而精确地描述到机器上是否真的更容易,或者更接近数学标记的是更好的选择?那条线应该画在哪里?最后,您是否被那些被吹捧为类似英语句子的语言所吸引?整个问题应该只是一个问题吗?

naturalLanguage > computerishLanguage ? booAndHiss : cheerLoudly;

13 个答案:

答案 0 :(得分:14)

当然,自然语言很少是清晰,简洁,干净,可爱,简洁,易懂的,这是大多数编程都是用非常自然的语言完成的原因之一。

答案 1 :(得分:5)

我对此的回答是,理想的编程语言介于自然语言和非常正式的语言之间。

在一个极端,有正式的,最小的数学语言。以Brainfuck

为例
,>++++++[<-------->-],[<+>-]<.    // according to Wikipedia, this means addition 

或者,对于上述混乱,任何类型的lambda calculus

都有些优先
λfxy.x
λfxy.y

这是在lambda演算中表达布尔真值的一种可能方式。看起来不是很整洁,尤其是当你围绕它们构建逻辑运算符(例如AND例如λpq.pqp)时。

我声称大多数人都可以以这种简约,难以理解的语言编写生产代码。


另一方面的问题,即人类所说的自然语言,是指具有过多复杂性和灵活性的语言,使程序员能够表达对今天的计算机毫无意义的模糊和不确定的事物。我们来看看这个示例程序:

MAYBE IT WILL RAIN CATS AND DOGS LATER ON. WOULD YOU LIKE THIS, DEAR COMPUTER?
IF SO, PRINT "HELLO" ON THE SCREEN.
IF YOU HATE RAIN MORE THAN GEORGE DOES, PRINT SOME VAGUE GARBAGE INSTEAD.
(IN THE LATTER CASE, IT IS UP TO YOU WHERE YOU OUTPUT THAT GARBAGE.)

现在这是一个模糊的明显案例。但有时你会因为更合理的自然语言程序而犯错误,例如:

READ AN INTEGER NUMBER FROM THE TERMINAL.
READ ANOTHER INTEGER NUMBER FROM THE TERMINAL.
IF IT IS LARGER THAN ZERO, PRINT AN ERROR.

IT指的是哪个号码?应该打印什么样的错误(你忘了指定它。) - 你必须非常小心谨慎地明确你的意思。

误解其他人已经太容易了。您如何期望计算机做得更好?

因此,计算机语言的语法和语法必须足够严格,以免产生歧义。声明必须以确定的方式进行评估。 (可能存在极端情况;我在这里谈论的是一般情况。)


我个人更喜欢使用非常有限的关键字的语言。您可以快速学习这种语言,而且您不必在10,000种方法中选择实现一个目标,因为有10,000个关键字用于执行相同的操作(例如:GO / WALK / { {1}} / RUN / TROD / etc。SLEEPWALK)。这意味着如果你需要考虑10,000种不同的做事方式,那将不是由于语言,而是由于有9,999种愚蠢的方法可以做到这一点,而1种优雅的解决方案只是比所有方式都闪耀其他人。

请注意,我以大写形式编写了所有自然语言示例。那是因为在我写这篇文章的过程中,我考虑过很好的旧GW-BASIC和COBOL。有一些编程语言的例子依赖于自然语言,我认为历史表明,它们通常比例如简洁的C风格语言。

答案 2 :(得分:4)

我最近看到根据Gartner的说法,目前全球有超过<4,000亿行的COBOL源代码在活跃使用。

除了银行和政府喜欢他们的遗留代码之外,这并不能证明什么,但是可以将其解释为英语类编程语言成功的证明。我不知道任何其他编程语言与英语如此接近,如此冗长。


除此之外,我倾向于同意其他受访者:程序员不喜欢打字太多,一般来说,基于类似数学的速记的语言比基于英语的速度更具表现力和精确性。

有一点,简洁,富有表现力的代码看起来像线路噪音。 Perl,APL和J以“难以理解的单行”为例。程序员是人类,将它们与自然语言的某些相似性留给他们可能是有益的,以使他们的大脑能够保持熟悉的东西。因此,我传播了一种令人联想到但不太接近自然语言的快乐媒介。

答案 3 :(得分:4)

“当创建一种允许程序员用简单英语编程的编程语言时,会发现程序员不会说英语。” 〜未知

答案 4 :(得分:3)

在我(不是那么)谦卑的意见中,没有。

自然语言充满了含糊之处。通常我们不会想到它们,因为人类可以根据计算机通常无法使用的许多标准轻松消除它们的歧义。首先,我们了解世界(大象不适合穿着睡衣),但是当我们彼此说话时,我们使用的感官不仅仅是听觉,而是用身体语言来命名。所说的语调和方式也有助于消除歧义。在书面文本中更难以发现讽刺或讽刺,这或多或少是我们所说的内容的转录,更多的是在IM文章较少的案例中。一般来说,在自然语言中存在大量含糊不清的情况,例如PP,介词短语所附带的内容:

 "Workers [dumped [sacks [with flour]]]"
 "Workers [dumped [sacks] [with a fork-lift]]]"

任何人都会立即告知PP将附着在哪里,合理的是在其中装有面粉袋,并且合理地使用叉车倾倒东西。另一个非常棘手的领域是“和”这个词,它可怕地搞砸了语法,或者我们使用的所有参考,一般的代词,还有更复杂的参考,即。 “比尔买了道奇V蛇,可悲的是这辆车是柠檬”。

所以我们有三个选项,保持模糊性并尝试处理它们,在消歧和非常慢的解析中接受很多错误,没有LALR或LL可以在这里工作,或者尝试制作类似于自然语言的人工语法并保持其确定性,这更合理但仍然可怕。我们现在有一种与英语错误相似的语言,但这并不令人困惑。我们没有正确语法的好处,没有自然语言带来的好处,而是一个超大的overwordly monstrum,带有难以理解和不直观的语法,难以学习和写作速度慢。

第三种方式是意识到我们需要一种表达自己的简洁方式,这种方式也可以由计算机处理,不像任何自然语言,而是专注于对算法的明确描述。这将增加可读性,特别是如果我们与非常精确的自然语言对应部分进行比较。这就是为什么许多人在处理困难问题或高级算法时也更喜欢阅读伪代码,它可以减轻我们处理歧义的麻烦,并且更适合表达计算机指令。

答案 5 :(得分:2)

问题不在于使用一种方法或另一种方法更容易描述复杂的想法,但它确实更容易理解机器语言(至少对于机器而言)。最大的问题是,一如既往,歧义。电脑是可怕的理解,所以对于编程语言的语法大部分的需要的待建要么删除所有含糊不清,或必须构造一般的语言,这样歧义实际上不是一个问题(这是棘手)。

任何允许模糊的编程语言都会非常容易出错;而任何自然语言不的允许模糊性是非常冗长难懂的(我看着你,逻辑语[好吧,也许逻辑语并没有那么糟糕,仍然...])。

的倾向有些人显示宁愿自然语言的编程语言可能实质上根除的渴望最终能输入一个物理教科书进入分析器,于是当被问及它会做你的功课。

当然,这并不是说,编程语言不应该有自然语言的提示:特别是对OOP它是有道理有通话语法类似于天然的语法,就像在的OBJ-C,这是一种疯狂的游戏:

[pot makeCoffee:strong withSugar:NO];

在BrainFuck中做同样的事情就是脑筋,翻转一个开关的三页代码会对你有所帮助。

在本质上;最好的语言(可能)是那些类似于自然语言的语言,而不是假装为一种语言。 (如果你愿意,可以避免编程语言的不可思议的山谷,[如果有这样的话]。[子句!Yay!])

答案 6 :(得分:1)

自然语言太模糊,无法用作编程语言。必须人为地限制它以消除歧义。

但它失去了拥有“自然”编程语言的目的,因为你有详细程度而且它在表达方面没有任何优势。

答案 7 :(得分:1)

我认为我专业编写的第四种语言(在Fortran,Pascal和Cobol之后)是Natural。对于ADABAS数据库开发大型机系统而言,这是1980年代的一个相当模糊的4GL。

被称为自然我相信,因为它有这样的自负。据说管理可读,像cobol,但减去绒毛。

哪个应该告诉你,'自然'编程语言的尝试现在有超过30年的商业历史(如果你算cobol更多)但他们几乎失去了那些不假装“自然”的语言但是允许程序员简洁地定义问题。当我第一次开始编写1GL时 - &gt; 2GL - &gt; 3GL的演变并不是那么古老,对于主流作品来说,向4GL(当时定义为更像英语的编程语言)的发展似乎是明显的下一步。它没有那样解决。如果现在编程的速度变得越来越快,因为需要学习更抽象的概念。

答案 8 :(得分:1)

SQL最初是以自然语言为基础设计的。幸运的是,由于它的概念不那么“自然主义”,所以它并没有对此保持过于紧张和进步。

但是任何尝试在SQL中编写复杂查询的人都会告诉你它并不那么容易。您担心查询中某些关键字的范围。你有这个令人难以置信的难以理解的查询,它会做一些疯狂的事情,但是每次你需要改变它时你都会重写它,因为它更容易。

自然语言编程是个坏主意。你从汇编中得到的越远,你可以犯的错误越多,不是逻辑错误或类似的东西,而是关于脚本解释器/字节码解释器/编译器如何使你的代码在CPU上运行的错误假设

答案 9 :(得分:0)

对于初学者或者作为“次要活动”进行编程的人来说,似乎是一个很棒的功能。但我怀疑你能用自然语言达到实际编程语言的复杂性和多元性。

答案 10 :(得分:0)

如果有一种编程语言实际上遵循了它所模仿的自然语言的所有惯例,那就太棒了。

然而,实际上,许多所谓的“自然”编程语言具有比英语更严格的语法,这意味着尽管它们易于阅读,但它们是否真的易于编写也存在争议。

英语中有意义的通常是AppleScript中的语法错误。

答案 11 :(得分:0)

日常语言不是如此清晰,简洁,干净,可爱,简洁和易懂 - 适用于计算机。然而,对于人类来说,可读性非常重要,而且越接近自然语言,就越容易阅读。这就是我们并非都使用汇编语言的原因。

如果你有一个完全自然的语言,有很多事情需要处理 - 句子需要解析,每个单词都必须被理解 - 并且有足够的空间歧义。对于编程语言而言,这通常不是一件好事,因为那时我们冒险进入通灵编程 - 计算机必须弄清楚你在想什么,这根本不容易获得。

然而,如果你可以做出足够接近自然语言的东西 - 是的,Inform 7可能是最好的例子 - 所以句子看起来很自然,但仍然有一些你需要遵循的结构 - 那么代码几乎可以立即读取,甚至对那些不懂语言的人也是如此。通常也会记住不那么专业的语法 - 因为你真的只是在谈论(略微修改过的)英语 - 但如果你不得不做一些与众不同的事情,那么你可能不得不跳过一些箍来做到这一点。

在实践中,大多数语言都不会为此烦恼,因为这样可以让他们更容易准确。然而,有些人仍然会更接近“自然语言”。这可能是一件好事:如果你必须将一些伪代码算法翻译成一种语言,你不需要操纵它来使其工作,从而降低你在翻译中出错的风险。

举个例子,让我们比较C和Pascal。这个Pascal代码:

for i := 1 to 10 do begin
  j := j + 1;
end;

相当于这个C代码:

for (i = 1; i <= 10; i++) {
  j = j + 1;
}

如果您对这两种语法都没有先验知识,那么Pascal版本通常会更容易阅读,只是因为它没有C语言那么复杂。

我们也考虑运营商。 Pascal和C都共享+, - 和*。它们都具有/,但具有不同的语义:在C中,如果两个操作数都是整数,则执行整数除法;在Pascal中,它始终执行“实际”除法并使用div进行整数除法。这意味着在确定该代码行中实际发生的情况时,您必须考虑这些类型。

C还有许多其他运算符:&amp;&amp;,||,&amp;,|,^,&lt;&lt;,&gt;&gt; - 在Pascal中,这些运算符的名称为andorandorxorshlshr 。它不是依赖于一些半任意的字符序列,而是更多地拼写出来。很明显xor是 - 好,XOR - 不像C版本,^和XOR之间没有明显的相关性。

当然,这在某种程度上是一个观点问题:我更喜欢类似Pascal的语法到类C语法,因为我认为它更具可读性,但这并不意味着其他人都这样做:更多自然语言通常会更加冗长,有些人只是不喜欢额外的冗长程度。

基本上,这是为问题域选择最有意义的问题:如果问题域非常有限(如使用Inform),那么自然语言就非常有意义。如果它是一个非常通用的域(比如C),那么你要么需要比我们目前能力更高级的处理,要么填写详细信息很多 - 在这种情况下,你必须选择一个平衡取决于关于什么类型的用户将使用这些语言(对于普通人来说,你需要更多的自然性,对于那些了解编程的人来说,他们通常使用较少的自然语言并且更喜欢接近这一点的东西)。

答案 12 :(得分:0)

我认为问题是,谁阅读以及谁编写了有问题的应用程序代码?我认为,无论语言或架构如何,经过培训的软件开发人员都应该编写代码,并在出现错误时分析代码。