Der Ursprung von \n
- Wenn der Befehl
just foo ausgeführt wird, schreibt justfile das Byte 0x0A in eine Datei namens bar
just ist in Rust geschrieben, und der just-Parser wandelt just-String-Tokens, die Escape-Sequenzen enthalten, über eine Funktion namens cook_string in UTF-8-Strings um
Verarbeitung in Rust
rustc verarbeitet Escape-Codes in einer Funktion namens scan_escape
rustc ist in Rust geschrieben und kompiliert sich selbst; um die Bedeutung von '\n' zu verstehen, wird dies an rustc delegiert
- Frühere Versionen von
rustc waren in OCaml geschrieben, und die OCaml-Version von rustc verarbeitete Zeichen-Escapes im Lexer
Verarbeitung in OCaml
- Der OCaml-Compiler wertet
\n als \010 aus und fügt das Ergebnis ein
0x0A ist 10, daher erhält der OCaml-Compiler beim Verarbeiten von \n den Byte-Wert 0x0A
Fazit
- Wenn es in einem
justfile das Zeichen-Escape \n gibt, schreibt das just-Binary den endgültigen String einschließlich des Bytes 0x0A
- Dieses Byte
0x0A wurde von rustc eingefügt, und das geht darauf zurück, dass der OCaml-Compiler ursprünglich das Byte 0x0A in das rustc-Binary eingefügt hat
Zusammenfassung von GN⁺
- Dieser Artikel erklärt, wie das Zeichen-Escape
\n in das Byte 0x0A umgewandelt wird
- Vor dem historischen Hintergrund der Rust- und OCaml-Compiler wird der Ursprung des Bytes
0x0A nachverfolgt
- Er bietet einen interessanten Einblick darin, wie Compiler von Programmiersprachen Zeichen-Escapes verarbeiten
- Ein hilfreicher Text, um das Compiler-Verhalten von Rust und OCaml besser zu verstehen
1 Kommentare
Hacker-News-Kommentare
Ein Nutzer erwähnt, dass er diese Idee zum ersten Mal am 42. Tag des Artikels "How I wrote a self-hosting C compiler in 40 days" gelesen habe
"\\n"in String-Literalen interpretiert"\\n"selbst keine tatsächliche ASCII-Zeichencode-Information enthält, sondern vom Compiler übergeben wird, wenn er den Compiler kompiliertBei EBCDIC-Systemen müsse man berücksichtigen, dass frühe C-Compiler auf Systemen entstanden seien, die nicht ASCII verwendeten
NextLine- undLineFeed-ZeichenDie einzige Garantie des C-Standards bezüglich der Zeichenkodierung ist, dass die Ziffern
'0'-'9'fortlaufend in aufsteigender Reihenfolge abgebildet werdenEin Nutzer erwähnt Ken Thompsons Turing-Award-Vortrag "Reflections on Trusting Trust" und vermutet, dass dieser Artikel davon inspiriert wurde
Es wird gefragt, ob der clang-Compiler dieselbe Eigenschaft besitzt, und erklärt, dass dies in
lib/Lex/LiteralSupport.cppexplizit als10kodiert istEin Nutzer fragt sich, warum man überhaupt untersuchen musste, weshalb
"\\n"als10kodiert ist, da er das für erwartbar hältEs wird erwähnt, dass sich der Artikel wie ein Schnittpunkt von literarischem Programmieren und Poesie liest, und dass er zu erklären versucht, wie durch Hunderte Zyklen der Code-Erzeugung das Byte
0x0AentstehtEin Nutzer erklärt, dass er wegen der Sprache C
"\\0???"für einen oktalen Escape hielt und"\\012"als"\\x0a"oder"0x0a"sowie"\\010"als"0x08"verstandEs wird die interessante Frage aufgeworfen, wie unser Code aussehen würde, wenn ASCII oder Strings keine Escape-Codes hätten
Ein Nutzer erwähnt eine Regel des Programmierens: Wenn es zwei Möglichkeiten gibt und die Chance 50/50 steht, dass eine richtig und die andere falsch ist, liegt man anfangs meist eher falsch damit