2010-04-10 5 views
3

J'ai écrit un interpréteur pour mon langage expérimental et je sais que je veux passer à autre chose et écrire un petit compilateur. Il prendra probablement la source, passera par les mêmes étapes que l'interpréteur (tokenizer, parser) et traduira ensuite la source en assembly.Compilateur: Traduction en assembleur

Maintenant, mes questions:

  • Puis-je attendre à ce que chaque commande dans ma langue peut être 1: 1 traduit à un groupe d'instructions de montage? Ce que je veux dire, c'est si je devrais complètement jeter tout le programme d'entrée ou s'il est juste traduit en assemblage par ligne.

  • Quel assembleur devrais-je utiliser comme format de sortie?

+0

Pour votre deuxième question: Quelle est votre plateforme cible? – Thomas

+0

Windows au premier abord – sub

+0

http://stackoverflow.com/questions/1669/learning-to-write-a-compiler –

Répondre

3
  1. J'interprète votre question demandant si chaque énoncé dans votre langue sera traduit dans le même sens de l'ASM dans un contexte. La réponse est: cela dépend de votre langue, mais généralement non. Il y a des problèmes compliqués tels que l'allocation de registre qui peut entraîner que la sortie ne soit pas 1: 1, selon le contexte. Votre déclaration peut avoir besoin de registres, qui dans un contexte peuvent être libres et à un autre occupé (vous utiliserez donc la pile). Dépend de la plate-forme et de vos projets. Si vous souhaitez compiler dans l'assembly natif pour Windows, le langage d'assemblage x86 doit être votre objectif.
0

À moins que vous ne soyez absolument déterminé à «réinventer la roue», vous pouvez tout aussi bien émettre du code C, puis le transmettre à un compilateur C existant, par ex. gcc. Ce sera beaucoup plus facile que d'écrire votre propre back-end et vous obtiendrez gratuitement toutes les optimisations du compilateur C, etc.

+0

Pourquoi, avez-vous peur qu'il fournisse un système décent pour Windows? Conseiller GCC est alors un bon moyen de ruiner cela :-) –

0

Non, vous ne pouvez pas vous y attendre. Si votre langage contient des choses comme eval(), cela peut devenir funky.

En tant qu'assembleur de backend, nasm semble être le plus populaire. Le GAZ est possible, mais je l'ai trouvé un peu impitoyable et incomplet.