Autres conseils

Presque toutes les langues est « compilé » de nos jours, si vous comptez bytecode comme étant compilé. Même Emacs Lisp est compilé. Ruby était un cas particulier parce que jusqu'à récemment, n'a pas été compilés dans bytecode.

Je pense que vous avez raison de remettre en question l'utilité de la caractérisation des langues comme « compilé » vs « interprété ». Une distinction utile, cependant, est de savoir si la langue crée un code machine (par exemple assembleur x86) directement à partir du code utilisateur. C, C ++, beaucoup Lisps et Java avec JIT activé faire, mais Ruby, Python, Perl et ne le font pas.

Les gens qui ne connaissent pas mieux appelleront une langue qui a une étape de compilation manuelle séparée « compilé » et ceux qui ne sont pas « interprétées ».

Une question subtile en effet ... Il fut un temps que « interprétés » langues ont été analysées et transformées en une forme intermédiaire qui était plus rapide à exécuter, mais la « machine » les exécuter était un programme spécifique jolie langue. langues « Compilé » ont été traduits à la place dans les instructions de code machine pris en charge par l'ordinateur sur lequel il a été exécuté. Une première distinction était très basique - statique par rapport à la portée dynamique. Dans un langage typé statiquement, assez pourrait bien être résolu une référence variable à une adresse mémoire dans quelques instructions de la machine - vous saviez exactement où dans le cadre d'appel a renvoyé la variable. Dans les langues dynamiquement tapées vous deviez rechercher (jusqu'à un A-liste ou un cadre d'appel) pour la référence. Avec l'avènement de la programmation orientée objet, la nature non immédiate d'une référence étendu à bien d'autres concepts - classes (types), les méthodes (fonctions), même l'interprétation syntaxique (comme DSLs embarqués regex).

La distinction, en fait, peut-être revenir à la fin des années 70 n'a pas été tellement entre compilé et interprété langues , mais si elles ont été exécutées dans un environnement compilé ou interprété. Par exemple, Pascal (le premier langage de haut niveau j'ai étudié) a couru à l'UC Berkeley d'abord sur interprète PXP Bill Joy, et plus tard le compilateur, il a écrit pcc . même langue, disponible dans les environnements compilés et interprétés.

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 y a mécanisme d'exécution important associé à l'exécution d'un programme. Des exemples de ce Forth, Smalltalk, NeWs, Lisp, étaient tous. Dans un premier temps, ces langues requises tant le mécanisme d'exécution (par rapport à un C ou un Fortran) qu'ils étaient un produit naturel pour l'interprétation.

Avant même que Java, il y avait des tentatives pour accélérer l'exécution des langages dynamiques complexes, avec des astuces, des techniques qui sont devenues compilation thread, compilation juste à temps, et ainsi de suite.

Je pense qu'il était Java, mais, ce qui était la première langue très répandue qui salie vraiment l'écart compilateur / interprète, ironiquement pas qu'il serait courir plus vite (bien que trop) mais pour qu'il fonctionne partout. En définissant leur propre langage machine et « machine » le bytecode java et VM, Java a tenté de devenir un langage compilé en quelque chose proche de toute machine de base, mais pas vraiment une machine réelle.

langues modernes se marient toutes ces innovations. Certains ont la nature dynamique, ouverte, vous-ne-sais-what-you-get-jusqu'à-exécution des langues interprétées traditionnelles »(Ruby, Lisp, Smalltalk, python, perl (!)), Certains tentent de ont la rigueur de la spécification permettant la détection d'erreur statique basée type profond des langages compilés traditionnels (java, scala). Tout compiler à des représentations indépendantes de la machine réelle (JVM) pour obtenir réinscriptibles-run anywhere sémantique.

Alors, compilé par rapport à interpréter? Le meilleur des deux, je dirais. Tout autour de la source de code (avec documentation), changer quoi que ce soit et l'effet est des opérations immédiates, simples fonctionnent presque aussi vite que le matériel peut les faire, les complexes sont pris en charge et assez rapide, les modèles de matériel et de la mémoire sont cohérentes sur toutes les plateformes.

La plus grande polémique dans les langues aujourd'hui est probablement si elles sont statiquement ou dynamiquement typés, ce qui veut dire pas à quelle vitesse vont-ils courir, mais les erreurs se trouve par le compilateur à l'avance (au prix du programmeur avoir à spécifier assez d'informations complexes de frappe) ou bien les erreurs venir dans les tests et la production.

Vous pouvez exécuter des programmes Ruby en utilisant de manière interactive RIR, Ruby Interactive Shell. Bien qu'il puisse générer bytecode intermédiaire, il est certainement pas un « compilateur » dans le sens traditionnel du terme.

Une langue compilé est généralement compilé en code machine, par opposition à code juste d'octets. Certains générateurs de code d'octets peuvent réellement plus compiler le code d'octets en code machine bien.

code octet lui-même est juste une étape intermédiaire entre le code littéral écrit par l'utilisateur et la machine virtuelle, il doit encore être interprété par la machine virtuelle si (comme cela se fait avec Java dans une machine virtuelle Java et PHP avec un cache opcode ).

Ceci est peut-être un peu hors sujet, mais ...

fer Ruby est une implémentation basée sur .NET de rubis et est donc généralement compilé en code octet et JIT compilé au langage de la machine à l'exécution (non interprété). En outre (au moins avec d'autres langues .net, donc je suppose avec rubis) NGEN peut être utilisé pour générer une version code binaire, de sorte que est effectivement à l'avance natif compilé la machine compilé de code Ruby.

En ce qui concerne les informations que je suis arrivé de RubyConf 2011 à Shanghai, Matz développe un « MRuby » (est synonyme de Ruby Matz) pour le ciblage en cours d'exécution sur les appareils embarqués. Et Matz a dit que le l'MRuby, fournira la capacité de compiler le code Ruby en code machine pour augmenter la vitesse et de réduire l'utilisation des ressources (limitées) sur les dispositifs embarqués. Donc, il sont différents types de mise en œuvre Ruby et certainement pas tous d'entre eux sont simplement interprétés au cours de l'exécution.

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