Czytałem książkę „Programowanie funkcjonalne w prawdziwym świecie”. Zaczęło się od porównania imperatywnych i funkcjonalnych języków programowania. I stwierdził, w jaki sposób „wartości” i „wyrażenia” w programowaniu funkcjonalnym różnią się od „zmiennych” i „funkcji” programowania imperatywnego. Na podstawie dyskusji opracowałem pomysł, który -
Funkcjonalne języki programowania mają więcej okazji do optymalizacji czasu kompilacji niż ich imperatywne odpowiedniki.
Czy to prawda?
źródło
To, że w zasadzie istnieje więcej możliwości optymalizacji czasu kompilacji dla języków funkcjonalnych niż dla ich imperatywnych odpowiedników, jest prawdopodobnie prawdą.
Bardziej interesujące jest to, że jeśli są one faktycznie zaimplementowane w bieżących kompilatorach i jak istotne są te optymalizacje w praktyce (tj. Końcowa wydajność idiomatycznego kodu „prawdziwego życia” w środowisku produkcyjnym, z przewidywalnymi ustawieniami kompilatora a priori).
np. zgłoszenia Haskella do niesławnej gry Benchmarki języka komputerowego (może to być złe - ale nie jest tak, że w tej chwili jest coś znacznie lepszego) sprawiają wrażenie, że spędzono znaczną ilość czasu na ręczne optymalizacje, które skonfrontowane z twierdzeniem o „możliwych optymalizacjach kompilatora z powodu
insert some property about FP languages here
” sprawiają, że optymalizacje są (przynajmniej przynajmniej) bardziej teoretyczną możliwością niż istotną rzeczywistością.Byłbym zadowolony, gdybym udowodnił, że się mylę w tej kwestii.
źródło
W funkcjonalnym stylu przepływ wartości przez program jest bardzo, bardzo widoczny (zarówno dla kompilatora, jak i programisty). Daje to kompilatorowi dużą swobodę w decydowaniu, gdzie przechowywać wartości, jak długo je przechowywać itd.
W imperatywnym języku kompilator obiecuje programiście model, w którym większość zmiennych odpowiada faktycznym lokalizacjom w pamięci, które pozostają przez określony czas. Potencjalnie każda instrukcja może odczytać (lub zapisać do!) Dowolną z tych lokalizacji, więc kompilator może jedynie zastąpić lokalizacje pamięci alokacją rejestru, scalić dwie zmienne w jedną lokalizację pamięci lub wykonać podobne optymalizacje po przeprowadzeniu drobiazgowej analizy tego, gdzie jeszcze w programie do tej zmiennej można się odwoływać.
Teraz są dwa zastrzeżenia:
Ale aby odpowiedzieć na ogólne pytanie, tak, funkcjonalny paradygmat daje kompilatorowi dużą swobodę w optymalizacji, której nie ma w bezwzględnie koniecznym otoczeniu.
źródło
main
jest to funkcja przekształcająca stan, a nie coś, co wykorzystuje sam stan.