Question

python est compilé dans un pseudo-code binaire intermédiaire (PyC), puis exécuté. Donc, il y a une compilation suivie d'une interprétation. Cependant, les utilisateurs Python long temps disent que Python est un langage « contraignant fin » et qu'il should`nt être considéré comme un langage interprété.

  1. Comment Python est différent d'un autre langage interprété?

  2. Pouvez-vous me dire ce que "contraignant fin" signifie, dans le contexte Python?

Java est une autre langue qui doit d'abord le code source compilé en bytecode puis interprété en bytecode.

  1. Java est un langage interprété / langage compilé?

  2. Comment est-il différent de Python en termes de compilation / exécution?

  3. Java est dit de ne pas avoir, "contraignant fin". Est-ce que cela a quelque chose à voir avec les programmes Java étant slighly plus rapide que Python?

Ce serait génial si vous pouviez aussi me donner des liens vers des endroits où les gens ont déjà parlé; J'aimerais en savoir plus sur ce sujet. Merci.

Était-ce utile?

La solution

La liaison tardive est un concept très différent à l'interprétation.

Strictement parlant, un langage interprété est exécuté directement de la source. Il ne passe pas par une étape de compilation de code d'octets. La confusion vient du fait que le programme python un interprète, mais il interprète l'octet de code, il est donc le langage octet de code de Python que vous décrivez comme « interprété ». Le langage Python lui-même est un langage compilé.

bytecode Java, en revanche, est à la fois interprété et compilé, ces jours-ci. Il est compilé en code natif par un compilateur JIT et puis exécutez directement sur le matériel.

La liaison tardive est une propriété du système de type et est présent dans la plupart des langues dans une certaine mesure, indépendamment du fait qu'ils sont interprétés ou compilés.

Autres conseils

  

Comment Python est différent d'un autre langage interprété?

Cela implique le fractionnement des cheveux. langues et langues « Interprété de code managé » comme langages C # et de machines virtuelles (comme Java) forment un continuum bizarre. Il y a des gens qui vont dire que tous langues sont « interprétées » - même langage machine. Après tout, les circuits électroniques de la CPU "interprètent" langage machine.

Le mieux que vous pouvez faire est de dire que « interprété » signifie qu'il ya une couche visible de logiciel l'interprétation de vos octets codes d'application. « Non » signifie que interprété votre logiciel est (plus ou moins) directement exécuté par le matériel sous-jacent. les gens « de code managé » sont libres de continuer à partager ces cheveux.

  

Pouvez-vous me dire ce que "contraignant fin" signifie, dans le contexte Python?

Les variables ne sont pas déclarées d'avoir un type. La variable est liée à un type le plus tard possible -. Avec la cession d'un objet réel

  

Java est un langage interprété / langage compilé?

Oui. Il est compilé des codes d'octets. Les codes d'octet sont interprétés. Je préfère l'appeler interprété.

Cependant, les gens (pour des raisons vraiment obscures) sont en désaccord. La présence d'une sorte de « compilation » pas - si minime - embrouille toujours les gens. La traduction en code octet n'a presque pas d'importance pour le comportement réel du programme au moment de l'exécution. Certaines personnes aiment à dire que peut être interprété uniquement langues qui sont totalement libre de toute souillure de pré-traitement « compilation ». Il n'y a pas beaucoup d'exemples de ce plus, étant donné que de nombreuses langues sont traduits à partir du texte convivial humain interprète bytecodes amical. Même Applesoft de base (dans les années 80), avaient ce genre de passe traduction effectuée que vous avez saisi le code dans.

do Some machine virtuelle Java de JIT. Certains ne le font pas. Certains sont un mélange. Dire que la machine virtuelle Java ne fait que la traduction-byte code JIT est incorrect. Certains le font JVM. Certains ne le font pas.

  

Comment est-il différent de Python en termes de compilation / exécution?

Pas du tout. La machine virtuelle Java peut exécuter Python. [Pour facilement confus, le mot « python » dans ce contexte ne peut vouloir dire « source python ». Cela doit vouloir dire bytecode python.]

  

Java est dit de ne pas avoir, « contraignant fin ». Est-ce que cela a quelque chose à voir avec les programmes Java étant slighly plus rapide que Python?

Peut-être. les programmes Java sont souvent plus rapides en raison des compilateurs JIT qui se traduisent par byte code Java en code machine à l'exécution.

statique ( « précoce ») liant n'a pas le même genre de profit pour Java qu'il a un langage vraiment compilé comme C ou C ++ où il n'y a presque pas de contrôles à temps courir de toute nature. Java fait encore des choses comme des limites du tableau, la vérification qui C passe sous silence dans l'intérêt de la vitesse brute.

Il y a en fait peu pénalité pour la liaison « en retard ». Python attributs et méthodes sont résolus à l'aide du dictionnaire simples recherches. Le dictionnaire est un hachage; la performance est assez bonne. Les hash pour les noms peuvent être mis dans un « interné » chaîne littérale piscine amortissant le coût du calcul du hachage.

Pour de vrai plaisir, regardez PyPy et RPython. Ceci est un interpréteur Python qui peut faire la compilation JIT. Vous liquidez avec un interprète 2 niveaux. Votre code est interprété par PyPy. PyPy est interprété par RPython. http://alexgaynor.net/2010/may/15/pypy-future -python /

Il y a un lien entre ce que nous appelons le temps de liaison et le concept de interprétation / compilation .

Le temps de liaison est le moment où une expression symbolique est liée à sa valeur de béton. C'est plus lié à la définition du langage de programmation, par exemple portée dynamique vs statique de variables. Ou une méthode statique par rapport à des procédés virtuels ou typage dynamique par rapport à typage statique.

Vient ensuite la mise en œuvre de la langue. Plus d'informations sont statiquement connus dès le départ, plus il est facile d'écrire un compilateur. Inversement, plus tard lié la langue est, plus il est difficile. D'où la nécessité de recourir parfois sur des techniques d'interprétation.

La distinction entre les deux est pas stricte cependant. Non seulement peut-on considérer que tout est finalement interprété (voir la réponse S. Lott), mais une partie du code peut être compilé, décompiler ou recompilation dynamique (par exemple JIT) faisant la distinction très floue.

Par exemple, le chargement dynamique des classes en Java va dans la catégorie « liaison tardive »: l'ensemble de la classe n'est pas fixée une fois pour toutes, et les classes peuvent être chargés dynamiquement. Certaines optimisations peuvent être faites quand on sait l'ensemble des classes, mais devront être invalidée quand une nouvelle classe est chargée. La même chose se produit avec la possibilité de mettre à jour une méthode avec l'infrastructure de débogage. La machine virtuelle Java devra de-optimize tous les sites d'appel ont été la méthode avait été inline

Je ne sais pas beaucoup sur Python, mais les pratiquants Python préfèrent peut-être le terme « lié tard » pour éviter une telle confusion.

Je pense que l'idée fausse que Python est interprété en Java est compilé se pose parce que Java a une étape de compilation explicite - vous devez exécuter javac pour convertir votre fichier source .java dans un fichier bytecode .class qui peut être exécuté.

Comme vous l'avez à juste titre Python compile de façon similaire les fichiers source en bytecode, mais elle le fait de manière transparente -. Compilation et l'exécution se fait généralement en une seule étape de sorte qu'il est moins évident pour l'utilisateur

La différence importante entre liaison anticipée et tardive et dynamique et typage statique. La distinction compilé / interprété est sans signification et sans pertinence.

temps de liaison est lorsque les noms seront résolus à des choses. D'autres langues de dynamiques tendent à la liaison tardive. Cela peut être séparé de l'interprétation / compilation - par exemple, méthodes Objective-C sont résolus en retard et de façon dynamique par rapport à C ++. Java fait beaucoup de celui-ci est contraignant au moment du chargement de la classe: au plus tard, mais C plus tôt que Python.

ma citation préférée de Contradictionary Computer Stan Kelly-Bootle :

temps de liaison n. Le moment où la table de hachage est corrompu.

==> Les progrès dans le calcul peuvent être mis en correspondance avec le « caractère tardif de la liaison, » qui m'a penser à ma propre soi-disant CS soi-disant carrière: passé d'or, gris présent, et l'avenir rose. Ceci est ma version de l'optimisme de Synge: l'herbe est plus verte, sauf à t = 0. Sur EDSAC I, mes fonctions (sous-routines 5CH-bandes de papier) ont été des coups de poing, jointées et lié environ deux semaines avant l'entrée. Ceci est connu aspremature obligatoire et appelle à deftness avec des bandes élastiques. FORTRAN est venu ensuite avec un nouveau type de reliure: ponts détrempés de cartes qui ont refusé d'être brassé. Puis, avec Algol et C, j'ai apprécié statique (compilation) de liaison, jusqu'à ce que C ++ a les joies émoussement de la dynamique (exécution) obligatoire. Mes objectifs actuels de recherche à retarder la liaison jusqu'à bien après l'exécution. J'appelle cette fin de temps de liaison, comme prophétisé dans l'Evangile de saint Matthieu: « ... et tout ce que tu lierez sur la terre sera lié dans les cieux ... » (Matthieu 16:19 LSG)

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top