2011-12-08 8 views
6

In CPython, penso, importare significa compilare il file py in un file pyc ed eseguire il file nel frame corrente, e la volta successiva CPython caricherà il file pyc direttamente senza compilare di nuovo. Che dire dell'importazione in ironpython? Immagino che ironpython non abbia un formato simile a quello di pyc. Si compila ogni volta che si importa?Cosa succede quando importa un modulo in ironpython?

+0

Ancora nessuno risponde? Sembra che debba rispondere io stesso ... – zchenah

risposta

7

Sì, IronPython ricompila il modulo importato in ogni esecuzione. Per due volte, in realtà.

È complicato.

Al primo passaggio, il codice Python viene analizzato in un AST, l'AST viene convertito in un albero di espressioni DLR e la struttura dell'espressione viene archiviata. Quando è il momento di eseguirlo, l'albero delle espressioni viene compilato in un set di istruzioni per un semplice interprete basato su stack e il codice del modulo viene eseguito su quell'interprete. Non è veloce durante la corsa, ma ha pochissimo tempo di avvio.

Dopo che un pezzo di codice è stato eseguito per un po ', IronPython si stanca di quanto sia lento, torna all'albero delle espressioni e ricompila il codice in un delegato .NET. Ciò significa che viene convertito in MSIL e quindi in codice nativo da .NET JIT. Questo codice è veloce da eseguire, ma richiede tempo per essere creato.

Questa conversione viene eseguita per funzione (o anche per ciclo), in modo che se si utilizza ripetutamente una funzione da un modulo e nessuna delle altre funzioni, solo la funzione comunemente utilizzata verrà sottoposta a codice IL completo generazione e JITting.

Nessuno di questa compilation viene salvato su disco, tuttavia. Il programma pyc.py incluso in IronPython può precompilare il codice, ma non viene eseguito automaticamente perché il codice generato in fase di runtime è diverso dal codice generato da pyc.py. Il codice runtime è solitamente da collezione, mentre il codice generato da pyc.py non lo è, e generare codice non da collezione in fase di runtime porta a perdite di memoria. pyc.py dovrebbe velocizzare le importazioni salvando alcuni passaggi, ma non sono sicuro di quanto.

+0

Grazie mille! – zchenah