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:
Beaucoup de code dans la BCL est opaque (natif) - et vous ne pouvez pas décompiler
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.
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é.
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.