A cosa desideri che i designer linguistici abbiano prestato attenzione? [chiuso]


38

Lo scopo di questa domanda non è quello di mettere insieme un elenco completo di funzioni del linguaggio di programmazione senza le quali non puoi vivere o che vorresti fosse nella tua lingua principale preferita. Lo scopo di questa domanda è quello di mettere in luce gli angoli del design delle lingue che la maggior parte dei progettisti di lingue potrebbero non pensare. Quindi, invece di pensare alla funzione linguistica X, pensa un po 'più filosoficamente.

Uno dei miei pregiudizi, e forse potrebbe essere controverso, è che il lato più morbido dell'ingegneria - i perché e ciò che fors - sono molte volte più importanti del lato più concreto. Ad esempio, Ruby è stato progettato con l'obiettivo dichiarato di migliorare la felicità degli sviluppatori. Mentre le tue opinioni possono essere mescolate sul fatto che siano state emesse o meno, il fatto che fosse un obiettivo significa che alcune delle scelte nel design del linguaggio sono state influenzate da quella filosofia.

Si prega di non pubblicare:

  • Sintassi guerre di fiamma. Ammettiamolo, abbiamo le nostre preferenze e la sintassi è importante in quanto riguarda il design del linguaggio. Voglio solo evitare epiche battaglie sulla natura di emacs vs VI (di cui un gran numero di persone in questi giorni non sanno nulla).
  • "Qualsiasi lingua che non ha la funzione X non merita di esistere", commenta i commenti. C'è almeno un motivo per cui esistono tutti i linguaggi di programmazione: buono o cattivo.

Si prega di fare postale:

  • Idee filosofiche che sembrano mancare ai designer linguistici.
  • Concetti tecnici che sembrano essere implementati male il più delle volte. Fornisci un esempio del dolore che provoca e se hai idee su come preferiresti che funzioni.
  • Le cose che desideri erano nella libreria comune della piattaforma ma raramente lo sono. Allo stesso modo, le cose che di solito si trovano in una libreria comune che desideri non lo fossero.
  • Funzionalità concettuali come test integrato / asserzione / contratto / supporto per la gestione degli errori che desideri che tutti i linguaggi di programmazione implementino correttamente e che definiscano correttamente.

La mia speranza è che questo sia un argomento divertente e stimolante.

Modifica: chiarito cosa intendo per Syntax Flame Wars. Non sto cercando di evitare qualsiasi discussione sulla sintassi, in particolare perché la sintassi è una parte fondamentale della progettazione del linguaggio del programma.


Dire che la sintassi è solo un dettaglio dell'implementazione è semplicemente sbagliato. La progettazione della sintassi è una parte fondamentale della progettazione di una lingua. E molti dei punti che si fanno vogliono vedere pubblicato può effettivamente comportare sintassi. Pietà. Sembrava una domanda interessante.
Konrad Rudolph,

Quello che voglio evitare è la guerra delle fiamme. Se puoi discutere la sintassi senza iniziare una guerra di fiamma, provaci.
Berin Loritsch,

Risposte:


49

Supporto Unicode per impostazione predefinita

Oggi, i programmi sono stati sviluppati per essere utilizzati a livello internazionale, o supponendo che potrebbero essere utilizzati a livello internazionale. Essi devono fornire il supporto per i loro set di caratteri o rendere i programmi scritti in quella lingua inutile.


2
+1 In effetti, la lingua stessa dovrebbe consentirti di utilizzare qualsiasi carattere per i tuoi identificatori. Non siamo tutti inglesi.
Berin Loritsch,

13
@Berin: In realtà, anche se sono francese, preferisco di gran lunga i programmi in inglese. Il problema è quello della comunicazione, se scrivi programmi con identificatori ungheresi, spagnoli o portoghesi, non aspettarti che io possa mai entrare ... in un contesto di internazionalizzazione è estremamente importante che gli sviluppatori siano in grado di comunicare tra loro e ciò implica l'utilizzo di un linguaggio comune per identificatori, commenti e documentazione. L'inglese è la lingua franca degli sviluppatori.
Matthieu M.

11
Aggiungo che il supporto Unicode dovrebbe essere naturale quando si usa la lingua. Se possibile, non dovrebbe essere necessario uno sforzo supplementare per "aggiungerlo", dovrebbe "semplicemente funzionare" (dove ragionevole).
RHSeeger,

4
Analogamente, la lingua dovrebbe fare una distinzione fondamentale tra i dati di testo (sequenza di caratteri) e binari (sequenza di byte). C # funziona bene con stringe byte[]. Come fa Python 3.x con stre bytes. C (++) charottiene questo terribilmente sbagliato.
dan04

1
@RHSeeger - davvero !!! Anche in Python devi digitare u'My Unicode Štring'. Vorrei che potessi semplicemente dimenticare il tipo di stringa con cui hai a che fare e il codice di scrittura di Friggin.
Orokusaki,

25

Ne ho un paio:

  • Generics / templates. Ad esempio, i generici Java sono potenti, ma non necessariamente flessibili. Inoltre, poiché usano la cancellazione dei tipi, ho riscontrato problemi nell'implementazione astratta, specialmente nelle interfacce. E il compilatore non dovrebbe avvisare quando viene utilizzato un generico non specifico (come Hashmapinvece di Hashmap<String, int>). Penso che potrebbero essere migliorati in modo significativo. Un buon modello è molto utile, ma spesso trascurato.

  • Supporto per Good Date nella libreria standard. Intendo essere in grado di aggiungere e sottrarre date, ore e minuti e non dover affrontare il numero di millisecondi dal 1 ° gennaio 1970.


2
"buon supporto per la data" è un requisito piuttosto ripido! Che cosa vuol dire, anche? Penso che le date e gli orari siano una di quelle cose in cui non riesci a trovarlo bene. o lo rendi semplice e sbagliato, o lo rendi giusto e ingiustamente complicato. è DAVVERO difficile colpire una buona via di mezzo.
Sara

@kai Il punto è che il supporto per la data è di solito piuttosto terribile. Il vecchio java.util.Dateha quasi tutti i possibili problemi e problemi. Conosco solo una parte del nuovo java.time.*pacchetto, ma è pulito, facile da usare e privo di bug AFAICT. Gli utenti più avanzati potrebbero riscontrare problemi, ma si tratta di un enorme miglioramento. +++ Il problema sembra essere quello che è complicato e la prima versione è affrettata e rotta.
maaartinus,

24

Rendi la tua lingua analizzabile / verificabile per gli addetti alla sicurezza del computer.

Gli addetti alla sicurezza devono essere in grado di trovare le vulnerabilità in un programma prima della spedizione. Idealmente, siamo chiamati in anticipo e possiamo commentare la base di codice mentre si sviluppa, ma spesso no.

Quando esce una nuova versione della lingua o delle librerie di base, le cose che erano precedentemente sicure potrebbero non essere più:

  1. le librerie possono diventare più potenti: ad esempio la libreria URL ora supporta javascript:
  2. ci possono essere nuovi modi per convertire stringhe o byte in codice: ad esempio evalo librerie di deserializzazione
  3. le tecniche di riflessione del linguaggio possono diventare più potenti: es. esporre variabili locali

Ognuna di queste modifiche può aumentare la quantità di autorità abusabile di un programma, ma poiché la quantità di autorità che il programma utilizza (quando si tratta di client non dannosi) non è cambiata, le persone di sicurezza sono difficili da capire senza un intenso nuovo audit.

Quindi, ti preghiamo di pensarci quando progettiamo e verifichiamo la lingua. Di seguito sono riportati alcuni suggerimenti:

Definire alcune primitive in cui un programma può essere scomposto.

HTML5 è particolarmente dannoso in questo modo. Hanno ovviamente pensato molto alla sicurezza e hanno alcune persone molto intelligenti, ma invece di specificare nuovi elementi del programma come <video>in termini di vecchi, o creare un'astrazione comune secondo cui sia <video>vecchi che nuovi <img>possono essere specificati in termini di, <video>è ancora un altro elemento del programma una tantum con le sue conseguenze sulla sicurezza.

Rendi la tua lingua adatta all'analisi statica (anche se non tipizzata staticamente).

La gente della sicurezza spesso usa l'analisi statica per trovare schemi e per cercare di escludere parti di un programma in modo che possano concentrarsi su bit davvero complicati.

Dovrebbe essere ovvio quali identificatori sono variabili locali e quali no.

Ad esempio, non commettere lo stesso errore delle vecchie versioni di JavaScript che ha reso impossibile stabilire se xsi tratti di un riferimento alla variabile locale nel seguito (secondo una lettura letterale di una vecchia versione della specifica):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Consentire la sicurezza decomposibile

Molti sistemi sicuri sono progettati attorno a un kernel sicuro che preserva le proprietà di sicurezza, in modo che le persone di sicurezza possano concentrare i loro sforzi sull'analisi di una piccola quantità di codice e liberare la maggior parte dei programmatori dal dover affrontare gente di sicurezza {fastidiosa, pedante, paranoica} .

Dovrebbe essere possibile scrivere un tale kernel nella tua lingua. Se una delle proprietà di sicurezza della tua lingua è che verrà recuperato solo un determinato sottoinsieme di URL, gli autori del kernel possono fare qualcosa per incanalare tutto il recupero degli URL attraverso il loro codice? Oppure i controlli di build statici (come guardare le importazioni) possono svolgere la stessa funzione.

Alcuni linguaggi come Newspeak utilizzano un modello di funzionalità degli oggetti. È fantastico e un ottimo modo per ottenere una sicurezza scomponibile.

Ma se non riesci a farlo, rendere il grafico del modulo un artefatto staticamente analizzabile può offrirti un bel po 'di vantaggio. Se posso dimostrare che un modulo non può raggiungere il modulo I / O del file (tranne chiamando il codice in un modulo nel TCB), allora posso escludere intere classi di problemi da quel modulo.

Limitare l'autorità dei linguaggi di scripting incorporati

Molti sistemi utili sono organizzati come un nucleo statico che dà il via a molto codice scritto in linguaggi dinamici (anche funzionali).

E l'incorporamento dei linguaggi di scripting può rendere un sistema molto più estensibile.

Ma un linguaggio di scripting non dovrebbe avere la piena autorità della VM.

Se si sceglie di consentire i linguaggi di scripting incorporati, è facile per l'invocatore limitare ciò che possono fare. Un modello di funzionalità degli oggetti (vedi commento su Newspeak sopra) è molto appropriato qui; quindi quando valuta il codice in un linguaggio di scripting, il chiamante deve passare il codice per eseguire e tutte le variabili globali per quel codice.

Tratta evalcome un linguaggio che si incorpora come un linguaggio di scripting

Se la tua lingua è in grado di invocare il proprio compilatore per trasformare una stringa in codice, allora consenti che il sandbox sia lo stesso di qualsiasi altro linguaggio di scripting incorporato.

Utilizzare un semplice modello di concorrenza

A noi della sicurezza non piace preoccuparsi delle condizioni di gara quando si cerca di capire se una proprietà di sicurezza viene mantenuta.

Si prega di considerare le alternative al threading prima di stabilirsi sui thread come un'opzione predefinita quasi impossibile da proteggere.

Uno semplice è la concorrenza del ciclo di eventi come quella presente in E, Verilog e JavaScript.

Non incoraggiare a citare confusione

Alcune lingue sono lingue di colla e finiscono per gestire stringhe in molte lingue diverse.

Ad esempio, JavaScript spesso compone stringhe di HTML, CSS, XML, JSON e persino JavaScript. È molto difficile per i programmatori ricordare di codificare correttamente le stringhe di testo semplice quando le combinano per creare stringhe in altre lingue, quindi i programmi JS, ovviamente, hanno tutti i tipi di problemi di confusione citati: XSS è il peggiore.

Se si desidera includere funzionalità di composizione delle stringhe, provare a ridurre il carico di sicurezza del programmatore. DSL, macro igieniche e linguaggi di template incorporati possono essere un ottimo modo per farlo spostando l'onere di fuggire correttamente nella libreria o negli sviluppatori di lingue e allontanarsi dallo sviluppatore finale.


Bella ripartizione.
Qix,

23

Alcune delle migliori lingue sono state progettate da persone che volevano creare una lingua per se stessi.

Quindi penso che i progettisti linguistici dovrebbero prestare meno attenzione ai loro utenti. Non puoi piacere a tutti, né dovresti provare a farlo.


4
Ciò può essere vero in una certa misura. Tuttavia, se non ascolti mai i tuoi utenti, non conosci mai il dolore che infliggi loro quando tentano di usare il tuo bambino cerebrale. Senza sentire / sentire quel dolore non ti verrà mai in mente la prossima grande idea che risolva quel problema e altri. Nessun uomo è un 'isola. Il dolore può essere un grande motivatore per l'innovazione.
Berin Loritsch,

5
@Berin: Non credo che il punto sia che non dovresti mai ascoltare i tuoi utenti, ma non ascoltare gli utenti che vogliono usare la lingua per qualcosa che non è stato progettato per fare. Se hai progettato una lingua per risolvere un set o problemi specifici, allora dovresti soddisfare gli utenti che devono anche risolvere quei problemi. Tuttavia, ti rivolgi agli estremi e talvolta una lingua può trovare una nicchia in un nuovo dominio, quindi +1.
Jeremy Heiler,

2
@Jeremy, sì, è esattamente quello che sto dicendo, ma penso che sia raro che una lingua funzioni bene in un dominio per cui non è stata progettata.
dan_waterworth,

@dan_waterworth: le lingue di successo di solito funzionano, spesso bene, in domini per i quali non sono state progettate.
David Thornley,

8
Invece di "non ascoltare gli utenti", il consiglio è meglio espresso come "non ascoltare gli utenti che non hai".
chrisaycock,

16

Solo il 5-10% del tempo viene effettivamente impiegato a scrivere codice. I progettisti linguistici dovrebbero prestare attenzione alle difficoltà di far funzionare effettivamente il software, il che significa correggere errori e bug.

Ciò significa che dovrebbe essere un buon debugger. Non uno strumento con sintassi arcana e comandi da tastiera che è solo leggermente migliore di tonnellate di istruzioni di stampa.


2
+1. Il debug è uno dei luoghi in cui alcune lingue sono migliori di altre - e alcuni IDE fanno la differenza tra una lingua utilizzabile e una che ti ostacola.
Berin Loritsch,

2
Aggiungerò un po 'a questo e dirò, ove possibile, utili tracce dello stack. Se c'è un errore (o un'eccezione non rilevata o altro, a seconda della lingua), voglio essere in grado di visualizzare l'intero stack di chiamate che è arrivato ad esso, insieme ai valori degli argomenti utilizzati. Tcl lo fa eccezionalmente bene .. ma, per essere onesti, tutto è una stringa in Tcl, quindi puoi stampare il valore di tutto con relativa facilità.
RHSeeger,

1
Non solo debug, ma rende difficile scrivere bug. Ero così felice quando Java ha introdotto il controllo automatico dei limiti sugli array ... ma eccoci, 15 anni dopo, a fare ancora quegli errori in altre lingue.
Alex Feinman,

3
Non sarebbe meglio avere una lingua che trovi i Bugs in fase di compilazione? Ad esempio, quando uso Ada, trascorro molto meno tempo nel debugger rispetto a quando uso C o C ++.
Martin,

12

Penso che dovrebbero prestare attenzione a Python, che fa più cose giuste di qualsiasi altra lingua che ho incontrato (e che anche se non ti piacciono alcune delle funzionalità). Ciò non significa che dovrebbero emulare Python, ma è importante sapere che cosa ha fatto Python, anche se non vuoi affatto creare un linguaggio come Python.

Per quanto riguarda le idee filosofiche che sono rilevanti lì, queste sono le più importanti dello Zen di Python:

  • Esplicito è meglio che implicito.
  • La leggibilità conta.
  • I casi speciali non sono abbastanza speciali da infrangere le regole.
  • Sebbene la praticità superi la purezza.
  • Dovrebbe esserci uno - e preferibilmente solo un - modo obsoleto di farlo.
  • Se l'implementazione è difficile da spiegare, è una cattiva idea.
  • Gli spazi dei nomi sono una grande idea che suona il clacson: facciamo di più!

Penso che un linguaggio che segua queste regole debba necessariamente essere abbastanza OK, ma conosco solo uno che lo fa, e questo è Python. Per tutte le somiglianze con, ad esempio, Ruby nell'implementazione, Ruby perde cose come la leggibilità e ti invita a giocare a code golf, che è divertente, ma non utile in un ambiente professionale.

L'unica caratteristica tecnica che mi manca in Python è un'istruzione "until" (come while, ma non testare l'espressione la prima volta). Quindi ci sono molte cose in entrambe le librerie standard di Python e di altre lingue che potrebbero essere migliorate, ma non sono strettamente linguaggi , quindi questa è una domanda diversa. :-)


4
Considero altre due cose più importanti, soprattutto a livello di progettazione linguistica: "I casi speciali non sono abbastanza speciali da infrangere le regole". perché un linguaggio con mille casi speciali o regole arcane è difficile da usare, insieme a "Sebbene la praticità superi la purezza". perché altrimenti ti addentri nel regno dei tarping turing.

15
Se esplicito è meglio di implicito, perché non ti viene richiesto di dichiarare le variabili? Quando un semplice errore di battitura può causare errori difficili da eseguire il debug (al contrario di errori rilevati in fase di compilazione o errori di runtime che sono ovvi e facili da eseguire il debug), si tratta di un grave sciopero contro il linguaggio IMO.
Mason Wheeler,

4
@Mason Wheeler: l'unica ragione per cui devi dichiarare variabili in altre lingue è che devi dichiarare di che tipo sono. Python è dinamico, quindi non è necessaria la dichiarazione del tipo e quindi non è necessaria la dichiarazione. Non vedo come ciò abbia a che fare con implicito / esplicito. I tipi in Python sono espliciti. Quindi sono le variabili. Dopo dieci anni, un errore di battitura non ha mai causato un errore di debug difficile. In effetti, sono banali per il debug.
Lennart Regebro,

8
+1 per l'elenco, -1 per il fanboy-ness. Prestare attenzione a tutte le lingue che hanno ottenuto un successo significativo e tentare di incorporare o almeno analizzare l'applicabilità di quegli elementi sembra l'approccio più pragmatico.
Steven Evers,

3
@Lennart: direi che essere in grado (ma non richiesto, vedi regola 4) di dichiarare esplicitamente i tipi di funzione è una buona cosa. È simile al design per contratto. Questo è il punto che voglio sottolineare.
Theo Belaire,

11

La possibilità di modificare la lingua in base alle proprie esigenze è fondamentale per me. Per Lisp fatto con le macro, per Tcl con livello superiore. In misura minore, Ruby usa lambda e simili. Voglio solo la possibilità di aggiungere nuove strutture di controllo adatte al problema anziché plasmare i miei problemi attorno alle strutture di controllo disponibili. Ad esempio, il costrutto "do .. fino" che esiste in alcune lingue ma non in altri è un modo più pulito di gestire alcuni casi rispetto a "while", è estremamente utile poter aggiungere nuove strutture per soddisfare altri casi.

In senso più generale, si tratta di metaprogrammazione ... ma lo uso principalmente per costruire nuove strutture di controllo.


Interessante. Un buon supporto per la meta-programmazione può essere difficile da ottenere, ma molto potente quando lo è. Ho sentito da persone a cui piace Lisp che l'implementazione di Lisp è tra le migliori, ma lo dicono di tutto in Lisp. Qualche esempio di ciò che pensi che la meta-programmazione sia fatta bene?
Berin Loritsch,

"La metaprogrammazione fatta bene" deve essere dove è semplice fare bene (bene, per un'attività semplice ragionevole) e dove il risultato finale sembra una parte naturale della lingua.
Donal Fellows

1
Modifica non solo modificabile, ma decifrabile. Se hai rimappato qualcosa nella lingua, come lettore dovrei essere in grado di capirlo rapidamente. Annotazioni o altri marcatori estrinseci potrebbero essere di aiuto.
Alex Feinman,

Penso che Mata-Lua o Template Haskell facciano un buon lavoro nel fornire questo. (Non bello come la macro Scheme, ma è quello che si paga per l'utilizzo di più di parentesi in una lingua)
Theo Belaire

10

La cosa più importante è che la tua lingua deve avere uno "stile". Ad esempio, definirei C un linguaggio di programmazione di sistemi basato su puntatore. Definirei Erlang un linguaggio di programmazione funzionale altamente concorrente. Alcuni altri linguaggi (come C ++ e probabilmente Java) sono quelli che Allan Kay chiamava linguaggi "agglutinativi": i linguaggi Frankenstein consistevano in un mucchio di caratteristiche messe insieme.

La prossima cosa più importante è che le modifiche alla lingua stessa dovrebbero essere l'ultima risorsa. Anche il suono più benigno può diventare complesso se combinato con le altre caratteristiche della lingua. Direi che per mettere una nuova funzionalità in una lingua, è necessario:

  1. Dimostra che è veramente necessario.
  2. Dimostra che non può essere fatto in una biblioteca.
  3. Dimostra che appartiene alla lingua.

2
In altre parole, la lingua dovrebbe avere un principio progettuale generale e la lingua dovrebbe essere coerente con tale principio. I commenti sull'evoluzione del linguaggio sono garantiti (l'ho visto fallire un paio di volte).
Berin Loritsch,

1
Mi ricorda la mia citazione C ++ preferita ... Un polipo fatto inchiodando le gambe in più su un cane.
ocodo,

4
Dimostra che non può essere fatto in una biblioteca . +1
Qix

2
Mi piace il bocconcino della biblioteca. È bello come linguaggi come haskell non abbiano elementi di flusso di controllo integrati come loop, eccezioni o continuazioni. sono semplicemente molto semplici da definire all'interno del linguaggio, mantenendo la sintassi molto pulita e promuovendo estensibilità e composibilità oltre a creare un sacco di funzioni linguistiche intelligenti.
Sara

10

Grazie per un'ottima domanda Stai ricevendo delle risposte abbastanza buone.

Non per guardarti negli occhi, ma guardo un programmatore come un canale informativo. Idee / concetti / requisiti vanno da un lato e il codice esce dall'altro.

Se prendi una serie di requisiti (non importa come sono dichiarati) e l'insieme di codice su un'enorme lavagna e disegni linee che mappano ogni requisito sul codice che lo implementa, la complessità di quel grafico dipenderà da quanto bene il codice esprime i requisiti. Idealmente, dovrebbe essere piuttosto diretto e one-to-one, ma è difficile metterlo in pratica.

Misuro la specificità del dominio di una lingua come misura in cui semplifica quel grafico. Questa è una proprietà estremamente desiderabile, e può essere affrontata in qualsiasi numero di modi, da qualsiasi cosa, dalla definizione delle classi / routine giuste (nomi / verbi), alle macro, alla scrittura del proprio parser e interprete / compilatore.

Vorrei solo fare un esempio di ciò che intendo. Per il problema della creazione di interfacce utente di dialogo flessibili, questa tecnica elimina la necessità di scrivere gestori di eventi, spostamento di dati e la maggior parte delle cose normalmente eseguite nelle UI. Inoltre, riduce il codice sorgente di circa un ordine di grandezza. Il meta-linguaggio è in realtà solo alcune routine e macro in C / C ++ / Lisp, e l'ho fatto anche in lingue senza macro.

Se l'implementazione di un requisito può essere effettuata con 5 punti di modifica del codice o con 10, farlo con 5 non è solo meno codice, ma meno possibilità di perdere un passaggio e inserire un bug. Quindi, più una lingua è specifica per un dominio, più piccolo è il codice, più gestibile e più privo di bug. Penso che dobbiamo sapere come guidare verso quello. Ciò non significa che il codice sia più leggibile, a meno che il lettore non abbia investito nella curva di apprendimento per comprendere la tecnica.


9

Tipi interi e distinti come in Pascal e Ada. Onestamente: quanto spesso ti serve l'intero intervallo di qualsiasi numero intero? Penso che ci sia molto da migliorare nei tipi primitivi per rappresentare meglio il mondo reale.


2
I tipi interi limitati ala C, C ++, D, Java, C #, ecc. Hanno sicuramente il loro posto. Ad alcuni tipi di programmazione non interessa e semplicemente hanno bisogno della distinzione tra numero intero e virgola mobile. Anche allora, forse abbiamo solo bisogno di un tipo di numero e preoccuparci della parte integrale del numero in seguito? In breve, la programmazione aziendale è meno sensibile al tipo di numero intero specifico rispetto al fatto che un numero è un numero intero. Quando si implementa un protocollo a basso livello, le regole cambiano drasticamente.
Berin Loritsch,

2
Quello che ho pensato dove tipi come in Ada dove puoi semplicemente dire type Date_Of_Month is 1 .. 31;e lasciare decisioni come 16 o 32 bit all'ottimizzatore. Ma soprattutto assegnare 32 o 0 o -5 a una variabile del tipo ti dà un RANGE_ERROR.
Martin,

Gli intervalli funzionano bene per cose come Date_Of_Month(o Month_Of_Year) in cui esiste un intervallo ovvio da usare, ma molti - probabilmente la maggior parte - sono sfocati. type Persons_Age is 0..120? E se qualcuno infrange il record di longevità? type Year is 0..9999? E se tu fossi un egittologo?
dan04,

Se sei un egittologo hai bisogno di dimenticare type Egyptian_Year is -9999 .. 300;. Nella mia esperienza puoi trovare utili limiti per numeri interi la maggior parte delle volte. A questo proposito dovresti considerare type Scrolls_Found is array Egyptian_Year of Natural;che non puoi / non dovresti avere un tipo illimitato come indice di array. È solo un vettore di attacco per hacker. A proposito: Ada consente di calcolare i limiti di intervallo in fase di esecuzione.
Martin,

1
@kai nessuno ha detto che questa particolare caratteristica dei sistemi di tipo deve essere usata ovunque senza eccezioni. Sono sicuro che Ada consente anche di usare tipi numerici "regolari". E i tipi numerici limitati sono certamente utili per alcuni problemi (piuttosto comuni).
Sarge Borsch,

8

Ci sono funzioni che rendono i linguaggi di programmazione facili da usare dopo averli appresi e ci sono funzioni che li rendono facili da imparare. Poiché gli utenti di una lingua hanno idealmente una relazione a lungo termine con essa, ottimizzare per facilità d'uso è meglio che ottimizzare per facilità di apprendimento. Non rendere le cose più difficili del necessario, ma non sacrificare l'espressività (essere in grado di scrivere un piccolo codice che fa molto) per la leggibilità a coloro che non hanno familiarità con la lingua. D'altra parte, la lingua non dovrebbe leggere come un rumore di linea per le persone che ci lavorano da anni; non sarebbe facile da usare o da imparare.


8

Convenzioni di denominazione (ti sto guardando PHP)


Meno problemi di progettazione linguistica, però. Certo, devi sempre tenere d'occhio ciò che entra nella libreria standard, ma i progettisti del linguaggio non possono applicare le convenzioni di denominazione;)

3
È possibile per la libreria standard.
Malfist,

3
Non menzionare nemmeno PHP. La peggiore lingua comunemente usata in giro. Non progettato da uno scienziato informatico, solo un ragazzo che voleva modelli e sono stati aggiunti steroidi.
Keyo,

@delnan: alcune lingue, come Mercury o Eiffel, impongono convenzioni di denominazione (tutti i nomi delle classi di capitale, variabili che iniziano con una capitale, ecc.) e sono applicate dal compilatore. Fortran ha detto che le variabili che iniziano con i, j, k sono numeri interi (da cui l'utilizzo tradizionale come variabili di loop nella maggior parte delle lingue ...). E così via. In qualche modo fastidioso se non ti piace la convenzione, ma buono almeno per coerenza dei codici sorgente.
PhiLho,

@PhiLho: Ma è molto limitato. Non può imporre - solo un esempio - un uso coerente e significativo (per i lettori umani) di capitalizzazione o di sottolineatura (potrebbe provare ma rischierebbe la sanità mentale dei programmatori nel processo).

7

Integrazione di prima classe con ambienti di sviluppo.

Al giorno d'oggi, la codifica viene eseguita in un ambiente ricco. Per HTML / CSS / JS, abbiamo Firebug e altri strumenti interattivi. Per Java, Eclipse e IDEA e altri IDE reali. E così via. Esiste un'ecologia di strumenti, che inizia con l'editor ma non termina qui:

  • Organizzazione del codice all'interno e tra i file
  • Evidenziazione intelligente
  • Completamento intelligente / digitazione predittiva
  • Debug statico (segnalazione di sintassi, errori semantici e stilistici)
  • Creazione e utilizzo di modelli e macro
  • Controllo della versione (controllo delle versioni, unione, diramazione, ...)
  • Sviluppo distribuito con più autori (commenti, documenti incorporati, annotazioni, ...)
  • Debug di runtime (tracce dello stack, stepping, orologi, ...)
  • Debug interattivo "live" (come Firebug - comportamento di modifica di un sistema live)
  • ... Non so nemmeno cosa succederà.

Le lingue dovrebbero essere costruite per fornire supporto per queste attività. Sono stati compiuti alcuni progressi, ad esempio annotazioni in Java per aiutare altri sviluppatori a comprendere l'intento del codice.

Ma soprattutto è roba hackerata, come usare $ Id $ in un commento in modo che la fonte controllata da CVS possa contenere un numero di versione. Perché non posso fare qualcosa del genere dalla stessa lingua?


Intendi qualcosa come ASIS (ISO / IEC 15291: 1999 "Ada Semantics Interface Specification")? ASIS non copre tutto ciò che desideri, ma piuttosto. Ho spesso desiderato qualcosa come ASIS per altri linguaggi di programmazione. Vedi sigada.org/wg/asiswg per i dettagli.
Martin,

Alcune di queste cose sono relativamente economiche da fare o vengono gratuitamente dal tuo IDE: organizzazione del codice, evidenziazione della sintassi, piegatura del codice, controllo della versione, modelli / macro. Altri richiedono molto più sforzo: debug di runtime, debug statico, completamento intelligente / digitazione predittiva, refactoring, ecc. Sebbene spesso trascurato, progettare un linguaggio coerente è molto più difficile quando devi preoccuparti anche dei plugin IDE.
Berin Loritsch,

6

Calcolo distribuito

Il pranzo gratis è finito. Oggi sono necessari programmi eseguiti su più core / processori multipli (e su circostanze speciali più computer).

Sfortunatamente scrivere codice multi-thread è concettualmente difficile, quindi non c'è davvero bisogno di aggiungere la lingua come barriera.

L' uso del C ++ 0x del futuro è sicuramente interessante, per tutto ciò che viene portato come libreria e non ti libera dagli attuali problemi di sincronizzazione (sai, quelli che sono così facili da risolvere ...)

Mi piace molto l' approccio di Go al problema: il multithreading è integrato e l'approccio adottato (canali e goroutine) stabilisce una mentalità molto più semplice rispetto ai tradizionali approcci semaphore / mutex / lock. È comunque facile accedere contemporaneamente a una struttura non sincronizzata (Go ha puntatori) o deadlock (ciclo di attesa sui canali ...)

Penso che le lingue che favoriscono l'immutabilità dei dati, come i linguaggi funzionali, possano averne il diritto (mi piace comunque l'esperienza lì).

Inoltre, il modello di attore potrebbe essere il nostro prossimo obiettivo. Era pensato anche per il calcolo distribuito.


Un altro esempio sarebbe Erlang. Un tema comune tra le lingue di questo tipo è un approccio al nulla condiviso , in cui lo stato viene sostanzialmente passato insieme al messaggio. L'approccio si ridimensiona bene.
Berin Loritsch,

@Berin: Hai ragione, anche se non ho citato Erlang nel messaggio perché ne so poco, lo ricordo correttamente implementa il modello di attore.
Matthieu M.

6

Chiamami pazzo, ma una delle caratteristiche linguistiche più importanti per me è la disponibilità di un buon riferimento online, insieme ad esempi. So di poter trovare buoni risultati di ricerca per qualsiasi lingua, ma mi piacciono molto il sito delle API MSDN e Java. Rendono la programmazione molto più semplice per una persona che non ha molta esperienza nella lingua specifica.


JavaDoc, CppDoc, RubyDoc, ecc. Sono stati una grande risorsa per la comprensione delle librerie standard e delle librerie create. Non sono tutti creati uguali e alcuni sono più facili da navigare rispetto ad altri.
Berin Loritsch,

D'accordo, il sito dell'API Java è una risorsa eccellente. È fantastico avere anche un formato standard per la creazione di documentazione API. I guadagni di produttività derivanti dall'uso di un IDE con supporto integrato per l'analisi di JavaDoc (netbeans) sono sorprendenti. Anche se ho un ricordo orribile, quindi probabilmente mi avvantaggia più di altri.
toc777,

6

Più capacità di aiutare il compilatore a controllare il tuo codice.

Essendo un programmatore di sistemi embedded, uso sempre C. Ma vorrei sempre avere modi più / migliori per dire al compilatore cosa mi aspetto dal mio codice in modo che possa verificarlo.

Ad esempio, posso avere una funzione

f(int x)

ma preferirei

f(int range[-5..25] x)

Ad esempio, vorrei essere in grado di scrivere asserzioni sulle funzioni usando un qualche tipo di linguaggio funzionale di livello superiore come Lisp o Haskell. Questi non verrebbero compilati in codice, ma potrebbero essere utilizzati per analisi statiche o dinamiche.


Essenzialmente un modo efficiente per fare il controllo dei limiti? Sarebbe piuttosto bello. Tuttavia, vorrei almeno che fosse incluso per il controllo di runtime e per il controllo del tempo di compilazione. Quando si raccolgono informazioni da un database o dall'interfaccia utente, si garantisce sempre che il valore sarà valido. Se questa fosse una funzionalità linguistica, vorrei usarla anche per questi scopi.
Berin Loritsch,

3
Dovresti usare Pascal. È possibile definire un tipo che copre un intervallo arbitrario di numeri, come -5..25, che il compilatore può verificare in fase di compilazione. (Finché stai assegnando solo costanti, ovviamente.)
Mason Wheeler,

1
@Kugel: Cos'altro se non una funzione del compilatore è asserita? E il test unitario non controllerà il codice in produzione. E non controllare la produzione è come togliere le barche dal vivo dopo il viaggio inaugurale. Per risparmiare carburante e rendere la nave più veloce.
Martin,

1
Vorrei usare Ada, tranne per il fatto che la piattaforma su cui sto lavorando non ha un compilatore Ada. Ha solo un compilatore C, quindi è comunque tutto accademico.
Rocketmagnet,

1
Uso già molte affermazioni, ma sarebbe ancora meglio avere questa e altre cose come funzionalità linguistiche.
Rocketmagnet,

5

Piccola sintassi con il minor numero di parole chiave possibile perché la sintassi dettagliata è difficile da imparare e non aiuta la leggibilità.

L'esempio peggiore è Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Le parole di riempimento come sono, come, .. non hanno senso per i linguaggi di programmazione.


4
Penso che l'esempio peggiore siano le lingue in cui dici public static void.
Joey Adams,

1
L'idea non è nuova e già implementa in forma di SmallTalk che non ha parole chiave. Quindi avresti dovuto usare SmallTalk come esempio positivo per il tuo reclamo. A proposito: se non sai a cosa ISserve allora non hai capito Ada (hai mai programmato Ada?): ISSepara la dichiarazione di procedura dalla dichiarazione di variabili locali e distingue anche una specifica dall'implementazione. Ovviamente noterai solo quando confronterai le specifiche e l'implementazione di una funzione per vedere che ISha perfettamente senso e non è affatto un riempitivo.
Martin,

1
Hai dimenticato di menzionare: la sintassi SmallTalk si adatta anche al retro di una cartolina. Quindi soddisferà anche il tuo desiderio di "piccolo". Ovviamente la maggior parte delle idee qui sono già implementate in qualche lingua da qualche parte e la maggior parte dei poster qui usa quelle lingue come esempio positivo invece di fare un esempio negativo difettoso . Ti voterei se odiassi abbastanza reputazione. Non perché la tua idea sia negativa, ma per usare un esempio negativo.
Martin,

7
Le parole di riempimento possono effettivamente servire a uno scopo se aiutano a chiarire la sintassi. Ad esempio, preferisco di gran lunga if x then …farlo if (x) …. Abbiamo scambiato una coppia di parentesi con una parola chiave contestuale. Questo ha senso perché la condizione xpuò essere un'espressione complessa con le proprie parentesi. L'eliminazione della coppia più esterna può aumentare drasticamente la leggibilità. Un'alternativa, ovviamente, è usare i due punti qui, come in Python. In effetti, credo che la maggior parte dei riempitivi così ambigui possano essere sostituiti da due punti. Non sono sicuro del metodo che preferisco.
Konrad Rudolph,

3
@Konrad: se disambula la sintassi, non è un filler. La is è un filler perché Ada avrebbe permesso procedure Hello begin ... endsenza ambiguità.
dan04,

4

Mi piacerebbe vedere più l' apprendimento delle lingue . Non solo lingue per principianti assoluti con restrizioni più sacre di te come richiedere uno spazio tra ogni token , ma lingue per persone che già conoscono la programmazione e vogliono imparare nuovi concetti o migliorare la programmazione in generale.

Per me, Haskell è un ottimo esempio di cosa intendo per "apprendimento della lingua" (sebbene sia cresciuto in popolarità e utilità generale nel corso degli anni). Abbandonando la familiare sintassi C e avendo operatori di composizione di funzioni all'indietro (ad esempio (+2) . (*3)è una funzione che si moltiplica per 3, quindi aggiunge 2), Haskell mi ha insegnato a scrivere funzioni più brevi. Il suo spietato correttore di tipi mi ha aiutato a imparare la lingua più velocemente e ha migliorato la mia capacità di pensare logicamente al codice. Entrambi questi vantaggi si sono riversati su altre lingue, persino sull'assemblaggio.

Gli obiettivi dell'apprendimento delle lingue e quelli delle lingue di uso generale sono spesso in conflitto. Una lingua di apprendimento dovrebbe essere stimolante e gratificante da imparare e dovrebbe applicare uno stile particolare, anche se quello stile non è il migliore per molte applicazioni. Un linguaggio generico dovrebbe essere buono per fare cose, e l'uso delle astrazioni dovrebbe essere attentamente misurato e "avere un senso". Ad esempio, quando si aggiusta un sito Web, conoscere le monadi sarebbe l'ultima cosa nella mente di un programmatore. Dall'altro lato della medaglia, quando qualcuno sta imparando a programmare, non dovrebbe dover superare le sciocchezze del "vuoto statico pubblico" se non ha ancora imparato a conoscere le funzioni.

Se sei un designer di lingue, ti preghiamo di decidere se la tua lingua è una lingua di apprendimento o una lingua applicata. Ciò determinerà fino a che punto vorrai impiegare la purezza nel tuo progetto.


2
In che modo la composizione delle funzioni di Haskell è in qualche modo arretrata? È una traduzione diretta di (f ∘ g)(x) = f(g(x)).
Jon Purdy,

@Jon Purdy: significa che devi scrivere le funzioni in ordine inverso alla loro applicazione. In entrambe le forme, gviene prima applicato l'argomento, seguito da f. Se si desidera ordinare un elenco, raggrupparlo e ottenere il primo elemento di tali elenchi, scrivere (map head . group . sort) listo map head $ group $ sort listo map head (group (sort list)). In tutti i casi, si finisce per scrivere le operazioni al contrario. A proposito, l'importazione Control.Arrowti permette di dire (sort >>> group >>> map head) list, ma l' >>>operatore mi sembra piuttosto imbarazzante e dettagliato.
Joey Adams

2
Non lo so, penso ancora che quello da destra a sinistra abbia un senso. (map head . group . sort) listlegge come "il primo elemento di ciascun gruppo in una sorta di list", il che è abbastanza naturale - e, per il mio orecchio, più funzionale di (sort >>> group >>> map head) list, che legge in modo piuttosto imperativo e arretrato come "ordina quindi raggruppa quindi prendi il primo elemento di ciascun gruppo. .. list".
Jon Purdy,

@JoeyAdams - l' >>>operatore sembra piuttosto imbarazzante e dettagliato - Alcuni linguaggi funzionali più recenti hanno iniziato a utilizzare |>come operatore di concatenamento da sinistra a destra, che forse è un po 'più facile per gli occhi ...
Jules

4

Dal momento che siamo nel 2011,

  • una specifica assolutamente completa. nessuna lacuna dipendente dall'architettura come in C.
  • supporto multithreading; non solo funzionalità di sincronizzazione (blocchi), ma funzionalità di linguaggio che rendono il multithreading semplice come scrivere un loop:

    all (o in myCollection) {o.someMethod ()}

  • multi-paradigma; lasciatemi, il programmatore, decidere se desidero la sicurezza in fase di compilazione di un linguaggio statico o la morbidezza di un linguaggio dinamico, caso per caso; dammi caratteristiche orientate agli oggetti, caratteristiche funzionali, ecc.

  • coerenza (so che sta chiedendo un po 'tanto per coerenza e multi-paradigma ...)


Sono con te al 100% per una specifica completa. Il multi-paradigma e la coerenza saranno sicuramente un atto di bilanciamento. È possibile specificare un insieme di comportamenti per un paradigma dinamico come sottoinsieme dei comportamenti per il controllo statico, ma penso che questi due approcci possano prestarsi a stili di programmazione molto diversi. Dovrebbero davvero essere lingue separate a quel punto. Forse un paio di lingue coerenti con compatibilità al 100% sarebbe quello che stai cercando?
Berin Loritsch,

Lingue come Scala (e forse Haskell? Non lo so abbastanza) hanno un forte sistema di tipo statico e terseness, grazie all'inferenza di tipo e alle implicazioni.
PhiLho,

2
Le funzionalità che dipendono dall'architettura vanno bene quando un linguaggio consente a un programmatore di specificare ciò che è o non è importante. Ciò che rende C orribile è che non c'è modo di dichiarare "tipo numerico che avvolge il modulo 65536"; anche se una piattaforma implementa uint16_t, lo standard richiede che alcune implementazioni considerino la differenza tra due uint16_tvalori come firmata e che altri considerino la differenza come non firmata; non fornisce alcun modo per il programmatore di specificare quale comportamento è desiderato.
supercat,

Non sono d'accordo con multiparadigm; che lascia troppo spazio per le battaglie in stile codice. La biblioteca A è scritta con un mucchio di paradigmi dinamici . La biblioteca B è scritta con un mucchio di paradigmi statici . Bene, ora la Biblioteca A deve parlare con la Biblioteca B; dov'è la via di mezzo? Se devi scrivere la colla tra due pezzi di codice nella stessa lingua, la lingua è intrinsecamente imperfetta IMO.
Qix,

3

Processi leggeri

Mi piacerebbe avere processi leggeri come in Erlang. È principalmente un problema per il runtime. Ciò manca in JVM e .NET CLR. LWP aiuta a creare software simultaneamente di massa. Idealmente, non dovrebbe essere più costoso creare un processo in quanto è creare un oggetto in una lingua. Vorrei creare milioni di processi nelle mie applicazioni.

È implementato come un pool di thread con pianificazione preventiva, quindi una singola attività non blocca l'altra attività e le attività possono essere programmate su qualsiasi CPU disponibile.

Supporto per la ricorsione della coda

Vorrei avere il supporto per la ricorsione della coda. Questo può anche essere un problema per l'ambiente di runtime. Ad esempio, JVM non ha supporto per la ricorsione della coda.

Facile programmazione distribuita

Vorrei avere il supporto per send ( ! ) E ricevere primitive su parti dell'applicazione in esecuzione su altre macchine sulla stessa rete di Erlang. Ciò semplifica la creazione di applicazioni scalabili, ad esempio archivi di dati distribuiti. Inoltre, la serializzazione integrata nella lingua è molto utile come in erlang. E non come in Java, devo farlo manualmente.



Scala ha la ricorsione della coda ed è compilato per la JVM. Anche il compilatore IBM Java può ricorrere alla coda, a volte.
Martin,

3

Facilitare la metaprogrammazione.

limitare forme speciali

In Python non ci sono buoni motivi per cui stamparlo non sia una funzione integrata. Sembra e agisce come una funzione tranne che per non voler avere nulla a che fare con i genitori.

Abbiamo davvero bisogno for, foreach,while e simili ciascuno come loro forma particolare. Che ne dite di un costrutto di ciclo e alcune macro predefinite per fornire lo zucchero sintattico delle forme di ciclo variante.

meta-programmazione per moduli speciali

form['if'](test-fn, body-fn)


Ruby ha "forme speciali" per il looping, almeno nel senso che gli oggetti iterabili di solito hanno un metodo del genere eachche accetta un blocco di codice come argomento. (Ha anche Ruby fore whileloops, ma nessun programmatore di Ruby che si rispetti effettivamente li usa.)
mipadi

@mipadi: sono un grande fan dei blocchi di Ruby e dei modi di dire associati.
dietbuddha,

forse pensano - Ti spingerai gli occhi fuori. :) Suppongo sia stata l'associazione di tutti voi potenti "Python" e "nessuna buona ragione per cui". Tuttavia, la metaprogrammazione è un valido problema di progettazione del linguaggio che viene spesso trascurato. È per questo motivo che valuterò questo.
Berin Loritsch,

@Berin: lo uso davvero e sono un fan di Python che lo rende più divertente.
dietbuddha,

Un tipo di loop renderebbe oscuro il flusso del codice. Ad esempio, come do..whileapparirebbe un loop se esistesse un tipo di loop con la valutazione in alto? Non sembrerebbe affatto un ciclo do..while.
Qix

2

Funzionalità di rete

Un linguaggio che viene fornito senza alcun supporto di rete è piuttosto zoppo nel mondo di oggi.

La maggior parte delle applicazioni del mondo reale deve comunicare su un qualche tipo di rete:

  • aggiornamento automatico
  • accesso al database
  • servizi web

Ovviamente è anche una pietra miliare del supporto distribuito / cloud computing.


8
Ma può essere una funzione di libreria standard bene.
Donal Fellows

@Donal: non ho mai detto diversamente (o almeno non l'ho pensato), la domanda è aperta sia alla lingua che alle funzionalità della libreria. Il mio punto è che se ricevi un pacchetto linguistico e non ci sono funzionalità di rete, riempirai il dolore prima piuttosto che dopo :)
Matthieu M.

3
La libreria standard fa davvero parte dell'esperienza linguistica e deve essere trattata con la stessa cura e rispetto. Sono anche d'accordo con questo requisito per una libreria standard.
Berin Loritsch,

1

Mi piace un linguaggio di programmazione facile da imparare e facile da combinare per creare cose nuove.

Ad esempio, sebbene sia attraente avere molti modi per scrivere qualcosa, penso che sia meglio avere solo uno o due modi per scriverlo. In questo modo il programma è più facile da mantenere.

Una lingua i cui concetti possono essere applicati a tutti gli elementi è molto utile (penso che questa sia chiamata ortogonalità) Quindi, la prossima volta che affronterai una nuova funzione linguistica, puoi dedurre come usarla.

Capisco che a volte la sintassi del linguaggio debba ostacolare le prestazioni nella fase di compilazione / interpretazione, ma a volte sento che il progettista del linguaggio rinvia questo lavoro allo sviluppatore. Ad esempio, stringhe multilinea in Java o Javascript.

Infine, la sintassi del linguaggio è la sua interfaccia utente e, come tale, dovrebbe essere chiara, concisa, intuitiva, facile da usare e dovrebbe rispettare le tue abitudini.


Ortogonale significa che ogni funzione fa qualcosa di diverso. Guarda strumenti come grep o awk. Fanno una cosa, bene. Quindi collegali in diversi ordini per fare tutto ciò di cui hai bisogno.
Theo Belaire,

1
  • Leggibilità : meno sono i più piccoli simboli utilizzati nella grammatica, più sono puliti e meglio è.
  • Tipi orientati agli oggetti : metodi, non funzioni.
  • Comprensione : interfacce fluide integrate, nomi completi e brevi per le classi / interfacce delle biblioteche e le specie.

1
Scusa, ma devo darti un -1 per essermi completamente sbagliato. La terseness aiuta scrivere il codice più velocemente, ma sicuramente non rende il codice più leggibile, oltre un certo minimo. Un certo livello di verbosità rende il codice molto più facile da leggere, perché quelle parole e simboli extra significano qualcosa e trasmettono informazioni significative al programmatore, specialmente se originariamente sono state scritte da qualcun altro e non hai il vantaggio di avere già un pensiero modello di esso nella tua testa.
Mason Wheeler,

Per me, il codice pulito è un codice leggibile. Ho anche detto il più piccolo: avere ":" invece di "=>" negli array PHP o avere "." invece di "->", sarebbe sicuramente un miglioramento (e già mi piace PHP).
dukeofgaming

4
@ Mason: io e molti bravi scrittori tecnici (ad es. William Zinsser), non sono d'accordo. La verbosità è nemica della leggibilità, non della terseness.
Konrad Rudolph,

2
Vado per una forma di terseness che è definita in termini di simboli . Sono abbastanza contento dei simboli multi-carattere, purché siano cose che il lettore considera naturalmente come un singolo simbolo (ad esempio, una parola è un simbolo).
Donal Fellows

1
Il tuo primo punto è in conflitto diretto con gli ultimi due.
Qix

1

Aggiunta di una funzione a un linguaggio di programmazione esistente. Quindi, la nuova lingua B è la vecchia lingua A più la funzione X.

Esempi esistenti:

  1. C aggiungendo classi => C ++
  2. Java aggiungendo alcune cose => C #

2
Questa è un'enorme semplificazione eccessiva. Un esempio molto migliore sarebbe la differenza tra C e Objective-C.
Jon Purdy,

0

Quando si tratta di tecnologia / piattaforma / lingua / database ecc. Il più delle volte si tratta di prestazioni. In futuro molti software di oggi potrebbero essere progettati utilizzando un linguaggio grafico poiché disponiamo di più potenti computazionali.

Spero per il giorno in cui avremo il potere computazionale e una lingua in cui tu progetterai la tua applicazione e non dovrai preoccuparti dei dettagli della lingua .

Aggiornare: invio un link a tale linguaggio LabView

Aggiornamento: dovrei spiegare di più cosa intendo per "potente computazionale". Le prestazioni del software compilato potrebbero non essere così potenti come il software compilato basato sul linguaggio di sintassi. Sto pensando alla programmazione grafica come a un livello più alto di programmazione e potrebbero esserci più spese generali. I computer di oggi sono in grado di eseguire facilmente linguaggi di programmazione grafica.


3
I computer sono già abbastanza potenti per farlo. Non è pratico, dato che dovrai entrare nel codice per un motivo o per l'altro .
Jeremy Heiler,

2
È ancora una specie di lingua. Ci sono stati più tentativi per renderlo realtà. Gli strumenti UML genereranno una certa quantità di codice, ma quando il modello è sufficientemente dettagliato per produrre un prodotto funzionante non è più utilizzabile per capire il codice. Credo che ci fosse qualcosa nell'ambiente Unix per il cablaggio grafico delle applicazioni, ma per essere corretto richiedeva molta configurazione. I motori del flusso di lavoro utilizzano questo metaforo per consentire ai non programmatori di progettare il flusso di lavoro.
Berin Loritsch,

1
In breve, mentre dubito seriamente dell'utilità di questo approccio in termini generali, ci sono applicazioni specifiche in cui è attualmente utilizzato e funziona bene per quell'applicazione. Ri: i tuoi punti ... 1. I computer hanno il potere computazionale, il lato tecnico non è il problema. 2. Il problema è fornire un linguaggio visivo sufficientemente espressivo per svolgere il lavoro in senso generale senza perdersi nei dettagli. Al di fuori delle applicazioni di nicchia, il testo sembra essere una rappresentazione molto più compatta di un programma. Ho votato perché è applicabile alla domanda posta.
Berin Loritsch,

1
@Amir: Quindi, spiega perché i computer devono essere più potenti per consentire la "programmazione grafica" per guidare lo sviluppo del software?
Jeremy Heiler,

7
@Amir: stai confondendo una limitazione tecnica con una più fondamentale. Il motivo per cui non abbiamo molti linguaggi grafici per computer è che non sappiamo come farli bene (e non sappiamo se possono essere fatti bene). Sono a conoscenza di LabView e ho sentito abbastanza lamentele nel fare cose complicate o nel cambiare cose semplici. Né abbiamo bisogno di computer più potenti per progettare un linguaggio del genere, quindi vai avanti e prova a disegnare alcuni programmi di esempio in un linguaggio così ipotetico.
David Thornley,
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.