2010-10-06 4 views
3

Si j'écris un script python, n'importe qui peut simplement pointer un éditeur et le lire. Mais pour la programmation écrite en C, il faudrait utiliser des décompilateurs et des tables hexadécimales et autres. Pourquoi donc? Je veux dire que je ne peux tout simplement pas ouvrir le navigateur web Safari et regarder son code.Pourquoi les programmes C requièrent-ils des décompilateurs mais pas les programmes python?

+0

Il devrait y avoir des balises pour les groupes d'âge. – Yehonatan

+0

@Yehonatan: Je pensais que l'étiquette qui recueille toutes les questions novices sur la programmation est une bonne idée – pyfunc

+0

@pyfunc: [la gestion n'est pas d'accord.] (Http://blog.stackoverflow.com/2010/08/the-death-of-meta -tags /) – intuited

Répondre

13

Note: L'auteur renie une profonde expertise dans ce domaine. Certaines affirmations peuvent être incorrectes.

Python est actuellement compilé en bytecode, qui est ce qui est exécuté par l'interpréteur python. Chaque fois que vous utilisez un module Python, Python génère un fichier .pyc avec un nom correspondant au module. C'est l'équivalent du fichier .o généré lorsque vous compilez un fichier C.

Donc, si vous voulez quelque chose à désassembler, le fichier .pyc serait il :)

Le processus Python passe par la compilation d'un module est assez similaire à ce que gcc ou un autre compilateur C avec le code source C. La différence majeure est que cela se passe de manière transparente dans le cadre de l'exécution du fichier. Il est également facultatif: lors de l'exécution d'un non-module, c'est-à-dire d'un script d'utilisateur final, Python interprète simplement le code plutôt que de le compiler en premier.

Donc vraiment votre question est "Pourquoi les programmes python sont-ils distribués en tant que source plutôt qu'en tant que modules compilés?" Ou, en d'autres termes, "Pourquoi les applications C sont-elles distribuées en tant que binaires compilés plutôt qu'en tant que code source?"

Il était très courant que les applications C soient distribuées comme code source. C'était avant que les systèmes d'exploitation et leurs diverses sous-entités (c'est-à-dire les distributions Linux) deviennent plus établies. Certaines distributions, par exemple gentoo, distribuent toujours des applications en tant que code source. Les applications qui sont un peu plus pointues ou obscures sont toujours distribuées comme code source pour toutes les plates-formes qu'elles ciblent.

La raison en est la compatibilité et les dépendances. La raison pour laquelle vous pouvez exécuter Safari binaire précompilé sur un Mac ou Firefox sur Ubuntu Linux est parce qu'il a été spécialement conçu pour ce système d'exploitation, cette architecture (par exemple x86_64) et un ensemble de bibliothèques.

Malheureusement, la compilation d'une grosse application est assez lente et doit être refaite au moins partiellement à chaque mise à jour de l'application. Ainsi, la motivation pour les distributions binaires. Alors pourquoi ne pas créer une distribution binaire de Python? Pour une chose, comme Aaron mentions, les modules devraient être recompilés pour chaque nouvelle version du bytecode Python. Mais ce serait similaire à la reconstruction d'une application C pour la relier à une nouvelle version d'une bibliothèque dynamique - les modules Python sont analogues dans ce sens aux bibliothèques C. La vraie raison est que la compilation Python est beaucoup plus rapide que la compilation en C. C'est en partie, je pense, à cause de la nature dynamique de la langue, et aussi parce que ce n'est pas aussi complet qu'une compilation. Cela a ses inconvénients: en particulier, les applications Python fonctionnent beaucoup plus lentement que leurs homologues C, car Python doit interpréter le bytecode compilé en instructions pour le processeur, alors que l'application C contient déjà de telles instructions. Ceci étant dit, il y a un programme appelé py2exe qui prendra un module Python et distribuera et compilera un exécutable précompilé Windows, y compris la logique du module et ses dépendances, y compris Python lui-même. Je suppose que le but de ceci est d'éviter d'obliger les gens à installer Python sur leur système Windows juste pour exécuter votre application. Sous linux, ou je pense même OS/X, Python est généralement déjà installé, donc la précompilation n'est pas vraiment nécessaire. Les systèmes Linux ont également des gestionnaires de paquets super-dandy qui vont installer de manière transparente les dépendances telles que Python si elles ne sont pas déjà installées.

10

Python est un langage de script qui s'exécute dans une machine virtuelle via un interpètre. C est un langage compilé, le code compilé en code binaire que l'ordinateur peut exécuter sans tout ce dont Python a besoin.

+0

Est-il alors possible de compiler python dans un fichier binaire exécutable, puis simplement le distribuer? – Ali

+2

@Ali: Non. Il n'y a pas de moyen raisonnable de le faire, ne croyez pas autrement. –

1

car le code C est conforme au code objet (machine) et le code python est compilé dans un code octet intermédiaire. Je ne suis pas sûr si vous faites référence même au code de byte de python - vous devez se rapporter au dossier de source lui-même qui est directement exécutable (cacher le code de byte de vous!). C doit être compilé et lié.

0
  • scripts Python sont analysés et convertis en binaire uniquement quand ils sont exécutés - à savoir, ils sont des fichiers texte et vous pouvez les lire avec un éditeur.
  • Le code C est compilé et lié à un fichier binaire exécutable avant de pouvoir être exécuté. Normalement, seul ce fichier binaire exécutable est distribué - vous avez donc besoin d'un décompilateur. Vous pouvez toujours voir le code source, si vous y avez accès.
+0

Je pense que l'OP signifie qu'il n'est pas possible de lire l'exécutable Safari lui-même. – intuited

+0

@intuited Hmm .. a du sens - l'a supprimé. – Amarghosh

+0

Est-il alors possible de compiler python dans un fichier binaire exécutable puis de le distribuer? – Ali

2

Vous ne pouvez pas non plus ouvrir et lire le code qui s'exécute réellement pour Python. Essayez

import dis 

def foo(): 
    for i in range(100): 
     print i 

print dis.dis(foo) 

qui vous montrera le (lisible) bytcode du programme foo. de manière équivalente, vous pouvez enregistrer le fichier et l'importer depuis l'interpréteur interactif Python. Cela va créer un fichier .pyc avec le même nom de base que le script. ouvrez cela avec un éditeur hexadécimal et vous regardez le bytecode python.

La raison de la différence est que python modifie son code d'octets entre les versions, ce qui vous obligerait à distribuer une version différente d'une version binaire pour chaque version de python. Ce serait une douleur. Avec C, il est compilé en code natif et le code d'octet est donc beaucoup plus stable, ce qui rend les versions binaires uniquement possibles.

5

Ceci est un très gros sujet. Vous devriez regarder dans votre programme d'informatique local convivial, vous trouverez beaucoup de bonnes choses sur ce sujet là-bas. La réponse courte est que le langage Python est un langage "interprété", ce qui signifie qu'il nécessite un programme de langage machine (l'interpréteur python) pour exécuter le programme python, en ajoutant une couche d'indirection. C ou C++ sont différents. Ils sont compilés directement au code machine, qui s'exécute directement sur votre processeur.

Il y a beaucoup de vaudou supplémentaire à apprendre ici, cependant. Techniquement, Python est compilé en bytecode, et les interpréteurs modernes font de plus en plus de compilation "juste à temps", de sorte que les frontières entre le code compilé et interprété deviennent de plus en plus floues.

2

Oui, vous pouvez - cela s'appelle le désassemblage, et vous permet de regarder parfaitement le code de Safari. Le fait est que C, entre autres langages, se compile en code natif, c'est-à-dire en code que votre CPU peut "comprendre" et exécuter.

Plus ou moins évidemment, le niveau d'abstraction présent dans l'ensemble d'instructions de votre CPU est beaucoup plus petit que celui d'un langage de haut niveau comme Python.Les instructions de la CPU ne concernent pas le "téléchargement de cette URI", mais plutôt "vérifier si ce bit est défini dans un registre matériel". Donc, en conclusion, le niveau de complexité d'une application native est beaucoup plus élevé lorsqu'on regarde le code machine, donc beaucoup de gens ne peuvent tout simplement pas comprendre ce qui se passe là-bas, il est difficile d'obtenir le grande image. Avec de l'expérience et du temps à portée de main, c'est possible - les gens le font tout le temps, en inversant les applications et tout le reste.

+0

Est-il possible de compiler python dans un fichier binaire exécutable, puis de le distribuer? – Ali

0

Les scripts Python sont analogues à ceux qui regardent une liste de tâches écrite en anglais (ou dans une langue qu'il comprend). L'homme doit faire tout le travail, chaque fois que cette liste de choses doit être faite. Si l'homme, au lieu de faire les pas tout seul à chaque fois, crée et programme un robot qui peut effectuer ces étapes encore et encore (et probablement plus vite que lui), ce robot est analogue au programme C.

L'homme dans le cas python s'appelle "l'interpréteur" et dans le cas C est appelé le "compilateur", et le robot C est appelé le programme/l'exécutable compilé.

Lorsque vous regardez la source du programme python, vous voyez la liste des choses à faire. Dans le cas du robot, vous voyez les engrenages, les moteurs et les batteries, etc., qui sont très différents de la liste de choses à faire. Si vous pouviez obtenir la liste des choses à faire, cela ressemblait un peu au code python, juste dans une langue différente.

+1

Les scripts Python sont compilés. Ils sont juste compilés pour une machine qui n'existe que dans les logiciels. L '"interpréteur" Python est un simulateur pour cette machine qui a un greffon incorporé greffé sur le dessus pour prendre le script et le compiler dans le format de code objet de cette machine fictive. –

+0

Merci beaucoup - je connais ces détails. Je fais la réponse facile pour la digestion, en supposant un taux de métabolisme modeste de la question asker. – Rajan

0

Tous les programmes C ne nécessitent pas de décompilateurs. Il y a beaucoup de code C distribué sous forme de source. Et certains programmes Python nécessitent des décompilateurs, s'ils sont distribués en tant que bytecode (fichiers .pyc). Mais, dans la mesure où vos hypothèses sont valides, c'est parce que C est compiled language alors que Python est interpreted language.

+0

python n'est pas un langage interprété, pas plus que java. Il fonctionne sur une machine virtuelle. – aaronasterling

3

Dans plusieurs commentaires, vous avez demandé: "Est-il possible de compiler python dans un fichier binaire exécutable, puis de le distribuer?" D'un point de vue théorique, il ne fait aucun doute que la réponse est oui: un programme Python peut être compilé et distribué sous forme de code machine entièrement compilé. D'un point de vue pratique, il est ouvert à beaucoup plus de questions. Il y a quelques choses comme l'hirondelle à jeun, Psyco, Shed Skin et PyPy que vous pourriez vouloir savoir cependant.

  1. Unladen Swallow est avant tout une tentative de faire Python courir plus vite, mais une partie du plan de le faire consiste à utiliser LLVM pour son back-end. LLVM peut (entre autres) produire une sortie de code machine native. Les dernières versions de Unladen Swallow ont utilisé LLVM pour la génération de code natif, mais 1) la mise à jour la plus récente sur le site Web date de fin 2009, et 2) les notes de publication pour cette version disent: "L'équipe d'Unladen Swallow ne recommande pas une large adoption de la version 2009Q3. " Fonctionne comme un plug-in pour Python qui fait essentiellement la compilation JIT, donc même s'il peut accélérer l'exécution (pas mal dans certains cas), il ne produit pas d'exécutable de code machine que vous pouvez distribuer. . En bref, bien que ce soit similaire à ce que vous voulez, ce n'est pas destiné à faire exactement ce que vous avez demandé.

  2. Shed Skin Python-to-C++ produit C++ comme sa sortie, et vous compilez ensuite le C++ et (potentiellement) distribuer le résultat de cela. Shedskin est actuellement à la version 0.5 - c'est-à-dire, personne ne prétend que c'est un produit fini, sorti.D'un autre côté, le développement est en cours et chaque version semble inclure des améliorations substantielles.

  3. PyPy est une implémentation Python écrite en Python. Leur intention est de permettre à la production de code d'être "branchée" sans affecter le reste de l'implémentation - mais alors qu'ils supportent actuellement 4 modèles de génération de code différents, je ne crois pas qu'aucun d'eux aboutisse à un code machine natif fonctionne directement sur le matériel.

Bottom line: le travail a été fait et est fait avec l'intention de faire ce que vous avez parlé, mais au moins à ma connaissance il n'y a pas vraiment tout ce que je pourrais recommander raisonnablement en tant que produit fini que vous peut vraiment dépendre de faire le travail en ce moment. L'accent principal est vraiment sur la vitesse d'exécution, ne produisant pas d'exécutables autonomes.

0

G-WAN exécute des scripts C ANSI à la volée en les faisant comme des scripts Python.

Il peut s'agir de scripts côté serveur (utilisant G-WAN comme serveur Web) ou de tout programme C à usage général et vous pouvez lier n'importe quelle bibliothèque existante.

Oh, et G-WAN scripts C sont beaucoup plus rapides que Python, PHP ou Java ...

+0

Et comment cela est-il pertinent? – NullUserException