Perché le funzionalità della lingua sono più popolari della progettazione del compilatore? [chiuso]

-1

Se disponessimo di un interprete universale per tutte le funzionalità disponibili dei linguaggi di programmazione, potremmo utilizzare uno specializzatore per generare compilatori per tutte le lingue. Potremmo semplicemente usare qualsiasi lingua come sorgente (o input) e qualsiasi piattaforma come target (output).

Potremmo tutti scrivere nel nostro linguaggio di programmazione preferito per aggiungere funzionalità all'interprete universale perché la base Abstract Syntax Tree (usata dall'interprete universale) potrebbe essere l'obiettivo del nostro linguaggio di programmazione preferito. Inoltre, è possibile visualizzare il "codice sorgente" dell'interprete universale in qualsiasi lingua, perché il "codice sorgente" dell'interprete universale è in realtà un AST.

Nonostante i programmatori abbiano questo tipo di idee da più di 40 anni, la maggior parte di noi sembra ancora pensare che dobbiamo scegliere una specifica rappresentazione testuale e un interprete appropriato (o un interprete specializzato chiamato compilatore).

Non capisco perché sia così. Ci sono così tanti programmatori in giro e la maggior parte dei programmatori è davvero appassionata della sua capacità di creare. Non capisco perché combattiamo su linguaggi di programmazione diversi, per me sembrano una visione diversa sullo stesso AST.

Perché non usiamo tutti la stessa base di una libreria da cui possiamo scegliere le caratteristiche linguistiche?

    
posta EECOLOR 16.02.2015 - 22:31
fonte

1 risposta

18

Sembra che i linguaggi di programmazione differiscano solo nella loro sintassi. Questo non è il caso. Anche le lingue possono avere una semantica ampiamente incompatibile. Ad esempio:

  • Un linguaggio funzionale che utilizza una valutazione lenta e un linguaggio imperativo che consente di combinare gli effetti collaterali.
  • Un linguaggio che consente l'aritmetica del puntatore e un linguaggio che garantisce la sicurezza della memoria sono difficili da conciliare.
  • Un programma che coinvolge loop infiniti non può necessariamente essere espresso in una lingua come Coq.
  • Un linguaggio che consente l'invio dinamico (ad esempio OOP) è incompatibile con un linguaggio completamente tipizzato in modo statico.
  • Alcune lingue non offrono l'allocazione dinamica della memoria.
  • Un programma che utilizza chiusure non ha una rappresentazione semplice in una lingua senza garbage collection.

L'elenco delle incompatibilità va avanti e avanti.

Ci sono un paio di rappresentazioni del programma che sono comuni per diverse lingue. Questi sono chiamati codice macchina o codice byte. Mentre sono funzionalmente equivalenti al programma originale, la maggior parte della struttura del programma è persa.

.NET common language runtime è un interessante esempio di piattaforma linguistica di livello intermedio che supporta una varietà di linguaggi diversi, sia imperativi che orientati agli oggetti (ad es. C #) e funzionali (ad esempio F #). Mentre i programmi non possono essere trasformati da una lingua all'altra - esistono lievi discrepanze di funzionalità -, parti diverse dello stesso progetto possono essere scritte utilizzando linguaggi diversi. A causa del comune runtime ricco di funzionalità, le loro strutture di interoperabilità sono praticamente prive di sforzo.

    
risposta data 16.02.2015 - 23:04
fonte

Leggi altre domande sui tag