Sopravvivere a MATLAB e R come programmatore hardcore [chiuso]

24

Adoro programmare in linguaggi che sembrano orientati verso programmatori esperti. (I miei preferiti sono Python e D.) MATLAB è orientato verso gli ingegneri e R è orientato verso gli statistici, e sembra che questi linguaggi siano stati progettati per persone che non sono programmatori esperti e non pensano come programmatori esperti. Li trovo sempre un po 'scomodi da usare, e in una certa misura non riesco a capire perché. Ecco alcuni problemi che sono riuscito a identificare:

  • (Entrambi): l'estrema enfasi su vettori e matrici nella misura in cui non ci sono veri primitivi.
  • (Entrambi): la difficoltà della manipolazione della stringa di base.
  • (Entrambi): Mancanza o difficoltà nel supporto delle strutture di dati di base come le tabelle hash e "reali", cioè di tipo parametrico e nestable, array.
  • (Entrambi): sono davvero molto lenti anche per gli standard linguistici interpretati, a meno che non ti pieghi all'indietro per vettorializzare il tuo codice.
  • (Entrambi): Sembra che non siano progettati per interagire con il mondo esterno. Ad esempio, entrambi sono programmi abbastanza voluminosi che richiedono un po 'di tempo per essere lanciati e sembrano non essere progettati per semplificare la scrittura di semplici programmi di filtro di testo. Inoltre, la mancanza di una buona elaborazione delle stringhe rende l'I / O dei file in qualsiasi forma, ma quasi standard, praticamente impossibile.
  • (entrambi): l'orientamento degli oggetti sembra avere una sensazione molto serrata. Sì, puoi farlo, ma non sembra molto più idiomatico di OO in C.
  • (Entrambi): nessun modo ovvio e semplice per ottenere un tipo di riferimento. Nessun riferimento o riferimento di classe. Ad esempio, non ho idea di come esegui il rollover della tua lista collegata in nessuna di queste lingue.
  • (MATLAB): non è possibile inserire più funzioni di primo livello in un singolo file, incoraggiando funzioni molto lunghe e codifica di copia e incolla.
  • (MATLAB): gli interi in teoria non esistono come un tipo di prima classe.
  • (R): le strutture di base dei dati incorporati sembrano troppo di alto livello e scarsamente documentate, e non sembrano mai fare esattamente quello che mi aspetto data la mia esperienza con strutture di dati simili ma di livello inferiore.
  • (R): la documentazione è diffusa ovunque e praticamente impossibile da navigare o cercare. Anche D, che è spesso battuto per cattiva documentazione ed è ancora abbastanza alfa, è sostanzialmente migliore per quanto posso dire.
  • (R): Almeno per quanto ne so, non esiste un IDE valido per questo. Ancora una volta, anche D, un linguaggio abbastanza alfa con una piccola comunità, fa meglio.

In generale, mi sento anche come se MATLAB e R potessero essere facilmente sostituiti da semplici vecchie librerie in linguaggi più generici, se esistessero librerie sufficientemente complete. Ciò è particolarmente vero nelle nuove lingue di uso generale che includono molte funzionalità per i writer di librerie.

Perché R e MATLAB sembrano così strani per me? Ci sono altri problemi importanti che hai notato che potrebbero rendere questi linguaggi così strani ai programmatori più accaniti? Quando è necessario il loro uso, quali sono alcuni buoni consigli per la sopravvivenza?

Modifica: vedo un problema da alcune delle risposte che ho ottenuto. Ho una strong preferenza personale, quando analizzo i dati, di avere uno uno script che incorpori l'intera pipeline. Ciò implica che è necessario utilizzare un linguaggio generico. Odio dover scrivere uno script per "ripulire" i dati e sputarli, poi un altro per leggerli in un ambiente completamente diverso, ecc. Trovo l'attrito di usare MATLAB / R per alcuni dei miei lavori e completamente un linguaggio diverso con uno spazio di indirizzamento completamente diverso e un modo di pensare per il resto come un'enorme fonte di attrito. Inoltre, so che esistono strati di colla che esistono, ma sembrano sempre essere orribilmente complicati e fonte di attrito.

    
posta dsimcha 28.01.2011 - 01:42
fonte

6 risposte

29

Probabilmente è una cattiva idea approcciare linguaggi specifici di dominio con la mentalità necessaria per la programmazione in generale o per programmare programmi generali con linguaggi di uso generale. Essendo specifici del dominio, probabilmente richiederanno una curva di apprendimento più ripida e una mentalità scomoda per essere utilizzati in modo più efficiente. Considero la scrittura di codice in Matlab equivalente alla scrittura di codice altamente specifico, dominio specifico (alla pari, per esempio, della scrittura di codice OpenGL efficiente e pulito). Li ho visti anche spostarsi sempre più verso l'utilizzo come librerie da utilizzare in altri linguaggi - vedi, ad esempio, link

Direi, usa lo stesso processo per questi DSL come faresti per qualsiasi altro:

  • Seleziona attentamente i problemi che stai risolvendo usando Matlab o R, per assicurarti che siano esattamente i tipi di problemi che sono più adatti a risolvere. Ad esempio, usa Matlab per manipolare i tuoi vettori, e non per il resto del tuo lavoro, se puoi evitarlo
  • Generalmente, mescolare / abbinare la soluzione per limitare le parti programmate in Matlab o R al sottoinsieme esatto del problema che sono costruito per gestire.
  • Segui la mentalità di un utente tipico nel dominio le lingue sono costruite per, quando progettare e costruire la tua soluzione - adattare un atteggiamento vettore-matematica verso il mondo precedente iniziando a lavorare su un programma Matlab, per esempio; possibilmente scrivere il tuo lavora su carta, usando la matematica standard notazione, prima
  • Fai il lavoro extra necessario per costruirti un ambiente di lavoro constrongvole, e ottenere gli strumenti necessari per fare il lavoro, anche se diverso dal standard per la DSL. Se sei un per esempio, un utente di emacs usando la modalità MATLAB per fare emacs il vostro lavoro; assicurati che funzioni pure come le modalità che hai impostato per gli altri lingue
  • Siate pronti a uscire. Soprattutto se devi tornare spesso alla lingua, assicurati di costruisci un ecosistema affidabile dove è il lavoro che fai nella DSL contenuto nel dominio specifico lavoro, solo, ed è facile come possibile passare a un altro lingua per il resto del tuo lavoro. Ricorda te stesso, più spesso di al solito, per cercare modi per fare il lavoro specifico non DSL in altro sistemi
risposta data 28.01.2011 - 02:56
fonte
24

Premetto che ho familiarità con MATLAB, ma non con R.

Il motivo per cui MATLAB non funziona bene con OO, elaborazione di stringhe o strutture dati personalizzate è che non è inteso a fare quelle cose. Esistono molte lingue per OO, molti che fanno un buon lavoro con l'elaborazione delle stringhe e molti altri che supportano pazzi tipi di dati personalizzati. Nessuno di questi è buono per la moltiplicazione della matrice, perché non sono stati progettati per questo.

Semplicemente ottimizzando le operazioni vettoriali e matriciali che MATLAB fa è abbastanza difficile senza occuparsi di tipi definiti dall'utente o puntatori o cosa no (se non fosse difficile, non sarebbero in grado di caricare così tanto per esso). È anche difficile aggiungere il supporto vettoriale veloce ai linguaggi generici esistenti, aggiungendo un notevole sovraccarico per una funzionalità che pochi programmatori utilizzeranno mai (troppo pochi programmatori comprendono gli elenchi collegati, come si prevede che utilizzino la decomposizione degli autovalori? ).

MATLAB ti è così estraneo perché è stato progettato per consentire agli scienziati e agli ingegneri di eseguire calcoli di moltiplicazione della matrice e ODE molto velocemente. MATLAB non è all'altezza della tua definizione di un linguaggio "hardcore" perché non è mai stato previsto. Cercare di pensare a MATLAB in termini di Python o D è come cercare di pensare a LISP o Haskell in termini di C o di Verilog e VHDL in termini di JavaScript --- risolvono diversi problemi e affrontano la risoluzione dei problemi in modi radicalmente diversi. Per essere onesti, MATLAB ha fatto alcune (okay, molte) bizzarre scelte di linguaggio-linguaggio che non riesco a capovolgere, anche dal punto di vista di un linguaggio specifico del dominio. Ma non c'è una ragione particolare per cui un astronomo dovrebbe preoccuparsi che il corpo celeste X sia esattamente 48 AU lontano dal corpo celeste Y rispetto a 48,0 UA. Tutte le misurazioni scientifiche contengono alcuni errori ed è assurdo affermare (dal punto di vista del cliente medio di MATLAB) che una determinata quantità è un numero intero e non un numero reale con una componente frazionaria molto piccola.

Ora, per fortuna, alcune biblioteche stanno arrivando sulla scena che fanno esattamente quello che suggerisci: un buon supporto per il calcolo scientifico in un linguaggio generico. Per Python, c'è NumPy / Matplotlib che ha alcuni spigoli, ma fornisce comunque una ragionevole funzionalità MATLAB all'interno di Python. La ragione per cui non ci sono altri progetti come questo è che le librerie sono incredibilmente difficili da scrivere e servire un mercato già coperto da MATLAB e FORTRAN.

Se devi assolutamente usare MATLAB o R, non puoi avvicinarti alla programmazione come un programmatore "hardcore", devi affrontarlo come uno scienziato o un ingegnere "hardcore". Per LISP, hai pensa in ricorsione. In MATLAB, devi solo pensare nelle matrici. Ripassa l'algebra lineare ( le lezioni del MIT sull'argomento sono un ottima recensione). Altrimenti, l'unico modo per "sopravvivere" a MATLAB è con la pratica di riconoscere quando un loop può essere sostituito con un'operazione vettoriale o quando il problema si riduce alla ricerca degli autovalori di un prodotto esterno.

    
risposta data 28.01.2011 - 07:00
fonte
14

Il tuo uso ripetuto del termine "programmatore hardcore" in riferimento a te stesso. insieme alla tua insinuazione che i designer di R e MATLAB sono non , mi sembra molto sciocco e incoraggia le persone a non prendere sul serio le tue critiche.

Se vuoi leggere alcune critiche serie di R, faresti bene a leggere questo pezzo di Ross Ihaka, uno dei designer di R. Mi sembra molto più difficile per me design R che per usare D o Python.

    
risposta data 25.07.2011 - 21:45
fonte
9

The extreme emphasis on vectors and matrices to the extent that there are no true primitives.

Dipende da ciò che chiami un vero primitivo. In R, un vettore è un vero primitivo; cioè, tutte le variabili sono vettori. Allo stesso modo, in MATLAB tutte le variabili sono matrici.

The difficulty of basic string manipulation.

In MATLAB, la manipolazione delle stringhe è potente ma concordo sul fatto che il codice sia spesso brutto e non intuitivo (almeno per ora). Per R, c'è il pacchetto stringr , che è bello da usare come strumenti in qualsiasi altra lingua.

Lack of or awkwardness in support for basic data structures like hash tables and "real", i.e. type-parametric and nestable, arrays.

In R, i vettori hanno nomi che funzionano come un hash. Ci sono anche i pacchetti hash e filehash . Non sei sicuro delle implementazioni di MATLAB, ma puoi chiamare facilmente le versioni di JAVA o .NET, se lo desideri.

They're really, really slow even by interpreted language standards, unless you bend over backwards to vectorize your code.

Una volta che hai appreso la vettorizzazione (sono sicuro che lo farai, se sei davvero hardcore) maledirai di dover usare loop quando torni ad altre lingue. La velocità di esecuzione è un compromesso per la velocità di programmazione.

They seem to not be designed to interact with the outside world. For example, both are fairly bulky programs that take a while to launch and seem to not be designed to make simple text filter programs easy to write. Furthermore, the lack of good string processing makes file I/O in anything but very standard forms near impossible.

Entrambi possono leggere e scrivere dati praticamente in qualsiasi formato. Possono essere entrambi chiamati dalla maggior parte degli altri linguaggi di programmazione. O da un prompt dei comandi. Puoi creare GUI con loro. Come non interagire con il mondo esterno? Se stai lottando con il tuo programma di filtro di testo, chiedi su StackOverflow.

Object orientation seems to have a very bolted-on feel. Yes, you can do it, but it doesn't feel much more idiomatic than OO in C.

concordati; sono principalmente lingue procedurali.

No obvious, simple way to get a reference type. No pointers or class references. For example, I have no idea how you roll your own linked list in either of these languages.

Concordato in R. In MATLAB, i riferimenti sono chiamati handle.

You can't put multiple top level functions in a single file, encouraging very long functions and cut-and-paste coding.

Sciocchezze. Crea solo più file.

Integers apparently don't exist as a first class type.

Lo fanno. Visualizza int8 , int16 , int32 e int64 .

The basic builtin data structures seem way too high level and poorly documented, and never seem to do quite what I expect given my experience with similar but lower level data structures.

Sono adatti per fare analisi dei dati. Si prega di fornire esempi specifici di comportamento imprevisto.

The documentation is spread all over the place and virtually impossible to browse or search. Even D, which is often knocked for bad documentation and is still fairly alpha-ish, is substantially better as far as I can tell.

Ci sono molti tipi di documentazione. Inizia con ?some_function , RSiteSearch('some concept') , rseek.org e il pacchetto sos . Per non parlare dei manuali forniti con l'installazione. Oppure un buon libro .

At least as far as I'm aware, there's no good IDE for it. Again, even D, a fairly alpha-ish language with a small community, does better.

Prova Architect o RStudio o l'IDE di Revolution Analytics. Consulta la sezione "IDE e editor per R" della pagina di informazioni sugli overflow dello stack per link e altre opzioni.

    
risposta data 24.08.2011 - 14:25
fonte
3

MATLAB può essere integrato con Java e C / C ++. È possibile implementare tutto il carico di lavoro non numerico in queste lingue e richiamarli da MATLAB.

their use is necessary

C'è una ragione per cui è necessario? Stai lavorando su una base di codice MATLAB esistente scritta da altre persone? È un requisito di lavoro? (o requisito di classe se ti trovi a scuola) In caso contrario, potresti prendere in considerazione l'utilizzo di SciPy o NumPy.

Sfortunatamente, secondo la mia opinione personale, se questa situazione viene imposta a qualcuno, non è sempre possibile sopravvivere. Anche al college, non tutti gli studenti di ingegneria possono abituarsi al modo di pensare computazionale MATLAB.

    
risposta data 28.01.2011 - 13:35
fonte
0

Lavoro con MATLAB, Python e C (e talvolta C ++), e mi considero uno (principalmente) uno sviluppatore di software, seduto di fronte a colleghi che tendono a essere scienziati di dati, matematici o altri specialisti di dominio.

Anche se sarei il primo ad ammettere che non è un linguaggio di programmazione generico nel senso che C o Python è, in realtà mi diverto molto a scrivere script in MATLAB, in particolare per cose come l'analisi di serie temporali o l'immagine elaborazione.

Ci sono un paio di funzioni del linguaggio che, sebbene generalmente implementate in modo abbastanza inefficiente, sono una gioia da usare. Ad esempio, prendi l'indicizzazione logica: posso creare un vettore logico o una matrice che seleziona una regione di interesse e chiamarla "isInROI", eseguendo un'operazione di filtro per selezionare elementi dal vettore o dalla matrice "dati" in quella regione è quindi semplicemente una questione di scrittura: "roiData = data (isInROI)".

Sono momenti come questo che mi fanno davvero apprezzare MATLAB e mi permettono di ignorare i suoi altri, numerosi e discussi peccati.

    
risposta data 02.08.2012 - 19:10
fonte

Leggi altre domande sui tag