获胜者似乎是普通的老式动态语言。
Lisp 是一个明显的反例,它是一种非常冗长的普通旧动态语言。另一方面,APL/J/K 可能比任何其他语言都简洁得多,而且它们是动态的。还有数学...
Haskell 和 Common Lisp 看起来并不比自称冗长的 Java 更简洁。
您的数据适用于针对性能进行了优化的微型程序,衡量标准是在特定设置下使用 GZIP 算法压缩后的代码大小因此,您不可能仅从它们中得出一般性结论。也许更有效的结论是您正在观察性能优化导致的膨胀,因此您的数据中最简洁的语言是那些由于根本上效率低下而无法优化的语言(Python、Ruby、Javascript、Perl、Lua、PHP)。相反,Haskell 可以通过足够的努力进行优化,以创建快速但冗长的程序。这真的是 Haskell 与 Python 的劣势吗?另一个同样有效的结论是 Python、Ruby、Perl、Lua 和 PHP 在该设置上使用 GZIP 算法可以更好地压缩。也许如果您使用游程编码或算术编码或 LZ77/8 重复实验,也许使用 BWT 预处理或其他算法,您会得到完全不同的结果?
该网站上的代码中还有大量毫无价值的杂物。查看这段 OCaml 代码片段,仅当您的 OCaml 安装已过时两代时才需要:
(* This module is a workaround for a bug in the Str library from the Ocaml
* distribution used in the Computer Language Benchmarks Game. It can be removed
* altogether when using OCaml 3.11 *)
module Str =
struct
include Str
let substitute_first expr repl_fun text =
try
let pos = Str.search_forward expr text 0 in
String.concat "" [Str.string_before text pos;
repl_fun text;
Str.string_after text (Str.match_end())]
with Not_found ->
text
let opt_search_forward re s pos =
try Some(Str.search_forward re s pos) with Not_found -> None
let global_substitute expr repl_fun text =
let rec replace accu start last_was_empty =
let startpos = if last_was_empty then start + 1 else start in
if startpos > String.length text then
Str.string_after text start :: accu
else
match opt_search_forward expr text startpos with
| None ->
Str.string_after text start :: accu
| Some pos ->
let end_pos = Str.match_end() in
let repl_text = repl_fun text in
replace (repl_text :: String.sub text start (pos-start) :: accu)
end_pos (end_pos = pos)
in
String.concat "" (List.rev (replace [] 0 false))
let global_replace expr repl text =
global_substitute expr (Str.replace_matched repl) text
and replace_first expr repl text =
substitute_first expr (Str.replace_matched repl) text
end
单核版本通常包含大量并行代码,例如OCaml 中的 regex-dna。看看OCaml 中 fasta的怪物:整个程序被复制了两次,并且它打开了字大小!我在磁盘上有一个旧的 OCaml 版本的 fasta,它的大小不到那个的五分之一......
最后,我应该指出,我向这个站点贡献了代码,但它被拒绝了,因为它太好了。抛开政治不谈,OCaml 二叉树曾经包含“由 Isaac Gouy 优化”的语句(尽管注释已被删除,但优化仍然存在,使得 OCaml 代码更长更慢),因此您可以假设所有结果已被主观篡改,以引入偏见。
基本上,有了如此低质量的数据,您就无法得出任何有见地的结论。您最好尝试找到已在语言之间移植的更重要的程序,但即便如此,您的结果也将是特定领域的。我建议完全忘记枪战......