En regardant la plupart (sinon tous) les langages dynamiques (par exemple Python, PHP, Perl et Ruby), ils sont tous interprétés. Corrige moi si je me trompe. Existe-t-il un exemple de langage dynamique qui passe par la phase de compilation? Le langage dynamique est-il identique au langage interprété?
programming-languages
php
ruby
perl
dynamic-typing
Joshua Partogi
la source
la source
Réponses:
Pas vrai. Vous pouvez compiler la source Python. Voilà une preuve existentielle.
Il existe des interprètes pour les langues à typage statique et des compilateurs pour les langues à typage dynamique. Les deux concepts sont orthogonaux.
Note latérale: En général, un langage n'est que cela: un langage, avec un ensemble de constructions syntaxiques pour exprimer la sémantique. Si vous écrivez Python sur un tableau blanc, cela s'appelle toujours Python! C'est l' implémentation qui peut être un interprète ou un compilateur. Être typé statiquement ou dynamiquement (d'une sorte d'hybride des deux) est une propriété du langage, tandis que l'exécution d'un programme par interprétation ou compilation est une propriété de l'implémentation.
la source
.pyc
fichiers sont en bytecode. Le code source de Python a été analysé, optimisé et compilé pour les créer. Les instructions de bytecode sont relativement de haut niveau et l'implémentation la plus populaire est un interpréteur simple (pour le contraste, regardez PyPy qui compile JIT bytecode en code machine très intelligent au moment de l'exécution) mais Python n'est pas moins compilé que Java ou C #. Python n'est "non compilé" que si "la compilation" était limitée à la compilation native à l'avance , mais personne n'a rien dit à ce sujet et généralement il peut faire référence à toute transformation de lanugage en langage.Python
etCPython
, alors que le second est une implémentation du premier, il en est de mêmePyPy
.Common Lisp est typé dynamiquement (et fortement) et généralement compilé .
Étant donné que cette dynamique est obtenue au moment de l'exécution, il existe certaines directives que vous pouvez utiliser dans le code source pour assurer au compilateur qu'un symbole ne contiendra qu'un certain type de valeur, afin que le compilateur puisse optimiser le code généré et augmenter les performances.
la source
C # 4.0 prend en charge les types dynamiques (liaison tardive) et il est compilé.
la source
node.js est basé sur le moteur javascript V8 de Google. V8 fait la compilation à l'exécution. Le V8 est aveuglément rapide compte tenu de ce fait. Consultez simplement http://shootout.alioth.debian.org et comparez le V8 à l'un des langages interprétés ci-dessus.
la source
Non - il est certainement possible de compiler des langages dynamiques.
Il existe même des langages dynamiques qui sont toujours compilés par conception (par exemple Clojure).
Cependant, la question touche à un point connexe important: bien que les langages dynamiques puissent être compilés, il arrive souvent que les langages dynamiques ne puissent pas être compilés en un code aussi efficace qu'un langage typé statiquement . Cela est dû au fait que certaines fonctionnalités inhérentes aux langages dynamiques nécessitent des vérifications d'exécution qui ne seraient pas nécessaires dans une jauge de langue compilée statiquement.
Un exemple de ceci: les langages qui autorisent l'application de correctifs au moment de l'exécution d'objets (par exemple Ruby) nécessitent souvent que l'objet soit inspecté (avec une recherche de table de hachage ou similaire) chaque fois que vous appelez une méthode sur l'objet. Même si cela est compilé, le compilateur devra générer du code pour effectuer la recherche de méthode lors de l'exécution. Dans une certaine mesure, cette recherche de méthode n'est pas différente de ce que devrait faire un interprète.
Cela ajoute une surcharge importante par rapport à un appel de méthode dans un langage comme Java, où la bonne méthode peut être déterminée statiquement par le compilateur à partir de la définition de classe et réduite à un simple appel de fonction en code natif.
Je crois que c'est cet effet plus que toute autre chose qui fait que les langages dynamiques ont des performances plus lentes en moyenne que leurs homologues compilés statiquement. Comme vous pouvez le voir sur les benchmarks défectueux , ce sont les langages typés statiquement (C, Java, Fortran, etc.) qui ont tendance à être les plus rapides avec les langages dynamiques (Perl, Python, Ruby, PHP, etc.) en bas du classement.
la source
Il était une fois BASIC a été interprété. Et certaines variantes de BASIC avaient un typage dynamique. Et vous pouvez également obtenir des compilateurs pour eux.
(C'était à l'époque des lecteurs de disquettes 100K, lorsque les dinosaures parcouraient encore la terre et mangeaient des développeurs s / w sans méfiance pour le petit-déjeuner.)
la source
Différentes implémentations Smalltalk gèrent cela différemment, mais plusieurs d'entre elles se compilent en bytecodes qui s'exécutent sur une machine virtuelle haute performance.
la source
En fait, la plupart des langages dits "interprétés" passent par / permettent une compilation juste à temps pour la faire fonctionner plus rapidement. Et certains d'entre eux doivent être compilés en code octet avant de pouvoir les exécuter.
En fait, dynamique et interprété sont deux idées totalement différentes, bien qu'il y ait une corrélation. La raison étant que ceux qui sentent que la frappe dynamique rend leur travail plus facile et plus rapide, ils ne s'inquiéteraient pas du fait que le code soit exécuté un peu plus lentement mais portable.
la source
Chrome, IE9 et Firefox 3.1+ compilent tous JavaScript en binaires natifs, et JavaScript est typé dynamiquement.
Je pense que la raison pour laquelle les langages dynamiques ont tendance à être historiquement interprétés est que le typage et l'interprétation dynamiques (ou plus précisément, le manque de compilation) ont tous deux tendance à être des fonctionnalités utiles aux langages de script et aux tâches de script en général.
La performance n'est pas non plus (pas) une préoccupation majeure pour les types de programmes qui ont été écrits dans ces langues, donc encore une fois, le surcoût de la frappe et de l'interprétation dynamiques n'était pas un problème aussi important que dans les langues cette valeur de performance.
la source
Python est généralement compilé. Certes, compilé en code octet qui est ensuite interprété.
Perl fonctionne de façon similaire.
Common Lisp se compilera généralement en un code natif ou octet. Cela diffère entre les implémentations (et, dans une certaine mesure, au sein d'une implémentation, selon divers paramètres d'optimisation).
la source
Oui. Toutes les langues dynamiques sont des langues interprétées (mais une langue interprétée peut être non dynamique).
La raison est simple: s'il est dynamique, il a besoin d'un interprète pour effectuer le dynamisme au niveau de la compilation binaire.
ex. : lorsque nous mettons une donnée dans une variable PHP, puis plus tard une autre d'un type différent, notre programme ne peut pas être compilé en code binaire car chaque type a son propre format de représentation binaire; l'interprète gère les décalages au niveau binaire de manière dynamique
la source