Quando qualcuno scrive un nuovo linguaggio di programmazione, in cosa lo scrivono?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

Domanda

Per favore, scusa la mia ignoranza. Mi diletto in PHP e mi sto bagnando i piedi navigando SO, e mi sento costretto a fare una domanda che mi chiedo da anni:

Quando scrivi un linguaggio di programmazione completamente nuovo, cosa scrivi in?

Probabilmente questo suona davvero sciocco per tutti voi programmatori, per i quali ho un rispetto tremendo, ma è un pollo e un perplesso perplessi; cosa dell'uovo per me. cosa fai? Di 'a te stesso Oggi ho intenzione di inventare una nuova lingua! e poi accendere ... Blocco note? Tutti i compilatori sono costruiti su linguaggi preesistenti, tali da disturbare uno che potrebbe tracciare tutti i linguaggi di programmazione mai concepiti su un mostruoso albero ramificato che alla fine è sorto a ... Non so, qualcosa vecchio?

Con il mio debole intelletto, trovo questo affascinante ... Per favore, educami!

È stato utile?

Soluzione

Non è una domanda stupida. È un'ottima domanda.

Come già risposto, la risposta breve è " Un'altra lingua. "

Bene, questo porta ad alcune domande interessanti? E se fosse la prima lingua scritta per  il tuo particolare hardware? Un vero problema per le persone che lavorano su dispositivi integrati. Come già risposto "una lingua su un altro computer". In effetti alcuni dispositivi embedded non avranno mai un compilatore, i loro programmi saranno sempre compilati su un altro computer.

Ma puoi respingerlo ancora di più. E i primi programmi mai scritti?

Bene i primi compilatori per " linguaggi di alto livello " sarebbe stato scritto in quello che viene chiamato "linguaggio assembly". Il linguaggio assembly è un linguaggio in cui ogni istruzione nella lingua corrisponde a una singola istruzione per la CPU. Il suo linguaggio di livello molto basso ed estremamente prolisso e molto laborioso per scrivere.

Ma anche per scrivere il linguaggio assembly è necessario un programma chiamato assembler per convertire il linguaggio assembly in "linguaggio macchina". Torniamo oltre. I primissimi assemblatori furono scritti in "codice macchina". Un programma costituito interamente da numeri binari che sono una corrispondenza diretta diretta con la lingua non elaborata del computer stesso.

Ma non finisce ancora. Anche un file con solo numeri non elaborati ancora necessita di traduzione. Hai ancora bisogno di ottenere quei numeri grezzi in un file nel computer.

Beh, che ci crediate o no, i primi computer avevano una fila di interruttori sul davanti. Hai girato gli interruttori fino a quando non rappresentavano un numero binario, quindi hai premuto un altro interruttore e quello ha caricato quel singolo numero nella memoria del computer. Quindi hai continuato a sfogliare finché non hai caricato un programma per computer minimo in grado di leggere programmi da file su disco o schede perforate. Hai premuto un altro interruttore e ha avviato il programma in esecuzione. Quando andai all'università negli anni '80, vidi dei computer con quella capacità ma che non avevano mai avuto il compito di caricare un programma con gli switch.

E anche prima i programmi per computer dovevano essere cablati con plug board !

Altri suggerimenti

La risposta più comune è C . La maggior parte delle lingue sono implementate in C o in un ibrido di C con callback e un "lexer" come Flex e generatore di parser come YACC . Queste sono lingue utilizzate per uno scopo: descrivere la sintassi di un'altra lingua. A volte, quando si tratta di lingue compilate, vengono prima implementate in C. Quindi la prima versione della lingua viene utilizzata per creare una nuova versione e così via. (Come Haskell .)

Molte lingue sono avviate al boot, ovvero scritte in se stesse . Per quanto riguarda il motivo per cui vorresti farlo, è spesso una buona idea mangiare il tuo cibo per cani .

L'articolo di Wikipedia a cui mi riferisco discute il pollo e l'uovo problema. Penso che lo troverai piuttosto interessante.

Praticamente qualsiasi lingua, anche se usarne una adatta per lavorare con grafici e altre strutture dati complesse renderà molte cose più facili. I compilatori di produzione sono spesso scritti in C o C ++ per motivi di prestazioni, ma linguaggi come OCaml, SML, Prolog e Lisp sono probabilmente migliori per la prototipazione del linguaggio.

Esistono anche diverse "piccole lingue" utilizzato nella progettazione del linguaggio. Lex e yacc sono usati per specificare sintassi e grammatiche, per esempio, e si compilano in C. (Ci sono porte per altre lingue, come ocamllex / ocamlyacc e molti altri strumenti simili.)

Come caso speciale, i nuovi dialetti Lisp sono spesso basati su implementazioni Lisp esistenti, poiché possono essere trasferiti sulla maggior parte della stessa infrastruttura. La scrittura di un interprete Scheme può essere eseguita in Scheme in una pagina di codice, a quel punto si possono facilmente aggiungere nuove funzionalità.

Fondamentalmente, i compilatori sono solo programmi che leggono qualcosa e lo traducono in qualcos'altro: convertire il sorgente LaTeX in DVI, convertire il codice C in assembly e quindi in linguaggio macchina, convertire una specifica grammaticale in codice C per un parser, ecc. Il progettista specifica la struttura del formato di origine (analisi), il significato di tali strutture, come semplificare i dati (ottimizzazione) e il tipo di output da generare. Gli interpreti leggono la fonte ed eseguono direttamente. (Gli interpreti sono in genere più semplici da scrivere, ma molto più lenti.)

In realtà puoi scrivere in quasi tutte le lingue che ti piacciono. Non c'è nulla che ti impedisca di scrivere un compilatore C in Ruby. & Quot; Tutti " devi solo analizzare il programma ed emettere il codice macchina corrispondente. Se riesci a leggere / scrivere file, probabilmente il tuo linguaggio di programmazione sarà sufficiente.

Se stai iniziando da zero su una nuova piattaforma, puoi eseguire la compilazione incrociata: scrivi un compilatore per la tua nuova piattaforma, che viene eseguito in Java o nativamente su x86. Sviluppa sul tuo PC e poi trasferisci il programma sulla tua nuova piattaforma di destinazione.

I compilatori più elementari sono probabilmente Assembler e C.

" Scrivere un nuovo linguaggio di programmazione " tecnicamente non comporta alcun codice. Sta solo arrivando una specifica per come appare la tua lingua e come funziona. Una volta che hai un'idea di come sia la tua lingua, puoi scrivere traduttori e interpreti per far sì che la tua lingua "funzioni".

Un traduttore inserisce un programma in una lingua e produce un programma equivalente in un'altra lingua. Un interprete inserisce un programma in una lingua e lo esegue.

Ad esempio, un compilatore C traduce in genere il codice sorgente C (la lingua di input) in un programma di linguaggio assembly (la lingua di output). L'assemblatore prende quindi il programma del linguaggio assembly e produce il linguaggio macchina. Una volta ottenuto l'output, non è necessario che i traduttori eseguano il programma. Poiché ora disponi di un programma in linguaggio macchina, la CPU funge da interprete.

Molte lingue sono implementate in modo diverso. Ad esempio, javac è un traduttore che converte il codice sorgente Java in bytecode JVM. JVM è un interprete [1] che esegue il bytecode Java. Dopo aver eseguito javac e aver ottenuto il bytecode, non è più necessario javac . Tuttavia, ogni volta che vuoi eseguire il tuo programma, avrai bisogno della JVM.

Il fatto che i traduttori non debbano essere tenuti in giro per eseguire un programma è ciò che rende possibile " bootstrap " la tua lingua senza farla finire in esecuzione " in cima a " livelli e livelli di altre lingue.

[1] La maggior parte delle JVM traducono dietro le quinte, ma in realtà non sono traduttori in quanto l'interfaccia per la JVM non è " lingua di input - > lingua di output " ;.

Generalmente puoi usare qualsiasi lingua tu voglia. PHP è stato scritto in C, per esempio. Se non hai accesso a nessun compilatore, dovrai ricorrere alla scrittura del linguaggio assembly e alla compilazione manuale del codice macchina.

Molte lingue furono prima scritte in un'altra lingua disponibile e poi reimplementate in sé e avviate in quel modo (o semplicemente mantenute l'implementazione in lingua straniera, come PHP e perl), ma alcune lingue, come il primo assemblatore, furono compilate a mano in il codice macchina come il primo compilatore C è stato compilato a mano in assembly.

Sono stato interessato al bootstrap da quando l'ho letto. Per saperne di più ho provato a farlo da solo scrivendo il mio superset di BF, che ho chiamato EBF , in sé. la prima versione di EBF aveva 3 primitive extra e ho compilato a mano il primo binario. Ho trovato un ritmo a due passi mentre lo facevo. Ho implementato una funzione nella lingua corrente in una versione e ho avuto una versione dolce in cui ho riscritto il codice per utilizzare la funzionalità implementata. Il linguaggio era abbastanza espressivo da essere usato per creare un interprete LISP .

Ho la versione compilata a mano insieme alla fonte in tag della prima versione e il codice è piuttosto piccolo. L'ultima versione ha dimensioni 12 volte maggiori e il codice e consente un codice più compatto, quindi compilare manualmente la versione corrente sarebbe difficile da ottenere.

Edmund Grimley Evans ha fatto qualcosa di simile con il suo linguaggio HEX

Una delle cose interessanti nel farlo da soli è che capisci perché alcune cose sono come sono. Il mio codice era prodotto se piccole regolazioni incrementali sembra più evoluto piuttosto che progettato da zero. Lo tengo presente quando leggo il codice oggi, che penso sia un po 'fuori posto.

Di solito con un linguaggio di programmazione generico adatto allo sviluppo di sistemi, ad es. C, Haskell, ML, Lisp, ecc., Ma l'elenco delle opzioni è lungo. Inoltre, di solito con alcuni linguaggi specifici del dominio per l'implementazione del linguaggio, ad esempio generatori di analizzatori lessicali e analizzatori, linguaggi intermedi come LLVM , ecc. E probabilmente alcuni script di shell, framework di test e un sistema di configurazione build, ad es autoconf.

La maggior parte dei compilatori sono stati wriiten come programma C o AC se non c, quindi assembly lang è la strada da percorrere Tuttavia quando si scrive un nuovo lang da zero e non si dispone di una macro lib o di un codice sorgente da un linguaggio prototipo che è necessario definire le tue funzioni Ora in quale lingua? Puoi semplicemente scrivere un Modulo "di codice sorgente chiamato psedocode sulla macchina che assomiglia a una grammatica bnf dalle specifiche di lang strutturate orientate agli oggetti come Fortran basic algo lisp. Quindi un'immagine che scrive un codice incrociato simile a una di queste sintassi del linguaggio È codice psedo

Anche ulteriori operazioni binarie o di assemblaggio devono essere tradotte in funzioni, ovvero il lavoro di assemblatori / compilatori, quindi in oggetto, da dati e funzioni, se non si dispone di un file sorgente per vedere " come queste funzionalità degli oggetti dovrebbero essere rappresentate nella tua implementazione del linguaggio, quindi devi riconoscere " vedi " implementare o definire le proprie funzioni, procedure e strutture di dati, il che richiede molta conoscenza, è necessario chiedersi quale sia una funzione. La tua mente diventa quindi la simulazione del linguaggio. Questo separa un programmatore Master dal resto.

Anch'io avevo questa domanda qualche mese fa. E ho letto alcuni articoli e guardato alcuni video che mi hanno aiutato a iniziare a scrivere la mia lingua chiamata soft. Non è ancora completo ma ho imparato molte cose da questo viaggio.

Le cose di base che dovresti sapere è come funziona il compilatore quando deve eseguire uno snippet di codice. Il compilatore ha molte fasi come analisi lessicale, analizzatore semantico, AST (Abstract Syntax Tree) ecc.

Ciò che ho fatto nella mia nuova lingua può essere trovato qui - http: / /www.singhajit.com/writing-a-new-programming-language/

Se stai scrivendo una lingua per la prima volta, allora tutto il meglio e hai ancora molta strada da fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top