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.
Odpowiedzi:
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:
źródło
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.
źródło
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.
źródło
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.
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 istnieje
stringr
pakiet, który jest równie przyjemny w użyciu, jak narzędzia w każdym innym języku.W R wektory mają nazwy, które działają jak skrót. Istnieją również
hash
filehash
pakiety i . Nie jestem pewien co do implementacji MATLAB, ale możesz łatwo wywoływać wersje JAVA lub .NET, jeśli chcesz.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.
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.
Zgoda; są to przede wszystkim języki proceduralne.
Uzgodnione w R. W MATLAB odniesienia są nazywane uchwytami.
Nonsens. Wystarczy utworzyć wiele plików.
Oni robią. Zobacz
int8
,int16
,int32
iint64
.Nadają się do analizy danych. Podaj konkretne przykłady nieoczekiwanego zachowania.
Istnieje wiele rodzajów dokumentacji. Start z
?some_function
,RSiteSearch('some concept')
, rseek.org orazsos
opakowania. Nie wspominając o instrukcjach dołączonych do instalacji. Lub dobra książka .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.
źródło
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.
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.
źródło
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.
źródło