Esistono linguaggi di programmazione che seguono un approccio di sviluppo minimalista?


26

Trovo che quando le lingue sono considerate uguali al software commerciale, c'è sempre la necessità costante di aggiungere nuove funzionalità per giustificare le nuove versioni.

Possono esserci o ci sono lingue in cui la versione 1.0 è la versione finale? Naturalmente le correzioni di bug sono esenti da questo, ma il set di funzionalità rimane sempre lo stesso?

In questo modo ogni funzione del linguaggio si adatta bene e non sembra che siano fissate dopo il fatto con funzionalità obsolete ancora in circolazione a causa della compatibilità con le versioni precedenti.

Presumo che alcune lingue accademiche siano così? Ma ci sono lingue di successo commerciale che seguono questa idea? Anche la biblioteca di accompagnamento è gratuita per ottenere nuove funzionalità, ma la lingua rimane sempre costante.

Un esempio che posso dare è, una delle mie lingue preferite C #, che uso abbastanza spesso, ogni volta vengono aggiunte sempre più funzionalità. Per trarne vantaggio, devo abbandonare i compiti reali e dedicare molto tempo ad apprenderli invece di essere in grado di raccogliere concetti banali e combinarli con facilità per risolvere problemi più complessi.

Quindi credo di essere alla ricerca di un approccio minimalista in cui tutto sia coerente, abbia senso ed sia il più ortogonale possibile.


7
Un campo di lavoro della maggior parte degli sviluppatori è quello di risolvere i problemi in modo efficace. L'efficacia richiede l'apprendimento di cose nuove, costantemente. Nuove funzionalità linguistiche, nuovi framework, nuovi strumenti sono sviluppati per essere più efficaci. Imparandoli, ti stai concentrando sul tuo lavoro.
Arseni Mourzenko,

4
Beh, non tutti quelli che programmano sono necessariamente programmatori a tempo pieno. È solo un altro strumento per molte altre professioni.
Joan Venge,

4
Quindi, ancora una volta, nessuno ti obbliga a imparare qualcosa. Se C # 1.0 risolve i tuoi requisiti, non perdere tempo a imparare qualcosa che non ti serve.
Arseni Mourzenko,

11
Penso che la domanda sia legittima: perché dovremmo applicare i principi KISS e YAGNI ai manufatti software ma non ai linguaggi di programmazione? Quando una lingua ha abbastanza caratteristiche di base, l'ulteriore sviluppo è (IMHO) principalmente dovuto al marketing (concorrenza con altre lingue che costringe le aziende a riempire le lingue con caratteristiche per mantenere i propri clienti).
Giorgio,

2
@MainMa: "L'efficacia richiede l'apprendimento di nuove cose, costantemente.": Un linguaggio di programmazione complesso, ricco di troppe funzionalità, può ridurre l'efficacia invece di aumentarla. Ad esempio in un team può portare a diversi sviluppatori che utilizzano diversi sottoinsiemi della lingua, rendendo meno efficienti le revisioni del codice, la correzione di errori e la manutenzione.
Giorgio,

Risposte:


32

Lisp, Smalltalk. Per coincidenza, quelle sono anche le migliori lingue dell'intero gruppo.

Sia Lisp che Smalltalk sono linguaggi che si basano su una forte metafora unificante. La metafora di Lisp è "tutto è un elenco; questo elenco rappresenta sia dati che codice (come funzioni)". La metafora di Smalltalk è "tutto è un oggetto; l'unico modo per invocare un comportamento è passare un messaggio a un oggetto". Queste metafore consentono alle lingue di essere stabili, minime e potenti. Il resto è in biblioteca.

Le cose che sono chiamate "strutture di controllo" in tutte le lingue non minimali (volevo scrivere "gonfio"), sono parti della libreria qui (ad esempio: condfunzione in lisp; ifTrue:/ ifFalse:famiglia di messaggi in Smalltalk implementano entrambe un condizionale, dove altre lingue hanno una ifparola chiave).

Si può vedere che Lisp / Smalltalk sono incarnazioni quasi minimali del loro paradigma e niente di più (Lisp: programmazione funzionale; Smalltalk: programmazione orientata agli oggetti).


4
Le buone implementazioni Lisp possono competere con il C, le buone implementazioni Smalltalk possono competere con il C ++. Heck, HotSopt JVM di Oracle, la VM più veloce del pianeta, è una VM Smalltalk, non utilizza nemmeno informazioni di tipo statico per le sue ottimizzazioni.
Jörg W Mittag,


9
Questa risposta è troppo piccola per essere costruttiva. Manca di dettagli o prove a sostegno.
Jimmy Hoffa, il

2
-1 Lisp? LISP ? Sul serio? Dopo le guerre LISP degli anni '70, i ripetuti tentativi di un LISP Unity e infine Common Lisp? No, anche LISP non è riuscito a "fare" a 1.0.
Ross Patterson,

1
Penso che tu abbia sottolineato un'idea molto importante: che un linguaggio dovrebbe essere costruito attorno a una (o poche) metafora (e) unificante, cioè un linguaggio di programmazione dovrebbe offrirti un modo per organizzare i tuoi pensieri. Penso che la complessità di alcune lingue sia in parte dovuta alla mancanza di tale metafora: queste lingue continuano a crescere incorporando nuove funzionalità perché non hanno una visione unificante sottostante.
Giorgio,

6

TeX , il sistema di composizione, è stato molto stabile dalla versione 3.

Dalla versione 3, TeX ha utilizzato un sistema di numerazione delle versioni idiosincratico, in cui gli aggiornamenti sono stati indicati aggiungendo una cifra aggiuntiva alla fine del decimale, in modo che il numero di versione si avvicini asintoticamente π. Ciò riflette il fatto che TeX è ora molto stabile e sono previsti solo aggiornamenti minori. La versione corrente di TeX è 3.1415926; è stato aggiornato l'ultima volta nel marzo 2008. Il design è stato bloccato dopo la versione 3.0 e non verranno aggiunte nuove funzionalità o modifiche fondamentali, quindi tutte le versioni più recenti conterranno solo correzioni di errori. Anche se Donald Knuth stesso ha suggerito alcune aree in cui TeX avrebbe potuto essere migliorato, ha indicato che crede fermamente che avere un sistema invariato che produrrà lo stesso output ora e in futuro è più importante dell'introduzione di nuove funzionalità. Per questo motivo, ha affermato che il "

Non pretenderò che soddisfi il tuo "Quindi immagino che sto cercando un approccio minimalista in cui tutto sia coerente, abbia senso ed sia il più ortogonale possibile". dichiarazione, ma soddisfa la maggior parte dei tuoi altri criteri.


6

C e Fortran sono lingue che mi vengono in mente. Sono molto stabili e la loro sintassi è facilmente contenuta nella propria mente. A parte scrivere male il codice, ci sono pochissime sorprese quando si usano queste lingue. Ma non li terrei come grandi lingue per un rapido sviluppo delle applicazioni.

Preferisco il rapido avanzamento delle lingue con caratteristiche che una volta che trascorro un po 'di tempo su di esse, rendono il mio lavoro considerevolmente più semplice e il codice meno complesso mantenendo l'espressività.


1
Concordo con il design minimalista di C. Anche se la lingua è stata aggiornata nel corso degli anni, il design di base e il modello di programmazione della lingua sono ancora riconoscibili (altre lingue subiscono una rivoluzione ogni 5-10 anni). Naturalmente, C non è un linguaggio generico come una volta, poiché è stato sostituito da altre lingue in domini di applicazioni specifici (applicazioni desktop, applicazioni Web e così via).
Giorgio,

@Giorgio: non tutti. Quelli minimi (come quelli che ho citato) no. Non c'è stato alcun cambiamento nella sintassi di Smalltalk sin dal suo inizio, tranne uno, introdotto da Squeak: gli array calcolati con parentesi graffe. La libreria è anche molto stabile al centro ( Behaviore Collectiongerarchie). Mi sembra che C sia molto meno stabile con tutti quei C89, C99 e quant'altro.
lei il

1
@herby: Probabilmente hai ragione sul fatto che altri linguaggi come Smalltalk sono più stabili di C. Tuttavia, il modello di programmazione di base di C è lo stesso di 20 anni fa. Altre lingue hanno subito profondi cambiamenti. Quindi, ancora una volta, non pretendo che C sia la lingua più stabile in circolazione, tuttavia, IMO è molto più stabile di molte altre lingue tradizionali.
Giorgio,

6

Altri hanno già detto Lisp, quindi devo far apparire Forth . È molto facile da implementare e le regole del linguaggio sono semplici da seguire.

È un linguaggio basato su stack con un dizionario di "parole". Puoi facilmente estendere la lingua usando alcune funzionalità di ereditarietà.

Un esempio MOLTO conciso della grafica delle tartarughe:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

Quindi eseguirlo con : squiral -50 50 g 20 0 do 100 f 21 t loop ;ti dà:

spirale

Ringraziamo il blog di questo dipendente Microsoft .


1
Come è stato nuovamente votato? Forth potrebbe essere un buon candidato, ma l'esempio fornito non è molto meglio del rumore di linea eseguibile; un primo esempio del perché l'ossessione di PLT per la terseness è in contrasto con ciò di cui i professionisti hanno effettivamente bisogno.
Telastyn,

4
@Telastyn Non era questa la sua domanda.
Austin Henley,

4

Sebbene sia stato menzionato Lisp, il linguaggio più minimalista che conosco è lo schema . Ho avuto difficoltà a capirlo nei corsi universitari dove ho dovuto. Ma ha cambiato il mio modo di pensare alla programmazione ed è molto minimale. Minimi quanto la sua intera sintassi sono parentesi ()e spazi.

L'unico cambiamento nella lingua è stata la decisione di convertire i primitivi, come +, define(e alcuni altri) a built-in. Ciò significa che sono disponibili all'avvio, ma possono essere ridefiniti durante il runtime.


2

Tcl, che è stato progettato per essere minimalista in primo luogo

Da lì sulla pagina http://www.tcl.tk/about/features.html , una delle caratteristiche è che è molto facile da imparare e dove programmatori occasionali o anche non programmatori possono usarlo.


3
Questo mi sembra accurato, ma le risposte a riga singola senza informazioni o dettagli di supporto sono di qualità troppo bassa per essere utili a chiunque. Per favore, aggiungi qualche buon dettaglio (e non solo un link senza un riassunto) e otterrai un voto positivo da parte mia
Jimmy Hoffa,

ok, ma a causa della chiusura della domanda non so quanto sforzo valga la pena
Egryan,

1
Per fortuna verrà riaperto dai voti. È una buona domanda Potrei pubblicare su Meta per provare a riaprirlo se non verrà riaperto presto dalla community.
Jimmy Hoffa, il

Sono d'accordo e ho intenzione di aggiungere altro al post una volta che ho smesso di lavorare, non ho alcuna fortuna nel trovare i collegamenti pertinenti
Egryan,

Cerca "Un caso di studio sul linguaggio TCL", "Tcl: un linguaggio di comando incorporabile" e tcl.tk/about/history.html : forniscono alcuni punti chiave. Tuttavia, non sono sicuro che sostengano il desiderio del PO - sembra che TCL sia stato esteso dal suo 1.0 originale (vedi wiki.tcl.tk/1721 )

2

Ci sono poche lingue che sono rimaste relativamente invariate sin dal loro inizio al di fuori delle lingue esoteriche e che sono improbabili essere ciò che si desidera (odio provare a scrivere qualcosa di significativo in Befunge (anche se è stato modificato dal suo 1.0 originale pubblicazione)).

Le lingue che hanno più probabilità di soddisfare il desiderio di non dover imparare nulla di nuovo sono lingue specializzate nella "colla" tra altri programmi. Lingue come jcl , bash e simili. Anche i linguaggi di scripting semplici possono rientrare in questo: awk è uno dei leader.

Una volta che si lascia questo regno, lo sviluppo avviene. O la lingua o le strutture. In alcune situazioni è "difficile" codificare per la lingua senza ottenere alcuni di alcuni framework che stanno cambiando rapidamente.

Molte lingue hanno un certo grado di compatibilità con le versioni precedenti. Oggi si può ancora scrivere Java 1.4, anche se probabilmente non è raccomandato: i framework per cui le persone scrivono stanno cambiando più velocemente della lingua. Si possono ancora trovare compilatori f77 e f90 là fuori per una specifica linguistica che non è cambiata in 20 o 40 anni. C, Objective C, C ++ possono ancora essere codificati in base a specifiche del linguaggio precedenti: non è necessario continuare ad aggiornare il proprio codice perché è stata rilasciata una nuova specifica o è disponibile un nuovo framework.

Alcune lingue hanno una storia invariata piuttosto lunga perché la lingua stessa è sufficientemente potente per fare qualunque cosa si desideri. Lisp è il primo candidato in questo settore. Anche Forth rientra nel regno "non è cambiato molto".

Passando a linguaggi di scripting più tradizionali, guarda TCL, Perl e Python. Evita le cose che si trovano attualmente nel regno della 'moda passeggera' che stanno vivendo un'esplosione di popolarità per un motivo o un altro (ruby e javascript, ti sto guardando). TCL è cambiato nel corso degli anni , anche se uno dei suoi obiettivi è cercare di mantenere una coerenza progettuale. I moderni Perl e Python hanno entrambi una certa coerenza nel design, anche se è vero che le nuove funzionalità possono sembrare bloccate (anche se non è necessario usarle).


2

Penso che Python sia un candidato ragionevole per un linguaggio con il minimalismo come uno dei suoi obiettivi di design. Si basa su un numero relativamente piccolo di concetti fondamentali, e la versione 3 ha tentato di, tra le altre cose, semplificare il linguaggio un po ' per la rimozione di alcune caratteristiche.

(Certo, non è lo stesso di un set di funzionalità che è rimasto lo stesso dalla versione 1, ma penso che sia un modo abbastanza arbitrario per valutare le lingue, dato che gli autori delle lingue possono chiamarlo versione 1 ogni volta che lo desiderano.)


La data di risposta del dicembre 2012 ti dà un passaggio gratuito, perché da allora abbiamo la mostruosità nota come Python 3, che rivaleggia con il C ++ nel voler aggiungere un mucchio di rifiuti di cruft, rimuovendo in realtà la semplicità. Ora è uno dei linguaggi infestati da addon più estranei nell'informatica.
Thomas Browne,

-1

Penso che l'approccio progettuale "minimalista" sarebbe esemplificato da Tcl. Ad esempio, puoi usare il comando {catch} con i valori {return -code n} per implementare qualsiasi struttura di controllo che la tua immaginazione può concepire, Perl ha dovuto aspettare un decennio per (ufficialmente) ottenere {switch} - (non che Perl mai avuto bisogno). Vedrai anche che Dodekalogue http://wiki.tcl.tk/10259 copre completamente la grammatica di Tcl - il resto, qualunque paradigma di programmazione con cui vuoi lavorare, può essere espresso in questa grammatica.


ciò si limita a ripetere il punto sollevato e spiegato in una risposta postata due anni fa
moscerino del

Facendo riferimento al post originale credo di poter solo dire ortogonalità = storia (la famiglia delle lingue C) e la recente assimilazione tra lingue; Ho visto in tutto il sistema operativo un approccio tra tutte le lingue ai framework web MVC generalizzati, alle coroutine, ecc. Al di fuori di questa tendenza, posso notare la notevole aggiunta di chiusure a C11 e l'imminente lambda Java (che rispecchiano entrambi lo sviluppo del linguaggio di "scripting" del sistema operativo).
user132043,
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.