33 votes

Quelle est la façon la plus simple de créer un compilateur F # que de lancer sur la JVM et de générer du bytecode Java?

Le Compilateur F# actuel est écrit en F#, est open source et fonctionne sur .Net et Mono, lui permettant d'exécuter sur de nombreuses plates-formes, y compris Windows, Mac et Linux. F#'s Code Citations mécanisme a été utilisé pour compiler F#, JavaScript dans des projets comme WebSharper, Pit et FunScript. Il semble également y avoir un certain intérêt dans l'exécution de code F# sur la JVM.

Je crois qu'une version du compilateur OCaml a été utilisé à l'origine pour Bootstrap le compilateur F#.

Si quelqu'un voulait construire un compilateur F# qui tourne sur la JVM serait-il plus facile:

  1. Modifier les existants compilateur F# pour émettre le bytecode Java et ensuite compiler le compilateur F# avec elle?
  2. Utiliser une JVM basé ML compilateur comme Yeti pour amorcer un minimum de compilateur F# sur la JVM?
  3. Ré-écrire le compilateur F# à partir de zéro en Java, comme le fjord du projet semble être d'essayer?
  4. Quelque chose d'autre?

12voto

mythz Points 54874

Une autre option qui devrait sans doute être considéré est de convertir les .NET CLR byte code JVM byte-code comme http://www.ikvm.net fait avec de la JVM > CLR octets de codes. Bien que cette approche ait été examiné et rejeté par le fjord propriétaire.

Obtenir buy-in de haut avec l'option 1) et le compilateur F# équipe ont enfichable backends que pourrait émettre le bytecode Java sons, en théorie, comme il l'aurait fait de produire le plus poli de la solution.

Mais si vous regardez les autres langues qui ont été portés à différentes plates-formes, ce qui est rarement le cas. La plupart du temps, c'est une réécriture à partir de zéro. Mais c'est aussi probablement dû à la langue d'origine de l'équipe n'ayant aucun intérêt dans la prise en charge d'autres plates-formes elles-mêmes et que l'hôte d'origine de la mise en œuvre pourrait n'ai pas été en mesure de prendre en charge plusieurs backends et c'est déjà trop lente pour que ce soit une option viable pour commencer.

Mon intuition est une combinaison de ré-écrit à partir de zéro et d'être capable de faire autant de partage de code et d'automatisation possible de la mise en œuvre d'origine. E. g. si les suites de test pourrait être ré-utilisé pour les deux implémentations, il faudrait beaucoup de poids sur la JVM port et aller un long chemin en veillant à la parité linguistique.

12voto

toyvo Points 3230

Si je devais faire ça, je serais probablement commencer avec le n ° 1 de l'approche - ajouter JVM serveur d'arrière-plan de l'existant compilateur. Mais je voudrais aussi essayer d'argumenter en faveur d'une cible différente de la VM.

Les citations ne sont pas très pertinentes - comme un auteur de WebSharper je peux vous assurer que, bien que les citations peuvent vous donner une belle F#comme langage de programmation, ils sont restrictives, et pas optimisé. J'imagine que pour le potentiel de la JVM F# les utilisateurs de la barre serait beaucoup plus élevé à pleine langue de la compatibilité et des performances comparables. C'est très dur.

Prendre la queue d'appels, par exemple. Dans WebSharper nous appliquer des heuristiques pour optimiser certains locaux de la queue des appels à des boucles en JavaScript, mais cela ne suffit pas - vous ne pouvez pas, en général, s'appuient sur le coût total de possession, comme vous le faites en général des bibliothèques de F#. C'est ok pour WebSharper que nos utilisateurs ne vous attendez pas à avoir la pleine F#, mais ne sera pas ok pour une JVM F# port. Je crois que la plupart de la JVM des implémentations ne pas faire TCO, il devra être mis en œuvre avec certains d'indirection, l'introduction d'un gain de performance.

Un bytecode re-compilation approche mentionné par @mythz semble très intéressante car elle permet de plus que juste le portage F# - idéalement, il permet le portage de plus .NET logiciel pour la JVM. J'ai travaillé un peu avec .NET bytecode analyse interne WebSharper 3.0 projet nous sommes à la recherche à l'option de compilation .NET bytecode au lieu de F# citations de JavaScript. Mais il y a d'énormes défis à relever:

  1. Beaucoup de code dans la BCL est opaque (natif) - et vous ne pouvez pas décompiler

  2. La généricité du modèle est assez compliqué. J'ai mis en place un runtime JavaScript que les modèles de classes et de méthodes génériques, l'instanciation, la génération de type, et de base de réflexion avec un peu de précision et de rendement raisonnables. C'était assez difficile, dans la dynamique de JavaScript avec les fermetures et semble assez difficile à faire dans un puissant moyen sur la JVM - mais peut-être que je ne vois pas une solution simple.

  3. Les types de valeurs de créer des complications importantes dans le bytecode. Je suis encore à celui-ci pour WebSharper 3.0. Ils ne peuvent pas être ignorés, car ils sont largement utilisés par de nombreuses bibliothèques que vous voulez porté.

  4. De même, la réflexion de base est utilisé dans de nombreux du monde réel .Bibliothèques NET - et c'est un cauchemar pour cross-compiler en termes à la fois de beaucoup de code natif et un soutien approprié pour les génériques et les types de valeur.

Aussi, le bytecode approche ne permet pas de supprimer la question sur la façon de mettre en œuvre des appels tail. Autant que je sache, Scala ne pas mettre en œuvre tailcalls. Ils ont certainement le talent et le financement pour le faire - le fait qu'ils ne sont pas, me dit beaucoup de choses sur comment pratique c'est d'en faire le TCO sur la JVM. Pour notre .NET->JavaScript port, je vais probablement aller un parcours similaire - pas de coût total de possession de garanties, sauf si vous demandez spécifiquement pour le trampoline qui va fonctionner, mais vous coûter un ordre de grandeur (ou deux) dans la performance.

9voto

gasche Points 23208

Il existe un projet qui compile OCaml en JVM, OCaml-Java : il est assez complet et peut notamment compiler les sources du compilateur OCaml (écrit en OCaml). Je ne sais pas quels aspects du langage F # vous intéressent, mais si vous cherchez principalement à obtenir un langage fonctionnel typé strict mature pour la JVM, cela peut être une bonne option.

8voto

kvb Points 35490

Je soupçonne que toute approche représenterait beaucoup de travail, mais je pense que votre première suggestion est la seule qui éviterait d'introduire de nombreuses incompatibilités et bogues supplémentaires. Le compilateur est assez complexe et il y a beaucoup de cas d'angle autour de la résolution de surcharge, etc. (et la spécification a probablement aussi des lacunes), il semble donc très peu probable qu'une nouvelle implémentation ait une sémantique constamment compatible.

1voto

Ingo Points 21438

Modifier les existants compilateur F# pour émettre le bytecode Java et ensuite compiler le compilateur F# avec elle? Utiliser une JVM basé ML compilateur comme Yeti pour amorcer un minimum de compilateur F# sur la JVM?

Portage du compilateur ne devrait pas être difficile si il est écrit en F#.

Je serais probablement aller de la première manière, parce que c'est la seule manière dont on peut espérer garder le nouveau compilateur en synchronisation avec le .net compilateur F#.

Ré-écrire le compilateur F# à partir de zéro en Java, comme le fjord du projet semble être d'essayer?

C'est certainement la moins élégante approche, à mon humble avis.

Quelque chose d'autre?

Lorsque le compilateur est fait, vous avez 90% du travail qui reste à faire.

Par exemple, ne sachant pas bien F#, mais je suppose que c'est facile à utiliser .NET bibliothèques. Cela signifie que le problème de base est le port le .NET de l'écosystème, en quelque sorte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X