Qual è il linguaggio di programmazione più ortogonale? [chiuso]


46

Mi sento ripetutamente infastidito dal dover insegnare alle matricole regole di linguaggio speciali (come il decadimento da array a puntatore) che non hanno assolutamente nulla a che fare con la programmazione in sé. Quindi mi chiedevo:

Qual è il linguaggio di programmazione con il minor numero di regole linguistiche speciali, in cui tutto è di prima classe e può essere composto senza fastidiose restrizioni tecniche? Una lingua del genere non sarebbe la lingua di insegnamento perfetta?

Nota del moderatore

Siamo alla ricerca di risposte lunghe che forniscano una spiegazione e un contesto. Non elencare solo una lingua: spiega perché pensi che la lingua risponda alla domanda. Le risposte che non spiegano nulla verranno eliminate. Vedi Buono soggettivo, Cattivo soggettivo per ulteriori informazioni.


1
Prova a usare Unlambda: c'è quasi un numero minimo di blocchi di linguaggio. Risposta un po 'più seria: Schema (R5RS in particolare).
SK-logic,

@ SK-logic, Unlambda non è ortogonale perché I=SKK. Il massimo delle lingue ortogonali sono i linguaggi a istruzione singola come Jot e RSSB.
Peter Taylor,

11
@Peter - Non penso che significhi strettamente minimo. Una lingua minima finisce con tutte le definizioni extra nella biblioteca, quindi gli studenti devono impararle in entrambi i modi. Il modo in cui leggo questa domanda è "quale lingua segue meglio il principio della minima sorpresa?".
Steve314,

1
@Peter Taylor: potresti fornire un esempio in cui Timtowtdi è in conflitto con l'ortogonalità?
keppla,

1
Penso che "ortogonalità" sia una cattiva scelta di parole qui. Come hanno stabilito Peter e Steve, ciò che realmente intendi è "principio della minima sorpresa" o qualità strettamente correlata.
Konrad Rudolph,

Risposte:


53

Quando si parla di "pochissime regole", direi che vincerebbe Lisp o Smalltalk. La sintassi nuda può essere scritta su una scheda della birra.

Ma nella mia esperienza, la semplicità di Lisp e Smalltalk non significa che siano semplici da capire e facili da insegnare. Sebbene non sia il modo "puro", nella mia esperienza lo stile di liste imperative di linguaggi imperativi è il più facile da comprendere per i neofiti.

Pertanto, suggerirei Python, Ruby o qualcosa di simile astrazione : trovi (quasi) ogni concetto di base in essi (OK, nessun puntatore), ma non è necessario capirlo dall'inizio per far funzionare qualcosa.


33
lavoro impressionante che misura la sintassi in unità di una scheda di birra.
psr

3
E non dimenticare Perl. Molto più Perl là fuori di quanto la maggior parte della gente pensi, e la comunità di utenti è enorme .
Randal Schwartz,

20
Perl può essere molto potente, ma un ragazzo che trova il percorso più semplice per programmare deve avere l'equivalente dei tunnel dei templi di Indiana Jones come corridoio principale dalla sua camera da letto alle sue docce ...
Kheldar,

9
La sintassi di Perl potrebbe adattarsi a una scheda della birra, a condizione che bevi abbastanza birra.
Dave Sherohman,

4
@Randal, la domanda richiede un linguaggio ortogonale . La filosofia di Perl è quella di non essere ortogonali: "esiste più di un modo per farlo".
Peter Taylor,

41

Direi LISP, o Schema o una lingua di quella famiglia sarebbe la più ortogonale. Con let, lambda, define, if, cons, list, e ( )si può insegnare qualsiasi cosa che si vorrebbe in un corso introduttivo. Non è inoltre necessario elaborare direttive di preelaborazione o int main()cose del genere che gli studenti includono ma di cui non vedono motivo.

Nei miei corsi di introduzione CS, abbiamo fatto molte cose davvero interessanti con Scheme: implementare una macchina Turing, implementare un computer TC-201, scrivere una grammatica libera dal contesto, usare la ricorsione, scrivere un tipo di unione e inserimento, implementare additivi e tonnellate di altre cose.

Avevo già lavorato a Java in scienze scientifiche in AP prima del college, ma Scheme era eccezionale perché potevo ridurre il disordine e concentrarmi sui concetti reali nel mio programma. È stata un'ottima lezione e ti consiglio vivamente di provarlo per il tuo insegnamento.


5
Essere d'accordo. Racket (precedentemente PLT Scheme) è una variante di Schema leggermente più amichevole che la nostra scuola utilizza con grande successo nelle lezioni introduttive.
NickAldwin,

3
Che mi dici di Haskell? Non conosco molto di Haskell, ma mi aspetto che sia un linguaggio ortogonale.
Giorgio,

4
@Giorgio: la sintassi di Haskell è molto più complicata, anche se immagino che solo un sottoinsieme potrebbe essere esposto. Il fatto stesso che devi interagire con le monadi IO fin dall'inizio per ottenere un programma interessante è un po 'fastidioso dato l'obiettivo dell'OP.
Matthieu M.,

4
Per "ortogonale", voto per Scheme, in particolare l' implementazione della racchetta . L'ambiente di Racket è progettato per rendere più semplice il percorso di uno studente rispetto a qualcosa come Raw Common Lisp. La lingua è pulita, con poche regole, anzi. Molto tempo fa, il MIT ha deciso di utilizzare Scheme per insegnare agli studenti di Freshman, usando il libro SICP . Quegli studenti sopravvissuti sembrano esibirsi abbastanza bene sul mercato. Tuttavia, questo approccio non insegnerà direttamente agli studenti come scrivere codice di livello commerciale nelle lingue più comunemente utilizzate.
John Tobler,

2
Sì! Il fatto che Scheme sia radicalmente diverso dalla maggior parte dei linguaggi "reali" ti consente di concentrarti sulla programmazione e non sulle API. Lo Schema di apprendimento è come la " ceretta, cera " del codice; sembra una perdita di tempo fino a quando non ti rendi conto di avere una comprensione più profonda del computer rispetto a prima.
benzado,

17

Pascal è stato appositamente progettato per insegnare la programmazione. È facile da imparare (è stato uno dei primi linguaggi di programmazione che ho imparato).


3
Ho anche imparato a programmare usando Pascal e trovo che sia un linguaggio molto pulito. L'unica caratteristica non ortogonale che mi viene in mente è la sintassi delle procedure writeln () e readln (), che hanno un numero variabile di argomenti e consentono di specificare la formattazione.
Giorgio,

L'ho trovato un linguaggio molto frustrante. Ma potrei proiettare, dato che avevo un istruttore molto, molto cattivo.
Greyfade,

14

Logo: è ancora vivo e vegeto !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Potrebbe sembrare più un giocattolo che un linguaggio di programmazione, ma non sarebbe un brutto primo passo per molte persone. La sintassi è molto semplice, ma la tartaruga fornisce una forma più concreta di feedback rispetto alla maggior parte delle lingue / ambienti. Cercare di creare una forma specifica è un ottimo modo per imparare il processo di pensare in anticipo per risolvere un problema.

Se hai un'avversione per le tartarughe, penso davvero che Scheme sia la strada da percorrere.


1
Che ci crediate o no, Logo è un Lisp, proprio come Scheme. La maggior parte degli utenti non va oltre il semplice looping e la grafica delle tartarughe per imparare questo.
Sean McSomething,

@SeanMcSomething Questo è interessante, vista l'attenzione sugli effetti collaterali (spostare la tartaruga) piuttosto che sulla valutazione delle espressioni.
benzado

10

Proporrei sia SML che Haskell. L'ortogonalità è stata un punto di progettazione principale per entrambi. In particolare, il nucleo di SML (ovvero la parte del linguaggio non interessata alla modularità) è praticamente un calcolo lambda tipizzato. Di conseguenza, la maggior parte delle funzionalità del linguaggio sono guidate dai tipi e i tipi a loro volta guidano i moduli di introduzione ed eliminazione dei valori. Questo è praticamente l'ideale.

Ci sono alcune verruche non teoriche in entrambe le lingue (eqtypes in SML, seq in Haskell) ma continuano a battere le mutande di qualsiasi altra cosa là fuori in termini di bizzarre interazioni di caratteristiche del linguaggio non correlate.


7

Qualunque sia la scelta, raccomanderei fortemente di insegnare una lingua "reale" . Insegnare le lingue dei giocattoli funziona per alcune persone, ma per altre è molto, molto frustrante a causa della disconnessione dal mondo reale. Alcune persone hanno bisogno della rilevanza del mondo reale come motivazione per l'apprendimento, e non è il nostro posto per giudicare questa strategia di apprendimento (in realtà, questo è un malinteso comune).

Ciò esclude lingue come Logo, ma anche lingue specifiche del dominio come Elaborazione . Mentre quest'ultimo è estremamente utile per determinate cose (ad es. Produzione di informazioni grafiche), l'uso è troppo limitato per la maggior parte degli usi (e quindi della maggior parte degli utenti). Ciò esclude anche Gofer , un sottoinsieme inutile di Haskell. E ' anche esclude Pascal perché, anche se quest'ultimo è stato utilizzato in progetti reali, semplicemente non è più rilevante e semplicemente manca di caratteristiche essenziali (ad esempio, built-in stringhe).

Delle lingue pratiche, concordo con quelle già menzionate: moderni dialetti Lisp o Scheme, Haskell, Python o Ruby. Personalmente, probabilmente userei Python ma tutte quelle scelte hanno la loro parte di vantaggi e svantaggi.


2
È un errore affermare che insegnare una lingua "reale" è il modo di fornire rilevanza nel mondo reale. È compito dell'insegnante mostrare come il linguaggio "giocattolo" si relaziona con le abilità del mondo reale. Imparare a destreggiarsi iniziando con i coltelli non significa che stai imparando abilità di giocoleria più rilevanti.
benzado,

3
@benzado Hai capito male il mio punto. Se impari una lingua giocattolo, devi trasferire le tue abilità per renderle rilevanti ai problemi del mondo reale. Il mio punto era che questo trasferimento è un'ulteriore direzione indiretta che impedisce attivamente ad alcune persone di apprendere . Diverse persone imparano in modi molto diversi e alcune persone hanno davvero bisogno di questa immediatezza. Imparare a destreggiarsi con i coltelli non è la stessa cosa. La vera analogia sarebbe con imparare a programmare scrivendo un sistema di guida missilistica dal vivo come primo progetto, e non l'ho mai suggerito.
Konrad Rudolph,

3
Ho capito il tuo punto. Non siamo d'accordo. Penso che il trasferimento sia importante, richiede che lo studente abbia una comprensione più profonda di chi ha una strategia di indovinare riuscita (ad esempio, uno che "risolve" i problemi di parole selezionando i numeri e inserendoli nelle formule all'inizio del capitolo ). In altre parole, se non riescono a trasferire ciò che hanno imparato, in primo luogo non lo hanno mai imparato. Per motivare gli studenti, devi solo scegliere i problemi giusti, il che è importante indipendentemente dalla lingua, "reale" o "giocattolo".
benzado,

@benzado Il trasferimento è importante, nessun argomento lì. Ma è tutta un'altra disciplina che deve essere insegnata e alcuni studenti non la possiedono. Inoltre, anche la parte della "comprensione più profonda" è vera, ma anche oltre al punto: questo è già uno stato avanzato che deve essere raggiunto . Una volta che gli studenti hanno imparato "esso", possono trasferirlo. Ma prima devono imparare, e per farlo, alcuni studenti hanno bisogno di rilevanza. Il trasferimento arriva dopo.
Konrad Rudolph,

In matematica edu (dove ho una piccola esperienza), "Imparare senza capire" è un grosso problema: concentrarsi su come farlo senza perché . La mia affermazione è che se insegni i concetti di programmazione, un linguaggio giocattolo funzionerà bene e, se riuscirai , il trasferimento in un linguaggio "reale" non sarà difficile. (Se il trasferimento è difficile, hai insegnato procedure, non concetti.) Un ambiente giocattolo non impedisce alle persone di apprendere, ma richiede una buona pianificazione della lezione per essere coinvolgente. (Mi piace questa discussione, ma penso che siamo entrati nel territorio della discussione e i moderatori saranno scontenti.)
benzado,

6

Tcl ha 12 regole che governano l'intera lingua.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Esistono pochissimi casi speciali o parole o caratteri riservati.


4

Qual è il linguaggio di programmazione con il minor numero di regole linguistiche speciali, in cui tutto è di prima classe e può essere composto senza fastidiose restrizioni tecniche? Una lingua del genere non sarebbe la lingua di insegnamento perfetta?

Per espandere il mio commento, in Jot tutto è di prima classe (perché è un calcolo lambda) e può essere composto. C'è solo un'istruzione. È una lingua di insegnamento assolutamente terribile.

In generale, i tarp di Turing hanno pochissime regole speciali e richiedono di comprendere molto bene i fondamenti del calcolo prima di poter fare qualsiasi cosa. La lingua di insegnamento perfetta consente agli studenti di sperimentare senza strapparsi tutti i capelli, quindi le astrazioni di livello superiore sono in realtà una buona cosa.


Grazie per avermi presentato il termine "turing tarpit", ho sempre avuto bisogno di un termine per questo tipo di semplicità.
keppla,

Concordo sul fatto che gli studenti dovrebbero essere in grado di sperimentare, ma richiedere comprensione prima di poter "fare qualsiasi cosa" sembra tutto il punto di insegnamento.
benzado,

@benzado, sono d'accordo sul fatto che il punto di insegnamento è impartire comprensione. Ma con la maggior parte delle persone devi iniziare con i concetti di base, lasciare che si capovolgano e quindi insegnare loro concetti intermedi. Quindi vuoi una lingua in cui qualcuno che capisce un po 'può scrivere programmi che fanno un po'. C'è una ragione per cui la maggior parte dei corsi di programmazione non inizia insegnando le macchine di Turing o le macchine del registro Minsky.
Peter Taylor,

1
Bene, penso che differiamo sul significato di "fare un po '". Se vuoi (per esempio) placare il contingente "mostrami come realizzare i videogiochi", puoi fare alcune cose, ma arriveranno a un punto perché non possono fare progressi e frustrarsi, quindi devi tornare alle "parti noiose" in modo che possano ottenere la comprensione per andare avanti. A questo punto, sono già frustrati in modo negativo e possono semplicemente arrendersi; d'altra parte, fare prima le "parti noiose" e costruire verso l'alto significa un progresso continuo. Ma ovviamente non inizi con una striscia di nastro semi-infinito.
benzado,

2

Le caratteristiche più importanti in una lingua che impari sono:

  • principio di minima sorpresa (PASCAL)

  • leggibilità (Ada)

Secondo me, il secondo ha la meglio sul primo, dato che leggere il codice è ancora più importante che scriverlo.

Ancora una volta, scrivo C #, Java, Objective-C e Javascript per vivere, che hanno tutti orribili stranezze: D

Tuttavia, se dovessi scegliere una lingua per cominciare, sceglierei C #. È relativamente facile da leggere, ha alcune gravi sorprese in sé (sono spesso nascoste negli strumenti / framework MS ...) e una quantità enorme di codice da leggere e documentazione, entrambi essenziali per imparare bene.


Se è solo per la leggibilità, e non per la tipizzazione statica e la sicurezza di ada, Python e Visual Basic (sì, lo so, non il modo in cui i bambini freddi) hanno una simile sintassi libera da disordine, imho.
keppla,

Sì, sono d'accordo con te, ma "se si compila in Ada, dovrebbe funzionare". Tuttavia, non impedisce errori logici, come Ariane V può dire: D
Kheldar il

Ho pensato se la digitazione statica sia utile o meno per i principianti. Fornisce più supporto (come le ruote da allenamento) ma questo può essere visto sia come una cosa positiva che una cosa negativa. Allontana alcune responsabilità dallo studente al tipo di sistema.
Aivar,

@Kheldar, nessun linguaggio di programmazione può impedire fottuti gestionali come quello responsabile del fallimento di Ariane V. Dovresti fare i compiti su questo.
John R. Strohm,

@ JohnR.Strohm che era esattamente il mio punto: a volte non è il linguaggio, è il flusso ingegneristico (ad esempio, la gestione) che è imperfetto. Secondo me, avresti potuto formulare il tuo commento in modo meno aggressivo.
Kheldar,
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.