Sopravvivere a MATLAB e R come programmatore hardcore [chiuso]


25

Adoro programmare in linguaggi che sembrano orientati verso programmatori hardcore. (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 le persone che non sono programmatori hardcore e non pensano come programmatori hardcore. Li trovo sempre un po 'imbarazzanti 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 vere primitive.
  • (Entrambi): la difficoltà della manipolazione di base delle stringhe.
  • (Entrambi): mancanza o imbarazzo nel supporto di strutture di dati di base come tabelle hash e array "reali", cioè di tipo parametrico e annidabili.
  • (Entrambi): sono molto, molto lenti anche per gli standard linguistici interpretati, a meno che non ti pieghi all'indietro per vettorializzare il tuo codice.
  • (Entrambi): sembrano non essere progettati per interagire con il mondo esterno. Ad esempio, entrambi sono programmi piuttosto ingombranti che richiedono un po 'di tempo per avviarsi e sembrano non essere progettati per rendere semplici i programmi di filtro di testo facili da scrivere. Inoltre, la mancanza di una buona elaborazione delle stringhe rende quasi impossibile l'I / O dei file in forme tutt'altro che standard.
  • (Entrambi): l'orientamento agli 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 puntatore o riferimenti di classe. Ad esempio, non ho idea di come si arrotoli il proprio elenco di collegamenti in una di queste lingue.
  • (MATLAB): non è possibile inserire più funzioni di livello superiore in un singolo file, incoraggiando funzioni molto lunghe e codifica taglia e incolla.
  • (MATLAB): gli interi apparentemente non esistono come tipo di prima classe.
  • (R): Le strutture di dati incorporate di base 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 in tutto il luogo e praticamente impossibile da navigare o cercare. Perfino D, che spesso viene scartato per cattiva documentazione ed è ancora abbastanza alfa-ish, è sostanzialmente migliore per quanto posso dire.
  • (R): Almeno per quanto ne so, non esiste un IDE valido per questo. Ancora una volta, anche D, una lingua alfa-ish con una piccola comunità, fa di meglio.

In generale, sento anche che MATLAB e R potrebbero essere facilmente sostituiti da semplici librerie vecchie in linguaggi più generici, se esistessero librerie sufficientemente complete. Ciò è particolarmente vero nei linguaggi di uso generale più recenti che includono molte funzionalità per gli scrittori di biblioteche.

Perché R e MATLAB mi sembrano così strani? Ci sono altri problemi importanti che hai notato che potrebbero rendere strani questi linguaggi strani per i programmatori hardcore? Quando è necessario il loro uso, quali sono alcuni buoni consigli di sopravvivenza?

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


40
python è ora scritto per programmatori "hardcore"? quando sarebbe successo?
TZHX,

3
@TZHX: Ok, quindi forse hardcore era la parola sbagliata. Una frase migliore sarebbe "persone che sono programmatori e pensano come programmatori".
dsimcha,

17
Non mi piace molto il termine "programmatore hardcore". Sembra una sorta di elitarismo e il termine "programmatore per scopi generici" sarebbe bastato a fare lo stesso punto.
Blubb,

5
Ti stai lamentando che R e Matlab non sono per programmatori hardcore, ma le tue lamentele sembrano essere che non sei abbastanza hardcore da usare R e Matlab. Se vuoi scrivere in una lingua che non appartiene alla famiglia Algol, devi pensare nei suoi termini.
Peter Taylor,

5
Accidenti, il mio secondo linguaggio di programmazione era Assembly. Python non è un hard core: è esattamente allo stesso livello di R e Matlab. Supporre che sia diverso è non capire molto al di là di Python ... Python è fantastico per la programmazione generale. Matlab è eccezionale per via delle molte cose che Mathworks semplifica. R è eccezionale a causa degli strumenti incomparabili di statistica, apprendimento automatico, preparazione dei dati, analisi e visualizzazione disponibili (ovvero statistiche). Il grande b / c di Perl ... Fai come me, impara tutti e scegli quello giusto per il lavoro. :)
Iteratore

Risposte:


29

Probabilmente è una cattiva idea avvicinarsi a linguaggi specifici di dominio con la mentalità necessaria per la programmazione in generale o per programmare programmi generali con linguaggi generici. Essendo specifici per il dominio, avranno probabilmente bisogno di una curva di apprendimento più ripida e di una mentalità scomoda per essere utilizzati in modo più efficiente. Considero la scrittura di codice in Matlab equivalente alla scrittura di codice altamente ottimizzato, specifico per il dominio (alla pari, ad esempio, con la scrittura di codice OpenGL efficiente e pulito). Li ho anche visti diventare sempre più utili come librerie da usare in altre lingue - vedi, ad esempio, http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

Direi, utilizzare lo stesso processo per questi DSL come faresti per tutti gli altri:

  • Seleziona con attenzione i problemi che stai risolvendo usando Matlab o R, per assicurarti che siano esattamente i tipi di problemi che sono i migliori 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 state create per gestire.
  • Segui la mentalità di un tipico utente nel dominio per cui sono state create le lingue, quando progetti e costruisci la tua soluzione - adatta un atteggiamento matematico vettoriale verso il mondo prima di iniziare a lavorare su un programma Matlab, per esempio; possibilmente scrivere il tuo lavoro su carta, usando prima la notazione matematica standard
  • Fai il lavoro extra necessario per costruirti un ambiente di lavoro confortevole e ottieni gli strumenti necessari per svolgere il lavoro, anche se diverso dallo standard per la DSL. Se sei un utente emacs, ad esempio, considera di utilizzare la modalità matlab per emacs per fare il tuo lavoro; assicurati che funzioni così come le modalità che hai impostato per altre lingue
  • Preparati a uscire. Soprattutto se devi tornare spesso nella lingua, assicurati di costruirti un ecosistema affidabile in cui il lavoro che fai nel DSL è contenuto solo per il lavoro specifico del dominio ed è il più semplice possibile passare a un'altra lingua per il resto del tuo lavoro. Ricordati, più spesso del solito, di cercare modi per svolgere il lavoro non DSL specifico in altri sistemi

3
Quello che dici ha perfettamente senso ed è in genere come faccio le cose quando devo usare Matlab o R. La parte frustrante di questo è l'attrito causato dalla necessità di integrare più lingue con più modi di fare le cose e più spazi di indirizzi. Di solito, ciò comporta il download di oggetti in file di testo in punti apparentemente arbitrari e la loro lettura, o l'utilizzo di alcuni strati di colla fragili, brutti, difficili da configurare.
dsimcha,

25

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

Il motivo per cui MATLAB non funziona bene con OO, elaborazione di stringhe o strutture di dati personalizzate è che non è destinato a fare queste cose. Esistono molte lingue per OO, molte che fanno un buon lavoro con l'elaborazione delle stringhe e molte altre che supportano tipi di dati personalizzati pazzi. Nessuno di loro è bravo a moltiplicare la matrice, perché non è stato progettato per questo.

Semplicemente ottimizzare le operazioni vettoriali e matriciali che MATLAB fa è abbastanza difficile senza occuparsi di tipi o puntatori definiti dall'utente o cosa no (se non fosse difficile, non sarebbero in grado di caricare così tanto per questo). È difficile anche aggiungere un supporto vettoriale veloce ai linguaggi generici esistenti --- aggiunge un grande sovraccarico per una funzione che pochi programmatori useranno mai (troppo pochi programmatori comprendono gli elenchi collegati, come ci si aspetta che utilizzino la decomposizione autovalutazione? ).

MATLAB è così estraneo a te perché è stato progettato per consentire a scienziati e ingegneri di eseguire moltiplicazioni di matrice e calcoli ODE molto velocemente. MATLAB non è all'altezza della tua definizione di linguaggio "hardcore" perché non avrebbe mai dovuto farlo. Cercare di pensare a MATLAB in termini di Python o D è come provare a pensare a LISP o Haskell in termini di C o a Verilog e VHDL in termini di JavaScript --- risolvono problemi diversi e affrontano il problem solving in modi radicalmente diversi. Ad essere sinceri, MATLAB ha fatto alcune (bizzarre,) bizzarre scelte di design del linguaggio che non riesco proprio a capire, anche dal punto di vista di un linguaggio specifico del dominio. Ma non c'è un motivo particolare per cui un astronomo dovrebbe preoccuparsi che il corpo celeste X sia esattamente a 48 UA dal corpo celeste Y rispetto a 48,0 UA.

Ora, per fortuna, stanno arrivando sulla scena alcune biblioteche che fanno esattamente come tu suggerisci: un buon supporto per il calcolo scientifico in un linguaggio generico. Per Python, c'è NumPy / Matplotlib che ha alcuni spigoli ma che altrimenti fornisce una ragionevole funzionalità MATLAB all'interno di Python. La ragione per cui non ci sono stati altri progetti come questo è che le biblioteche sono incredibilmente difficili da scrivere e servono 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, è stato pensare in ricorsione. In MATLAB, devi solo pensare alle matrici. Ripassare 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 tuo problema si riduce alla ricerca degli autovalori di un prodotto esterno.


Sì, nel complesso amo Numpy / Scipy / Matplotlib e li uso ogni volta che l'alternativa ovvia sarebbe MATLAB / R. Le mie uniche lamentele sono che non sono così profonde come MATLAB / R e che, dato che sono Python, sono ancora piuttosto lente.
dsimcha,

4
@dsimcha, questo è effettivamente errato . In questo studio delle prestazioni, Numpy è alla pari con MATLAB e Pyrex è ben all'interno di un fattore 2 di C ++.
wvoq,

@wvoq: Chiarimento: intendevo che l'interprete Python è lento, non Numpy. So che Numpy è principalmente un wrapper per BLAS e LAPACK, che sono veloci. Naturalmente c'è ancora l'overhead fisso di chiamare questo codice. Sono anche a conoscenza di Pyrex, Cython, ecc. E mi aiutano, ma stai ancora mescolando le lingue a un livello ben preciso e questo può ancora essere una fonte di attrito.
dsimcha,

2
@dsimcha, Il sovraccarico di chiamare Numpy è praticamente una costante. Nello studio delle prestazioni che ho citato, stai guadagnando qualche decimo di secondo con C ++. Quel tempo deve essere confrontato con il tempo impiegato a scrivere e eseguire il debug e il debug delle chiamate BLAS in questo. Potrebbe essere istruttivo chiedere perché non scrivere tutto in assemblea? O addirittura un codice macchina diretto, poiché la conversione dall'assemblaggio al codice macchina aggiunge un overhead fisso?
wvoq,

3
@dsimcha Huh? Vuoi fare tutto in un'unica lingua (veloce), ti piace di più Python e poi ti lamenti del fatto che Python sia lento? Quindi qual è il punto. Immagino che desideri solo che MATLAB abbia funzioni più generiche ed sia più veloce di un linguaggio interpretato?
Chris dice di reintegrare Monica il

14

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

Se desideri leggere alcune critiche serie a R, faresti bene a leggere questo pezzo di Ross Ihaka, uno dei designer di R. A me sembra molto più difficile progettare R piuttosto che usare D o Python.


2
-1. Non ho mai voluto sottintendere che i progettisti di MATLAB e R siano nient'altro che programmatori hardcore molto bravi. Tuttavia, MATLAB e R non sono progettati per programmatori hardcore.
dsimcha,

3
"... sembra che questi linguaggi siano stati progettati da persone che non sono programmatori hardcore e non pensano come programmatori hardcore."
wvoq,

6
Non hai ancora chiarito cosa sia un "programmatore hardcore". Con i tuoi esempi, "hardcore" suona come se significasse semplicemente "più comodo con C ++", nel qual caso R e MATLAB non saranno hardcore per definizione. Quasi tutti i tuoi esempi si riducono a lamentele sul fatto che queste lingue non sono quelle a cui sei abituato, senza chiederti perché gli esperti in questi campi abbiano ritenuto opportuno implementarle in quel modo.
wvoq,

1
Inoltre, in termini di definizione, ho pensato che fosse ovvio, ma un "programmatore hardcore" è solo qualcuno che è a proprio agio con concetti di programmazione di base come riferimenti / puntatori, orientamento degli oggetti, funzioni lambda, strutture di dati di base, ecc. Ed è abituato a sviluppare in una lingua di uso generale.
dsimcha,

2
Bene, in primo luogo, "hardcore" è un termine piuttosto carico se inteso per indicare "qualcuno che conosce concetti di base nella programmazione oo / procedurale / funzionale". In secondo luogo, non posso parlare per MATLAB, ma R ha tutte queste cose. L'unica differenza è che in R sei incoraggiato dal linguaggio a presentare il tuo problema in modo tale che gli elementi del vocabolario statistico diventino i tuoi primitivi. La ragione di ciò è che gli statistici e gli addetti all'apprendimento automatico spesso lavorano con i problemi facilmente espressi in questo modo, il che rende R una scelta naturale anche se ti senti a tuo agio con le cose "più difficili".
wvoq,

9

L'estrema enfasi su vettori e matrici nella misura in cui non esistono veri primitivi.

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

La difficoltà della manipolazione di base delle stringhe.

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

Mancanza o imbarazzo nel supporto di strutture di dati di base come tabelle hash e array "reali", cioè di tipo parametrico e annidabili.

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

Sono molto, molto lenti anche per gli standard linguistici interpretati, a meno che non ti pieghi all'indietro per vettorializzare il tuo codice.

Dopo aver appreso della vettorializzazione (sono sicuro che, se sei davvero hardcore), maledirai di dover usare i loop quando torni in altre lingue. La velocità di esecuzione è un compromesso per la velocità di programmazione.

Sembrano non essere progettati per interagire con il mondo esterno. Ad esempio, entrambi sono programmi piuttosto ingombranti che richiedono un po 'di tempo per avviarsi e sembrano non essere progettati per rendere semplici i programmi di filtro di testo facili da scrivere. Inoltre, la mancanza di una buona elaborazione delle stringhe rende quasi impossibile l'I / O dei file in forme tutt'altro che standard.

Entrambi possono leggere e scrivere dati in quasi tutti i formati. Entrambi possono essere chiamati dalla maggior parte degli altri linguaggi di programmazione. O da un prompt dei comandi. È possibile creare GUI con loro. In che modo non interagisce con il mondo esterno? Se stai lottando con il tuo programma di filtro di testo, chiedi su stackoverflow.

L'orientamento agli oggetti sembra avere una sensazione molto serrata. Sì, puoi farlo, ma non sembra molto più idiomatico di OO in C.

Concordato; sono principalmente linguaggi procedurali.

Nessun modo ovvio e semplice per ottenere un tipo di riferimento. Nessun puntatore o riferimenti di classe. Ad esempio, non ho idea di come si arrotoli il proprio elenco di collegamenti in una di queste lingue.

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

Non è possibile inserire più funzioni di livello superiore in un singolo file, incoraggiando funzioni molto lunghe e codifica taglia e incolla.

Senza senso. Basta creare più file.

Apparentemente i numeri interi non esistono come tipo di prima classe.

Loro fanno. Vedere int8, int16, int32e int64.

Le strutture di dati incorporate di base sembrano troppo alte 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.

Sono adatti a fare analisi dei dati. Fornisci esempi specifici di comportamento imprevisto.

La documentazione è diffusa in tutto il luogo e praticamente impossibile da navigare o cercare. Perfino D, che spesso viene scartato per cattiva documentazione ed è ancora abbastanza alfa-ish, è sostanzialmente migliore per quanto posso dire.

Esistono molti tipi di documentazione. Inizia con ?some_function, RSiteSearch('some concept'), rseek.org , e il sospacchetto. Per non parlare dei manuali forniti con l'installazione. O un buon libro .

Almeno per quanto ne so, non esiste un IDE valido per questo. Ancora una volta, anche D, una lingua alfa-ish con una piccola comunità, fa di meglio.

Prova Architect o RStudio o l'IDE Revolution Analytics. Vedere la sezione "IDE ed editor per R" della pagina di informazioni Stack Overflow per collegamenti e altre opzioni.


3

MATLAB può integrarsi con Java e C / C ++. Puoi implementare tutto il tuo carico di lavoro non numerico in queste lingue e invocarlo da MATLAB.

il loro uso è necessario

C'è un motivo 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 sei 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 forzata su qualcuno, non è sempre sopravvivibile. Anche al college, non tutti gli studenti di ingegneria possono abituarsi al modo di pensare computazionale di MATLAB.


2
Sono a conoscenza di queste soluzioni, ma sembrano piuttosto arretrate. Vorrei chiamare MATLAB da C ++, Java, ecc., Non viceversa. Vorrei tutto tranne MATLAB per essere il mio linguaggio "driver".
dsimcha,


0

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

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

Ci sono un paio di caratteristiche 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 denominarla "isInROI", eseguendo un'operazione di filtro per selezionare elementi dal vettore o 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 trascurare i suoi altri, numerosi e discussi peccati.


Nota che numpy ha anche l'indicizzazione logica: docs.scipy.org/doc/numpy/user/…
jarondl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.