PDA

View Full Version : Interpretare il codice sorgente [Python o in generale linguaggi interpretati]


Maurazio
07-09-2008, 12:37
Salve,
ho cominciato un po' a vedere come programmare con python, che però è un linguaggio interpretato e ho visto un immagine:
codice sorgente --> interprete --> risultato
Io ho il programma per scrivere il codice, ho l'interprete (python 2.5.2), ma non riesco a capire come salvare ed eseguire il programma, con un .exe o roba simile.

nico159
07-09-2008, 13:37
Giusto una precisazione: sorgente -> byte code -> Esecuzione
Il codice sorgente viene prima tradotto in byte code e poi eseguito dalla macchina virtuale Python.

Per distribuire il tuo software sviluppato in Python puoi usare la tecnica dei "binari congelati" che permette di creare un esecutibile completamente autonomo. I binari congelati contengono l'interprete, i byte code del tuo programma e i moduli di cui fai uso.
I principali sono Py2EXE (solo Windows), PyInstaller (Windows, Linux) e Py2App (Mac OS X).

cdimauro
07-09-2008, 21:31
Salve,
ho cominciato un po' a vedere come programmare con python, che però è un linguaggio interpretato e ho visto un immagine:
codice sorgente --> interprete --> risultato
Io ho il programma per scrivere il codice, ho l'interprete (python 2.5.2), ma non riesco a capire come salvare ed eseguire il programma, con un .exe o roba simile.
Python non è un linguaggio interpretato. Le sue implementazioni più diffuse compilano in bytecode.

In generale, comunque, un linguaggio di per sé non si può classificare come interpretato o compilato sulla base di una sua implementazione. Un linguaggio definisce una SINTASSI e una SEMANTICA precisa, e... tanto basta.

Maurazio
08-09-2008, 11:17
ah okey, allora la roba che ho letto cunta sü ball.
e se lo volessi compilare che cosa uso?

nico159
08-09-2008, 12:39
Hai letto il mio post? :stordita:

Non ti serve compilarli per forza

cdimauro
08-09-2008, 13:10
ah okey, allora la roba che ho letto cunta sü ball.
C'è molta ignoranza e molte leggende metropolitane, purtroppo.

xciaoatuttix
08-09-2008, 14:13
Python non è un linguaggio interpretato. Le sue implementazioni più diffuse compilano in bytecode.

se viene compilato in bytecode vuol dire che ha bisogno dell'interprete... no ? :stordita:

banryu79
08-09-2008, 14:22
se viene compilato in bytecode vuol dire che ha bisogno dell'interprete... no ? :stordita:
Ehm, a dire il vero... no :D
Chi compila in bytecode, è appunto un compilatore :)

xciaoatuttix
08-09-2008, 15:49
no volevo dire che una volta compilato in bytecode poi ha bisogno dell'interprete per essere interpretato ... no ?:fagiano:

banryu79
08-09-2008, 16:09
no volevo dire che una volta compilato in bytecode poi ha bisogno dell'interprete per essere interpretato ... no ?:fagiano:
Non vorrrei dire castronerie ma credo che l'interprete Python interpreti proprio codice sorgente Python (infatti in Python puoi scrivere una riga di codice sorgente e mandarla direttamente in esecuzione per "stamparne" l'output come se fossi in una specie di modalità interattiva, e in questo caso credo che entri in gioco proprio l'interprete).

Il bytecode prodotto dal compilatore invece, viene eseguito dalla Virtual Machine quando il programma viene mandato in esecuzione.

Maggiori delucidazioni te le possono fornire altri utenti del forum più esperti che usano Python (uno a caso, cdimauro).

xciaoatuttix
08-09-2008, 16:24
Non vorrrei dire castronerie ma credo che l'interprete Python interpreti proprio codice sorgente Python (infatti in Python puoi scrivere una riga di codice sorgente e mandarla direttamente in esecuzione per "stamparne" l'output come se fossi in una specie di modalità interattiva, e in questo caso credo che entri in gioco proprio l'interprete).

Il bytecode prodotto dal compilatore invece, viene eseguito dalla Virtual Machine quando il programma viene mandato in esecuzione.


quindi è una specie di linguaggio di scripting che puo' essere anche compilato in bytecode... vediamo gli esperti che dicono :stordita:
wikipedia dice che è un linguaggio interpretato tipo java.

Maurazio
08-09-2008, 17:03
io ho scaricato quello che ti trasforma il python in un autoeseguibile, ma non un compilatore, solo che nn ci capisco niente Py2EXE

WarDuck
08-09-2008, 19:00
Se Python segue la logica di Java, il bytecode è il codice di mezzo che viene prodotto dal compilatore, poi questo bytecode viene interpretato da una macchina virtuale.

Per questo non si dice che è compilato o interpretato... in genere è entrambe le cose.

Il compilatore come ogni compilatore dunque compila per una determinata macchina, che in questo caso è la macchina virtuale. La genialata sta nel fatto che basta disporre di una macchina virtuale compilata su più ambienti operativi, affinché il programma compilato una volta sola sul tuo pc possa funzionare ovunque ci sia a disposizione una macchina virtuale capace di interpretare il bytecode.

Questo in linea teorica garantisce la portabilità (anche se ciò non è pienamente vero), ed è uno dei vantaggi principali.

Tra gli svantaggi c'è appunto la possibilità che le prestazioni rispetto al codice nativamente compilato possano risultare inferiori...

cdimauro
08-09-2008, 20:26
Non vorrrei dire castronerie ma credo che l'interprete Python interpreti proprio codice sorgente Python (infatti in Python puoi scrivere una riga di codice sorgente e mandarla direttamente in esecuzione per "stamparne" l'output come se fossi in una specie di modalità interattiva, e in questo caso credo che entri in gioco proprio l'interprete).

Il bytecode prodotto dal compilatore invece, viene eseguito dalla Virtual Machine quando il programma viene mandato in esecuzione.

Maggiori delucidazioni te le possono fornire altri utenti del forum più esperti che usano Python (uno a caso, cdimauro).
Python interpreta il sorgente soltanto:
- la prima volta che lo legge;
- se ha subito modifiche;
- se è stato immesso da riga di comando;
- in presenza di funzioni di valutazioni (eval, compile) a cui vengono passate stringhe che contengono codice Python.

Ma in ogni caso viene sempre generato il corrispondente bytecode, che viene poi passato alla virtual machine.
quindi è una specie di linguaggio di scripting che puo' essere anche compilato in bytecode... vediamo gli esperti che dicono :stordita:
wikipedia dice che è un linguaggio interpretato tipo java.
Wikipedia sbaglia perché ha dimenticato la definizione di linguaggio di programmazione. Ci sono soltanto due cose che identificano un linguaggio: la sintassi e la semantica.

Un linguaggio NON si può identificare con una (o più) sua implementazione.

Per tornare a Python, l'implementazione ufficiale (supportata dal team di sviluppo del linguaggio) / più diffusa è CPython che traduce il sorgente in bytecode, che dà poi in pasto alla virtual machine.

Ma NON è l'unica implementazione. PyPy, ad esempio, è in grado di generare diverse forme di codice oggetto: si va dal bytecode al linguaggio macchina PowerPC.

Similmente, Java non si può considerare interpretato come linguaggio perché compilatori come GCJ permettono di compilare il sorgente generando codice macchina.

Spero di essere stato chiaro. :)
io ho scaricato quello che ti trasforma il python in un autoeseguibile, ma non un compilatore, solo che nn ci capisco niente Py2EXE
Attenzione: Py2EXE infila nell'exe la virtual machine Python.

Comunque non l'ho usato, per cui non ti saprei dare una mano.
Se Python segue la logica di Java, il bytecode è il codice di mezzo che viene prodotto dal compilatore, poi questo bytecode viene interpretato da una macchina virtuale.

Per questo non si dice che è compilato o interpretato... in genere è entrambe le cose.

Il compilatore come ogni compilatore dunque compila per una determinata macchina, che in questo caso è la macchina virtuale. La genialata sta nel fatto che basta disporre di una macchina virtuale compilata su più ambienti operativi, affinché il programma compilato una volta sola sul tuo pc possa funzionare ovunque ci sia a disposizione una macchina virtuale capace di interpretare il bytecode.

Questo in linea teorica garantisce la portabilità (anche se ciò non è pienamente vero), ed è uno dei vantaggi principali.

Tra gli svantaggi c'è appunto la possibilità che le prestazioni rispetto al codice nativamente compilato possano risultare inferiori...
Indubbiamente, ma possono essere anche superiori (e ci sono sempre margini di miglioramento).

Su interpretazione vs compilazione vedi sopra: non esistono linguaggi che si possano espressamente etichettare con questi termini. Esistono i linguaggio, e (alcune) loro implementazioni. ;)

Vincenzo1968
08-09-2008, 20:36
..
Indubbiamente, ma possono essere anche superiori (e ci sono sempre margini di miglioramento).
...


Teoricamente, direi anche. Su cinque contest, pochissime implementazioni in Python(ci ha provato DanieleC88, nel 5°, ma subito dopo è passato al C).
:fiufiu:

DanieleC88
08-09-2008, 21:17
Be' a dire il vero ho fatto versione Python/C sia nel quarto che nel quinto Contest. :D
Poi sono rimasto sul C perché nel contest contava strettamente l'elemento prestazionale, e su questo del codice nativo ben tarato è ancora nettamente superiore a qualsiasi linguaggio che possa essere interpretato in qualche modo. Per completezza mi tocca però dire che il miglioramento registrato con Psyco mi ha colpito parecchio, e se ho lasciato il Python è principalemente perché il PC che posso usare adesso è un pezzo d'antiquariato (e mi rende difficile l'opera di sperimentazione), ma non appena tornerò su per i corsi proverò a darmi meglio da fare con Python, mi sembra un linguaggio interessante. E comunque imparare un linguaggio in più non può farmi che bene :D

ciao ;)

cdimauro
08-09-2008, 21:29
Teoricamente, direi anche. Su cinque contest, pochissime implementazioni in Python(ci ha provato DanieleC88, nel 5°, ma subito dopo è passato al C).
:fiufiu:
Per forza: con Python ha ottenuto, con poco sforzo, una versione funzionante fin da subito. Poi si è concentrato sul miglioramento delle prestazioni.

Tu prima di ottenere qualcosa di realmente funzionante in C hai perso un mare di tempo. :D

Comunque i contest non cambiano la sostanza di quanto ho detto. ;)

Vincenzo1968
08-09-2008, 21:58
Per forza: con Python ha ottenuto, con poco sforzo, una versione funzionante fin da subito. Poi si è concentrato sul miglioramento delle prestazioni.

Tu prima di ottenere qualcosa di realmente funzionante in C hai perso un mare di tempo. :D

Comunque i contest non cambiano la sostanza di quanto ho detto. ;)

Ho perso un mare di tempo perché, come programmatore C(anzi, come programmatore, in generale ;) ), sono assai scarso. Immagina cosa potrebbe fare il linguaggio in mano a programmatori con i controcabasisi(come rеpne scasb).

Non critico Python ma, dal punto di vista delle prestazioni, il C rimane imbattibile(a parte, ovviamente, l'assembly).

cdimauro
08-09-2008, 23:12
Confrontato a Python sicuramente (d'altra parte non è la velocità d'esecuzione il motivo per cui è nato e per cui viene tanto usato), ma di fronte a C#, Java, ma soprattutto C++/CLR la tua affermazione non è corretta, visto che sempre più ci sono casi di applicazioni che girano meglio delle equivalenti C o C++. :cool: