2

Je crée un jeu dans XNA et je pensais créer mon propre langage de script (extrêmement simple d'esprit). Je sais qu'il y a de meilleures façons d'y parvenir (et que je réinvente la roue), mais je veux que l'expérience d'apprentissage soit plus productive que rapide. Quand je suis confronté au code au moment de l'exécution, d'après ce que je comprends, l'approche habituelle est d'analyser un code machine ou un code octet ou autre chose qui est réellement exécutable, puis l'exécuter, n'est-ce pas? Mais, par exemple, lorsque Chrome est sorti, ils ont dit que leur moteur JavaScript était rapide car il compilait le code JavaScript en code machine. Cela implique que d'autres moteurs ne se sont pas compilés en code machine.Comprendre l'interprétation et l'exécution du code temporel d'exécution

Je préférerais ne pas compiler vers un langage inférieur, donc existe-t-il des techniques modernes connues pour analyser et exécuter du code sans compiler au niveau bas? Peut-être quelque chose comme analyser le code dans une sorte d'arbre, se ramifier dans l'arbre, et comparer chaque symbole et appeler une fonction qui gère ce symbole? (Je devine et poignarde dans l'obscurité)

+0

Les processeurs ne comprennent que le langage machine ... donc si vous ne compilez pas en langage machine, quelque chose d'autre devra le faire, sinon il ne le sera pas courir à ma connaissance. –

+0

@Tony comment fonctionne l'interprète alors? – Earlz

+0

Vous avez dit: "ils ont dit que leur moteur JavaScript était rapide car il compile le code JavaScript en code machine" Donald Knuth a déclaré que "l'optimisation prématurée est la racine de tout mal". Vous semblez optimiser votre langage de script avant de l'avoir inventé. ;) – msw

Répondre

2

Personnellement, je ne voudrais pas lancer votre propre analyseur (transformer l'entrée en jetons) ou lexer (vérifier les jetons d'entrée pour la grammaire de votre langue). Jetez un oeil à ANTLR pour l'analyse syntaxique/lexing - c'est un cadre génial et a un code source complet si vous voulez creuser dans les tripes de celui-ci. Pour exécuter le code que vous avez analysé, j'examinerais courir une machine virtuelle simple ou même regarder mieux llvm qui est une tentative d'open-source (ish) pour normaliser le format de code d'octet de machine virtuelle et fournir gentil des fonctionnalités comme JITing (en tournant votre script compilé code octet dans l'assemblage). Je ne vous découragerais pas par les options plus avancées que vous utilisez comme l'exécution de code machine natif mais gardez à l'esprit que c'est un domaine très spécialisé et devient vraiment complexe, très rapide! Earlz a fait remarquer que ma réponse pourrait sembler impliquer «ne vous embêtez pas à le faire vous-même. Re-lire mon message ça sonne un peu comme ça. La raison pour laquelle j'ai mentionné ANTLR et LLVM est qu'ils ont tous deux des tas de code source et des tutoriels, donc je pense que c'est une bonne source de référence. Prenez-le comme base et jouer

+0

Umm, "expérience d'apprentissage" a été mentionné. En outre, j'ai écrit un interprète en C# et il était en fait assez facile ... (comme dans, je l'ai eu et complet pendant 2-3 semaines de programmation) – Earlz

+0

@Earlz Bien sûr, mais les deux outils que j'ai mentionnés ont code source et sont de bonnes ressources générales si vous êtes intéressé par le domaine. Je ne veux pas décourager «rouler le vôtre», mais toujours agréable d'avoir une base pour se référer à – zebrabox

+0

Merci pour les liens. Voyant le code source devrait certainement donner une idée de la façon dont l'analyse et lexical sont faits – Bob

0

Python est génial comme langage de script. Je vous recommande de faire une liaison C# pour son API C et l'utiliser. L'intégration de Python est facile. Votre application peut définir des fonctions, types/classes et variables à l'intérieur des modules auxquels l'interpréteur Python peut accéder. L'application peut également appeler des fonctions dans des scripts Python et obtenir un résultat. Ces deux fonctionnalités combinées vous donnent un schéma de communication bidirectionnel.

Fondamentalement, vous obtenez gratuitement la syntaxe et la sémantique de Python. Ce que vous devez implémenter, c'est l'API que votre application expose à Python. Un exemple pourrait être l'accès aux fonctions de logique de jeu et aux fonctions de rendu. Les scripts Python définiraient alors des fonctions qui les appellent, et l'application hôte invoquerait les fonctions Python (avec des paramètres) pour faire le travail.

EDIT: On dirait que IronPython peut vous faire encore plus de travail.Il s'agit d'une implémentation C# de CPython, et a sa propre API d'intégration: