是什么使语言针对特定任务“优化”的?


15

通常,有专门用于特定任务的编程语言。有些编程语言在数组算术方面很出色(例如矩阵和多维数组的使用),而有些编程语言则在很难用其他语言重现的高级数学上却要好得多(但仍然可能一样)。

考虑到大多数语言只是简单地编译成汇编语言,那么与其他语言相比,该语言使它对特定任务或最终目标更有利吗?

我说的是图灵完整的语言,与图灵等效的语言。


1
这是一个百科全书式的问题。我建议您以某种方式分解它,使其更具体。
安德烈·索萨莱莫斯

5
说“市场营销”会错吗?
corsiKa '16

2
@corsiKa是的,我认为这不仅仅是营销问题。
杰里米·韦斯特

Answers:


18

有几件事要考虑:

  • 抽象:语言被视为“特殊”语言?是矩阵的一等值,例如在Matlab中,还是像C这样使用更简单的类型(如数组)对它们进行编码?C让您思考矩阵的实现方式,而Matlab则没有。

    同样,如果您有复杂的异步通信系统,则可能需要一流的功能,以便可以进行回调。

    添加的功能越多,语言就越复杂。因此,尽管有诸如C ++和D之类的“多范式”语言,但大多数语言都选择了一个细分市场,选择对该细分市场重要的事物,并将它们作为主要抽象优先级。

  • 性能:所有抽象都伴随着成本,无论是编译时还是运行时。某些语言以某种方式限制自己,使它们不太抽象,但性能更高。

    早期的Fortran不允许使用指针或递归,因此它在数字运算方面非常出色,比C语言(运行大量循环)更快。但是,在编码大型数据结构(例如树)时非常糟糕,在这种情况下,您需要使用指针进行间接寻址。(请注意,我对现代Fortran不太了解。)

本质上,总会有权衡。更加抽象意味着要么运行时变慢,要么在编译时变得更加复杂。更多功能意味着更复杂的语言。有些功能会使某些事情变快,而另一些则使速度变慢,例如指针和递归。没有完美的语言,因此每种语言在语言质量空间中都会达到某种局部最大值。


8

某些语言的约束使得更容易实现更快的代码(例如,Fortran与C和指针别名),这是在开箱即用的性能和可能性之间进行权衡的问题。

该语言并未针对特定任务进行“优化”,但其实现,编译器和约束条件使编译器更易于理解代码。真正的问题是关于特定的库,根据问题的长度,算法可以通过切换来加快处理速度,从而使其达到最佳状态。

例如,乘法使用各种情况(请参阅GMP乘法)

当语言指定更高级别的数学运算时,其实现是最佳的(在这种情况下是高效的),但这不是语言规范的一部分。

请看一下Matlab,Mathematica和Maple中的矩阵秩计算(我现在不能自己执行所有测试,但是这些与我的测试一致)。所有这些语言(环境)都实现相同的更高级别的操作,但是实现细节有所不同,并且会出现不同的时间。

当某些特定领域的任务(这里也称为特定领域的语言)针对特定的计算时,它们就会针对目标受众进行改进和优化(多年来)。但是,并非总是如此。例如,Perl拥有处理字符串的悠久历史,但是PCRE(这里只是Perl的正则表达式)不是现存最快的(并且使用大量内存),但是具有极强的表现力和强大功能。

语言的约束在编译过程中有所不同,提到的指针别名防止了代码重新排序的可能性,并强制了变量的重新加载。


9
大多数语言都按规范完成了图灵,因为并非所有语言都在其规范中指定了固定的地址大小。而且,失去诸如C之类的东西(图灵完成的模地址大小)与Coq,Agda或System F之类根本不是图灵完成的东西之间的区别是非常有限的。
jmite

1
@jmite谢谢。我希望这不再是阴影的差异
邪恶

@Evil:好吧,我认为您关于语言无法针对任务进行优化的说法是错误的。从计算机的角度来看,您会看到“优化”一词。但是某些语言旨在使它仅对程序员更容易,并让实现者弄清楚如何使其执行。
医生

从效率的角度来看,这没错,我只是采用了这个角度,您可能会考虑另一个角度(优化意味着在其中编写一些特定的任务会更容易)。“关于某种语言,它比其他语言更适合于特定任务或最终目标。”,我非常有信心:“更好”中可能包含更容易编写,更快,更便宜的……。作者既不接受某些答案,也没有提供澄清或意见,即所给出的任何答案都不是所要问的。除此之外,它的因素之一,对某些人比其他更重要的
邪恶的

5

在我看来,这实际上可以很精确地表述为:当某种工具在所有可能使用的工具中最小化时,它是针对特定类别问题的最佳工具(例如,一种编程语言及其标准库)。获得足够正确和有效的解决方案的预期成本,其中期望值是对问题类别中所有问题的某些给定概率分布的接受。通常,这笔费用是以程序员时间的形式出现的,包括预期的设计时间,预期的调试时间,教育尚未熟悉该工具的人员所需的预期时间等。

实际上,这些量中几乎没有一个可以实际测量。不过,我认为这是思考问题的正确方法。


4

这是一个很好的问题,不容易回答。关于Erlang语言,是否有什么适合实时电信应用的?还是关于Erlang编译器?还是关于Erlang社区和生态系统?也许是那些了解如何编写电信应用程序的人是Erlang的专家,而知道Erlang的人们是电信应用程序的专家?我怀疑所有这些因素都起作用。

Erlang中可能有两个功能使其适合于此类应用程序(注意:我自己从未使用过该语言)-它具有对并发的良好支持以及对动态软件升级的支持。这些功能在其他许多领域也很有用,但是电信工程师对正常运行时间非常狂热。也许,如果建立网站的人们像建立电话交换机的人们一样关注高可用性,那么Erlang也会在那里流行。


3

其他答案错过了为特定任务优化语言的要点-不仅仅是使代码在给定硬件上运行更快的原因;这是关于特定语言如何清晰明确地表达您对问题的解决方案。这在很大程度上取决于问题领域,并且(连同市场炒作,对现有解​​决方案的无知以及编写新语言的自我之旅)是我们拥有多种语言的原因-目标是程序员编写更少的代码,不太容易出错,并且让下一个程序员更容易阅读/理解/修复/增强。

例如,C和C ++都可以用于面向对象的编程-确实,GObject库是OO C的一个很好的例子。包含函数指针的AC结构可以起到与C ++类上的虚方法相同的作用,并且可以执行更好; 开发的代价是粘合代码以分配内存,初始化函数指针以及选择用于调用“父”方法的策略。在大多数情况下,键入Class klass * = new class()比更加清晰/安全struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...


好吧,jmite的答案提供了一个项目符号,指出您编写的内容丢失了。我写了针对此问题优化的特定于域的任务。我喜欢C,我知道像OCC这样的东西,但是它不能使C Object Oriented(编译器对此无济于事,并且很多优化都被阻止,没有垃圾回收器,等等)。您不能像在C ++中那样重载C函数,但是您当然可以模拟任何行为(jmite也对此进行了介绍)。我看不出这如何回答上述问题。
Evil

2
@Evil:面向对象的编程和面向对象的编程语言是两个不同的概念。面向对象的编程不需要面向对象的语言。可以说,仅需要纸或白板的存在即可进行UML设计。
slebetman '16

@slebetman我没看到那件事。可以说,您不需要纸和白板,您可以想象对象,并且据某些人说,这就是我们的想法,但这与OOP概念的语言支持没有任何距离。抱歉,这是我不想提及的争议。
Evil

@Evil:我不是那么肯定能够跟踪这一切精神上没有一定的抽象来帮助你。给我的第一份工作是一大段C代码,它看起来像所有带有函数指针的数组(花了我一段时间来弄清楚奇怪的语法的含义-那时还没有Google),我一直在努力,直到我开始看到一个模式并意识到那些数组是对象,那些函数指针是方法。给自己买了一块
小白板

1
@slebetman鉴于面向对象编程比UML至少早了20年,因此您声称UML设计对于面向对象是必需的,这似乎是完全错误的。
David Richerby
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.