什么是计算机编程语言?

时间:2009-08-25 01:59:10

标签: programming-languages

冒着听起来天真的风险,我会问这个问题,以便更深入地理解编程语言的概念。我写这个问题是为了我自己的启发和其他人的启发。

计算机编程语言的有用定义是什么?它的基本和必要组件是什么?区分语言的主要特征是什么(功能,命令,声明,面向对象,脚本等)?

考虑这个问题的一种方法。想象一下,你正在看现代台式机或笔记本电脑的硬件。假设C语言或其任何变体不存在。您如何向其他人描述使计算机在我们今天对个人计算机的期望方面具有表现力和功能所需的所有东西?

切线相关,它允许其他语言存在的计算机语言是什么?例如,使用Javascript,Perl或PHP等脚本语言。我假设这些定义的一部分是有一个解释器很可能在某种程度上用C或C ++实现。是否可以在Javascript中为Javascript编写解释器?这是完整语言的要求吗? Perl,PHP等也一样吗?

我对可以进一步查找或研究的概念列表感到满意。

11 个答案:

答案 0 :(得分:27)

与任何语言一样,编程语言只是表达和传达想法的交流工具。在这种情况下,我们将软件应该如何工作的想法转化为结构化和有条理的形式,计算机(以及在大多数情况下知道语言的其他人)可以阅读和理解。

  

计算机编程语言的有用定义是什么?它的基本和必要组件是什么?

我想说编程语言的定义特征如下:用该语言编写的东西最终会被转换为执行的东西。因此,伪代码虽然可能具有编程语言的结构和严格性,但实际上并不是编程语言。同样,UML可以像编程语言一样以抽象的方式表达许多强大的想法,但它不足以因为人们通常不会编写UML来执行。

  

您如何根据我们对个人电脑的期望,向他人描述使计算机具有表现力和功能所需的所有内容?

即使“编程语言”这个词不是我正在谈论的小组的共享词汇的一部分,我认为对其他人来说显然我们需要一种与计算机通信的方式。正如没有人期望汽车自行驾驶(但是!)没有与方向盘和踏板交互形式的外部指令,没有人能够期待硬件在没有被告知做什么的情况下运行。如上所述,编程语言是我们通过其进行沟通的渠道。

  

切线相关,它允许其他语言存在的计算机语言是什么?

所有有用的编程语言都有一个名为图灵完整性的属性。如果图灵完整集中的一种语言可以做某事,那么它们中的任何一种都可以;他们被认为是计算上等同的

但是,仅仅因为它们同样“强大”并不意味着它们与人类一起工作也同样好。这就是为什么许多人愿意牺牲你从编写汇编代码中获得的无与伦比的微观管理,以换取你使用更高级语言(如Ruby,Python或C#)获得的表现力和力量。

  

是否可以在Javascript中为Javascript编写解释器?这是完整语言的要求吗? Perl,PHP等也一样吗?

由于存在用C编写的Javascript解释器,因此必须能够在Javascript中编写Javascript解释器,因为两者都是图灵完备的。然而,再次注意到图灵完整性并没有说明用一种语言做另一种语言有多难 - 只有这样才能开始。你的Javascript-interpreter-inside-Javascript可能非常低效,消耗大量内存,需要巨大的处理能力,并且是一个非常丑陋的黑客。但是图灵完整性保证了它可以完成!

答案 1 :(得分:5)

虽然这并没有直接回答你的问题,但我想起了Paul Graham关于编程语言发展的Revenge of the Nerds文章。这当然是一个开始调查的有趣场所。

答案 2 :(得分:4)

前面有点长时间的咆哮。

计算机语言实际上与人类语言并没有什么不同。两者都用于以通常理解的术语表达想法和概念。在不同的人类语言中存在语法差异,但你可以在每种语言中表达相同的东西(这是否使人类语言图灵完整?:))。有些语言比其他语言更适合表达某些事物。

例如,虽然技术上not completely correct,因纽特语似乎非常适合描述各种雪。根据我的经验,日语非常适合表达自己的感受和心态,这要归功于该领域的大量简洁词汇。由于基本上没有明确的语法,德语非常精确。

不同的编程语言也有不同的专业,但它们在表达事物所需的细节层次上大多不同。人类语言和编程语言之间的巨大差异主要在于编程语言缺少大量词汇并且很少有“语法”规则。使用库,您可以扩展语言的词汇。

例如:

  

让我喝咖啡。

对于人类来说很容易理解,但这只是因为我们知道每个单词的含义。

  

咖啡:由热带灌木的烤豆腐种子制成的饮料   饮用:可吞咽的液体
  吞咽:导致或允许传递喉咙
  ......等等等等。

我们深知所有这些定义,但我们必须在某些时候学习它们。

同样,计算机也可以“教导”以“理解”单词。

Coffee::make()->giveTo($me);

这可能是计算机语言中完全有效的表达。如果计算机“知道”Coffeemake()giveTo()的含义以及$me是否已定义。它表达了与英语句子相同的想法,只是用不同的,更严格的语法。

在不同的环境中,您必须说出稍微不同的东西才能获得相同的结果。例如,在日语中你可能会说:

  

コーヒーを作ってもらっても良いですか?
  Kōhīotsukuttemoratte mo ii desu ka?

大致可以转换为:

if ($Person->isAgreeable('Coffee::make()')) {
    return $Person->return(Coffee::make());
}

相同的想法,相同的结果,但$me是隐含的,如果您不首先检查isAgreeable,您可能会收到运行时错误。在计算机术语中,有点类似于Ruby的隐含行为,即返回最后一个表达式的结果(“语法特征”)并首先检查可用内存(环境必要性)。

如果你正在和一个语气很少的人说话,你可能需要更详细地解释一下:

  

去厨房   拿一个锅   用水填充锅   ...

就像Assembler一样。 :O)

无论如何,关键是,编程语言实际上就像人类语言一样。它们的语法不同,专门用于问题域(逻辑/数学)和“监听器”(计算机),但它们只是传递思想和概念的方法。

修改
关于“监听器优化”的另一点是编程语言试图消除歧义。从技术上讲,“让我喝咖啡”的例子可以被理解为“把我变成咖啡”。人类可以直观地分辨出什么是计算机所不能的。因此,在编程语言中,一切通常只有一个和一个含义。如果不存在问题,Javascript中的“+”运算符就是一个常见的例子。

1 + 1     -> 2
'1' + '1' -> '11'

答案 3 :(得分:4)

不是定义,但我认为编程语言基本上有两个发展方向:

  • 那些从机器可以做的事情到更具表现力和更少与机器联系的东西(汇编,Fortran,C,C ++,Java,......)

  • 从一些数学或理论计算机科学的计算概念到实际机器上可实现的东西(Lisp,Prolog,ML,Haskell,...)

当然,实际上情况不是那么整洁,两股都借助最好的想法相互影响。

答案 4 :(得分:3)

答案 5 :(得分:2)

有趣。

我认为编程语言的定义特征是能够根据输入做出决策。实际上,ifgoto。其他一切都是很多很多的语法糖。这就是产生Brainfuck的想法,它实际上非常有趣(尝试)使用。

有些地方线路模糊;例如,我怀疑人们会认为XSLT真的是一种编程语言,但它是Turing-complete。我甚至用它解决了Project Euler问题。 (非常,非常慢。)

人们会想到语言的三个主要属性:

  1. 怎么运行?是编译为裸机(C),通过一些运行时查找(C ++)编译为大多数裸机,在JIT虚拟机(Java,.NET)上运行,字节码解释(Perl),或纯粹解释(呃... )?这并没有对语言本身做出太多评论,而是说明代码的可移植性,我可能期望的速度(以及广泛的任务类型将如何运作),以及有时语言的灵活性。 / LI>
  2. 它支持哪些范例?程序?功能?标准库是用类还是函数构建的?有反思吗?理想情况下,是否支持我想做的任何事情?
  3. 我如何表示我的数据?是否有阵列,是否是固定大小?使用字符串有多容易?是否内置了结构或哈希?什么是类型系统?有物品吗?它们是基于类还是基于原型?一切都是对象,还是有原始的?我可以继承内置对象吗?
  4. 我意识到最后一个是一个非常大的潜在问题集合,但这一切都与我的想法有关。

    我认为完全从头开始重建编程语言环境几乎可以解决它第一次如何实现:迭代。从汇编开始,处理器理解的直接命令列表,并用更容易使用的东西包装它。重复,直到你开心。

    是的,您可以在Javascript中编写Javascript解释器,在Python中编写Python解释器(请参阅:PyPy),或在Javascript中编写Python解释器。这种语言称为自托管。看看Perl 6;这从一开始就是其主要实施的目标。

    最终,一切只需转换为机器代码,不一定是C.如果需要,可以编写D或Fortran或Haskell或Lisp。 C恰好是一个旧标准。如果您为语言Foo编写了一个最终可以通过任何方式吐出机器代码的编译器,那么您可以在Foo中重写该编译器并跳过中间人。当然,如果您的语言是纯粹解释的,这可能会导致堆栈溢出......

答案 6 :(得分:2)

人类表达:

  • 描述数学函数
  • 使计算机打开和关闭开关

答案 7 :(得分:2)

这个问题非常广泛。我最喜欢的定义是编程语言是表达计算的手段

  • 处于较高水平
  • 我们可以通过各种方式推理他们

通过计算我的意思是图灵和教会的意思:图灵机和lambda演算具有相同的表达能力(这是一个定理),以及Church-Turing假设(这是一个猜想)粗略地说,那里没有更强大的计算概念。换句话说,可以用任何编程语言表达的计算类型充其量只能使用图灵机或lambda演算程序表达 - 而且某些语言只能表达这些计算的一部分。

这种计算定义还包括您友好的邻居硬件,使用图灵机很容易模拟,甚至更容易使用lambda演算进行模拟。

表达计算正是意味着计算机无法摆脱其义务:如果我们考虑到特定的计算,我们可以使用编程语言强制计算机来执行该计算。 (具有“实现定义”或“未定义”结构的语言使得这项任务变得更加困难。使用这些语言的程序员通常愿意接受 - 或者可能在不知不觉中解决 - 一些只与密切相关的计算他们想到的计算。)

在高级别表达计算 是编程语言的全部内容。有这么多不同的编程语言的一个重要原因是有很多不同的高级方法来思考问题。通常,如果您要解决一个重要的新类问题,最好创建一种新的编程语言。例如,拉里沃尔的写作表明,解决一类称为“系统管理”的问题是他创建Perl的动机。

(有很多不同的编程语言的另一个原因是创建一种新语言很有趣,任何人都可以学习它。)

最后,许多程序员想要的语言可以轻松推理程序。例如,今天我的一名学生实施了一种新算法,使他的程序运行速度提高了六倍。他必须非常谨慎地推断C数组的内容,以确保新算法能够完成与旧算法相同的工作。幸运的是C有很好的工具来推理程序,例如:

  • a[i]中的更改不会影响a[i-1]
  • 的值

我的学生还应用了一个在C中无效的推理原则:

  • 序列无符号整数的总和将至少与序列中的任何整数一样大。

在C 中不是这样,因为总和可能会溢出。一些程序员喜欢标准ML之类的语言的一个原因是,在SML中,这种推理原则总是有效的。在广泛使用的语言中,可能Haskell具有最强的推理原则Richard Bird已经开发了关于高级艺术项目的等式推理。


我不会尝试解决您的开场问题后面的所有切向细节。但是我希望你会得到一些答案,这些答案旨在让你更深入地理解关于编程语言的基本问题。

答案 8 :(得分:2)

许多“IT”类型遗忘的一件事是有两种类型的计算机编程语言:

  1. 软件编程语言:C,Java,Perl,COBAL等

  2. 硬件编程语言:VHDL,Verilog,System Verilog等

答案 9 :(得分:2)

正如朋友教我的计算机语言一样,语言就是一个世界。与该机器通信的世界。 Alonzo和Alan描述的是实现思想,算法和功能的世界。它是上述科学家建立的数学结构的技术等价物。它是一种具有epxressions和限制的语言。然而,正如路德维希·维特根斯坦所说的“我语言的极限意味着我的世界的极限”,总有局限性,而这就是人们如何选择适合自己需要的语言。

这是一个通用答案......实际上有些想法而不是答案。

答案 10 :(得分:0)

对此有很多定义,但我更喜欢的是:

计算机编程是有助于解决特定技术任务/问题的编程。

有3个要注意的关键短语:

:计算机将按照程序员(程序员)的指示进行操作。

说明:以计算机可以理解的语言向计算机提供了说明。我们将在下面讨论。

问题:最终,计算机是工具(复杂的)。他们在那里使生活变得更简单。

答案可能很冗长,但您可以找到有关computer programming的更多信息