読者です 読者をやめる 読者になる 読者になる

Murga

個人的に言いたいコト・主張・気持ち。

各 OS のデフォルト改行コードが決まった理由が知りたい

Windows は CR+LF、Mac OS9 までは CR、Mac OSX 以降や Unix・Linux 系は LF が改行コードのデフォルトだが、なぜ OS ごとにそれをデフォルトの改行コードにしたのかが知りたい。

そもそも CR (キャリッジリターン) と LF (ラインフィード) って何なんだという話は以下。

テレックスに用いられていたITA2では、「改行」の動作をCR (0x08) + LF (0x02) によって実現していた。すなわち、プリンタヘッドを新しい行の先頭に移動するという「改行」の動作を、現在行の先頭に移動するCR(キャリッジリターン→横移動)の動作と、新しい行に移動するLF(ラインフィード→縦移動)という2つの動作に分割し、それぞれ独立して制御するよう設計されていた。そのため、例えば行の途中でLFを伴わない単独のCRを送り、そのまま通常文字を出力することで、先に出力した文字に重ね書きすることや、CRを伴わない単独のLFを用いて新しい行の途中から文字を出力することも可能だった。

アプリケーションからハードウェアの詳細を隠蔽するデバイスドライバという概念がまだ発展していなかったため、アプリケーションはテレタイプ端末と直接やりとりをし、テレタイプ端末の慣習に従う必要があったためである。このシステムでは、プリンタヘッドが右端から復帰するのに1文字の時間では間に合わなかった。これがCRが先に送られた理由である。実際には、プリンタヘッドが停止するのを待つためにCR+LF+NUL(最後に「何もしない」という命令を送る)やCR+CR+LF(CRを二度送る)というシーケンスを送らなければいけないこともあった。このようなシステムが消滅してからはCR+LFのような2文字の改行コードは技術的な意味を持たないが、現在も一部のシステムで存続している。

テレタイプは初期の電子計算機に繋げられ、端末として使われた。これが、現在の改行コードの元になったのである。

CP/Mや、MS-DOS、そして現在のWindowsも、これを律義に引き継ぎ、この二組を改行コードとしてそのまま使っている。

一方、UNIXでは\nつまりニューライン(ラインフィード)LFだけになり、Mac OSではキャリッジリターンCRだけを改行コードとして採用したのである。なお、Mac OSもMac OS Xからは内部がUNIXとなり、改行コードもLFが使用されるようになった。

改行コードが二文字から構成されている理由

 改行が CR LF (CRLF) や LF CR (LFCR) のような二文字から構成されている形式の理解にはシリアルプリンタの制御を考えるとよい。シリアルプリンタとは、一文字印字できるヘッドを主に行の左から右に動かして印字していく方式であり、一行を印字するごとに用紙を次の行に進める(行送り)することでページ全体を印字していく。個人向けに発売されているインクジェットプリンタや熱転写方式 / ドットインパクト方式のプリンタなどがこれに該当することが多い。

 このヘッドを行の左端 (行頭) に戻すためのコードとして利用されるのが CR であり、また行を送るために使用されるのが LF である。つまり、CR LF と連続して送信することで、一行を印字して右端に行ってしまったヘッドを左端に戻して、さらに次の行を印字するための用紙送りをするのである。

 しかし、それならば、LF CR の順番でも結果的に同じになるのではと思うだろう。LF で用紙を送り、そして CR でヘッドを行頭に戻すので、結果的には CR LF と同じになるはずである。しかし、その方法では問題が発生することがあった。それは、LF に比べると CR の方が動作が遅いという物理的な制約があったからである。先に LF をすると、CR が完了しないうちに印字が開始されてしまうことがあったのである。

改行コードが一文字で表現されている理由

 改行が LF や CR 単独で構成されている形式の理解にはラインプリンタの制御を考えるとよい。ラインプリンタとは、一度に一行ずつ印字していく方式である。シリアルプリンタではヘッドを左右に動かすことで行を印字していたが、ラインプリンタでは行を一度に印刷するため、行中の各桁(文字)に相当する部分すべてにヘッドがあるような機構を持っている。シリアルプリンタに比べ行単位で印字する分速度が速いこともあり、汎用機などで用いられることが多かった。

 このようなプリンタの場合には、印字する単位は行であるので、どこで行が終わればよいのかがわかればよい。したがって、それを表す文字はたかだか一文字で十分である。

Mac と Linux が LF オンリーだし、Windows も Bash on Ubuntu on Windows (Windows Sybsystem For Linux) そろそろ LF だけに統一してくれないかなぁ。