python
lunedì 21 maggio 2012 - 3 Commenti
Pyweek – consigli e riflessioni

Introduzione
Da poco si è conclusa la quattordicesima edizione della pyweek (non le votazioni, almeno durante la stesura di questo articolo) e per me è stata la prima partecipazione all’evento. Volevo approfittarne per parlare un pò di come ho impiegato la mia settimana nella stesura del gioco insieme ad i miei compagni (abbiamo partecipato come squadra) per dare dei suggerimenti a coloro che vorrebbero, come noi, mettersi alla prova e partecipare. In particolare darò alcuni suggerimenti che mi sono stati utili, commentando secondo la mia esperienza personale.
Per chi non conoscesse l’evento, …

mercoledì 14 marzo 2012 - 7 Commenti
Casi frequenti, limiti, e compromessi per una macchina virtuale (e non solo)

L’esperienza che ho maturato in trenta, lunghi, anni di programmazione si potrebbe racchiudere nella seguente massima: “32 bits ought to be enough for anybody“, parafrasando una massima che viene erroneamente attribuita a Bill Gates.
La stessa frase la si potrebbe riscrivere, senza alterarne il significato, cambiando 32 con 8 all’epoca d’oro dei microprocessori a 8 bit, con 16 per l’era dei 16 bit, e… con 64 visto che siamo già entrati in quella dei 64 bit (di macchine a 128 bit non credo che ne parlerò).
Tutto ciò ha senso perché i …

mercoledì 7 marzo 2012 - 4 Commenti
Una nuova rappresentazione per gli interi lunghi di Python

Gli interi sono il tipo di dato più diffuso nel campo della computazione, per cui è normale che vi si dedichi più attenzione e risorse cercando di ottimizzarne il più possibile l’uso.
Python non fa eccezione nel discorso generale, ma purtroppo abbiamo visto nella serie di articoli precedenti che a partire dalla versione 3 è sparita la rappresentazione più veloce (gli interi “corti”) a favore dell’unico tipo di dato intero che fa capo ai long (interi “lunghi”).
Questo ha portato a una generale perdita di prestazioni, specialmente alla luce del complesso meccanismo che …

mercoledì 29 febbraio 2012 - 1 Commento
CPython e il polimorfismo degli operatori

Manca ormai l’ultimo pezzo del puzzle, come si suol dire, per completare l’analisi del funzionamento e dell’implementazione degli operatori nella macchina virtuale di Python (CPython per l’esattezza).
Abbiamo visto nel precedente articolo che, per l’operatore di “somma” (il simbolo +), l’astrazione è racchiusa dentro un’apposita funzione, chiamata PyNumber_Add.
Ovviamente esistono altrettante funzioni per gli altri operatori, inclusi quelli unari, ma il concetto finora esposta è di carattere generale, per cui è applicabile anche a questi.
PyNumber_Add, però, esegue soltanto una piccola parte del lavoro, delegando l’implementazione, di più basso livello, a un’altra funzione, …

mercoledì 22 febbraio 2012 - Commenta
L’astrazione dell’operazione di somma/concatenazione in CPython

La lunga serie di articoli finora scritti che descrivono i meccanismo interni di CPython hanno fornito uno spaccato di come la macchina virtuale implementi le operazioni a cui siamo abituati (in particolare ci siamo soffermati su quelle binarie), ma il cerchio non è ancora stato chiuso.
Manca, infatti, l’analisi del workflow che dall’istruzione / opcode da eseguire porta alla routine che verrà effettivamente utilizzata per coprire il caso specifico, di cui quest’articolo presenta una prima parte.
CPython 2.x ci ha abituati a diversi hack, spezzoni di codice altamente specializzato per accelerare il …

mercoledì 18 gennaio 2012 - 2 Commenti
Tipi, classi, e protocolli in CPython

Dopo una breve pausa torniamo a parlare di Python e della sua implementazione più comune, la virtual machine CPython. Abbiamo già visto in che modo viene effettivamente realizzata la somma di due numeri interi e, in parte, la concatenazione di due stringhe.
Il “filo conduttore” di tutto è rappresentato dal tipo (o classe) più semplice, cioè dalla struttura PyObject definita in C dai due campi ob_ref e ob_type, rispettivamente contatore del numero di riferimenti di un certo oggetto, e puntatore alla struttura della classe a cui appartiene.
Quest’ultimo è stato visto più volte, …

mercoledì 14 dicembre 2011 - 8 Commenti
Dai long del C a quelli di (C)Python

Nel precedente articolo abbiamo visto a grandi linee in che modo viene eseguita una somma fra due interi “lunghi” (long) di CPython (il codice riguardava la versione 3.2, per la precisione), puntando l’attenzione sul caso migliore (che dovrebbe anche essere il più comune).
Dalla discussione era rimasta fuori la funzione PyLong_FromLong, che si occupa di convertire il risultato dell’operazione dal tipo long del C al PyLongObject col quale lavora la macchina virtuale, ma a causa della complessità ho preferito trattarla separatamente.
Al solito, suddividendo il codice in parti risulta molto più semplice comprenderne …

mercoledì 7 dicembre 2011 - 14 Commenti
Sommare due “long” non è così semplice in CPython

Arrivati ai long (interi “lunghi”) sulla scia dei precedenti articoli sulla macchina virtuale di Python (CPython, quella maggiormente in uso finora), un articolo sull’implementazione della loro somma, a titolo anche di confronto con la medesima operazione per gli interi (corti), era inevitabile.
Il cuore di tutto sta nella funzione long_add, locata nel file longobject.c, che ovviamente riceve come parametri i due oggetti PyLongObject di cui si voglia effettuare la somma:
In apparenza il funzionamento non sembra complicato, presentando poco codice che, però, si trova per lo più celato all’interno di macro e funzioni …

venerdì 2 dicembre 2011 - Commenta
Sviluppare un gioco in Python: Panda3D – collisioni

Introduzione
Con questo articolo concludiamo il nostro breve tour nel mondo di Panda3d. Purtroppo lo facciamo trattando molto superficialmente un tema spinoso e vasto, ovvero le collisioni.
In questo esempio vedremo semplicemente come individuare delle collisioni, visualizzandole nella nostra scena.
Collisioni
L’individuazione delle collisioni è il primo passo per far sì che due oggetti urtino e reagiscano all’evento.
Ci sono due tipi di collisioni (o modalità) che si possono individuare:

Creare una speciale geometria per la collisione di un particolare oggetto, come una sfera, un cilindro, un cubo o anche un insieme di essi.
Permettere le collisioni …

giovedì 1 dicembre 2011 - 9 Commenti
Python: dagli interi “corti” a quelli “lunghi”

In Python raramente mi è capitato di avere a che fare con gli interi “lunghi”, cioè quegli interi che, non potendo essere rappresentati dai classici 32 o 64 bit (a seconda dell’architettura del processore), necessitano di un nuovo tipo di dati in grado di ottemperare a questo requisito.
Naturalmente un programmatore è molto attento nella manipolazione delle quantità di interi (in base al dominio del problema da risolvere), per cui un overflow dovuto a qualche operazione aritmetica che porti il risultato a essere trasformato da int a long è quasi sicuramente …