L’origine de \n
- Lorsque la commande
just foo est exécutée, le justfile écrit l’octet 0x0A dans un fichier nommé bar
just est écrit en Rust, et l’analyseur de just convertit les tokens de chaîne just contenant des séquences d’échappement en chaînes UTF-8 via une fonction appelée cook_string
Traitement par Rust
rustc traite les codes d’échappement dans une fonction appelée scan_escape
rustc est écrit en Rust et se compile lui-même, en déléguant à rustc la compréhension de la signification de '\n'
- Les premières versions de
rustc étaient écrites en OCaml, et la version OCaml de rustc traitait les échappements de caractères dans le lexer
Traitement par OCaml
- Le compilateur OCaml évalue
\n en \010 puis insère le résultat
0x0A vaut 10, donc lorsque le compilateur OCaml traite \n, il obtient la valeur d’octet 0x0A
Conclusion
- Lorsqu’un échappement de caractère
\n apparaît dans un justfile, le binaire just l’écrit dans la chaîne finale en y incluant l’octet 0x0A
- Cet octet
0x0A a été inséré par rustc, ce qui remonte au moment où le compilateur OCaml a, pour la première fois, inséré l’octet 0x0A dans le binaire rustc
Résumé de GN⁺
- Cet article explique comment l’échappement de caractère
\n est converti en octet 0x0A
- Il retrace l’origine de l’octet
0x0A à travers le contexte historique des compilateurs Rust et OCaml
- Il offre un éclairage intéressant sur la manière dont les compilateurs de langages de programmation traitent les échappements de caractères
- C’est un article utile pour comprendre le fonctionnement des compilateurs de Rust et d’OCaml
1 commentaires
Discussion sur Hacker News
Un utilisateur mentionne que la première fois qu’il a lu cette idée, c’était au 42e jour de l’article « How I wrote a self-hosting C compiler in 40 days »
"\\n"dans un littéral de chaîne"\\n"ne contient pas l’information réelle du code de caractère ASCII, mais qu’elle est transmise lorsque le compilateur compile le compilateurIl est mentionné que, sur les systèmes EBCDIC, il faut tenir compte du fait que les premiers compilateurs C sont apparus sur des systèmes non ASCII
NextLineetLineFeedexplicitesDans le standard C, la seule garantie concernant l’encodage des caractères est que les chiffres
'0'-'9'sont mappés de façon contiguë en ordre croissantUn utilisateur mentionne la conférence de remise du prix Turing de Ken Thompson, « Reflections on Trusting Trust », et suppose que cet article en est peut-être inspiré
Quelqu’un se demande si le compilateur clang possède la même propriété, et explique que cela est codé explicitement comme
10danslib/Lex/LiteralSupport.cppUn utilisateur se demande pourquoi il a fallu enquêter pour comprendre pourquoi
"\\n"est encodé comme10, estimant que c’était attenduIl est mentionné que cet article se lit comme à l’intersection entre programmation lettrée et poésie, et qu’il tente d’expliquer comment l’octet
0x0Aest généré à travers des centaines de cycles de génération de codeUn utilisateur explique qu’à cause du langage C, il pensait que
"\\0???"était une séquence d’échappement octale, et qu’il interprétait"\\012"comme"\\x0a"ou"0x0a", et"\\010"comme"0x08"Une question intéressante est soulevée sur ce à quoi notre code ressemblerait si ASCII ou les chaînes de caractères n’avaient pas de codes d’échappement
Un utilisateur mentionne qu’une règle de la programmation est que, lorsqu’il existe deux façons de faire, si la probabilité qu’une soit correcte et l’autre incorrecte est de 50/50, alors il est plus probable qu’on choisisse d’abord la mauvaise