Widziałem ten cytat dotyczący pytania: Jaki jest dobry język funkcjonalny, na którym można zbudować usługę internetową?
W szczególności Scala nie obsługuje eliminacji wywołań ogonowych, z wyjątkiem funkcji samorekursywnych, co ogranicza rodzaje kompozycji, które możesz wykonać (jest to fundamentalne ograniczenie JVM).
Czy to prawda? Jeśli tak, co jest takiego w JVM, że stwarza to podstawowe ograniczenie?
źródło
Podstawowym ograniczeniem jest po prostu to, że JVM nie zapewnia wywołań ogona w swoim kodzie bajtowym, a zatem nie ma bezpośredniego sposobu, aby język zbudowany na JVM sam zapewniał wywołania ogona. Istnieją obejścia, które mogą przynieść podobny efekt (np. Trampolinowanie), ale wiążą się one z poważnym kosztem fatalnej wydajności i zaciemniania wygenerowanego kodu pośredniego, co czyni debugger bezużytecznym.
Dlatego JVM nie może obsługiwać żadnych funkcjonalnych języków programowania o jakości produkcyjnej, dopóki Sun nie zaimplementuje wywołań końcowych w samej JVM. Dyskutują o tym od lat, ale wątpię, czy kiedykolwiek zaimplementują wywołania ogonowe: będzie to bardzo trudne, ponieważ przedwcześnie zoptymalizowali swoją maszynę wirtualną przed wdrożeniem tak podstawowej funkcjonalności, a wysiłki firmy Sun koncentrują się na językach dynamicznych, a nie na językach funkcjonalnych.
Stąd istnieje bardzo mocny argument, że Scala nie jest prawdziwym funkcjonalnym językiem programowania: języki te uważały wywołania ogonowe za zasadniczą cechę od czasu wprowadzenia Scheme ponad 30 lat temu.
źródło
Hence there is a very strong argument that Scala is not a real functional programming language
- argument jest właściwie dość słaby. Jasnetail calls [as] an essential feature
i fajnie, jeśli sprzęt (lub maszyna virtal) obsługuje go bezpośrednio. Ale to szczegóły implementacji.Scala 2.7.x obsługuje optymalizację wywołań końcowych dla samorekursji (funkcji wywołującej samą siebie) końcowych metod i funkcji lokalnych.
Scala 2.8 może również zawierać obsługę biblioteki dla trampoliny, co jest techniką optymalizacji wzajemnie rekurencyjnych funkcji.
Wiele informacji na temat stanu rekurencji Scala można znaleźć na blogu Richa Dougherty'ego .
źródło
Oprócz artykułu w Lambda The Ultimate (z linku zamieszczonego powyżej), John Rose z Sun ma więcej do powiedzenia na temat optymalizacji wywołań ogonowych.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Słyszałem, że pewnego dnia może zostać zaimplementowany w JVM. Na Maszynie Da Vinci analizuje się między innymi obsługę połączeń ogonowych.
http://openjdk.java.net/projects/mlvm/
źródło
Wszystkie źródła wskazują, że JVM nie jest w stanie zoptymalizować w przypadku rekurencji ogonowej, ale po przeczytaniu dostrajania wydajności Java (2003, O areilly) stwierdziłem, że autor twierdzi, że może osiągnąć większą wydajność rekurencji poprzez implementację rekurencji ogonowej.
Możesz znaleźć jego twierdzenie na stronie 212 (wyszukaj „rekurencję ogonową”, powinien to być drugi wynik). Co daje?
źródło