はじめに
改行コードは,テキストの改行を表す制御文字・もしくは制御文字列のことを指します. 現在,改行コードとしては CR と LF の2つが,改行を表現するのに使われています. 文字列を扱うプログラムを書く人ならピンとくると思いますが,改行コード問題は複数のOSにまたがって作業をしている際に頭の痛い問題です. 今日は「どうしてこうなった」と言いたくなる改行コードの歴史的背景について触れます.
諸説あるようですが,調べた範囲での話で書いていきます. といっても知ってた内容はほとんどウェブ上から仕入れたものなので,完全に受け売りです…
前提知識
- 改行コードとはなにか知っている
効能
- 明日から使えるトリビア
CR, LF と CR+LF
CR, LF の意味を見ていきましょう.
- CR (Carriage Return) : 行の先頭へ戻る
- LF (Line Feed) : 行を送る
「早送りと巻き戻しが子どもたちに通じない」と嘆くおじさんたちがいますが,「行送り」も同様の理由で嘆くべき対象かもしれません. そうです,これらの名前と機能はタイプライター,もっと正確に言うとテレタイプの仕組みから来ています.
テレタイプの動きがよく分かる動画があったので張っておきます.
ブラウン管ディスプレイが登場するまでは,こうしたテレタイプライターをキーボードかつディスプレイのようにして使用していたのです.
こうした名残から,UNIX 系の OS で通信端末を表す tty
という文字列は,このテレタイプ(teletype) から取られています.閑話休題.
改行するところで,行頭に戻る(CR)と同時に紙を上に送る(LF)動作をしているのがわかると思います. この2つの動作をする文字を1つ決めてしまえば,今更混乱することもなかったと考える方も多いと思います. しかし,行末から行頭に戻る動作にはかなり時間がかかります.この間につぎの文字のデータが届いてしまったら変な位置で文字が印字されてしまいますね. そこで,このいやーな現実を隠すために,まずはじめに行頭に戻る動作を指令しておいて,その間に紙を送ることでヘッドが行頭に戻るまでの時間稼ぎをしていたというわけです.
当時のコンピュータにはデバイスドライバという概念がまだ乏しかったため,各ハードウェアに対して直接通信をしてプログラムを動かす必要がありました. 一方で,1964年から開発がはじまった Multics という OS では,このようなハードウェア依存性の高い部分をソフトウェアから切り離して考えられるようにデバイスドライバの概念を導入しています. その理由から,Multics では CR+LF ではなく LF のみを改行コードとして扱うことにし,デバイスドライバ側で必要に応じて CR+LF に変換をして通信をする仕組みになっています. CR はテレタイプ上で上書きすることによる太字や取り消し線の描画等に使う文字として残されました. UNIX は Multics の流れを引いているため,当初から LF のみを改行コードとして採用しています.
現在の状況ですが,Microsoft Windows は,MS-DOS 時代から頑なに CR+LF という2文字の文字列を 互換性の理由で 改行コードとして扱い続けています. Macintosh (Mac OS 9以前) では改行コードには CR が使用されていましたが, OS X では LF を使用するように変更されています.
まとめ
- Windows はアレ
参考
- Newline - Wikipedia, the free encyclopedia
- The Great Newline Schism
- ラインエディタ(line editor)にはテレタイプ(teletype)端末が相応しい: こぴーのーと
補足
- テレタイプ自体はコンピュータの端末用というよりは,電話線を繋いで電信をするためのものでした.そういうわけで,電話線越しにコンピュータと対話しているような形になるわけです.
- 動画に “UNIX System V” という文字列が出てきますね.sysv というのは今でも残っている名称ですね.
- Vim のご先祖様であるラインエディタの ex は,このあたりの時代からあるはずです.