Come vengono stampati gli interpreti e la macchina virtuale?

0

Mentre i compilatori di Language-Assembly diretti generano il codice richiesto per eseguire attività specifiche per la piattaforma specificata, come fanno gli interpreti?

Esempio astratto

Il seguente pseudo-codice ...

printf("Hello World");

... compilerebbe questo codice di linguaggio assembly.

org 100h
mov dx,msg
mov ah,9
int 21h
mov ah,4Ch
int 21h
msg db 'Hello, World!',0Dh,0Ah,'$'

Vorrei prendere Python come esempio. In CPython abbiamo un'istruzione print rappresentata da PRINT_ITEM istruzione VM. Quindi abbiamo una funzione print() che (sic!) Credo che chiama direttamente o meno la dichiarazione di stampa, potrei sbagliarmi. Ma allora vuol dire che non possiamo fare qualcosa senza implementarlo prima nel codice sorgente della VM? In che modo Python / altri linguaggi interpretati implementano funzioni più complesse come scrivere i dati su file? Significa che davvero tutta la libreria standard / funzionalità di base deve essere implementata nel codice della VM.

Che cosa viene chiamato quando vogliamo scrivere i dati nel file? Non esiste un'istruzione VM diretta per questo in CPython. Quindi chiama un metodo che è definito nel codice C di CPython? O forse il codice C espone solo alcuni flussi che lo abilitano al codice interpretato?

Spero che tu possa capire cosa intendo.

    
posta Sam Neezneny 19.08.2017 - 02:31
fonte

2 risposte

1

I would like to take Python as an example. In CPython we have a print statement represented by PRINT_ITEM VM instruction. Then we have a print() function which (sic!) I believe calls directly or not the print statement, I may be wrong.

L'istruzione di stampa è in Python 2. La funzione di stampa è in Python 3. Questo è il cambiamento tra le versioni principali. Inoltre, la funzione di stampa non chiama la dichiarazione di stampa, ma invia direttamente gli elementi a un flusso di output.

Does it mean that really all of the standard library/basic functionality has to be implemented in the VM's code.

Principalmente sì. Naturalmente, alcuni di essi possono essere implementati già nel codice emulato da un interprete; è molto spesso. Ma un interprete avrà sempre una porzione di codice implementata su un linguaggio compilato di livello inferiore (finalmente, eseguito da un processore). Se alcune funzionalità sono implementate in questa base di interprete, dipende da due fattori:

  1. Qualcosa non può essere implementato affatto nella lingua interpretata. Ciò include l'avvio e lo spegnimento dell'interprete, l'esecuzione delle istruzioni, l'interazione del sistema operativo, l'accesso diretto alla memoria e la garbage collection e così via.
  2. Qualcosa è molto inefficiente da implementare nel linguaggio interpretato. Questo fattore è molto specifico per un'implementazione particolare, ma la maggior parte degli interpreti è molto lenta con calcoli intensivi e lunghi accessi a catena di oggetti.
risposta data 19.08.2017 - 12:43
fonte
0

Per ciascuno dei comandi supportati dall'interprete ci sarebbe un po 'di codice idraulico precompilato che indirizza gli argomenti del comando a una funzione di libreria specifica dell'interprete. La funzione della libreria eseguiva la gestione degli errori specifica della lingua e in definitiva poteva delegare l'operazione di basso livello a un'API del sistema operativo.

Quindi sì, ci sarebbe una quantità significativa di codice pre-implementato che supporta il comportamento dell'interprete.

    
risposta data 19.08.2017 - 06:02
fonte

Leggi altre domande sui tag