Surviving MATLAB and R jako Hardcore Programmer [zamknięty]

25

Uwielbiam programować w językach, które wydają się być nastawione na hardkorowych programistów. (Moimi ulubionymi są Python i D.) MATLAB jest nastawiony na inżynierów, a R na statystów, i wygląda na to, że te języki zostały zaprojektowane dla ludzi, którzy nie są hardkorowymi programistami i nie myślą jak hardkorowi programiści. Zawsze uważam je za nieco niewygodne w użyciu i do pewnego stopnia nie mogę wskazać dlaczego. Oto niektóre problemy, które udało mi się zidentyfikować:

  • (Oba): ekstremalny nacisk na wektory i macierze do tego stopnia, że ​​nie ma prawdziwych prymitywów.
  • (Oba): trudność podstawowej manipulacji ciągiem.
  • (Oba): brak lub niezręczność w obsłudze podstawowych struktur danych, takich jak tabele skrótów i „rzeczywiste”, tj. Tablice parametryczne i zagnieżdżalne.
  • (Oba): Są naprawdę, bardzo powolne, nawet według interpretowanych standardów językowych, chyba że pochylisz się do tyłu, aby wektoryzować swój kod.
  • (Oba): Wydaje się, że nie zostały zaprojektowane do interakcji ze światem zewnętrznym. Na przykład oba są dość nieporęcznymi programami, których uruchomienie zajmuje trochę czasu i wydaje się, że nie zostały zaprojektowane w taki sposób, aby proste programy do filtrowania tekstu były łatwe do napisania. Co więcej, brak dobrego przetwarzania łańcucha powoduje, że operacje wejścia / wyjścia plików w niczym innym, jak bardzo standardowym formularzu są prawie niemożliwe.
  • (Oba): Wydaje się, że orientacja obiektu jest bardzo przykręcona. Tak, możesz to zrobić, ale nie wydaje się to bardziej idiotyczne niż OO w C.
  • (Oba): Nie ma oczywistego, prostego sposobu na uzyskanie typu odniesienia. Brak wskaźników lub odniesień do klasy. Na przykład nie mam pojęcia, w jaki sposób tworzysz własną listę z linkami w jednym z tych języków.
  • (MATLAB): Nie można umieścić wielu funkcji najwyższego poziomu w jednym pliku, zachęcając do bardzo długich funkcji i kodowania metodą wycinania i wklejania.
  • (MATLAB): Liczba całkowita najwyraźniej nie istnieje jako typ pierwszej klasy.
  • (R): Podstawowe wbudowane struktury danych wydają się zbyt wysokie i słabo udokumentowane i nigdy nie wydają się robić tego, czego oczekuję, biorąc pod uwagę moje doświadczenia z podobnymi, ale niższymi poziomami struktur danych.
  • (R): Dokumentacja jest rozrzucona po całym miejscu i przeglądanie lub wyszukiwanie jest praktycznie niemożliwe. Nawet D, który często jest powalany z powodu złej dokumentacji i wciąż jest dość alfa, jest znacznie lepszy, o ile wiem.
  • (R): Przynajmniej o ile mi wiadomo, nie ma dla niego dobrego IDE. Ponownie, nawet D, dość alfa-język z małą społecznością, radzi sobie lepiej.

Ogólnie rzecz biorąc, wydaje mi się, że MATLAB i R można łatwo zastąpić zwykłymi starymi bibliotekami w językach bardziej ogólnego przeznaczenia, jeśli istnieją wystarczająco kompleksowe biblioteki. Jest to szczególnie prawdziwe w nowszych językach ogólnego przeznaczenia, które zawierają wiele funkcji dla twórców bibliotek.

Dlaczego R i MATLAB wydają mi się takie dziwne? Czy zauważyłeś jakieś inne ważne problemy, które mogą sprawić, że te języki będą dziwne dla zapalonych programistów? Kiedy ich użycie jest konieczne, jakie są dobre wskazówki dotyczące przetrwania?

Edycja: Widzę jeden problem z niektórych otrzymanych odpowiedzi. Kiedy analizuję dane, mam silną osobistą preferencję, aby mieć jeden skrypt obejmujący cały potok. Oznacza to, że należy użyć języka ogólnego przeznaczenia. Nienawidzę pisania scenariusza, aby „wyczyścić” dane i wypluć je, a potem innego, aby odczytać je z powrotem w zupełnie innym środowisku, itp. Uważam, że korzystanie z MATLAB / R w niektórych pracach jest dla mnie bardzo trudne. inny język z zupełnie inną przestrzenią adresową i sposobem myślenia, aby reszta była ogromnym źródłem tarcia. Co więcej, wiem, że istnieją warstwy kleju, ale zawsze wydają się być strasznie skomplikowane i źródłem tarcia.

dsimcha
źródło
40
python został napisany dla programistów „hardkorowych”? kiedy to się stało?
TZHX 28.01.11
3
@TZHX: Ok, więc może hardcore to złe słowo. Lepszym wyrażeniem byłoby „ludzie, którzy są programistami i myślą jak programiści”.
dsimcha
17
Naprawdę nie lubię określenia „hardcorowy programista”. Wydaje się, że to jakaś forma elitaryzmu, a termin „programista ogólnego przeznaczenia” wystarczyłby, aby powiedzieć o tym samym.
blubb
5
Narzekasz, że R i Matlab nie są dla hardcorowych programistów, ale twoje skargi wydają się być takie, że nie jesteś wystarczająco hardkorowy, aby używać R i Matlaba. Jeśli chcesz pisać w języku, który nie pochodzi z rodziny Algol, musisz pomyśleć w jego kategoriach.
Peter Taylor
5
Ojej, moim drugim językiem programowania było Zgromadzenie. Python nie jest twardym rdzeniem - jest dokładnie na tym samym poziomie co R i Matlab. Zakładać, że inaczej jest nie rozumieć niczego poza Pythonem ... Python jest fantastyczny do programowania ogólnego przeznaczenia. Matlab jest świetny ze względu na wiele rzeczy, które Mathworks ułatwia. R jest świetny ze względu na nieporównywalne statystyki, uczenie maszynowe, przygotowanie danych, analizę i dostępne narzędzia wizualizacji (czyli statystyki). Perl's great b / c ... Po prostu rób tak, jak ja - ucz się ich wszystkich i wybierz odpowiedni do pracy. :)
Iterator

Odpowiedzi:

29

Prawdopodobnie złym pomysłem jest podejście do języków specyficznych dla domeny z nastawieniem wymaganym do programowania w ogóle lub do programowania programów ogólnych przy użyciu języków ogólnego przeznaczenia. Będąc specyficzne dla danej dziedziny, prawdopodobnie będą wymagały bardziej stromej krzywej uczenia się i niewygodnego nastawienia, aby można było je jak najlepiej wykorzystać. Uważam, że pisanie kodu w Matlabie jest równoznaczne z pisaniem wysoce zoptymalizowanego, specyficznego dla domeny kodu (na równi z na przykład pisaniem wydajnego i czystego kodu OpenGL). Widziałem też, jak coraz bardziej się zmieniają, aby stać się użytecznymi jako biblioteki do użycia w innych językach - patrz na przykład http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Powiedziałbym, użyj tego samego procesu dla tych DSL, jak dla innych:

  • Ostrożnie wybierz problemy, które rozwiązujesz za pomocą Matlaba lub R, aby upewnić się, że są to dokładnie te problemy, które najlepiej rozwiązują. Na przykład użyj Matlaba do manipulowania wektorami, a nie do końca swojej pracy, jeśli możesz tego uniknąć
  • Zasadniczo mieszaj / dopasowuj rozwiązanie, aby ograniczyć części, które programujesz w Matlabie lub R, do dokładnego podzbioru problemu, który są zbudowane do obsługi.
  • Kierując się typowym użytkownikiem w dziedzinie, dla której budowane są języki, projektując i budując swoje rozwiązanie - dostosuj na przykład matematyczne podejście do świata przed rozpoczęciem pracy nad programem Matlab; ewentualnie najpierw napisz swoją pracę na papierze, używając standardowej notacji matematycznej
  • Wykonaj dodatkową pracę wymaganą do zbudowania sobie wygodnego środowiska pracy i uzyskaj narzędzia wymagane do wykonania pracy, nawet jeśli różnią się od standardowego dla DSL. Jeśli jesteś użytkownikiem emacsa, na przykład rozważ użycie trybu matlab dla emacsa, aby wykonać swoją pracę; upewnij się, że działa tak samo, jak tryby ustawione dla innych języków
  • Przygotuj się na zmianę. Zwłaszcza, jeśli często powracasz do języka, upewnij się, że zbudowałeś niezawodny ekosystem, w którym praca wykonywana w DSL jest ograniczona tylko do pracy w danej dziedzinie i przejście na inny język jest tak proste, jak to możliwe. reszta twojej pracy. Przypomnij sobie częściej niż zwykle, aby poszukać sposobów wykonywania pracy innej niż DSL w innych systemach
Blueberryfields
źródło
3
To, co mówisz, ma doskonały sens i zazwyczaj jest to, jak robię rzeczy, gdy muszę używać Matlaba lub R. Frustrująca część tego to tarcie spowodowane koniecznością integracji wielu języków z wieloma sposobami robienia rzeczy i wieloma przestrzeniami adresowymi. Zwykle polega to na zrzucaniu rzeczy do plików tekstowych w pozornie arbitralnych punktach i odczytywaniu ich z powrotem lub używaniu kruchej, brzydkiej, trudnej do skonfigurowania warstwy kleju.
dsimcha
25

Przedmówię to zauważając, że znam MATLAB, ale nie R.

Powodem, dla którego MATLAB nie radzi sobie dobrze z OO, przetwarzaniem ciągów lub niestandardowymi strukturami danych, jest to, że nie jest przeznaczone do robienia takich rzeczy. Istnieje wiele języków dla OO, wiele, które wykonują dobrą robotę przy przetwarzaniu ciągów, i wiele innych, które obsługują szalone niestandardowe typy danych. Żaden z nich nie jest dobry w mnożeniu macierzy, ponieważ nie został do tego przeznaczony.

Po prostu optymalizacja operacji wektorowych i macierzowych wykonywanych przez MATLAB jest wystarczająco trudna bez radzenia sobie z typami lub wskaźnikami zdefiniowanymi przez użytkownika lub czymś innym (jeśli nie byłoby to trudne, nie byliby w stanie tyle za to zapłacić). Trudno jest też dodać obsługę szybkich wektorów do istniejących języków ogólnego przeznaczenia - dodaje to duży narzut dla funkcji, z której niewielu programistów kiedykolwiek skorzysta (zbyt niewielu programistów rozumie połączone listy, w jaki sposób mają korzystać z rozkładu wartości własnych? ).

MATLAB jest dla Ciebie tak obcy, ponieważ został zaprojektowany, aby umożliwić naukowcom i inżynierom bardzo szybkie mnożenie macierzy i obliczanie ODE. MATLAB nie zgadza się z twoją definicją języka „hardkorowego”, ponieważ nigdy nie miał tego robić. Próba myślenia o MATLAB w kategoriach Python lub D jest jak próba myślenia o LISP lub Haskell w kategoriach C lub o Verilog i VHDL w kontekście JavaScript --- rozwiązują różne problemy i podchodzą do rozwiązywania problemów na zupełnie odmienne sposoby. Szczerze mówiąc, MATLAB dokonał kilku (w porządku, wielu) dziwnych wyborów dotyczących projektowania języka, których po prostu nie mogę się oprzeć, nawet z perspektywy języka specyficznego dla domeny. Ale nie ma żadnego szczególnego powodu, dla którego astronom powinien dbać o to, by ciało niebieskie X znajdowało się dokładnie 48 jednostek AU od ciała niebieskiego Y w przeciwieństwie do 48,0 jednostek AU.

Teraz, na szczęście, na scenę wkraczają niektóre biblioteki, które działają dokładnie tak, jak sugerujesz: dobre wsparcie dla obliczeń naukowych w języku ogólnego przeznaczenia. W przypadku Pythona istnieje NumPy / Matplotlib, który ma pewne szorstkie krawędzie, ale poza tym zapewnia rozsądną funkcjonalność MATLAB w Pythonie. Powodem, dla którego nie istniały inne tego typu projekty, jest to, że biblioteki są niezwykle trudne do napisania i obsługiwać rynek już objęty MATLAB i FORTRAN.

Jeśli absolutnie musisz użyć MATLAB lub R, nie możesz podejść do programowania w nich jak „hardkorowy” programista, musisz podejść do niego jak „hardkorowy” naukowiec lub inżynier. Dla LISP, to nie myśleć w rekursji. W MATLAB musisz tylko myśleć w matrycach. Odśwież algebrę liniową ( wykłady MIT na ten temat są świetną recenzją). W przeciwnym razie jedynym sposobem na „przetrwanie” MATLAB jest praktyka rozpoznawania, kiedy pętlę można zastąpić operacją wektorową lub kiedy twój problem ogranicza się do znalezienia wartości własnych produktu zewnętrznego.

Hoa Long Tam
źródło
Tak, ogólnie uwielbiam Numpy / Scipy / Matplotlib i używam ich, ilekroć oczywistą alternatywą byłoby MATLAB / R. Moją jedyną skargą na to jest to, że nie są tak głębokie jak MATLAB / R, a ponieważ są Pythonem, wciąż są nieco powolne.
dsimcha
4
@dsimcha, jest to niepoprawne pod względem faktycznym . W tym badaniu wydajności Numpy jest na równi z MATLAB, a Pyrex jest w granicach 2 C ++.
wvoq
@wvoq: Wyjaśnienie: Miałem na myśli, że interpreter Pythona jest wolny, a nie Numpy. Wiem, że Numpy to głównie opakowanie dla BLAS i LAPACK, które są szybkie. Oczywiście nadal istnieje stały narzut związany z wywoływaniem tego kodu. Znam też Pyrex, Cython itp. I one pomagają, ale wciąż miksujesz języki na drobnym poziomie, a to wciąż może być źródłem tarcia.
dsimcha
2
@dsimcha, Koszt wywołania Numpy jest praktycznie stały. W badaniu wydajności, o którym wspomniałem, zyskujesz kilka dziesiątych sekundy dzięki C ++. Czas ten należy porównać do czasu spędzonego na pisaniu i debugowaniu oraz debugowaniu wywołań BLAS. Warto zapytać, dlaczego nie napisać wszystkiego w asemblerze? A może nawet prosty kod maszynowy, ponieważ konwersja z zestawu do kodu maszynowego powoduje pewne stałe koszty ogólne?
wvoq
3
@dsimcha Huh? Chcesz robić wszystko w jednym (szybkim) języku, najbardziej lubisz Python, a potem narzekasz na powolność Pythona? Więc o co chodzi. Wydaje mi się, że chcesz, aby MATLAB miał bardziej ogólne funkcje i był szybszy niż język tłumaczony?
Chris mówi Przywróć Monikę
14

Wielokrotne użycie terminu „hardcorowy programista” w odniesieniu do ciebie. wraz z twoją insynuacją, że projektanci R i MATLAB nie są , wydaje mi się bardzo głupiutki i zachęca ludzi, aby nie brali poważnie twojej krytyki.

Jeśli chcesz przeczytać poważną krytykę R., dobrze byłoby przeczytać ten utwór Rossa Ihaki, jednego z projektantów R. Wydaje mi się, że rdzeń jest znacznie trudniejszy do zaprojektowania R niż użycie D lub Python.

wvoq
źródło
2
-1. Nigdy nie chciałem sugerować, że projektanci MATLAB i R są kimś innym niż bardzo dobrymi, hardkorowymi programistami. MATLAB i R nie są jednak przeznaczone dla hardcorowych programistów.
dsimcha
3
„... wygląda na to, że te języki zostały zaprojektowane przez ludzi, którzy nie są hardkorowymi programistami i nie myślą jak hardkorowi”.
wvoq
6
Nadal nie wyjaśniłeś, czym jest „hardkorowy programista”. W twoich przykładach „hardcore” brzmi tak, jakby oznaczało „najwygodniej z C ++”, w którym to przypadku R i MATLAB z definicji nie będą hardcore. Prawie wszystkie twoje przykłady sprowadzają się do skarg, że te języki nie są tym, do czego jesteś przyzwyczajony, bez pytania, dlaczego eksperci w tych dziedzinach uznali je za odpowiednie do wdrożenia w ten sposób.
wvoq
1
Ponadto, pod względem definicji, myślałem, że to oczywiste, ale „hardkorowy programista” to po prostu ktoś, kto jest zaznajomiony z podstawowymi pojęciami programowania, takimi jak referencje / wskaźniki, orientacja obiektowa, funkcje lambda, podstawowe struktury danych itp. I jest przyzwyczajony do programowania w języku ogólnego przeznaczenia.
dsimcha
2
Po pierwsze, „hardcore” jest dość ładnym terminem, jeśli ma oznaczać „kogoś, kto zna podstawowe pojęcia z oo / programowania proceduralnego / funkcjonalnego”. Po drugie, nie mogę mówić w imieniu MATLAB, ale R ma wszystkie te rzeczy. Jedyną różnicą jest to, że w języku R zachęca cię język do taktowania problemu w taki sposób, że elementy słownictwa statystycznego stają się twoimi prymitywami. Powodem tego jest to, że statystycy i uczący się maszynowo często pracują z problemami łatwo wyrażonymi w ten sposób, co sprawia, że ​​R jest naturalnym dopasowaniem, nawet jeśli nie masz nic przeciwko „trudniejszym rdzeniom”.
wvoq
9

Skrajny nacisk na wektory i macierze do tego stopnia, że ​​nie ma prawdziwych prymitywów.

To zależy od tego, co nazywacie prawdziwym prymitywem. W R wektor jest prawdziwym prymitywem; to znaczy wszystkie zmienne są wektorami. Podobnie w MATLAB wszystkie zmienne są macierzami.

Trudność podstawowej manipulacji ciągiem.

W MATLAB manipulowanie ciągami znaków jest potężne, ale zgadzam się, że kod jest często brzydki i nieintuicyjny (przynajmniej na razie). Dla R istniejestringr pakiet, który jest równie przyjemny w użyciu, jak narzędzia w każdym innym języku.

Brak lub niezręczność w obsłudze podstawowych struktur danych, takich jak tabele skrótów i „rzeczywiste”, tj. Tablice parametryczne typu i zagnieżdżalne.

W R wektory mają nazwy, które działają jak skrót. Istnieją równieżhashfilehash pakiety i . Nie jestem pewien co do implementacji MATLAB, ale możesz łatwo wywoływać wersje JAVA lub .NET, jeśli chcesz.

Są naprawdę, bardzo powolne, nawet według interpretowanych standardów językowych, chyba że pochylisz się do tyłu, aby wektoryzować swój kod.

Po opanowaniu wektoryzacji (jestem pewien, że tak, jeśli jesteś naprawdę hardkorowy) przeklinasz konieczność używania pętli po powrocie do innych języków. Szybkość wykonania jest kompromisem dla szybkości programowania.

Wydaje się, że nie są zaprojektowane do interakcji ze światem zewnętrznym. Na przykład oba są dość nieporęcznymi programami, których uruchomienie zajmuje trochę czasu i wydaje się, że nie zostały zaprojektowane w taki sposób, aby proste programy do filtrowania tekstu były łatwe do napisania. Co więcej, brak dobrego przetwarzania łańcucha powoduje, że operacje wejścia / wyjścia plików w niczym innym, jak bardzo standardowym formularzu są prawie niemożliwe.

Oboje mogą odczytywać i zapisywać dane w praktycznie dowolnym formacie. Można je wywoływać z większości innych języków programowania. Lub z wiersza polecenia. Za ich pomocą możesz tworzyć GUI. Jak to nie wchodzi w interakcje ze światem zewnętrznym? Jeśli masz problem z programem do filtrowania tekstu, zapytaj o przepływ stosu.

Orientacja obiektu wydaje się być bardzo przykręcona. Tak, możesz to zrobić, ale nie wydaje się to bardziej idiotyczne niż OO w C.

Zgoda; są to przede wszystkim języki proceduralne.

Nie ma oczywistego, prostego sposobu na uzyskanie typu odniesienia. Brak wskaźników lub odniesień do klasy. Na przykład nie mam pojęcia, w jaki sposób tworzysz własną listę z linkami w jednym z tych języków.

Uzgodnione w R. W MATLAB odniesienia są nazywane uchwytami.

Nie można umieścić wielu funkcji najwyższego poziomu w jednym pliku, zachęcając do bardzo długich funkcji i kodowania metodą wycinania i wklejania.

Nonsens. Wystarczy utworzyć wiele plików.

Liczba całkowita najwyraźniej nie istnieje jako typ pierwszej klasy.

Oni robią. Zobacz int8, int16, int32i int64.

Podstawowe wbudowane struktury danych wydają się zbyt wysokie i słabo udokumentowane i nigdy nie wydają się robić tego, czego oczekuję, biorąc pod uwagę moje doświadczenia z podobnymi, ale niższymi poziomami struktur danych.

Nadają się do analizy danych. Podaj konkretne przykłady nieoczekiwanego zachowania.

Dokumentacja jest rozrzucona po całym miejscu i praktycznie niemożliwa do przeglądania lub wyszukiwania. Nawet D, który często jest powalany z powodu złej dokumentacji i wciąż jest dość alfa, jest znacznie lepszy, o ile wiem.

Istnieje wiele rodzajów dokumentacji. Start z ?some_function, RSiteSearch('some concept'), rseek.org oraz sosopakowania. Nie wspominając o instrukcjach dołączonych do instalacji. Lub dobra książka .

Przynajmniej o ile mi wiadomo, nie ma dla niego dobrego IDE. Ponownie, nawet D, dość alfa-język z małą społecznością, radzi sobie lepiej.

Wypróbuj Architect, RStudio lub Revolution Analytics IDE. Zobacz sekcję „IDE i edytory dla R” na stronie informacyjnej Przepełnienie stosu, aby uzyskać linki i więcej opcji.

Richie Cotton
źródło
3

MATLAB może być zintegrowany z Javą i C / C ++. Możesz zaimplementować wszystkie nienumeryczne obciążenia w tych językach i wywołać je z MATLAB.

ich użycie jest konieczne

Czy istnieje powód, dla którego jest to konieczne? Czy pracujesz na istniejącej bazie kodu MATLAB napisanej przez inne osoby? Czy to wymaga pracy? (lub wymaganie dotyczące klasy, jeśli jesteś w szkole) Jeśli nie, możesz zamiast tego rozważyć użycie SciPy lub NumPy.

Niestety, moim osobistym zdaniem, jeśli ta sytuacja zostanie narzucona komuś, nie zawsze da się to przeżyć. Nawet na studiach nie każdy student inżynierii może przyzwyczaić się do sposobu myślenia obliczeniowego MATLAB.

rwong
źródło
2
Jestem świadomy tych rozwiązań, ale wydają się one dość zacofane. Chciałbym wywołać MATLAB z C ++, Java itp., A nie na odwrót. Chciałbym, aby cokolwiek oprócz MATLAB-a było moim językiem „kierowcy”.
dsimcha
2
@dsimcha możesz wywoływać biblioteki MATLAB i R z C. Patrz mathworks.com/help/techdoc/matlab_external/f38569.html lub math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
Charles E. Grant
0

Pracuję z MATLAB, Python i C (a czasem C ++) i uważam się za (przede wszystkim) programistę, siedzącego naprzeciw kolegów, którzy zwykle są naukowcami danych, matematykami lub innymi specjalistami od domen.

Chociaż jako pierwszy przyznałbym, że nie jest to język programowania ogólnego przeznaczenia w tym sensie, że C lub Python, tak naprawdę lubię pisać skrypty w MATLAB-ie, szczególnie w takich rzeczach jak analiza szeregów czasowych lub przetwarzanie obrazów.

Jest kilka cech języka, które, choć generalnie wdrażane dość nieefektywnie, są przyjemne w użyciu. Weźmy na przykład indeksowanie logiczne: mogę utworzyć wektor logiczny lub matrycę, która wybierze interesujący region i nazwać go „isInROI”, wykonując operację filtrowania w celu wybrania elementów z wektora lub macierzy „dane” w tym regionie to następnie wystarczy napisać: „roiData = data (isInROI)”.

Właśnie takie chwile naprawdę sprawiają, że doceniam MATLAB i pozwalają mi przeoczyć inne, liczne i szeroko dyskutowane grzechy.

William Payne
źródło
Zauważ, że numpy ma również indeksowanie logiczne: docs.scipy.org/doc/numpy/user/…
jarondl