编程语言复杂性

时间:2009-07-22 21:21:11

标签: programming-languages complexity-theory

在语法和语义方面是否客观衡量编程语言的复杂性,而不是语言的复杂程度

我读过许多主观评论但很少有严谨的分析。

11 个答案:

答案 0 :(得分:10)

语言BNF是一个粗略的衡量标准 - 只是为了品味: - )

一些例子,

答案 1 :(得分:6)

我不清楚复杂性在应用于编程语言时甚至是一个定义明确的术语。

如果“客观”是指“定量”,您可以提出以下问题

  • 明确的语法有多大?

  • 工作yacc语法有多大?

由于几乎没有语言具有形式语义,因此很难进行任何定量研究。但你可以问

  • 相对于使用相同元语言(编写解释器的语言)的其他语言的解释器,语言最简单的解释器有多大?这一措施与Kolmogorov复杂性有些相关。

除了好奇心之外,我不清楚这个问题是值得问的 - 很难想象有用的答案。

答案 2 :(得分:4)

查看Denotational semanticsoperational semantics

  

指称语义是一种通过构造数学对象(称为指示)来形式化编程语言含义的方法,这些对象描述了语言中表达式的含义。

  

编程语言的操作语义描述了如何将有效程序解释为计算步骤序列。然后这些序列是程序的含义。在功能程序的上下文中,终止序列中的最后一步返回程序的值。 (通常,单个程序可能有许多返回值,因为程序可能是不确定的,即使对于确定性程序,也可能存在许多计算序列,因为语义可能无法准确指定到达该值的操作序列。)

答案 3 :(得分:3)

我看过一种语言的最佳衡量标准是随机字符串是一个有效程序的概率。 Perl是一种在这种规模上排名靠前的语言,Ada排名相当低。

此指标的含义完全是另一个问题。

答案 4 :(得分:3)

作为一般规则,语法或语义或实现越多动态和抽象,语言越复杂(不按照您的说法使用)。< / p>

因此,Java是一种比C更复杂的语言,因为:

  1. C具有简单的范围规则与Java相对复杂的规则
  2. 类型更复杂,方法解决和重载
  3. 诸如无意义,参数枚举和检查,方法重载之类的事情使编译过程变得更加复杂。
  4. 在这个基础上,我认为Python比Java更简单,因为它的对象模型虽然复杂,但在简化为简单形式方面却很简单。从时间和计算角度来看,给定语法可以轻松地转换为更简单的形式也可能是一个角度。

    另一方面,如 lisp 这样的语言,有些人认为使用复杂但非常简单。像Haskell这样的事情也是如此。

    您可以通过以下方式之一衡量复杂性,但非完整性:

    1. 一个简单问题的关键字数量,代码行数和语义复杂性(如标识符解析)。斐波纳契计算可能是一个。比较通用算法的高效实施。
    2. 什么时候发生?名称在运行时绑定,还是在编译时解析?
    3. 如果没有给出标识符,类型和外部代码的所有事实,是否可以通过多种方式理解给定的代码片段?
    4. 吨方式。您可以测量给定语法的编译过程的计算复杂性。

      并非所有这些例子都是真的。一些对象模型非常复杂,但速度非常快,因为它们使用了快速的基础。自我可能就是一个例子。

答案 5 :(得分:1)

我喜欢Project Euler对此进行评估。 :)

答案 6 :(得分:1)

最容易理解的两个完全客观的事情是语言定义的符号和关键字/保留字的数量,以及其BNF中的制作量。

对于那些拥有它们的语言,您可以看到的另一件事是它们的标准文档的相对大小。有些人认为并非所有标准文件都是在同一级别编写的。

答案 7 :(得分:1)

我认为如果你看一下正确性证明的领域,你会发现更详细的语义复杂性分析。像CSP(以及较小程度上的Lambda Calculus)这样的系统被设计为通过分析易于处理。语言越接近于表达底层正式系统,从语义角度来看就越简单。

反例可能类似于C编程语言。在不知道它将运行什么操作系统和硬件的情况下,无法弄清楚C程序实际上做了什么。

答案 8 :(得分:1)

正如其他用户所发布的那样,关键字是衡量编程语言复杂程度的客观指标。语法/语法将描述代码结构的复杂程度(允许的关键字组合)。有一些与软件质量相关的代码指标可用于衡量一段代码的复杂程度。

在我看来,语义复杂性难以衡量。它与表达能力有关(编程语言水平越高,表达能力越强)。我认为没有必要尝试比较用不同语言实现的不同解决方案来衡量它们的表达能力(即使用Euler项目问题​​实现=解决方案)。问题本身和每种编程语言范例都会使比较产生偏差。

在高级编程语言的情况下,我假设特定问题的可能实现的数量(从抽象的角度来看)是语义复杂性的一个很好的衡量标准。

对于低级编程语言,看看规范语言如何生成代码(找到针对给定问题的实现=解决方案)可能很有趣。无论如何,由于抽象有限,这一措施似乎与软件质量代码指标密切相关。

正如您所看到的,抽象和语义复杂性更难实现自动化(根据规范生成实现=解决方案)。程序员的知识,智力和心理学都在这里(AI还没有达到这一点)。

答案 9 :(得分:0)

语言的复杂程度有点主观。

另一方面,可以回答关于语言语义有多复杂的问题,但只有与其他语言比较时才能回答。然而,这些并不一定有用。例如,我会给Smalltalk一个语义复杂度1和C ++复杂度为9.但是,我会打赌你正在阅读的浏览器中的任何内容都是 在C ++中,而不是Smalltalk。

答案 10 :(得分:0)

如果存在这样的客观衡量标准,那么评估特定目的使用给定语言的效用或成本可能几乎无用。它可以帮助你排除空白或脑袋,但这可以很容易地完成,而不需要在这样一个客观测量上花费资源 - 通过主观观察源代码并意识到你永远不想用它做认真的工作。

大多数语言会有很多正面和负面因素,你需要权衡你想要实现的目标和需要满足的条件。