Creiamo un linguaggio di programmazione scrivendo un compilatore?


8

Dì, volevo creare il mio linguaggio di programmazione. Supponendo di aver preso tutte le decisioni su come voglio che appaia e agisca, devo solo scrivere un compilatore per questo?

Ad esempio, il codice Java di alto livello è diverso dal semplice testo e questo testo è nel formato corretto per il compilatore per accettarlo e trasformarlo in qualcos'altro?

La mia domanda è: la creazione di un linguaggio di programmazione avviene tramite un compilatore? L'alto livello va bene.



Non proprio. Inoltre, potrei teoricamente inventare la mia unica lingua semplicemente creando un compilatore che analizza del testo? Dove questo testo è il mio linguaggio inventato nella mia sintassi. Ad esempio, è System.out.println()Java perché il compilatore Java lo accetta o c'è qualche altra cosa che funziona qui.
Haych,

3
Cosa intendi con "la creazione di un linguaggio di programmazione"? Cosa intendi con "fatto attraverso"? È difficile per me dire esattamente cosa stai chiedendo. Dici di aver già preso tutte le decisioni su come vuoi che la lingua appaia e agisca; cosa c'è di più nella creazione di un linguaggio di programmazione, dal tuo punto di vista? Se si tenta di elaborare ciò che si sta tentando di ottenere, sarà probabilmente possibile fornire risposte più utili su come raggiungere questo obiettivo. In questo momento sembra che dobbiamo indovinare cosa potresti chiedere.
DW

Risposte:


10

La risposta breve è no .

Puoi pensare a un linguaggio di programmazione come a un formalismo matematico utilizzato per esprimere il calcolo. Un compilatore / interprete è solo un pezzo di un vero software che esegue quel calcolo e non dovrebbe servire come specifica del linguaggio.

Detto questo, oltre alle specifiche lessicali e di sintassi di una lingua, dovresti anche definire le specifiche semantiche, cioè cosa significa effettivamente un programma (sintatticamente corretto) scritto nella tua lingua. La semantica ovvia per cominciare è la semantica operativa , in cui il significato di un programma è dato in termini di come il programma viene effettivamente eseguito. Cioè, (matematicamente) definisce con precisione come vengono eseguiti i programmi. Oltre a questa semantica, dovresti creare un compilatore / interprete reale con ottimizzazioni e così via.

Specificare la semantica operativa completa della tua lingua ti darà una documentazione linguistica formale e ti farà comprendere la tua lingua nei minimi dettagli. Inoltre, ti permetterà di ragionare formalmente su alcuni aspetti della lingua. Annotare la semantica operativa è davvero una buona abitudine.

Esistono anche altre utili semantiche, come la semantica assiomatica , denotazionale e di gioco . Tuttavia, sono più avanzati e in genere non si fanno strada in un compilatore / interprete.


3
Questo è sbagliato. Un linguaggio di programmazione senza una specifica formale è ancora un linguaggio di programmazione.
reinierpost,

3
@reinierpost Quindi, la tua risposta alla domanda "è la creazione di un linguaggio di programmazione tramite un compilatore" è sì? In tal caso, credo che dovresti scriverlo come risposta.
Bellpeace,

4
@reinierpost: una casa che non è stata progettata da un architetto è ancora una casa. Ma in che tipo di casa preferiresti vivere?
Andrej Bauer,

1
La domanda, come affermato, è ambigua. È possibile creare un linguaggio di programmazione creando un compilatore per esso? Decisamente. È questo il modo di creare un linguaggio di programmazione? No, è solo un modo possibile.
reinierpost,

2
@johan Un linguaggio di programmazione è di troppo grande importanza pratica e teorica per essere lasciato come un concetto che non è definito con precisione. Ad esempio, come spiegheresti con precisione a qualcuno cos'è C o come funziona esattamente? Dandole un compilatore in C? Ma ce ne sono così tanti e sono diversi! Inoltre, in molti casi non sappiamo nemmeno cosa farà il compilatore C (suggerimenti: concorrenza, modelli di memoria). A rigor di termini, un compilatore / integer `` induce '' un linguaggio di programmazione, ma pensare a un linguaggio di programmazione come una semplice implementazione solleva più problemi di
quanti

5

Dì, volevo creare il mio linguaggio di programmazione. Supponendo di aver preso tutte le decisioni su come voglio che appaia e agisca, devo solo scrivere un compilatore per questo?

No. Prendere tutte le decisioni su come vuoi che la lingua appaia e agisca sta creando il tuo linguaggio di programmazione. Non è necessario un compilatore o un interprete per creare un linguaggio di programmazione. Non hai bisogno di un compilatore o di un interprete per scrivere programmi nel tuo linguaggio di programmazione.

Hai solo bisogno di un compilatore o di un interprete se vuoi davvero eseguire i programmi che scrivi.

La mia domanda è: la creazione di un linguaggio di programmazione avviene tramite un compilatore? L'alto livello va bene.

No. La creazione di un linguaggio di programmazione avviene attraverso l'elaborazione di due serie di regole:

  1. come appare un programma legale (sintassi)
  2. cosa fa un programma legale (semantica)

Questo è tutto.

Esistono linguaggi di programmazione che non hanno implementazione. O che non ha avuto implementazione per molto tempo.

Ad esempio, Konrad Zuse ha creato Plankalkül a metà degli anni '40, ma a causa della guerra non è mai stato in grado di implementarlo. Fu implementato per la prima volta come parte di una tesi nel 1975. Ma certamente esisteva negli anni '50 e '60.

LISP è stato originariamente progettato come alternativa più trattabile al calcolo λ per lo studio del calcolo. È stato implementato da Steve Russell, uno studente di John McCarthy. Lo stesso McCarthy dubitava persino che il LISP potesse essere implementato!

APL è stato originariamente progettato come notazione per l'insegnamento della matematica. È stato successivamente esteso per servire come linguaggio di specifica per IBM System / 360. Le implementazioni arrivarono dopo, dopo che la lingua era già stata usata.

PIANIFICATORE era un linguaggio molto influente, che in realtà fu implementato solo dopo aver influenzato altre lingue; fu progettato nel 1969 e implementato nel 1973, quando aveva già influenzato Smalltalk e Prolog (entrambi 1972).

Struttura e interpretazione della meccanica classica è un libro di testo di fisica che utilizza Scheme anziché matematica per descrivere sistemi dinamici; il fatto che Scheme abbia interpreti e compilatori è essenziale per il libro, è usato come linguaggio per trasmettere pensieri, non eseguire programmi.

Come puoi vedere, i linguaggi di programmazione possono essere utili anche senza implementazioni. "I programmi dovrebbero essere scritti per essere letti dagli umani, e solo per inciso da eseguire dai computer" è una famosa citazione di Struttura e interpretazione dei programmi per computer. I linguaggi di programmazione sono linguaggi formali per descrivere in modo inequivocabile processi complessi. Il fatto che se descrivi un processo in modo sufficientemente preciso da essere compreso da un essere umano, capita anche che sia eseguibile da una macchina è un effetto collaterale. È un effetto collaterale molto desiderabile, utile, potente, ma è un effetto collaterale.

I primissimi "linguaggi di programmazione", calcolo λ, calcolo SKI, macchine di Turing, funzioni μ ricorsive, non sono stati creati per l'esecuzione. Sono stati creati per comprendere questioni fondamentali di logica e matematica.


0

La creazione di un linguaggio di programmazione avviene tramite un compilatore?

Ci sono 3 opzioni.

  • Un assemblatore
  • Un interprete
  • Un compilatore

Assembler
codice sorgente scritto da un essere umano si traduce da 1 a 1 in codice macchina consumato dalla CPU.

Interprete
Un programma legge ogni riga di codice, segue le istruzioni ed esegue queste in ordine.

Compilatore
Un programma analizza spesso le istruzioni utilizzando un albero di sintassi astratto e lo utilizza per generare il codice oggetto.
Il compilatore genera una qualche forma di codice oggetto che può essere utilizzato da una macchina reale o virtuale.

Sfocare le linee
Ci sono molti intermediari qui.
Ruby corre dal suo AST. Java esegue notoriamente il codice byte per una CPU fittizia.
SQL viene interpretato, ma non viene eseguito come scritto, viene tradotto in un piano di query.

Javascript esiste in una strana zona crepuscolare. Viene interpretato per la maggior parte, ma le parti critiche vengono eseguite attraverso un compilatore JIT che genera un codice byte non standardizzato e viene anche utilizzato come codice oggetto per alcuni compilatori.
Php era un linguaggio interpretato puro, ma Facebook utilizza il proprio compilatore php.

La mia raccomandazione
Se si desidera sperimentare la scrittura di un linguaggio di programmazione.
Inizia con un interprete.

Se vuoi capire i compilatori, studia AST!
Un linguaggio come Pascal è fatto su misura per un AST che può passare dal codice sorgente al codice macchina in un unico passaggio ed è quindi relativamente facile da implementare in un compilatore.
Se insisti a studiare compilatori e non interpreti, ti consiglio di studiare gli scritti di Wirth sull'argomento.


Ci sono più di tre opzioni. Ad esempio, un'opzione è: non fare nulla. Puoi creare un linguaggio di programmazione semplicemente indicandone le regole. Non è necessario implementarli affatto. Plankalkül non è stato implementato fino a 60 anni (?) Dopo la sua creazione. LISP e APL non erano originariamente concepiti per essere implementati affatto, LISP è stato progettato come una versione più trattabile di λ-calcolo per studiare il calcolo, APL è stato progettato come notazione per l'insegnamento della matematica. Il libro Structure and Interpretation of Classical Mechanics utilizza Scheme come notazione per la descrizione di sistemi dinamici, non come un ...
Jörg W Mittag

linguaggio per la scrittura di programmi che vengono effettivamente eseguiti.
Jörg W Mittag,

0

Tutto ciò che un compilatore fa è assicurarsi che l'input che viene fornito utilizzi la lingua che il compilatore comprende e che abbia la stessa struttura semantica della lingua.

Il compilatore simula l'intelligence facendo uso di un lexer e di un parser al fine di analizzare lessicamente l'input e provare ad analizzare i token in un ordine che ha il significato previsto senza introdurre ambiguità.

Per rispondere alla tua domanda, PUOI creare un linguaggio di programmazione creando il compilatore, ma in tal modo, il linguaggio di programmazione viene effettivamente creato prima che il compilatore sia completato.

Pensa ai linguaggi di programmazione come a qualsiasi altra lingua là fuori - inglese, francese, tedesco, ecc. Il lavoro di un compilatore è, dato qualche input, assicurati che le parole usate in quell'input corrispondano alle parole usate nella lingua per cui è costruito, crea sicuro che l'ordinamento delle parole abbia un senso nella lingua per cui è stato costruito e, infine, tradurre quell'input in una lingua comprensibile alla macchina


Questo non è necessariamente vero. Ci sono molti esempi di lingue create insieme ai programmi scritti per elaborarle. FORTRAN era il nome del compilatore, non la lingua.
reinierpost,

@reinierpost Il mio punto è che prima che un compilatore possa riconoscere un insieme di token nella sua lingua, quei token devono esistere prima ... quindi la lingua è nata prima del completamento del compilatore. Una lingua non può esistere senza i suoi componenti di base che sono le parole / frasi all'interno di quella lingua. La semantica può venire dopo. Allo stesso modo, un compilatore non può nemmeno iniziare a fingere di compilare una lingua se non conosce le parole che la compongono
smac89,

Non è necessario che sia disponibile una lingua "specifica". Il compilatore può elaborare l'input senza alcuna definizione specifica di ciò che costituisce un input valido per esso. Cerca di convincere una moltitudine di programmatori C ad accordarsi su cosa sia e non sia esattamente un programma C. In bocca al lupo!
reinierpost,
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.