2011-06-17 2 views
6

Je travaillais sur IronLua pendant mon temps libre. Lexing et l'analyse est actuellement fait. J'ai en quelque sorte cessé de travailler dessus par frustration car l'implémentation des coroutines Lua dans .NET sans avoir recours à des hacks de threads sales n'est pas facile. Ceci est lié à la façon dont je compile les fonctions de Lua, et c'est un problème que je dois résoudre tôt lors de la conception du compilateur.Compilateur CPS pour l'implémentation coroutine

J'ai fait des recherches sur les implémentations coroutine, et il s'avère que mes premières impressions sur les suites étaient correctes. Comme la création de coroutine, le rendement et d'autres opérations ne sont pas des mots-clés de langue, mais des fonctions dans la table "coroutine", je ne peux pas basculer statiquement en compilation CPS car la table coroutine a été écrasée par un script précédent. Bien que je comprenne que les scripts d'écrasement de la table de coroutine sont rares, je voudrais être prudent et aborder la question aussi proprement que possible.

Mon plan est d'utiliser le style continuation-passing pour chaque expression, peu importe si nous sommes dans une coroutine ou non. Tout serait suivi d'une continuation.

Outre la difficulté évidente d'écrire un compilateur en premier lieu, et en y ajoutant la transformation CPS, je suis troublé par cette décision de conception et ses implications en termes de performances.

Je suis à la recherche de conseils sur l'implémentation de la coroutine Lua dans .NET.

Merci pour votre temps.

Répondre

0

Vous voudrez peut-être regarder le travail effectué pour Scala on .NET. Scala supporte les continuations en tant que plugin de compilateur. Mise en garde: Je ne sais pas si le support des suites fonctionne dans .NET, ou même si le travail sur le compilateur lui-même est avancé. La personne responsable est Miguel Garcia, vous pouvez trouver son adresse sur la Scala Lang: The Scala Development Team

Les références suivantes peuvent être utiles:

Scala comes to .Net

The Scala Compiler Corner, for .NET and Mono fans

+0

merci, je vais jeter un oeil à leur source. mettra à jour. – Raine

1

Je ne connais pas avec les détails des co-routines lua. Mais je pense que la seule façon d'obtenir le support de la co-routine à un niveau similaire à celui que lua supporte lui-même nécessite que toutes les variables locales soient allouées sur le tas sous une forme ou une autre.

Votre problème n'est pas seulement que les fonctions coroutine peuvent être remplacées, mais que toute fonction lua que vous appelez pourrait céder.

Vous devriez également regarder dans le CTP asynchrone qui implémente un comportement très similaire en C#. La principale différence que je vois est que vous devez faire toutes les méthodes async, alors que la fonctionnalité C# est opt-in.

Si votre intégration .net est bonne (et je m'attends à ce qu'elle soit bonne si je compile sur le DLR) alors je ne m'inquiéterais pas trop de la performance. Il est facile d'écrire les parties critiques de la performance en C# et d'utiliser lua pour le code de la colle.