Aller au contenu
Korben, roi d’internet, logo bébé avec des lunettes en mode thug life

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 that ends in "()" with no space>
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          = "+" | "-" | "&" | "|" | "^" | "<<" | ">>"
            | "==" | "!=" | "<" | ">" | "<=" | ">="

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

Source


Les articles du moment