Najszybszy język funkcjonalny

18

Niedawno zajmuję się programowaniem funkcjonalnym, zwłaszcza Haskell i F #, jeszcze bardziej. Po pewnym googlowaniu nie mogłem znaleźć porównania porównawczego bardziej znanych języków funkcjonalnych (Scala, F # itp.).

Wiem, że niektóre języki niekoniecznie są sprawiedliwe (przychodzi mi na myśl Scala), ponieważ są to hybrydy, ale chcę tylko wiedzieć, które osiągają lepsze wyniki, niż które z nich.

Farouk
źródło
18
Języki nie są szybkie ani wolne, implementacje są.
starblue
6
Implementacje językowe nie są szybkie ani wolne, programy są uruchamiane przy użyciu tych implementacji językowych (w porównaniu do niektórych innych programów). Bądź charytatywny - gdy ktoś mówi o tym, że jeden język programowania jest szybszy od drugiego, oczywistym sposobem, który ma sens, jest zrozumienie, że mówi o konkretnych programach uruchamianych przy użyciu określonych implementacji językowych.
igouy 16.12.12
3
@starblue: To bardzo płynna odpowiedź i niezbyt pomocna. Chociaż z pewnością możliwe jest utworzenie dwóch implementacji tego samego języka, z których jedna jest wolniejsza od drugiej, sposób, w jaki to umieściłeś, oznacza, że ​​nie istnieją szczegóły projektowania języka, które z konieczności wymagałyby pewnej nieefektywności we wdrażaniu innych języków, projekt, nie wymagają. A to po prostu nieprawda. (Zwłaszcza w tym konkretnym temacie; języki funkcjonalne są dla nich znane!)
Mason Wheeler,
3
@igouy „Implementacje językowe nie są szybkie ani wolne” To nie jest prawda. CPythonvs PyPyszybko przychodzi mi na myśl.
NlightNFotis
@NlightNFotis - Ile sekund zajmuje CPython? Ile sekund zajmuje PyPy? Implementacje językowe nie są szybkie ani wolne. Ile sekund zajmuje ten program z CPython?
igouy,

Odpowiedzi:

25

Zgodnie z Wielkiej Grze poziomy odniesienia , ATS jest szybszy niż reszta z Haskell, Scala, a jeden z wariantów Common Lisp w szorstkiej krawat dla prędkości tuż za to. Potem Ocaml i F # są mniej więcej w tej samej kategorii prędkości, a rakieta i Clojure pozostają w tyle ...

Jednak prawie nic z tego tak naprawdę nic nie znaczy. To wszystko kwestia problemu, maszyny, kompilatora, technik kodowania, a w niektórych przypadkach zwykłego szczęścia. Ogólnie rzecz biorąc, języki kodowane bezpośrednio maszynowo, takie jak Haskell, będą lepsze niż języki skompilowane z VM, takie jak F # i znacznie przewyższą języki czysto interpretowane. Ogólnie mówiąc, języki o typie statycznym są szybsze niż o typie dynamicznym ze względu na analizę statyczną, która pozwala na obliczenie wszystkich operacji typu podczas kompilacji, a nie w czasie wykonywania. Ponownie, są to ogólne zasady, zawsze będą wyjątki. „Paradygmaty” mają z tym niewiele wspólnego.

Inżynier świata
źródło
Wiem, że istnieje wiele czynników, które należy wziąć pod uwagę i nawet jeśli wszystkie rzeczy były idealne, mogłyby działać inaczej na różnych danych, moje pytanie jest dość niejasne. Dzięki za link, bardzo pomocny - nigdy nie wiedziałem, że ATS był tak szybki
Farouk
Ładny link ze szczegółowymi informacjami porównawczymi. Jestem trochę rozczarowany widząc, że Clojure zużywa znacznie więcej pamięci i zajmuje znacznie więcej czasu niż Java. Pamiętam niektóre twierdzenia o podobnym działaniu Clojure, co nie wydaje się być prawdą.
DPM,
Strona internetowa ATS stwierdza, że ​​ATS obsługuje różne paradygmaty programowania - więc zanim zaczniesz twierdzić, że ATS jest szybszy niż reszta, musisz pokazać, że te programy są w rzeczywistości napisane w funkcjonalnym stylu. Być może funkcjonalny ATS nie jest szybszy niż reszta.
igouy 16.12.12
2
Witryna Scala stwierdza, że ​​Scala integruje funkcje obiektowe i funkcjonalne. Czy sprawdziłeś, że programy Scala są pisane jako programy funkcjonalne, a nie programy zorientowane obiektowo?
igouy
12

Należy również zauważyć, że nie można mierzyć / kwantyfikować wydajności języka programowania . Najlepsze, co możesz zrobić, to zmierzyć wydajność konkretnej implementacji języka na określonych platformach, uruchamiając określone programy.

Kiedy więc pytasz o „najszybszy język funkcjonalny”, tak naprawdę pytasz o najlepsze z obecnych implementacji języka (ów).


Komentarz @ igouy podnosi, że istnieją inne mierniki wydajności implementacji języka; np. czas kompilacji. Ale to nie zmienia faktu, że czas działania aplikacji jest (pośrednią) miarą implementacji języka, a nie miarą samego języka.

Rozważmy na przykład Javę. Załóżmy, że piszę jednowątkowy test porównawczy, używając wyłącznie funkcji językowych klasycznej (Java 1.0) Java. Jeśli skompiluję i uruchomię przy użyciu JDK 1.0, uzyskam niską wydajność ('ponieważ JDK 1.0 nie miał natywnego kompilatora kodu). Jeśli przejdę z JDK 1.1 na ... JDK 1.7, najprawdopodobniej uzyskam stopniowo lepsze wyniki. Ale nie jest to spowodowane zmianami języka Java ... ponieważ mój test porównawczy używa tego samego podzbioru językowego. Raczej przyspieszenie wynika z ulepszeń w kompilatorach, systemie wykonawczym i / lub implementacji bibliotek klas. Są to wszystkie problemy z implementacją .

Drugą kwestią jest to, że różnice w implementacji mogą być naprawdę znaczące (np. Rzędy wielkości) dla tego samego języka. Zatem fakt, że najlepsza implementacja dla języka X jest szybsza niż najlepsza (lub tylko) implementacja języka Y, niekoniecznie mówi wiele o samym języku.

Stephen C.
źródło
Najlepsze, co możesz zrobić, to zmierzyć wydajność określonych programów. Kiedy mierzymy wydajność implementacji języka, chcemy dowiedzieć się, ile czasu zajmuje skompilowanie jakiegoś programu, a nie jak długo ten program działa.
igouy 16.12.12
Czas działania programu jest właściwością tego konkretnego programu, gdy jest uruchamiany przy użyciu tej konkretnej implementacji języka na tym konkretnym sprzęcie itp. Biorąc pod uwagę, że czas wykonywania programu nie jest właściwością języka, warto zezwolić, aby w tym kontekście nazwa języka jest używany jako skrót do zwykłych dobrze znanych implementacji językowych.
igouy
@igouy - to prawda. Ale wiele osób nie czyni tego rozróżnienia, co ilustruje wiele starych stron internetowych głoszących, że „Java jest powolna. Niestety, ten nonsens został odczytany dosłownie przez całe pokolenie programistów ... i znacznie pogorszył reputację Javy. dlatego mówię o tym TUTAJ
Stephen C,
Jeśli chcesz mieć swobodę wypowiadania się - „(pośrednia) miara implementacji języka” - wyjaśnij, dlaczego ktoś nie powinien mieć swobodę wypowiadania się - (pośrednia) miara języka .
igouy
@igouy - 1) Możesz powiedzieć, co chcesz. Ale to nie sprawia, że ​​masz rację. 2) Rozważ przypadek, w którym jedyną implementacją języka jest bzdura. Testujemy to. Następnie aktualizujemy implementację, porównujemy ją, a wydajność znacznie się poprawiła. Czy to oznacza, że ​​poprawiła się wydajność językowa? Jak to ma sens ... biorąc pod uwagę, że język NIE zmienił się !!!
Stephen C
6

Jeśli patrzysz na języki tylko na szybkość wykonywania, brakuje niektórych ważnych punktów. Szybkość to dobra rzecz, ale nie tylko.

Haskell korzysta z bardzo solidnego systemu typów do tworzenia programów, które z dużym prawdopodobieństwem będą wolne od błędów i niezawodne.

Erlang wykorzystuje wbudowany system monitorowania, aby umożliwić tworzenie systemów uszkodzeń, które mogą zapewnić ogromny poziom niezawodności w obliczu różnego rodzaju usterek. Ponadto Erlang może zapewnić poziom współbieżności, który trudno jest dopasować w innych językach.

Prawdę mówiąc, uważałbym, że szybkość wykonywania we współczesnych czasach jest raczej daleko na liście rzeczy, które rozważałbym w większości przypadków. (OK, gdybym wykonywał masowe obliczenia numeryczne, prawdopodobnie chciałbym użyć fortranu do prędkości, ale w przeciwnym razie Po prostu nie jest wystarczająco ważny, aby mieć znaczenie)

Zachary K.
źródło