Domanda

Io sono interessato all'attuazione di un quarto di sistema, solo così posso ottenere qualche esperienza di costruzione di un semplice VM e runtime.

Quando partire in quarta, tipicamente si impara a conoscere gli stack e i suoi operatori "DROP", il DUP, SWAP, etc.) prima, quindi è naturale pensare a questi come tra i primitivi operatori.Ma non lo sono.Ognuno di loro può essere suddiviso in operatori che direttamente manipolare la memoria e la pila di puntatori.Poi uno impara a conoscere store (!) e fetch (@) che può essere utilizzato per implementare DUP, SWAP, e così via (ha!).

Così che cosa sono le primitive operatori?Quelli che devono essere implementati direttamente in runtime environment dal quale tutti gli altri, può essere costruito?Io non sono interessato ad alte prestazioni;Voglio qualcosa che io (e altri) può imparare.Operatore di ottimizzazione può venire più tardi.

(Sì, sono consapevole del fatto che posso iniziare con una macchina di Turing e passare da lì.Che è un po ' estrema.)

Edit:Quello che sto puntando è simile a quello di avvio di un sistema operativo o un nuovo compilatore.Che cosa devo fare realizzare al minimo, in modo che sono in grado di costruire il resto del sistema è di quelle primitive costruzioni?Io non implementare questa nudi hardware;educativi e di esercizio, mi piacerebbe scrivere il mio minimo VM.

È stato utile?

Soluzione

Questa discussione copre il tuo domanda esatta. Ecco una implementazione da zuppa a noci con documentazione completa.

Ho scritto una subroutine filettata Forth indirizzata 68K quando ero al college. Ho definito l'ambiente di runtime e il formato del dizionario, quindi ho scritto del codice C che avviava un'applicazione di Macintosh che caricava un dizionario predefinito, popolava alcuni vettori I / O e faceva funzionare il codice. Poi ho preso il libro Leo Brodie Starting Forth e ho iniziato a implementare il dizionario di base in 68K linguaggio assembly. Ho iniziato con parole aritmetiche / logiche, poi ho controllato le strutture e poi le parole di definizione / manipolazione delle parole. La mia comprensione è che come minimo hai bisogno di @,!, +, -, * e /. Il resto può essere implementato in termini di quelli, ma è come provare a scrivere un'intera libreria grafica basata su SetPixel e GetPixel: funzionerà, ma piace, perché?

Mi è piaciuto il processo in quanto vi sono stati alcuni enigmi davvero interessanti, come ottenere DOES> esattamente nel modo giusto (e una volta che ho avuto una solida implementazione <=>, stavo creando chiusure che si sono trasformate in minuscole, minuscole quantità di codice).

Altri suggerimenti

Molto tempo fa, ho avuto un libro che si chiama "Filettato Interpretativa Lingue", pubblicato penso che per Byte, che ha discusso di come implementare un Via-come la lingua (non credo abbiano mai chiamato Indietro) in assembly Z80.

Non si può avere un Z80 portata di mano, o desidera uno, ma il libro potrebbe essere istruttivo.

Questo post su comp.lang.forth elenca alcuni " minimal Forths " ;.

http://groups.google.com/group/comp .lang.forth / msg / 10872cb68edcb526

Perché lo so? Mio fratello, Mikael, ha scritto n. 3 e ha anche scritto un documento sulla realizzazione di un " minimo Forth " (in svedese, però). Se ricordo bene, voleva ottenere un set minimo di operatori che potevano essere costruiti in silicone.

Non sono ancora convinto che la domanda sia ben formata. Ad esempio, le istruzioni di Plinth possono essere ridotte; dopotutto, * e / possono essere implementati in termini di + e -, ma poi '+' può essere implementato in termini di una funzione successiva (vedi Peano axioms .) Il che ti mette nei pressi di una macchina di Turing. Come fai a sapere dove fermarti?

Potresti anche dare un'occhiata al compilatore 4tH di Hans Bezemer . / p>

Che Via di attuazione stai usando quello di non fornire tali informazioni nella documentazione?Data la natura della Via, potrebbe essere dipendente dall'implementazione.C'è una serie di parole nel dizionario, ma se sono arrivati dall'assemblea/C/qualunque cosa o Indietro non importa, poiché la Via è, per definizione, un self-linguaggio estensibile.

Contrariamente a quanto dici, generalmente DROP SWAP ecc. sono considerate operazioni Forth di base. Il motivo è che se le implementate usando le operazioni di memoria come suggerite, l'intero sistema diventa più, non meno complicato. Inoltre, non esiste una chiara distinzione tra Forth e cosa no. Negli anni '80 la ricerca di un dizionario sarebbe di base e codificata in assembler per la velocità, mentre un moderno linux ospitato può permettersi di codificare ciò nel cosiddetto livello alto. Anche i Forther tendono a ricodificare sistematicamente le parole assembler in alto livello e le parole di alto livello in assemblatore. Sono l'autore di ciforth e yourforth. È possibile definire & Lt; = as & Quot; & Gt; & Non quot; come ho fatto in ciforth. Ma a tuo avviso, ho deciso che avere tutto & Lt; < = > > = come simili, dall'aspetto uniforme, le routine di assemblaggio di piccole dimensioni erano effettivamente più semplici. Questa è una richiesta di giudizio, e una questione di gusti, certamente non una questione di principio.

Nel contesto interpreto la domanda come: " Qual è una dimensione ragionevole per il numero di operazioni primitive per arrivare a un Forth potente ragionevole con una velocità ragionevole? " Chiaramente non sei interessato a trucchi intelligenti per sbarazzarti di una parola assemblatore a spese di un sovraccarico enorme come si trova in alcuni dei thread che trattano questo argomento.

Ora puoi guardare un certo numero di piccoli Forth come quelli che ti aspettano e concludere che per lo più si arriva a circa 50-100 primitivi. Quei Forth sono definiti in assemblatore. Se vuoi definire le tue primitive in c, python o Java, la situazione è di nuovo diversa. Ora per es. nella ricerca del dizionario sopra è possibile scegliere tra c e Forth. Entrano in gioco considerazioni che non hanno nulla a che fare con il design del linguaggio. Potresti essere un prolifico programmatore c, o potresti insistere nel codificarlo in Forth perché è un progetto di apprendimento.

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