编程语言是否越来越像自然语言?


27

我们可以在语言学背景下学习编程语言吗?编程语言会以与自然语言类似的方式自然地进化吗?

尽管完全的合理性和数学上的一致性对于编程语言至关重要,但仍然需要(尤其是现代语言)使它们对人类可读并舒适。

编程语言是否正在发展以变得更加语言化并因此变得更加自然?例如,机器代码,打孔卡和汇编语言已被更易读的语言(如Ruby和Python等)所取代。

当我说计算机语言变得越来越自然时,我并不是说它们包含更多的“英语中的单词”,而是因为它们的语法复杂性和表达含义的能力似乎变得更像一种自然语言。 (例如,能够以理性和人类可理解的方式雄辩地描述来自数据库的查询)。

你们怎么想 编程语言是否变得越来越像自然语言,从而变得适用于语言学法则?

也许语言生活在一个范围内,一方面,您拥有极端理性的语言,另一方面,您拥有更多的创造力。也许编程语言和自然语言是完全相同的,并且两者都只是在这种语言范围内(它们唯一的区别,也许就是他们试图赋予其含义的“事物”)。

人类语言的(巴别塔效应)分离与计算机语言之间是否存在联系?它们是否由于相同的原因而变得更加多样化(即解决不断发展的计算机系统/文化系统等内部的不同问题)?


3
简短的回答:是的,是的。

17
简短的回答:不,不,不是。


3
计算机语言往往在简洁性和精确度方面做得很好,有点像数学符号,在过去的数千年中,计算机语言没有表现出向自然语言(我知道的)发展的倾向。我还怀疑,如果您在婴儿出生后的头几年只与他在Haskell进行交流,他会不会自然流利。因此,我认为自然语言和计算机语言之间存在非常鲜明的对比。我想,随着时间的流逝,语言构造技术的广泛传播可能会稍微改善“自然性”。

@ryanOptini:C#,JavaScript,Python或SQL看起来像自然语言吗?虽然它们都使用英语的关键字,但是它们都没有融合为自然语言格式。COBOL可能是最接近的,但我认为没有很多人在其绿地项目中使用COBOL。
Jim G.

Answers:


32

不是,不是 编程语言仅在“我们用英语所拥有的单词”(sic)的意义上变得更像自然语言。

编程语言的一个关键特征是它们不是模棱两可的。当您编写并执行程序时,它具有明确定义的含义,即其行为。如果您要编写一个能够按预期工作的程序(一个困难的目标),则程序的行为¹应尽可能地可预测,这一点很重要。编程语言在与自然语言的巨大差距中并没有太大改变。

相反,已经在弥合差距方面进行了工作:使用与编程语言相同的工具分析自然语言。这个领域称为自然语言处理。这些方法几乎已经被抛弃以支持机器学习。我将在Wikipedia文章中引用一段与本文直接相关的文章

直到1980年代,大多数NLP系统都基于复杂的手写规则集。但是,从1980年代后期开始,随着语言处理机器学习算法的引入,NLP发生了一场革命。这既是由于摩尔定律导致的计算能力的稳定增长,又是由于逐渐减少了乔姆斯基语言学理论(例如,转换语法)的支配地位,其理论基础阻碍了作为机器学习方法基础的语料库语言学。语言处理。

编程发展的一种方式是,随着我们设计越来越大的系统,源代码并不总是一种理解它们的好方法。例如,Intel CPU是Man设计的最复杂的对象之一,它的“源代码”不仅是文本文件的集合,而且远非如此。但是完整的设计也没有朝着类似于人类语言的方向发展。我不知道这里合适的认知工具或隐喻是什么,而且我认为还没有人知道。几个世纪后再问一次。

¹ 或更确切地说,是在可能出现的情况下加上了可能出现的情况,但这只是在建模中增加了间接的步骤,因此在这里并没有实际意义。


值得注意的是,尝试制作更像编程语言的“自然”语言并不是很成功。参见Lojban作为最发达的示例。
Dougal

CPU体系结构和编程之间的比较有点不合理,硬件设计一直主要是基于文本的,因为它要解决的问题完全不同,例如二维放置和布线问题。(如果有的话,硬件设计正在朝着使用HDL的更多基于文本的设计迈进)
jk。

2

计算机语言往往在简洁性和精确度方面做得很好,有点像数学符号,在过去的数千年中,计算机语言没有表现出向自然语言(我知道的)发展的倾向。

我还怀疑,如果您在婴儿出生后的头几年仅与婴儿在Haskell进行交流,他会不会自然流利。因此,我认为自然语言和计算机语言之间存在非常鲜明的对比。

我想,随着时间的流逝,语言构造技术的广泛传播可能会稍微改善“自然性”,因为程序员通过使用对他们来说似乎更容易的语言来“用脚投票”,并且能够创建语言的人数越来越多。从业人员和更好的工具,但这只是微不足道的影响,并不代表编程语言向人类语言的根本转变。


2

这方面的一个有趣的案例研究是Perl vs Ruby(和Python)。Perl是一种90年代初开发的脚本语言,与以前的基于Unix的脚本语言(例如bash)相比,它增加了很多功能。作者Larry Wall记录在案,他说他的语言学背景启发了某些语言功能。

但是Perl的语法笨拙和许多特殊情况使语言在所有细微的特质上都像英语一样,激发了不同程度的批评。后来,由计算机科学家开发的诸如Ruby和Python之类的脚本语言在语法上具有更多一致性。主要问题是自然语言具有大量的歧义性(这是在语言学领域研究的)。因此,自然语言将在未来的人机界面(如Siri)中占据关键位置,但这些界面固有地会受到歧义性问题的困扰。

因此,在这种情况下,计算机语言的发展偏离了自然语言的观念。此外,计算机编程语言的一般历史是,它们已被开发和更改以消除歧义(这是自然语言所固有的)。这在编译器历史的早期(例如可能在1970年代)还没有被理解,例如,Fortran语言的早期版本具有依赖于编译器实现的含糊不清的语句。某些与解析有关的CS语言理论是部分由于对语言解析中歧义性的发现而提出的。


您输入的日期有误:Perl于1987年发布,Bash于1989年发布。由于大写错误,您也很难阅读您的帖子。
tchrist

1

机器语言非常精确,而人类书写的文本通常可以用许多不同的方式来解释(例如,一些诗意的文本)。

越来越多的是模式匹配,例如,当您编写一些丑陋的代码时,编译器可以帮助您提出几种可能的解决方案,然后抛出一些警告或错误,可以帮助您超越自我。(例如,基于常见的代码模式)

关于交互/设计模式有专门的研究,甚至T9和SWYPE都是模式识别器,对您有很大帮助(记录您的声音并将其转换为文本的程序也是模式识别器)。

当然,程序是一种依赖于精确机制的东西,因此您需要精确的语言(不是自然的),而在google上进行简单的网络搜索是很自然的,您只需要键入几个单词就可以得到想要的东西。

每个不同的任务和目标都有其自己的语言,这不是简单的“单一语言演变”,而是有更多的语言。精确的任务需要精确的语言,而宽松的任务则需要宽松的语言

您可以编写相同的C代码,然后使用多个不同的编译器进行编译,并且(除非生成了某些编译器,否则,即使生成了不同的程序集,)代码的结果也将相同,而对于Web搜索,则是相同的不同搜索引擎的关键字会产生不同的结果。


1

几年前,我的大儿子和我开发了一个简单的英语编程和开发系统,以回答以下问题:

  1. 可以使用高级语言(例如英语)方便高效地编写低级程序(例如编译器)吗?

  2. 自然语言能否以相对“草率”的方式进行解析,并且仍然为生产性编程提供足够稳定的环境?

  3. 当您不必将自然语言的思想转换为其他语法时,编程是否更容易?

现在,我们可以根据直接的经验,用响亮的“是”回答这三个问题。

我们认为,解析器的运作类似于人脑。考虑。一位父亲对他的宝贝儿子说:

“想吮吸这个瓶子,小家伙?”

孩子听到了

“等等,等等,SUCK,等等,等等,BOTTLE,等等,等等。”

但是他的反应是正确的,因为他的头部右侧有一个“图片”,左侧与“ bottle”一词相连,脖子后部已有一个“ skill”,与瓶身相连。术语“吸”。换句话说,孩子将他的能力与他所积累的图片(类型)和技能(例行程序)相匹配,而忽略了其余部分。我们的编译器做同样的事情,在程序员编写新的应用程序代码时,不是由我们而是由程序员来定义新的图片(类型)和技能(例程)。

典型的类型定义如下所示:

多边形是具有某些顶点的事物。

在内部,名称“多边形”现在与一种动态分配的结构类型相关联,该结构包含一个双向链接的顶点列表。“顶点”以类似方式在其他地方(在此定义之前或之后)定义;复数是自动理解的。

一个典型的例程如下所示:

要将x坐标和ay坐标附加到多边形:给定x和y创建一个顶点。将顶点附加到多边形的顶点。

请注意,参数和变量不需要形式名称(专有名词)。我们认为,这是一个重要的见识。我的现实世界中的椅子和桌子从不(在正常对话中)从未被称为“ c”或“ myTable”-我将它们简称为“椅子”和“桌子”。同样在这里:“顶点”和“多边形”是此类事物的自然名称。

另请注意,例程和变量“名称”(例如“ x coord”)中允许使用空格。这是21世纪,对吗?并且还允许使用“昵称”(例如,“ x坐标”中的“ x”)。而且所有格(“多边形的顶点”)以非常自然的方式用于引用“记录”中的“字段”。

还要注意,“给定”一词本来可以是“使用”或“与”或任何其他等效形式,因为我们的草率分析着重于理解和忽略所需要的图片(类型)和技能(例程)尽可能的休息。

在最低级别,事情看起来像这样:

将一个数字添加到另一个数字:Intel $ 8B85080000008B008B9D0C0000000103。

请注意,在这种情况下,我们在一个例程中同时拥有最高和最低的语言-英语和机器代码(尽管为十六进制)。这里的见识是(像典型的数学书一样)程序应该主要用自然语言编写,并根据需要(并且仅根据需要)以更方便的语法编写适当的摘要。

您可以在这里获得我们的开发系统:www.osmosian.com/cal-3040.zip。这是一个小的Windows程序,大小不到一兆字节。如果从“ documentation”目录中的PDF开始,则在进入十页之前,您将重新编译整个文件本身(在Walmart的最底层机器上,不到三秒钟)。

有关问题和意见,请发送至gerry.rzeppa@pobox.com


您是否知道trypo.ifi.uzh.ch/site/description控制的英语?你似乎并Inform7之间坐在en.wikipedia.org/wiki/Inform#Example_game_2
皮特Kirkham的

我喜欢这个主意,但似乎仍有一些语法难关。例如,我不认为我或对几何对象建模的任何人会认为X和Y坐标是分别添加的,因此“添加x坐标和ay坐标...”听起来对我来说真的很奇怪。就像“创建给定x和y的顶点”一样。几乎可以原谅,因为它实际上基本上像英语一样阅读,但看起来仍然过于严格。我不知道,也许我只是习惯于不像人类一样思考。
cHao

1

人类语言的分离来自(达尔文式的)进化,这些社区是孤立的。编程语言的分离来自技术需求,技术意识形态的变化,技术和理论理解的变化,技术实施能力的变化。我认为这是一个更加自觉的过程。

计算机语言会更像自然语言吗?大概到一定程度。我想自然语言复杂性的很大一部分是由多种并发的演化现象造成的,尽管没有理由在任何时间点产生一致的结果,尽管旧的不一致可能会在新的出现时逐渐消除。 。我不是历时语言学专家。但是我们是否想要编程语言中的这种复杂性。

歧义问题是一个重要的问题,但并非大多数人都说的那样。语言是交流的一种手段,必须在这种交流的背景下进行分析(人与人,人与机器,无论是在地点之间还是在时间之间,……简而言之)。重要的不是您是否只能用该语言做出明确的陈述,而是您是否始终可以确保交流在其预期的上下文中是明确的。有一种众所周知且使用广泛的编程语言,它允许编写模棱两可的程序(是的,但确实如此,但是我已经有一段时间没有看过最新版本了)。在这种情况下,编译器足够聪明,可以检测出歧义并要求澄清,可以将其合并到程序中以消除歧义。请注意,歧义检测并不意味着只有一种可能的选择才有意义,它们都具有意义。问题在于通信实体之一是否可以检测到歧义,以便发送方可以澄清歧义。人类对此很不好,但是计算机可以非常好。

形式主义和编程语言可以具有更丰富,更灵活的语法。我相信他们不这样做的主要原因是简单的保守主义。所使用的语法工具仍然经常是三十年前或更早设计的工具,可以满足当时计算机的限制。解析效率不再是编译中的关键问题,更强大的技术确实存在。

有趣的是,编程语言语法使用最广泛的基础来自自然语言研究:上下文无关的语法。六十年代,许多技术研究都转移到了理论/技术计算机科学,到八十年代初,自然语言人又重新发现了这些东西(我正在简化)。从那时起,自然语言的语法取得了很大的进步,而计算机科学似乎在很大程度上被旧的句法工具所束缚。自然语言的钟摆现在正再次转向统计技术,但是不会忘记语法的代数方法。好的方法很可能来自代数和统计技术的结合。

我的感觉是关键区域是语义以及语法和语义之间的过渡。对于自然语言,这仍然很难规范化,而在编程语言和形式系统的情况下,我们拥有许多精确的技术。由于该游戏远非自然语言所能玩,因此很难说它将来会对编程语言产生什么影响。

另一点是,许多编程语言设计师都在试图证明某些东西或执行某种技术思想。因此,它们在设计中具有极强的规范性,以防止用户偏离其预期的范例。不幸的是,这对创造力起反作用。有史以来设计最有创造力的语言是最早的语言:Lisp(1958)。它所允许的自由和灵活性是创造力的来源。代价是它需要自律和理解。但是Lisp实际上是一种元语言,是一种用于创建语言的语言。

现在,换个角度来看,程序实际上是对其规范的证明,被视为一种数学陈述(嗯,我再次简化)。有些人(我不记得参考文献,对不起)一直在使用定理证明来产生证明,看起来像是数学家用自然语言编写的证明。因此,我认为拥有看起来像是用自然语言编写的程序的想法可能并不完全荒谬。

但是,您可能会注意到,即使由数学家非正式地写,数学话语看起来也与普通话或历史书完全不同。这是由于所涉及的话语领域(正在讨论的语义领域)存在显着差异。因此,尽管您可以设想看起来更像自然语言的编程语言,但存在一个自然的局限性,即话语领域及其自身理想的属性。它很可能将基本上保持肤浅,即主要是句法。数学家可以谈论形式系统和政治。希望这两种论述不会相似。电脑无法(尚未?)谈论政治或理解政治。他们这样做的那天将不再是编程。

回顾历史,高级语言从一开始(FORTRAN)就试图接近一种更自然的形式来表达计算任务,但是这些任务被理解为数学或逻辑上的(Fortran 1957,Algol 1958,Lisp 1958 ),或更多面向业务(Cobol 1959)。在十年之内,人们开始担心语言会更接近,更适合当前的问题,并且对所谓的语言进行了大量研究extensible languages,涵盖了语法和语义。一种更自然地表达问题的主要途径是的出现object orientation(有时以其他名字命名)。尽管分配父母身份总是很困难,但它可能来自人工智能(主要是Lisp)和语言Simula 67(Algol家族)本身旨在表达将在计算机上模拟的更自然的现实世界问题。这似乎在历史上是一致的。


0

尽管它们的相似之处在于询问的问题相似,但在复杂性方面却截然不同。主要区别在于自然语言固有地是模棱两可的(即使在单词层次上也是如此)。甚至不清楚一个词是什么意思?但是,在编程语言的世界中,各种各样的定义设备都可以使用。查看用于解析自然语言的语法和用于解析编程语言的语法,它们的大小差异惊人。事实是,编程语言的语法是形式系统。因此它们适合进行数学分析。处理歧义性会弹出许多问题,在编程语言中,对应问题的解决方案将是简单或简单的。

如果计算机科学家和“自然”人之间的距离缩小,那么自然语言和编程语言之间的距离也许会缩小。


0

在过去的几年中,对(E)DSL流畅接口的兴趣一直在以多种语言不断增长:Haskell,各种脚本语言,C#,Java甚至C ++(请考虑重载)。operator<<用于输出)。

在某种程度上,这些允许代码更自然地读取。我将以groovy为例说明一个EDSL示例。该groovy.time包让你写

use ( TimeCategory ) {
    // application on numbers:
    println 1.minute.from.now
    println 10.days.ago

    // application on dates
    def someDate = new Date()
    println someDate - 3.months 
}

如果要通过java.util.Calendar类执行此操作,则必须为第一个示例编写如下代码:

void demo() {
    Calendar date = new GregorianCalendar();
    date.add(Calendar.MINUTE, 1);
    System.out.println(date);
}

0

计算机语言(甚至是很久以前的基本机器语言)人类语言,因为它们主要用于与人类进行交流,由人类定义,并且仅次于向机器传达指令。因此,它们的演化方式与“自然”语言的演化方式大致相同(只需查找您喜欢的语言的“惯用语”,检查例如C是如何从K&R C演化到当前的ISO-C2011。但是它们存在于不同的环境中,它们必须传达准确含义(电脑还是太愚蠢意义和正确什么是问他们的),并且对易加工的溢价(因此语法和甚至C ++词汇,PL / 1,或APL是简单而不是英语,因为自然语言很简单。

关于数学或科学的形式主义,甚至是蓝图(本质上是2D,而不是其他的1D),可以说很多相同的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.