Ruby est-il vraiment un langage interprété si toutes ses implémentations sont compilées en bytecode?
Dans la réponse choisie pour cette question à propos de Bleu RubyChuck dit:
De tous les courants Ruby
les implémentations sont compilées
bytecode. Contrairement à SAP revendications, comme
de Ruby 1.9, l'IRM lui-même comprend un
compilateur bytecode, bien que la possibilité
pour enregistrer le code compilé sur le disque
disparu quelque part dans le processus de
de la fusion de la YARV de la machine virtuelle.
JRuby est compilé en Java .classe
les fichiers. Je n'ai pas beaucoup de détails
sur le MagLev, mais il semble sûr de dire qu'il
prendront la route ainsi.
Je suis confus au sujet de cette compilation/interprétation de la question par rapport à Ruby.
J'ai appris que Ruby est un langage interprété et c'est pourquoi quand j'ai enregistrer les modifications apportées à mon Ruby je n'ai pas besoin de re-construire le projet.
Mais si toutes les Rubis implémentations sont maintenant compilés, est-il toujours juste de dire que Ruby est un langage interprété? Ou suis-je malentendu quelque chose?
source d'informationauteur Paul Dexter
Vous devez vous connecter pour publier un commentaire.
Oui, Ruby est encore un langage interprété, ou plus précisément, du Matz Interpréteur Ruby (IRM), qui est ce que les gens parlent quand ils parlent de Rubis, est toujours un interprète. L'étape de compilation est simplement là pour réduire le code à quelque chose qui est plus rapide à exécuter que d'interpréter et réinterpréter le même code de temps après le temps.
Presque toutes les langues est "compilé" aujourd'hui, si vous comptez bytecode comme étant compilé. Même Emacs Lisp est compilé. Ruby était un cas spécial, parce que jusqu'à récemment, il n'était pas compilé en bytecode.
Je pense que vous êtes en droit de remettre en question l'utilité de la caractérisation des langues en tant que "compilé" vs "interprété." Une distinction utile, cependant, est de savoir si le langage crée le code machine (par exemple, assembleur x86) directement à partir du code utilisateur. C, C++, de nombreux Lisps, et Java avec JIT activé faire, mais Ruby, Python, Perl et ne le font pas.
Gens qui ne savent pas mieux appeler n'importe quel langage qui a un manuel séparé étape de compilation "compilé" et ceux qui ne le sont pas "interprété."
Un subtil question en effet...
Il a utilisé pour être que "interprété" les langues ont été analysées et transformées en une forme intermédiaire qui a été plus rapide à l'exécution, mais la "machine" de leur exécution était une jolie langue programme spécifique. "Compilé" les langues ont été traduits dans le code machine des instructions pris en charge par l'ordinateur sur lequel il a été exécuté. Un début de distinction très à la base-statique vs dynamique étendue. Dans un langage statiquement typé, une référence à une variable pouvait très bien être résolu à une adresse de mémoire dans quelques instructions machine--tu savais exactement où dans le cadre de l'appel de la variable. Dans typées dynamiquement langues dont vous avez eu à chercher (une liste ou d'un appel de bloc) pour la référence. Avec l'avènement de la programmation orientée objet, la non-immédiateté de référence élargi à de nombreux autres concepts-classes(types), des méthodes(fonctions),et même de syntaxe à l'interprétation (embedded DSLs comme regex).
La distinction, en fait, remontant peut-être à la fin des années 70 n'était pas tellement entre compilé et interprété languesmais qu'ils ont été exécutés dans un compilé ou interprété environnement.
Par exemple, Pascal (le premier langage de haut niveau, j'ai étudié) a couru à l'université de Berkeley d'abord sur le projet de Loi de la Joie pxp interprète, et plus tard sur le compilateur, il écrit pcc. Même langue, disponibles à la fois compilé et interprété environnements.
Certaines langues sont plus dynamiques que d'autres, le sens de quelque chose, un type, une méthode, une variable, dépend de l'environnement d'exécution. Cela signifie que compilé ou non, il est important au moment de l'exécution mécanisme associé à l'exécution d'un programme. De suite, Smalltalk, des Nouvelles, Lisp, tous sont des exemples de cette. Initialement, ces langues tant mécanisme d'exécution (par rapport à un C ou Fortran) qu'ils étaient d'un naturel pour l'interprétation.
Avant même de Java, il y eut des tentatives pour accélérer l'exécution de complexe, dynamique des langues avec des astuces, des techniques qui est devenu filetée de la compilation juste-à-temps de compilation, et ainsi de suite.
Je pense que c'est Java, bien que, qui fut la première grande propagation de la langue que vraiment brouillé le compilateur/interpréteur écart, paradoxalement, de sorte qu'il serait plus rapide (bien que trop), mais de manière qu'il irait partout. En définissant leur propre langage machine et de la "machine" le bytecode java et la machine virtuelle Java essayé de devenir un langage compilé dans quelque chose de proche de toute machine de base, mais pas réellement de toute la machine réelle.
Langues modernes épouser toutes ces innovations. Certains ont de la dynamique, ouvert, vous-ne-sais-what-you-get-jusqu'à l'exécution de la nature de la traditionnelle "langages (ruby, lisp, smalltalk, python, perl(!)), certains essaient d'avoir la rigueur de spécification permettant de profondeur en fonction de leur type statique de la détection des erreurs de langages compilés traditionnels (java, scala). Tout compiler à la machine réelle, indépendante de représentations (JVM) pour obtenir de l'écrire une fois, exécuter de n'importe où sémantique.
Ainsi, compilé vs interprété? Meilleur des deux, je dirais. Tout le code de la autour de dans la source (avec documentation), de changer quoi que ce soit et l'effet est immédiat, les opérations simples exécuter presque aussi rapide que le matériel peut faire, complexes sont pris en charge, et assez rapide, le matériel et les modèles de mémoire sont compatibles sur toutes les plateformes.
La plus grande polémique dans les langues d'aujourd'hui est probablement qu'ils sont statiquement ou dynamiquement typé, qui est-à-dire non pas à quelle vitesse vont-ils courir, mais les erreurs d'être trouvé par le compilateur à l'avance (au coût de la programmeur d'avoir à spécifier assez complexe de l'information en tapant) ou bien les erreurs viennent de test et de production.
Vous pouvez exécuter Ruby programmes de manière interactive à l'aide de la cisrInteractive Ruby, Shell. Alors qu'il peut générer des intermédiaires du bytecode, il n'est certainement pas un "compilateur" dans le sens traditionnel du terme.
Un langage compilé est généralement compilé en code machine, plutôt que de simplement en byte code. Certains générateurs de code octet peut effectivement plus de compiler le byte code en code machine.
De Byte code en lui-même est juste une étape intermédiaire entre le sens littéral du code écrit par l'utilisateur et la machine virtuelle, il doit encore être interprété par la machine virtuelle (comme c'est fait avec Java dans une machine virtuelle java et PHP avec un cache d'opcode).
C'est peut-être un peu hors sujet, mais...
Fer Ruby est un .net de la mise en œuvre de ruby et il est donc généralement compilé en byte code et ensuite JIT compilé en langage machine au moment de l'exécution (c'est à dire pas interprété). Aussi (au moins avec les autres .net languages, je suppose qu'avec ruby) ngen peut être utilisé pour générer la compilation d'un fichier binaire natif à l'avance, de sorte que c'est effectivement une machine de code compilé la version de code ruby.
Que pour les informations que j'ai reçu de RubyConf 2011 à Shanghai, Matz est le développement d'une "MRuby'(pour Matz Ruby) pour le ciblage en cours d'exécution sur les systèmes embarqués. Et Matz a dit le MRuby, offrira la possibilité de compiler le code ruby en code machine pour augmenter la vitesse et la diminution de l'utilisation de l' (limitée) des ressources sur les périphériques embarqués. Donc, il y a différents types de Ruby mise en œuvre et certainement pas tous d'entre eux sont simplement de l'interprétation au cours de l'exécution.