Победителями кажутся простые старые динамические языки.
Лисп - это очевидный контрпример, простой старый динамический язык, который чрезвычайно многословен.С другой стороны, APL / J / K, вероятно, будет гораздо более кратким, чем любой из других языков, и они динамичны.Кроме того, Mathematica ...
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
Одноядерные версии часто содержат много кода для параллелизма, например, regex-dnaв OCaml .Посмотрите на чудовище, которое fasta в OCaml : вся программа дублируется дважды и включает размер слова!У меня есть старая версия fasta на диске OCaml, которая меньше, чем пятая часть этого размера ...
Наконец, я должен отметить, что я добавил код на этот сайт только для того, чтобы он был отклонен, потому чтоэто было слишком хорошоПомимо политики, двоичные деревья OCaml раньше содержали выражение «де-оптимизирован Исааком Гуи» (хотя комментарий был удален, деоптимизация все еще там, что делает код OCaml более длинным и медленным), так что вы можете предположить, что всерезультаты были субъективно подправлены, чтобы внести предвзятость.
По сути, при таких низкокачественных данных нельзя надеяться сделать какие-либо глубокие выводы.Вам было бы гораздо лучше найти более важные программы, которые были перенесены между языками, но даже тогда ваши результаты будут зависеть от предметной области.Рекомендую полностью забыть о перестрелке ...