Convertir Ruby en langues de bas niveau?
J'ai toutes sortes de scripts Ruby:
rails (symfony)
ruby (php, bash)
rb-appscript (applescript)
Est-il possible de remplacer le faible niveau de langues avec Ruby trop?
J'écris en Ruby et il la convertit en java, c++ ou c.
Cause de Gens disent que quand il s'agit de plus de la performance à des tâches critiques en Ruby, vous pouvez l'étendre avec C. Mais le mot prolonger signifie que vous écrivez C les fichiers que vous appelez dans votre code Ruby. Je me demande, pourrais-je plutôt utiliser le Rubis et le convertir en code source C qui sera compilé en code machine. Ensuite, j'ai pu "sortir" avec C, mais dans le code Ruby.
Qu'est ce que ce poste est d'environ. Tout écrire en Ruby, mais d'obtenir la performance de C (ou Java).
Le deuxième avantage est que vous n'avez pas à apprendre d'autres langues.
Comme HipHop for PHP.
Sont là des implémentations pour cela?
source d'informationauteur never_had_a_name
Vous devez vous connecter pour publier un commentaire.
Un tel compilateur serait un énorme morceau de travail. Même si elle travaille, elle doit encore
Tous ces infliger d'énormes exécution des peines, parce qu'un compilateur C ne peut ni comprendre, ni d'optimiser ces abstractions. Ruby et les autres langages dynamiques ne sont pas seulement plus lent parce qu'ils sont interprétés (ou compilé en bytecode qui est ensuite interprété), mais aussi parce queils sont dynamiques.
Exemple
En C++, un appel de méthode peut être incorporé dans la plupart des cas, parce que le compilateur connaît le type exact de
this
. Si un sous-type est passé, la méthode ne peut toujours pas changer, sauf si c'est virtuel, auquel cas, ce qui est encore très efficace table de recherche est utilisé.En Ruby, les classes et les méthodes peuvent changer à tout moment, donc un (relativement cher) de recherche est nécessaire à chaque fois.
Langages comme Ruby, Python ou Perl ont de nombreuses caractéristiques qui, tout simplement, sont cher, et la plupart, si pas tous les programmes s'appuient fortement sur ces fonctionnalités (bien sûr, ils sont extrêmement utiles!), ils ne peuvent donc pas être supprimé ou inline.
Il suffit de mettre: langages Dynamiques sont très difficile à optimiser, il suffit de faire ce que les services d'un interprète et n'compilation qui en code machine ne coupe pas. Il est possible d'obtenir une vitesse incroyable de dynamique des langues, comme le V8 prouve, mais vous devez lancer d'énormes piles de l'argent et des offices le plein de bons programmeurs.
Il est http://rubyforge.org/projects/ruby2c/ Ruby C compilateur. Il en fait ne prend que dans un sous-ensemble de Ruby. Je crois que la principale partie manquante est la Méta-Programmation des fonctions
Dans une récente interview (16 novembre 2012) Yukihiro "Matz" Matsumoto (le créateur de Ruby) a parlé de compiler Ruby C
Juste un étudiant n'est pas beaucoup, mais il pourrait être un projet intéressant. Probablement un long chemin à parcourir prise en charge totale de Ruby.
De"bas niveau" est très subjective. Beaucoup de gens le tracé de la ligne différemment, pour le bien de cet argument, je vais supposer que vous dire de compiler Ruby vers une forme intermédiaire qui peut ensuite être transformé en code machine pour votre plate-forme. I. e., compiler ruby C ou IR LLVM, ou quelque chose de cette nature.
La réponse courte est oui, cela est possible.
La plus longue réponse va quelque chose comme ceci:
Plusieurs langues (Objective-C notamment) existent en tant que couche mince sur d'autres langues. ObjC syntaxe est vraiment juste un lâche wrapper autour de la objc_*() libobjc d'exécution des appels, à toutes fins pratiques.
Sachant cela, alors que fait le compilateur? Eh bien, il fonctionne en fait comme tout compilateur C, mais il prend également la objc spécifique des choses, et génère le C des appels de fonction pour interagir avec l'objc de l'exécution.
Un rubis compilateur pourrait être mis en œuvre dans des termes similaires.
Il convient également de noter, cependant, que seulement par la conversion d'une langue à un niveau inférieur formulaire ne signifie pas que la langue est instantanément plus performante, même si elle ne signifie pas qu'elle sera moins bon. Vous devez vraiment vous demander pourquoi vous êtes désireux de le faire, et si c'est une bonne raison.
Il est également JRubysi vous envisager de Java un langage de bas niveau. En fait, le langage lui-même n'a que peu à faire ici: il est possible de compiler vers du bytecode JVM, qui est indépendant de la langue.
Performance ne vient pas uniquement de "bas niveau" les langages compilés. Cross-compilation de votre Ruby programme de alambiqué, généré automatiquement du code C ne va pas aider non plus. Ce sera probablement juste de confondre les choses, à long temps de compilation, etc. Et il y a beaucoup de meilleurs moyens.
Mais vous dites "à faible niveau de langues" et parle de Java. Java n'est pas un langage de bas niveau. C'est juste une étape ci-dessous Ruby en termes de haut ou de bas niveau des langues. Mais si vous regardez comment Java fonctionne, la machine virtuelle java bytecode et juste-à-temps de compilation, vous pouvez voir comment le niveau élevé des langues peut être rapide(er). Ruby est en train de faire quelque chose de similaire. L'IRM 1.8 est un langage interprété, et a eu quelques problèmes de performance. 1.9 est beaucoup plus rapide, à l'aide d'un interpréteur de bytecode. Je ne sais pas si ça va jamais arriver à l'IRM, mais Ruby est juste une étape loin de JIT sur l'IRM.
Je ne suis pas certain que les technologies sous-jacentes jRuby et IronRuby, mais ils ont peut-être déjà fait. Cependant, les deux ont leurs propres avantages et inconvénients. J'ai tendance à coller avec l'IRM, il est assez rapide et il fonctionne très bien.