Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Est-il possible de transformer un code Python en C ?

+1 vote

Pour mes études, j'ai codé plusieurs intelligence artificiel tels que Backtrack, Forward checking etc pour un jeu qui ressemble fortement au sudoku. Étant beaucoup plus habitué au Python et la programmation orienté objet, j'ai préféré le coder dans ce langage (Python35).

Le problème, c'est que je doit rendre des fichier en C de ce que j'ai fait.

Je me suis déjà renseigner sur Cython mais je ne suis pas sûr qu'il permette de rendre le code C indépendant de Python. J'ai entendu parlé de Pythran aussi mais je crois pas que cela génère du code C mais plutôt du C++.

Je peux utiliser autant Linux que Windows.

Ainsi, est-il possible de transformer un code Python en code C lisible et indépendant de Python, compilable avec GCC ?

demandé 15-Mar par Andy (274 points)

transformer un code python en C oui, lisible non =/

4 Réponses

+5 votes
 
Meilleure réponse

En un mot : tu veux faire de la compilation. C'est-à-dire transformer un langage source (ici python) vers un autre (ici C).

Pour ça, il va te falloir…

un peu d'apprentissage

quelques dizaines d'heure de lecture de bouquin sur comment faire un compilateur, au sens général. Les arbres syntaxiques, la résolution de variable,…

Compte aussi du temps pour apprendre un langage pour écrire le compilateur. C est souvent utilisé, mais d'autres comme haskell ou lisp sont aussi reconnus pour ce job.

(Les deux derniers ont l'avantage de ne pas être du C, du coups pas besoin d'apprendre C ! C'est toujours ça de gagné, comme dirais ma grand-mère)

beaucoup de R&D

Compiler du python vers du C, c'est compliqué.
D'abord parce que Python propose de la POO et pleins de concepts qui ne sont pas triviaux en C.

Par conséquent, il va falloir déployer des trésors d'ingéniosité pour gérer des cas incertains comme celui ci :

a = 2
print(a * 'a')
a = 3.0

a est de type entier ou de type flottant ? Réponse : ça dépends.
Sans compter la POO, qui n'existe pas en C et qui est potentiellement complexe à implémenter (regarde le code cpython : c'est du C qui compile du python vers un code d'automate à pile, et qui exécute ce dernier)

Là, compte quelques centaine d'heure et de millions d'euros pour lancer une équipe de recherche sur ce problème sur lequel se penche quotidiennement des communautés de recherche déjà assez efficace.
Table sur une amélioration significative du code généré dans 10 ans si tu injecte suffisamment de moyens.
Le gros plus, c'est que ce qu'aura trouvé ton équipe sera bénéfique pour toute la communauté informatique, car il y a énormément d'application à la clef. (et au passage, il faudra peut-être développer un hyper ordinateur pour attaquer le problème, rien de grave si tu as quelques décennies/milliards supplémentaires sous le coude)

Alternative à tout ça

Utiliser des outils qui existent déjà, comme nuitka, pypy ou, si tu es patient, pyston.

C'est gratuit, déjà utilisable (sauf pyston), efficace et libre.

Le downside, c'est que code généré est globalement illisible. C'est normal : ils compilent du code arbitraire, en gérant le typage dynamique, la POO, la métaprogrammation, les coroutines,… et de fait génèrent des milliers de lignes pour le moindre hello world avec deux variables.

Peut-être que du côté des softs propriétaires, il y a mieux, mais je doute sincèrement que ça soit beaucoup mieux.


Bien sûr, cette réponse est la version longue du ahahahah.

Petit conseil : apprend le C. C'est pas perdu, et si tu veux progresser dans un langage, c'est très formateur d'en apprendre un autre.
C'est aussi très formateur de faire le même projet scolaire deux fois avec deux langages différents. Ça permet de voir les différences un peu fondamentales entre les deux langages.
J'ai personnellement fait la bêtise de prendre deux langages proches, ruby et python. Du coups je peux te donner la grande différence fondamentale entre python et ruby : le nom du langage.

répondu 17-Mar par lucas (2,028 points)
sélectionné 20-Mar par Andy

j'aime ta réponse :)

+3 votes

Si tu dois apprendre le c pour ton école, fait le correctement en c, là tu aurais quelque chose de sale et qui ne t'aidera pas vraiment.

répondu 16-Mar par ptank (278 points)

Le truc c'est que ça va me prendre des heures et que j'ai pas trop le temps. Mais bon si c'est le seul moyen je vais le faire bien sur.

+2 votes

J'appuierai les autres, en rappelant que tu as pour objectif de passer d'un langage haut niveau avec beaucoup de sucre syntaxique à un langage beaucoup plus bas niveau.

Les seuls routines que tu arriveras à traduire assez proprement sont des routines très simples et basique (et dans ce cas, tu perds tout l'interet de passer par un langage haut niveau...).

répondu 20-Mar par Poisson (256 points)
0 votes

De mon côté, je recoderais mon code Python en Golang et je compilerais les fonctions en bibliothèques partagées qui peuvent être facilement appelées en C.

Le lien ci-dessous montre le principe :
https://www.darkcoding.net/software/building-shared-libraries-in-go-part-1/

Celà résoudrait tes problèmes : passer de Python à Golang serait facile d'un point de vue syntaxique et tu aurais la souplesse pour que tes collègues puissent appeler tes fonctions à partir du C.

répondu 21-Mar par DoubleNain (1,580 points)
...