Domanda

Per curiosità, ci sono molti compilatori là fuori che prendono di mira i file .pyc?

Dopo un po 'di usare Google, gli unici due che posso trovare sono:

  • empia : di why_ Ruby-to-pyc compilatore
  • Python : Pitone del PSF al compilatore pyc

Quindi ... non ci sono più?

(come nota a margine, ho ottenuto a pensare a questo perché voglio scrivere un compilatore Scheme-to-pyc)

(come seconda nota a margine, io non sono in qualsiasi illusione che un compilatore Scheme-to-pyc sarebbe utile , ma che mi avrebbe dato una scusa incredibile per imparare alcuni interni di entrambi Scheme e Python)

È stato utile?

Soluzione

ho scritto un compilatore diversi anni fa, che ha accettato un linguaggio Lisp chiamato "Noodle" e prodotto bytecode Python. Mentre non è mai diventata particolarmente utile, è stata una buona esperienza di apprendimento tremendamente sia per comprendere meglio Common Lisp (ho copiato molte delle sue caratteristiche) e per la comprensione Python meglio.

Posso pensare due casi particolari quando potrebbe essere utile per indirizzare direttamente bytecode Python, invece di produrre Python e trasmetterla ad un compilatore Python:

  1. chiusure complete: in Python 3.0 prima (prima che la parola chiave nonlocal), non è possibile modificare il valore di un chiuso-over variabile senza ricorrere a bytecode aggiustamenti. È possibile mutare valori invece, quindi è pratica comune avere una chiusura riferimento a un elenco, per esempio, e cambiando il primo elemento in esso dall'ambito interno. Che può ottenere reali fastidioso. La restrizione è parte della sintassi, però, non è il Python VM. La mia lingua aveva esplicita dichiarazione di variabile, quindi ha fornito con successo "normali" chiusure con valori chiuso oltre modificabili.
  2. Come in un oggetto traceback senza fare riferimento qualsiasi comandi incorporati. caso di nicchia reale, di sicuro, ma ho usato per rompere una prima versione del carcere "Safelite". Vedere mio invio su di esso.

Quindi sì, è probabilmente molto più lavoro di quanto ne vale la pena, ma mi sono divertito, e si potrebbe anche.

Altri suggerimenti

"Voglio scrivere un compilatore Scheme-to-pyc".

Il mio cervello fa male! Perché si vuole farlo? codice Python byte è un linguaggio intermedio specificamente progettato per soddisfare le esigenze del linguaggio pitone e progettato per funzionare su Python macchine virtuali che, di nuovo, sono stati adattati alle esigenze di pitone. Alcune delle più importanti aree di sviluppo di Python in questi giorni si stanno muovendo Python ad altre "macchine virtuali", come ad esempio Jython (JVM), IronPython (NET), PyPy e il vuoto Rondine progetto (spostamento CPython a un LLVM sede rappresentazione). Cercando di spremere la sintassi e la semantica di un altro, un linguaggio molto diverso (Schema) nella rappresentazione intermedia di un altro linguaggio di alto livello sembra essere affrontare il problema (qualunque sia il problema è) a livello sbagliato. Quindi, in generale, non sembra che ci sarebbero molti compilatori .pyc là fuori e c'è una buona ragione per questo.

Vi suggerisco di concentrarsi su CPython.

http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html

Invece di uno schema per .pyc traduttore, vi consiglio di scrivere un piano per Python traduttore, e poi lasciare CPython gestire la conversione a .pyc. (C'è un precedente per fare in questo modo, il primo compilatore C ++ è stato Cfront che tradotto in C ++ C, e poi lasciare che il compilatore C sistema di fare il resto.)

Da quello che so del regime, non sarebbe così difficile da tradurre Schema a Python.

Un avvertimento: la macchina virtuale di Python non è probabilmente più veloce per Schema come Schema stessa. Ad esempio, Python non si accende automaticamente coda ricorsione in iterazione; e Python ha uno stack relativamente poco profondo, in modo da sarebbe in realtà bisogno di trasformare la ricorsione in coda per l'iterazione per il vostro traduttore.

Come bonus, una volta a vuoto Rondine accelera Python, il vostro traduttore Scheme-to-Python trarrebbero vantaggio, ea quel punto potrebbe anche diventare pratico!

Se questo vi sembra un progetto di divertimento a voi, dico andare per esso. Non tutti i progetti deve essere immediatamente pratico.

P.S. Se si desidera un progetto che è in qualche modo più pratico, si potrebbe desiderare di scrivere un AWK a Python traduttore. In questo modo, le persone con gli script eredità AWK potrebbe facilmente fare il salto in avanti a Python!

Proprio per l'interesse, ho scritto un compilatore giocattolo da un semplice LISP a Python. In pratica, si tratta di un LISP per compilatore pyc.

Date un'occhiata: sinc - Il più piccolo compilatore LISP

Probabilmente un po 'tardi alla festa, ma se siete ancora interessati al progetto clojure-py (https://github.com/halgari/clojure-py) è ora in grado di compilare un sottoinsieme significativo di clojure a Python bytecode -. ma qualche aiuto è sempre il benvenuto

Targeting bytecode non è difficile in sé, tranne per una cosa: non è stabile su piattaforme (es MAKE_FUNCTION apre 2 elementi dalla pila in Python 3 ma solo 1 in Python 2), e queste differenze non sono chiaramente documentati in un unico punto (AFAICT) - quindi probabilmente hai qualche livello di astrazione necessario

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