通常,有专门用于特定任务的编程语言。有些编程语言在数组算术方面很出色(例如矩阵和多维数组的使用),而有些编程语言则在很难用其他语言重现的高级数学上却要好得多(但仍然可能一样)。
考虑到大多数语言只是简单地编译成汇编语言,那么与其他语言相比,该语言使它对特定任务或最终目标更有利吗?
我说的是图灵完整的语言,与图灵等效的语言。
通常,有专门用于特定任务的编程语言。有些编程语言在数组算术方面很出色(例如矩阵和多维数组的使用),而有些编程语言则在很难用其他语言重现的高级数学上却要好得多(但仍然可能一样)。
考虑到大多数语言只是简单地编译成汇编语言,那么与其他语言相比,该语言使它对特定任务或最终目标更有利吗?
我说的是图灵完整的语言,与图灵等效的语言。
Answers:
有几件事要考虑:
抽象:语言被视为“特殊”语言?是矩阵的一等值,例如在Matlab中,还是像C这样使用更简单的类型(如数组)对它们进行编码?C让您思考矩阵的实现方式,而Matlab则没有。
同样,如果您有复杂的异步通信系统,则可能需要一流的功能,以便可以进行回调。
添加的功能越多,语言就越复杂。因此,尽管有诸如C ++和D之类的“多范式”语言,但大多数语言都选择了一个细分市场,选择对该细分市场重要的事物,并将它们作为主要抽象优先级。
性能:所有抽象都伴随着成本,无论是编译时还是运行时。某些语言以某种方式限制自己,使它们不太抽象,但性能更高。
早期的Fortran不允许使用指针或递归,因此它在数字运算方面非常出色,比C语言(运行大量循环)更快。但是,在编码大型数据结构(例如树)时非常糟糕,在这种情况下,您需要使用指针进行间接寻址。(请注意,我对现代Fortran不太了解。)
本质上,总会有权衡。更加抽象意味着要么运行时变慢,要么在编译时变得更加复杂。更多功能意味着更复杂的语言。有些功能会使某些事情变快,而另一些则使速度变慢,例如指针和递归。没有完美的语言,因此每种语言在语言质量空间中都会达到某种局部最大值。
某些语言的约束使得更容易实现更快的代码(例如,Fortran与C和指针别名),这是在开箱即用的性能和可能性之间进行权衡的问题。
该语言并未针对特定任务进行“优化”,但其实现,编译器和约束条件使编译器更易于理解代码。真正的问题是关于特定的库,根据问题的长度,算法可以通过切换来加快处理速度,从而使其达到最佳状态。
例如,乘法使用各种情况(请参阅GMP乘法)。
当语言指定更高级别的数学运算时,其实现是最佳的(在这种情况下是高效的),但这不是语言规范的一部分。
请看一下Matlab,Mathematica和Maple中的矩阵秩计算(我现在不能自己执行所有测试,但是这些与我的测试一致)。所有这些语言(环境)都实现相同的更高级别的操作,但是实现细节有所不同,并且会出现不同的时间。
当某些特定领域的任务(这里也称为特定领域的语言)针对特定的计算时,它们就会针对目标受众进行改进和优化(多年来)。但是,并非总是如此。例如,Perl拥有处理字符串的悠久历史,但是PCRE(这里只是Perl的正则表达式)不是现存最快的(并且使用大量内存),但是具有极强的表现力和强大功能。
语言的约束在编译过程中有所不同,提到的指针别名防止了代码重新排序的可能性,并强制了变量的重新加载。
在我看来,这实际上可以很精确地表述为:当某种工具在所有可能使用的工具中最小化时,它是针对特定类别问题的最佳工具(例如,一种编程语言及其标准库)。获得足够正确和有效的解决方案的预期成本,其中期望值是对问题类别中所有问题的某些给定概率分布的接受。通常,这笔费用是以程序员时间的形式出现的,包括预期的设计时间,预期的调试时间,教育尚未熟悉该工具的人员所需的预期时间等。
实际上,这些量中几乎没有一个可以实际测量。不过,我认为这是思考问题的正确方法。
这是一个很好的问题,不容易回答。关于Erlang语言,是否有什么适合实时电信应用的?还是关于Erlang编译器?还是关于Erlang社区和生态系统?也许是那些了解如何编写电信应用程序的人是Erlang的专家,而知道Erlang的人们是电信应用程序的专家?我怀疑所有这些因素都起作用。
Erlang中可能有两个功能使其适合于此类应用程序(注意:我自己从未使用过该语言)-它具有对并发的良好支持以及对动态软件升级的支持。这些功能在其他许多领域也很有用,但是电信工程师对正常运行时间非常狂热。也许,如果建立网站的人们像建立电话交换机的人们一样关注高可用性,那么Erlang也会在那里流行。
其他答案错过了为特定任务优化语言的要点-不仅仅是使代码在给定硬件上运行更快的原因;这是关于特定语言如何清晰明确地表达您对问题的解决方案。这在很大程度上取决于问题领域,并且(连同市场炒作,对现有解决方案的无知以及编写新语言的自我之旅)是我们拥有多种语言的原因-目标是程序员编写更少的代码,不太容易出错,并且让下一个程序员更容易阅读/理解/修复/增强。
例如,C和C ++都可以用于面向对象的编程-确实,GObject库是OO C的一个很好的例子。包含函数指针的AC结构可以起到与C ++类上的虚方法相同的作用,并且可以执行更好; 开发的代价是粘合代码以分配内存,初始化函数指针以及选择用于调用“父”方法的策略。在大多数情况下,键入Class klass * = new class()
比更加清晰/安全struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
。