Uwaga: poniższy post może zawierać kontrowersyjne opinie, więc pamiętaj, że są to tylko moje opinie i nie mają na celu nikogo urazić.
Programuję w takiej czy innej formie od około 1999 roku. Początkowo używałem R, a potem, około 2004 roku, przełączyłem się głównie na Python.
Na przykład w wielu aplikacjach naukowych symulacja, w tym np. MCMC, zarówno R, jak i Python są zbyt wolne i należy je przyspieszyć. Zwykle jest to możliwe dzięki rozszerzeniu w C lub C ++. Zarówno dla R, jak i Pythona, właśnie to zrobiłem, używając R API C z C ++ i biblioteki Boost Python z Pythonem.
Jednak z różnych powodów ta kombinacja nie jest idealnym rozwiązaniem. Co jest ważne w programowaniu, szczególnie algorytmach? Ekspresyjność i szybkość, które są oczywiście powiązane. Im bardziej ekspresyjny jest język, tym szybciej można w nim pisać.
1) Jeśli chodzi o ekspresję, ani R, ani Python nie są moim zdaniem idealne do pisania algorytmów naukowych. Nie mapują ściśle algorytmu bazowego. Jednak oba są znacznie lepsze niż C ++.
2) Lubię pisać w języku Python, który jest przyjemnym językiem, chociaż, jak wspomniano powyżej, nie jest idealny do pracy algorytmicznej. Jednak gdy trzeba pracować z kombinacją Python / C ++ z powodu problemów z prędkością, ta mieszanka staje się znacznie mniej przyjemna w pracy. Zwykle dzieje się tak, że najpierw piszę w Pythonie, a gdy mam już coś, co działa dobrze, często odkrywam, że jest on zbyt wolny (dla niektórych subiektywnych wartości zbyt wolnych). Następnie podejmuję decyzję, czy poświęcić trochę nieuzasadnionego czasu na przepisywanie go w C ++, czy pogodzić się ze spowolnieniem. Z perspektywy czasu często wydaje mi się, że lepiej byłoby znosić powolność, zwłaszcza że uzyskane przyspieszenia są nieprzewidywalne. Ponadto interfejs Boost Python między nimi powoduje znaczny ból głowy związany z utrzymaniem, a sklejenie kodu w dwóch różnych językach jest po prostu rozpraszające. Brak krytyki dotyczącej Boost Pythona, jest on tak potężnym interfejsem, jak można sobie wyobrazić, i właściwie działa przez większość czasu.
Teraz, w idealnym świecie, z nieograniczonym czasem i zasobami, żaden z tych problemów nie byłby poważnym problemem. Jednak w projektach naukowych, nad którymi pracowałem, miałem następujące doświadczenie.
Bez względu na to, czy mam współpracowników przy projekcie, zawsze wydaje mi się, że wykonuję zdecydowaną większość obliczeń. W sumie 5 znaczących projektów miałem znaczący udział tylko jednej osoby w jednym projekcie. Ta jedna osoba zrobiła więcej niż tylko podniosła swój ciężar; zrobił tak samo jak ja lub więcej. Jednak we wszystkich innych przypadkach, w tym w projektach z wieloma współpracownikami, wykonałem (praktycznie) całą pracę obliczeniową. Chociaż mogę powiedzieć, że nie zostałem pobłogosławiony najlepszymi współpracownikami (wydaje się to mieszanką lenistwa i niekompetencji), nie jest dla mnie jasne, czy ten stan rzeczy może się zmienić w przyszłości.
Obliczeniowa praca naukowa to ogromny wysiłek, a jeśli nie mogę zmienić zachowania moich współpracowników, mogę zmienić sposób pracy. Najważniejsze ulepszenie polegałoby na szybszym wykonywaniu zadań. Co sprowadza mnie tutaj do głównej uwagi, a mianowicie, że zmiana języka na coś mniej ortodoksyjnego może pomóc. Na podstawie wcześniejszych badań najbardziej prawdopodobnymi kandydatami w kolejności prawdopodobieństwa są Common Lisp i Ocaml. Myślałem o tym od lat, ale ostatnio poważniej o tym myślałem.
O ile wiem, niewiele osób używa CL lub Ocaml do obliczeń naukowych. Podczas przeszukiwania tej witryny znalazłem dwa odniesienia do CL (jeden był mój) i jeden do Ocaml (mój). Przez lata miałem kilka zachęcających kontaktów z odważnymi ludźmi pracującymi na marginesie. W 2008 roku natknąłem się na recenzję książki „Practical Common Lisp” Petera Seibela (której jestem właścicielem) autorstwa Tamas K. Papp. To przykuło moją uwagę, ponieważ był to jeden z niewielu wzmianek o naukowym informatyce dla Lisp, z którym się spotkałem w sieci. Napisałem do Tamasa, który natychmiast odpowiedział pomocnie i zachęcająco. Cytując go
Moja produktywność programowa prawdopodobnie wzrosła dziesięciokrotnie wraz z Lispem, ale wydarzyło się to około roku i wciąż się uczę (chociaż po 2 miesiącach radziłem sobie całkiem nieźle). Więc jeśli pracujesz nad czymś krytycznym czasowo, odłóż przełącznik.
Powinieneś zastanowić się nad pytaniem ludzi o cll, nie jestem jedynym, który wie o tych rzeczach, inni zajmują się obliczeniami naukowymi na Lisp.
Ma także blog i stronę GitHub .
Inną osobą, z którą krótko korespondowałem (w grudniu 2006 r.) Była Ira Kalet , która używała Common Lisp w kontekście radioterapii onkologicznej.
Być może są inni, którzy zajmują się obliczeniami naukowymi na Lisp, ale nie znam nikogo.
Najczęstszym problemem, na który powołują się CL, jest brak bibliotek. Jest to poważny problem w obliczeniach ogólnego przeznaczenia, ale może nie być tak bardzo w obliczeniach naukowych, szczególnie od podstaw implementacji algorytmów. W szczególności przez większość czasu mogę uzyskać podstawową bibliotekę matematyczną, w tym funkcje rozkładu prawdopodobieństwa, wielowymiarową bibliotekę tablicową i podstawowy zestaw kontenerów, np. Map, set, list itp., Które znajdują się w standardowych bibliotekach C ++ i Python.
Wiem jeszcze mniej o Ocaml niż o CL, ale wrzuciłem to jako alternatywę. Jest podobno bardzo szybki, ma jedną darmową implementację francuskich naukowców i wydaje się być najbardziej przydatną z rodziny języków ML do obliczeń naukowych.
Podsumowując, zastanawiam się, czy inni mają z tym doświadczenie i jakie mają myśli, jeśli w ogóle.
EDYCJA: Najbardziej interesują mnie doświadczenia z pierwszej ręki w kontekście problemów, które omówiłem powyżej. Np. Jeśli używałeś Pythona i C ++ (lub R i C ++) i przeniosłeś się na bardziej niejasny język, byłbym najbardziej zainteresowany usłyszeniem o twoich doświadczeniach.