Convertir un code Python en C++ puis le compiler

Convertir un code python en C++ puis le compiler

Avant Propos

Qui n'a pas un jour rêver de profiter de la syntaxe claire et simple de python et de la vitesse du C++.
Avec shedskin, c'est possible, ce programme convertit votre code python en code C++.

Introduction

Voilà une super bonne nouvelle pour la communauté des utilisateurs de python, un espoir de compilation grâce au formidable travail de l'équipe de shedskin.

Grâce à ce petit programme vous pourrez convertir vos codes python en C++ puis les compiler et augmenter les performances de 20 à plus de 200.

Limitations

  • Supporte les versions python de 2.4 à 2.6
  • Ne supporte pas le typage dynamique (Un variable int doit rester int par exemple)
  • Il supporte ces librairies seulement mais il est possible de compiler une librairie ou ses propres librairies, moyennant adaptation du code:
    • bisect
    • collections
    • ConfigParser
    • copy
    • datetime
    • fnmatch
    • getopt
    • glob
    • math
    • os (il manque certaines fonctions sous Windows)
    • os.path
    • random
    • re
    • socket
    • string
    • sys
    • time

Pour plus de détails, voir en Annexe, en bas de ce tutoriel, un extrait de la documentation officielle (en)

Installation de shedskin

Tout d'abord télécharger la dernière release de shedskin : http://sourceforge.net/projects/shedskin/files/

Exécuter le programme d'auto extraction choisissez le dossier où extraire shedskin.

Allez dans le répertoire d'extraction ouvrez le bat nommé init.bat. Une fenêtre s'ouvre

Conversion en C++

Placez votre fichier python .py dans le dossier d'en dessous nommé shedskin.

Pour convertir py -> C++ tapez dans la commande, en supposant que votre script Python s'appelle monpy.py :

shedskin monpy.py

Shedskin doit bien être marqué dans la console !

La conversion débute et vous indique si votre code ne comporte pas d'erreurs.

Les fichiers monpy.cpp, monpy.hpp et pythot.ss.py sont créés, ils serviront à la compilation.

Compiler son code

Maintenant tapez juste après avoir converti votre code :

make run

. Tout simplement.
La compilation est en cours puis le programme se lance.
Tapez seulement

make

pour seulement compiler.

Conclusion

Voilà c'est compilé. Votre exe se trouve dans le répertoire shedskin : shedskin-0.2\shedskin.
Il nécessite libpcre-0.dll et gc.dll.

Annexe - Extrait de la documentation

Shed Skin translates pure, but implicitly statically typed, Python programs into C++. The static typing restriction means that variables can only ever have a single, static type. So, for example,

a = 1
a = '1' # bad

is not allowed. However, as in C++, types can be abstract, so that, for example,

a = A()
a = B() # good

where A and B have a common base class, is allowed.

The typing restriction also means that the elements of some collection (list, set, etc.) cannot have different types (because their subtype must also be static). Thus:

a = ['apple', 'b', 'c'] # good
b = (1, 2, 3) # good
c = [[10.3, -2.0], [1.5, 2.3], []] # good

are allowed, but

d = [1, 2.5, 'abc'] # bad
e = [3, [1, 2]] # bad
f = (0, 'abc', [1, 2, 3]) # bad

are not allowed. Of course, dictionary keys and values may be of different types:

g = {'a': 1, 'b': 2, 'c': 3} # good
h = {'a': 1, 'b': 'hello', 'c': [1, 2, 3]} # bad

In the current version of Shed Skin, mixed types are also permitted in tuples of length two:

a = (1, [1]) # good

In the future, mixed tuples up to a certain length will be allowed.

None may only be mixed with non-scalar types (i.e., not with int or float):

l = [1]
l = None # good

m = 1
m = None # bad

def fun(x = None): # bad: use a special value for x here, e.g. x = -1
pass
fun(1)

Integers and floats can often be mixed, but it is better to avoid this where possible, as it may confuse Shed Skin:

a = [1.0]
a = [1] # wrong - use a float here, too

Shed Skin will only ever support a subset of all Python features. The following common features are currently not supported:

  • reflection (getattr, hasattr), eval, or other really dynamic stuff
  • arbitrary-size arithmetic (integers become 32-bit on most architectures!)
  • generator expressions
  • variable numbers of arguments and keyword arguments
  • multiple inheritance
  • nested functions and classes
  • inheritance from builtins (excluding Exception and object)
  • some builtins, such as map, filter and reduce
  • overloading __iter__ and __call__

Some other features are currently only partially supported:

  • class attributes must always be accessed using a class identifier:
self.class_attr # bad
SomeClass.class_attr # good
  • anonymous function passing works reasonably well, but not for methods, and they cannot be contained:
var = lambda x, y: x+y # good
var = some_func # good
var = self.some_method # bad
[var] # bad
A voir également
Ce document intitulé « Convertir un code Python en C++ puis le compiler » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous