Ceci est basé sur un exposé sur les compilateurs que j'ai écouté il y a quelque temps, mais je ne me souviens malheureusement pas de quand ni où.
Créez le compilateur le plus court dans n'importe quel langage capable de se compiler. Ciblez tout ISA raisonnable (68K, x86, MIPS, ARM, SPARC, IBM BAL, etc.) n'ayant pas d'instruction "programme de compilation" (cela peut exclure certaines versions de VAX). Lire les programmes sources à partir de stdin
et imprimer le code généré stdout
. Vous pouvez utiliser la bibliothèque standard C pour le traitement des E / S et des chaînes (par exemple, _printf
). Vous n'avez pas besoin de compiler le langage entier, mais uniquement les sous-ensembles contenant le compilateur (par exemple, imprimer un quine de langage assembleur, bien qu'impressionnant, ne compte pas comme une solution.)
#!/usr/local/bin/tcc -run
à la première ligne de votre source C et exécutez-le directement à partir de la ligne de commande." C'est plutôt cool.Réponses:
Sous-ensemble Haskell → C - 18926 caractères
Cela compile un petit sous-ensemble de Haskell en C. Il prend en charge:
Les principales caractéristiques manquantes sont les variables imbriquées (c'est-à-dire sans lambda / let / where / case), la vérification du type et les classes de type. Les programmes résultants perdent de la mémoire et l'auto-compilation prend environ 200 mégaoctets sur mon système (le ramasse-miettes Boehm aide beaucoup, mais uniquement si le compilateur optimise bien la récursion de la queue).
Pour démarrer, décommentez les trois premières lignes (non comptées dans la partition) et compilez avec GHC. Le compilateur prend le code de sous-ensemble Haskell sur stdin et produit le code C sur stdout.
C'est long non pas parce que le langage est complexe, mais parce que je suis paresseux.
Cependant, c'est actuellement la solution la plus courte. Plusmaintenant. Je suppose que je ne m'ennuierai pas ce week-end.la source
Langage personnalisé → C - (7979)
Puisque la question n'empêche pas de créer mon propre langage, j'ai pensé essayer.
L'environnement
La langue a accès à deux piles, la pile d’appel et la pile de données. La pile d'appels est utilisée pour les instructions de saut
{
et}
, tandis que la pile de données est utilisée par la plupart des autres instructions. La pile d'appels est opaque pour les applications.La pile de données peut contenir trois types de valeurs différents: entier, texte et vide. Les entiers sont de type intptr_t, tandis que le texte est stocké sous forme de chaînes de style C.
L'
^
instruction a accès à The Array. Le tableau est un tableau constant de longueur 17 d'éléments de texte. Vous devriez probablement voir la source du schéma d’indexation car il est un peu malicieux.La langue
Le compilateur
Ceci est le compilateur. Ce n'est pas un terrain de golf et je pense qu'il pourrait être considérablement réduit. Il devrait être possible d’utiliser directement le code machine et de générer un fichier DOS, mais je n’en ai pas encore pris connaissance. Je sais que cela ressemble à un programme C, mais l'implémentation réelle du compilateur est à la fin.
Actuellement, le compilateur génère beaucoup d’informations de débogage sur stderr.
Pour compiler le code C généré:
Le jeu de caractères est requis car le compilateur échappe aux caractères spéciaux en ajoutant 128.
Le bootstrap
Pour compiler le premier compilateur, j'ai écrit un interpréteur python pour le langage.
Mettre tous ensemble
En supposant que vous ayez enregistré le compilateur en tant que
compiler.cmp
et le bootstrap en tant quebootstrap.py
, voici comment construire le compilateur, puis utilisez-le pour se compiler:Donc, je ne suis pas un grand programmeur C, ni un concepteur de langage, alors toute suggestion pour améliorer ceci est la bienvenue!
Exemples de programmes
Bonjour le monde!
la source
Extended Brainfuck v0.9: 618 octets (sans compter les sauts de ligne inutiles)
Il s'agit d'une version de ma toute première version de EBF, avec la suppression de la prise en charge des commentaires et du code mort pour la suppression des variables.
Donc, fondamentalement, c'est BrainFuck avec des variables.
:x
crée des variables x. Le compilateur sait où vous êtes et$y
produira des <et des> pour atteindre cette position. Parfois, vous avez besoin de boucles asymétriques et vous devez ensuite indiquer au compilateur où vous vous trouvez@x
. Comme EBF actuel, il compile pour Brainfuck.Cette première version n'avait qu'un seul nom de variable, mais j'ai utilisé cette version pour compiler la version suivante, et ainsi de suite jusqu'à la version actuelle dotée d'un ensemble de fonctionnalités impressionnant. Lors de la compilation à partir de la source github, il télécharge le binaire compilé à la main pour initialiser 6 versions ebf intermédiaires afin de créer la version actuelle.
Pour l'amorcer, vous pouvez utiliser ce premier et unique fichier binaire dans le référentiel git EBF, qui a été compilé à la main avec succès après quelques essais.
Brainfuck a quelques implémentations matérielles, par exemple. ceci , ceci et cela pour n'en citer que quelques-uns. Mais la plupart du temps, il est si facile à mettre en œuvre que vous pouvez pratiquement utiliser un interprète sur n’importe quel système. Je plaisantais en disant que Zozotez LISP , qui est écrit en EBF, est probablement le LISP le plus portable à ce jour.
la source
Hex, 550 octets
Ceci cible spécifiquement les systèmes x86_64 exécutant Linux.
Dans cette langue, le code source est constitué d'octets représentés sous forme de deux chiffres hexadécimaux minuscules,
[0-9a-f][0-9a-f]
. Ces octets peuvent avoir n'importe quelle quantité d'espace blanc environnant, mais rien ne peut se produire entre les chiffres qui forment un seul octet. En outre,'!'
est un caractère de commentaire de ligne: il est ignoré, ainsi que tout ce qui le sépare du'\n'
caractère suivant .Si vous comprenez l'assemblage x86, voici une version beaucoup plus lisible du code source:
Si vous extrayez le langage d'assemblage à partir des commentaires ci
! Program Code
- dessous , vous pouvez assembler et exécuter le compilateur Hex. Les entrées et sorties utilisent stdin et stdout.la source
Hex
n'est pas une langue.Sous-ensemble Javascript -> Java, 504 octets
la source
05AB1E , 2 octets (éventuellement non concurrents)
Essayez-le en ligne!
Code sur la première ligne d’entrée, entrées sur les lignes suivantes.
la source
Bois d'oeuvre , 0 octet
Lumber est un langage de programmation ésotérique complet inventé par Unrelated String, écrit en seulement 10 lignes de code Prolog.
Vous ne pouvez pas y croire? Les commentaires de ces programmes ont été supprimés et la source de l’interprète est plus concise.
lumber_corefuncs.pl:
lumber_types.pl
lumber_corefuncs.pl intègre la bibliothèque lumber_types; et à son tour, cette bibliothèque définit un module ne contenant rien. Par conséquent, Lumber ne fait rien sur les entrées arbitraires, qui sont à leur tour un auto-compilateur.
la source
Nil , 0 octet
la source