SectorC, un étonnant compilateur C de seulement 512 octets
Peux être être vous tombé sur ce projet incroyable baptisé SectorC ?
C’est un compilateur C écrit en assembleur x86-16 qui tient dans le secteur d’amorçage de 512 octets d’une machine x86. Si vous pensez que c’est déjà assez impressionnant, attendez d’entendre toutes les fonctionnalités dont il dispose !
Il prend en charge un sous-ensemble de C suffisamment grand pour écrire des programmes vraiment intéressants (Variables globales, fonctions, instructions if et while, de nombreux opérateurs, les pointeurs, commentaires, etc.), en plus d’être probablement le plus petit compilateur C jamais écrit.
Encodé en base64, voici ce que ça donne :
6gUAwAdoADAfaAAgBzH/6DABPfQYdQXoJQHr8+gjAVOJP+gSALDDqluB+9lQdeAG/zdoAEAfy+gI AegFAYnYg/hNdFuE9nQNsOiqiwcp+IPoAqvr4j3/FXUG6OUAquvXPVgYdQXoJgDrGj0C2nUGV+gb AOsF6CgA68Ow6apYKfiD6AKrifgp8CaJRP7rrOg4ALiFwKu4D4Srq1fonP9ewz2N/HUV6JoA6BkA ieu4iQRQuIs26IAAWKvD6AcAieu4iQbrc4nd6HkA6HYA6DgAHg4fvq8Bra052HQGhcB19h/DrVCw UKroWQDoGwC4WZGrW4D/wHUMuDnIq7i4AKu4AA+ridirH8M9jfx1COgzALiLBOucg/j4dQXorf/r JIP49nUI6BwAuI0G6wyE0nQFsLiq6wa4iwarAduJ2KvrA+gAAOhLADwgfvkx2zHJPDkPnsI8IH4S weEIiMFr2wqD6DABw+gqAOvqicg9Ly90Dj0qL3QSPSkoD5TGidjD6BAAPAp1+eu86Ln/g/jDdfjr slIx9osEMQQ8O3QUuAACMdLNFIDkgHX0PDt1BIkEMcBaw/v/A8H9/yvB+v/34fb/I8FMAAvBLgAz wYQA0+CaANP4jwCUwHf/lcAMAJzADgCfwIUAnsCZAJ3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAVao=
Xorvoid, l’auteur de ce projet a été inspiré par les recherches de Justine Tunney et Tom Murphy. Ainsi, pour réduire la taille du tokenizer, l’auteur a proposé une version de C appelée “Barely C Programming Language” qui utilise des “méga-tokens” pour minimiser le nombre de tokens nécessaires.
Voici la “grammaire” de son C maison :
program = (var_decl | func_decl)+ var_decl = "int" identifier ";" func_decl = "void" func_name "{" statement* "}" func_name = <identifier ends="" in="" no="" space="" that="" with=""> statement = "if(" expr "){" statement* "}" | "while(" expr "){" statement* "}" | "asm" integer ";" | func_name ";" | assign_expr ";" assign_expr = deref? identifier "=" expr deref = "*(int*)" expr = unary (op unary)? unary = deref identifier | "&" identifier | "(" expr ")" | indentifier | integer op = "+" | "-" | "&" | "|" | "^" | "<<" | ">>" | "==" | "!=" | "<" | ">" | "<=" | ">="</identifier>
De plus, la fonction atoi() est utilisée comme une fonction de hachage pour les littéraux entiers, ce qui permet de réduire encore plus le nombre de tokens.
Pour réussir à minimiser la taille de son code en langage assembleur, Xorvoid a expérimenté différentes méthodes, comme celle du “byte-threaded-code”, qui consiste à aligner les adresses sur une limite de 2 octets pour utiliser un seul octet pour l’adressage. Finalement, le créateur de SectorC a réussi à minimiser son code autant que possible en utilisant différentes petites astuces et en revenant sans cesse à une version encore plus simple de son code.
Au final, ce petit projet nous démontre que même avec des contraintes importantes, il est possible d’obtenir des résultats impressionnants. Ainsi, SectorC pourrait être utile pour ceux qui souhaitent explorer les fonctions bios x86-16 et ce modèle de machine sans avoir à apprendre beaucoup d’assembleur au préalable. Ce genre de défi impressionnant est souvent l’occasion de trouver des solutions plutôt créatives et assez innovantes. Ça scotche les amateurs de technique comme moi en tout cas.
Et bien sûr, si vous êtes curieux et voulez en apprendre davantage sur ce projet surprenant, je vous invite à découvrir SectorC ici : https://xorvoid.com/sectorc.html