Perché i linguaggi di programmazione scientifica sono così strani? [chiuso]


9

Mi sembra che i linguaggi di programmazione pensati per l'uso in scienze e ingegneria siano costantemente strani rispetto ai linguaggi di uso generale. Alcuni esempi dalla parte superiore della mia testa:

  • In Matlab, ogni funzione deve essere inserita in un file separato
  • In R, <- è l'operatore di assegnazione, al contrario di = in quasi tutte le altre lingue
  • Matlab, R, Julia e altri sono tutti 1 indicizzati
  • Matlab utilizza% per i commenti e non lo standard # o //

Naturalmente, tutti questi linguaggi hanno diverse caratteristiche di progettazione che li rendono effettivamente più facili da usare per applicazioni scientifiche, come una notazione a matrice più naturale. Tuttavia, fanno tutte inspiegabilmente tutte queste bizzarre scelte che non facilitano nulla e che potrebbero essere facilmente evitate se i progettisti del linguaggio avessero appena scelto di fare ciò che fa il 99% delle altre lingue. Il motivo è il blocco del fornitore? Mancanza di contatto con la più ampia comunità di sviluppo software? Qualcos'altro?

Ho letto questa discussione e non ho trovato soddisfacenti le spiegazioni. Solo perché R sono stati progettati come un linguaggio scientifico non significa che doveva ignorare completamente le convenzioni e l'uso <- invece di =.


6
Risposta breve: perché sono stati fatti per gli scienziati, non per i programmatori.
Bart van Ingen Schenau,

19
Risposta breve: poiché ogni lingua che ritieni normale è stata influenzata da un antenato comune, C.
Ross Patterson,

3
Credo che si fatica a trovare eventuali convenzioni tra le varie lingue. Dipende dalla loro eredità.
Robbie Dee,

6
Niente di tutto ciò è strano. È solo diverso . Perché non vi è alcun motivo particolare per scegliere una sintassi rispetto all'altra, tranne ciò a cui è abituato l'autore specifico della lingua specifica.
Jan Hudec,

8
Il tuo 99% è sbagliato. Se conosci solo C e i suoi derivati ​​potresti pensare di sì, ma ben oltre il 50% dei linguaggi non C usa qualcosa di diverso per assegnazione, indicizzazione e / o commenti.
david.pfx,

Risposte:


21
  • Esistono diverse convenzioni. Convenzioni in matematica, logica e scienze applicate e convenzioni in informatica. I primi sono molto più vecchi.
  • I linguaggi scientifici sono creati per rendere più comoda la vita dei LORO utenti. L'utente è visto come uno scienziato, che di tanto in tanto può realizzare qualche algoritmo o controllare qualche teoria, senza la necessità di imparare qualcosa di veramente nuovo. Pertanto, le lingue per gli scienziati DEVONO essere adattate a standard non IT. Perché non sono pensati per l'uso di personale IT. Sono all'altezza di ALTRI standard e questo è buono a causa dell'audizione target. Perché la buona interfaccia utente SW, e la lingua è l'interfaccia utente SW, deve essere eseguita in base alle esigenze dell'utente, non del programmatore.
  • I nostri standard IT sono standard di settore. L'IT è industria. La scienza non è industria. Gli scienziati ne sono orgogliosi. E con riluttanza prenderebbero qualsiasi cosa dalla nostra pratica nella loro. E a loro non piacciono affatto gli standard. E a nessuno piacciono gli standard stranieri. Quindi, se qualcuno creerà un linguaggio scientifico che rispetti gli standard IT, difficilmente venderebbe bene, a causa della antipatia per il sistema uditivo target, anche se obiettivamente fosse più conveniente.

E anche se giudicheremo solo in base agli standard IT ... Siamo spiacenti, quali standard intendi? Hai provato a scrivere un prog in APL o SNOBOL? Queste due lingue sono, IMHO, le PIÙ potenti nei campi appropriati (conteggio e stringhe). Ma la sintassi è qualcosa di MOLTO strano (ed efficace) La lettura di una riga di codice APL potrebbe richiedere giorni. D'altra parte, tale linea è un serio pezzo di SW. Ritorneresti a Mathlab con lacrime di sollievo.

Per quanto riguarda "=", molte persone hanno problemi ad abituarsi al fatto che non si tratta di uguaglianza, ma di assegnazione. A proposito, in Pascal è l'uguaglianza e l'assegnazione è ": =".

E pensi davvero che == per l'uguaglianza sia più naturale? Al contrario, mescolando = e == è l'errore più comune nella programmazione in C, accade molto spesso anche negli IDE contemporanei, con il loro controllo automatico.

Informazioni sull'indicizzazione da 1: è l'unica naturale. Quando eri bambino, avevi imparato poesie e canzoni, dove contavi: uno, due, tre ... E non 0,1,2 ... In matematica a scuola abbiamo studiato che il conteggio parte da 1, e che 0 non appartiene ai numeri naturali / di conteggio. Solo con la definizione di funzioni vengono indici non naturali. Dopotutto, lo 0 è stato inventato molte migliaia di anni dopo che il nostro antenato ha alzato un dito.

0-start è stato più semplice da realizzare e ha subito iniziato la pratica IT dopo l'apparizione C. Ma in Fortran, la prima lingua, viene utilizzata l'indicizzazione 1. Lo stesso con altre lingue dell'epoca preindustriale.

E sì, avevo letto l'articolo di Dyjkstra sulla naturalità del conteggio basato su 0. E totalmente in disaccordo con le sue argomentazioni. È naturale per i musicisti. E anche 0 appassionati che creano i compilatori C e Java, contano le righe del codice A PARTIRE DA 1!


1
": =" per assegnazione e indicizzazione basata su 1 sono utilizzati anche in Smalltalk.
Rory Hunter,

1
Non compro che l'indicizzazione basata su 0 sia dovuta alla facilità di implementazione (FORTRAN praticamente lo smentisce). cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html fornisce alcuni motivi per cui si potrebbe preferire l'indicizzazione basata su 0, ma si noti che la scelta è abbastanza arbitraria.
jk.

2
FORTRAN aveva l'indicizzazione basata su 1. PASCAL ha consentito l'indicizzazione basata su arbitrari: è possibile dichiarare un array il cui indice è compreso tra -42 e +57. (Vedi en.wikipedia.org/wiki/… per un esempio in cui questo è utile.)
John R. Strohm,

1
@Gangnus Penso che sia un errore confrontare le lingue moderne con C e ritenerlo intenzionalmente difficile da leggere. È stato progettato per essere un'alternativa di alto livello alle lingue di livello inferiore.
Robbie Dee,

1
FORTH è un linguaggio basato su stack. Pensa alla calcolatrice HP. Era molto compatto e veloce, ma era difficile scrivere codice che non fosse impenetrabile. In FORTH, raramente usi le variabili ma piuttosto spingi le cose nello stack e usi gli operatori che agiscono sullo stack.
Gort the Robot

16

L'indicizzazione da 1 non è strana, è del tutto normale e prevista tranne che per i programmatori , perché sono stati condizionati ad aspettarsi il conteggio basato su 0 da C (che era condizionato dalle proprietà dell'architettura del processore).

I commenti sono indicati in molti, molti modi diversi in diverse lingue; non esiste un modo standard, ogni lingua sceglie un simbolo o un digrafo che non è già stato preso.

Allo stesso modo, l'assegnazione è un concetto strano e incomprensibile, ad eccezione dei programmatori ; alla maggior parte delle persone non potrebbe importare di meno se è =o :=o <-, fanno fatica a comprenderne il significato (e per loro è in effetti meglio non usarlo =, perché questo sottolinea che l'assegnazione non è l'uguaglianza - l'ostacolo più comune per i non programmatori capire il codice).

In breve, i linguaggi di programmazione destinati a persone diverse dai programmatori professionisti sembrano diversi perché le persone che li usano più lo desiderano in questo modo.


4
Non sono d'accordo sul fatto che l'indicizzazione da 1 non sia strana. L'indicizzazione 0 è almeno comune quanto l'indicizzazione 1 in matematica, ed era ovviamente stata la norma nella programmazione per anni prima dell'avvento di Matlab o S / R.
haroba,

9
@Aqwis Oh, sì, vedo già il bambino che conta zero, uno, due ... Il modo più naturale, davvero.
Gangnus,

4
I bambini non scrivono codice. Ci sono buoni motivi per usare l'indicizzazione zero (vedi: Dijkstra) e quando l'indicizzazione zero è comune anche in matematica non riesco a vedere molti motivi per usare l'indicizzazione 1.
haroba,

1
@Aqwis Risposta per le tue parole. Ciò che è strano e no. Una cosa stabilita dall'infanzia e dalla matematica (i numeri naturali non includono zero), non può essere strana da nessuna parte. E ciò che contraddice, È strano. E che ti sei abituato a qualcos'altro, è irrilevante. Queste lingue semplicemente non sono fatte per te o per me.
Gangnus,

1
@phresnel Per parafrasare dalla risposta: l'indicizzazione da 1 è normale. Ad eccezione dei programmatori, perché sono stati condizionati ad aspettarselo [indicizzazione da 0] da C
Robbie Dee,

5

Ci sono tre problemi:

  1. Non sei a conoscenza di certe tradizioni e delle buone ragioni per certe scelte.
  2. Metti troppa enfasi sulla sintassi, troppo poca sulla semantica.
  3. Ingegneri e scienziati non hanno esperienza nella progettazione del linguaggio, portando a una sintassi discutibile.

Ora ai tuoi punti specifici:

  • Non conosco Matlab, quindi non posso commentare i requisiti dell'organizzazione dei file. Nota che Java vuole che tu usi un file per classe pubblica.

  • In R, =può essere utilizzato anche come operatore di assegnazione. Nota che ha bisogno di più operatori di assegnazione <-e <<-di gestire il suo concetto di scoping ( <<-assegna a un simbolo in un ambito esterno invece di creare un nuovo simbolo all'interno di una funzione). Le frecce possono essere utilizzate nella direzione opposta troppo, rendendo potenzialmente codice più pulito: complex_calculation() -> x.

  • L'indicizzazione basata su 1 è lo standard in matematica, che è ciò con cui gli utenti di Matlab e R sono più a loro agio rispetto a C. Julia segue Matlab per avere una curva di apprendimento migliore.

  • %per i commenti viene utilizzato anche in TeX / LaTeX. L' #è solo una convenzione da linguaggi di scripting Unix, ed i loro discendenti.

Ignori anche che i linguaggi di programmazione "reali" hanno molte parti strane. Perché non utilizza Scheme =? Anziché:

(define foo 5)

Perché C usa *per la dereferenziazione, quando ovviamente un cursore ^xè più comune in altre tradizioni?


"Non conosco Matlab, quindi non posso commentare i requisiti dell'organizzazione dei file. Nota che Java vuole che tu usi un file per classe pubblica." Penso che sia perfettamente ragionevole per la lingua aspettarsi che divida il progetto in diversi file. Tuttavia, una classe è generalmente una quantità relativamente grande di codice. Le funzioni non devono essere. Forzando un file separato per ogni funzione, Matlab ti scoraggia dalla creazione di piccole funzioni e promuove invece funzioni monolitiche di grandi dimensioni.
haroba,

1
Concordo quasi con tutto, tranne p.3. Gli scienziati non fanno le loro lingue, le ORDINANO. Sono clienti, utenti, ma non i loro creatori. Se qualcuno lo è, è già un fanatico dell'IT. E la sintassi di qualsiasi lingua è discutibile, nessuno è l'ideale per tutte le attività.
Gangnus,

Matlab compila funzioni / file su una base just-in-time come richiesto. Non ha un vero concetto di programma, solo un mucchio di funzioni. Se sto eseguendo una funzione che effettua una chiamata a foo (), quindi cercherà nel suo percorso un file chiamato foo.m, lo compili e lo esegue. Non è necessario comunicare anticipatamente a Matlab quale set di file intendo utilizzare.
Simon B,

1

Immagino che dipenda dalla tua esposizione ad altre lingue. In cima alla mia testa:

  • C / C ++ ha file sorgente separati (.c / .cpp & .h)
  • I caratteri -> sono usati in C # per le espressioni lambda
  • Le vecchie versioni di VB utilizzavano 1 come indice predefinito (sebbene ciò potesse essere modificato con Option Base)

1
In C e C ++, puoi definire tutte le funzioni che vuoi in un file.
haroba,

Sto solo sottolineando che non è insolito che i moduli siano suddivisi su più file. Se si volesse si potrebbe mettere tutte le funzioni in file separati utilizzando linguaggi .NET con la classe parziale costrutto.
Robbie Dee,

1
Naturalmente non è insolito che i moduli siano suddivisi su più file, ed è in molti casi desiderabile. Ma in Matlab devi mettere ogni singola funzione nel suo file, il che significa che se hai mille funzioni hai bisogno di mille file .
haroba,

3
I commenti in HTML sembrano <!-- ... -->. Il segno di percentuale viene utilizzato per la codifica URL: http://example.com/()diventa http://example.com/%28%29.
am

Scusa, errore mio.
Robbie Dee,
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.