Linuxが改行文字としてLFを使用するのはなぜですか?


87

私の知る限り、すべてのオペレーティングシステムには、行末(EOL)文字をマークする異なる方法があります。商用オペレーティングシステムでは、EOLにキャリッジリターンを使用します(Windowsではキャリッジリターンとラインフィード、Macではキャリッジリターンのみ)。一方、LinuxはEOLにラインフィードを使用します。

LinuxがEOLにキャリッジリターンを使用しないのはなぜですか(代わりにラインフィードのみ)。


77
MacはOS Xの前からCRのみを使用していません...今では* nixスタイルのLFを使用していると思います。
Bレイヤー

33
多くの商用Unixy OSもある/あったと思います。
イルッカチュ

20
ウィキペディアで説明。基本的に、過去60年代のMultics(Unixに影響を与え、Linuxに影響を与えた)は、ある程度の抽象化を追加して、テキストエンコードがテレタイプデバイスの制限に邪魔されないようにし、2文字で改行をエンコードする必要がなくなりました(さらに少なくなります)もちろん50年後の感覚)。
ステファンシャゼル

74
2番目の段落は有効な質問ですが、1番目の段落は単純化しすぎて完全な誤りでいっぱいであるため、回答者は質問にたどり着く前に、多くの不確かで欠陥のある施設を修正する必要があります。
JdeBP

21
何?Linuxは、UNIXと呼ばれる商用OS標準の無料の近似です。UNIX準拠のシステムには当時多額の費用がかかっていましたが、現在でもそのようになっています。
errantlinguist

回答:


334

Windowsが使用するのはCRLF、MS-DOSから継承したためです。

MS-DOSはCRLF、既にを使用していたCP / Mに触発されたために使用しCRLFます。

CP / Mおよび80年代以前の多くのオペレーティングシステムは、CRLFテレタイプで印刷された行を終了する方法であったために使用されました(通常のタイプライターのように、行の先頭に戻り、次の行にジャンプします)。これにより、前処理がほとんど必要ないか、まったく必要ないため、ファイルの印刷が簡素化されました。単一のキャラクターを使用できないようにする機械的な要件もありました。キャリッジが戻り、プラテンが回転するまでに時間がかかる場合があります

Gnu / LinuxはLFUnix クローンであるため使用します。1

Unixは、LFスペースを節約し、標準的な行末に標準化するために最初から単一の文字を使用していましたが、2文字を使用するのは非効率的であいまいでした。この選択は、1964年には早くも使用されていたMulticsから継承されました。メモリ、ストレージ、CPUパワー、および帯域幅は非常にまばらなので、1行あたり1バイトを節約する価値がありました。ファイルが印刷されると、ドライバーは改行(改行)をターゲットデバイスに必要な制御文字に変換していました。

LF好まれたCR後者は、まだ具体的な使用方法を持っていたので。印刷された文字を同じ行の先頭に再配置することにより、すでに入力された文字を上書きできました。

Appleは最初は単一の文字も使用することにしましたが、何らかの理由でもう1つの文字を選択しましたCR。BSDインターフェースに切り替えると、に移動しましたLF

これらの選択は、OSが商用であるかどうかに関係ありません。

1これはあなたの質問に対する答えです。


20
Multicsは、1文字の表現が必要な場合にキャリッジリターンとラインフィードの両方を単一の文字で表現する方法として規定した、現代のISO / IEC 646に準拠してラインフィードを使用しました。
JdeBP

10
単一のキャラクターを選択する本当の理由は、スペースを節約するためだと思います。本当の理由は、出力デバイス(端末など)に依存しない単一の改行文字を定義することでした。端末(または同様の)ドライバは、改行を適切な制御文字シーケンス(通常はCR LF)に変換します。これにより、文字列を使用したプログラミングの際に優れた抽象化が可能になります。改行は\n、特定の出力デバイスに関係なく、単一ので表示されます。
ヨハンMyréen17年

14
それにもかかわらず、SaltzerとOssannaによる1970年の論文(Multicsのリモート端末文字ストリーム処理)は、デバイスの独立性理由であったことを非常に明確にしています。
JdeBP

3
@JdeBPこのペーパーでは、リモート端末との間でやり取りされる文字ストリームの標準形式への縮小がこのペーパーの主題であると述べています。正規の形式に縮小することは、スペースを節約する方法でもありました(あまりにも)。別の言い方をすると、2文字を使用することは非効率的で曖昧なスペースの無駄遣いでした。
jlliagre

46
そして、テレタイプは非電気タイプライターからこれを得ました。CR-LFは、左側のレバーを押したときに取る機械的動作を説明しています。プラテン(ローラー)を右端まで保持する「キャリッジ」(キーストライクを左の最初の位置に置く)を返し、プラテンを1行高さ回転させて次の入力可能な行に移動します。はい、私はここで年齢を明らかに示しています。
cdkMoose

17

「改行」に関するウィキペディアの記事は、1964年のMulticsの行末記号(または区切り記号)としてのNLの選択を追跡しています。残念ながら、この記事には情報源への引用がほとんどありませんが、これが正しいことを疑う理由はありません。この選択には、CR-LFよりも2つの明らかな利点があります。スペースの節約とデバイスの独立性です。

主な代替案であるCR-LFは、テレタイプマシンで用紙キャリッジを物理的に移動するために使用される制御コードに由来します。CRはキャリッジをホームポジションに戻し、LFは用紙ローラーを回転させて印刷位置を1つ下に移動します。ライン。ITA2コードには2つの制御文字が表示されますが、これらは1924年に遡り、現在も使用されているようです(Wikipediaを参照)。明らかにITA2は、1901年に遡るBaudotコードのマレー版からそれらを取り出しました。

若い読者にとっては、メインフレームの伝統には改行文字がなかったことに注目する価値があります。むしろ、ファイルは、固定長(パンチカードに基づいて80文字が多い)または可変長のレコードのシーケンスでした。可変長レコードは通常、各レコードの先頭に文字カウントで保存されていました。それぞれが任意のバイナリコンテンツを含む一連の可変長レコードで構成されるメインフレームファイルがある場合、これをUNIXスタイルのファイルに無損失に変換するのは難しい変換になる可能性があります。

もちろん、LinuxはUnixの再実装に過ぎず、UnixはMulticsから多くの設計上の決定を下したため、1964年に重要な決定が下されたようです。


12

他の答えは、1960年代までの継承チェーンとテレタイプをたどりました。しかし、ここに彼らがカバーしなかった一つの側面があります。

テレタイプの時代には、オーバーストライクと呼ばれることをすることが望ましい場合がありました。パスワードを消去することは不可能であるため、パスワードをあいまいにするために重ね打ちが使用されることがありました。また、フォントにない記号を取得するために、重ね打ちが行われました。たとえば、文字Oとスラッシュは新しいシンボルを生成します。
バックスペースを使用することもありましたが、改行なしでキャリッジリターンを入力することで、オーバーストライクが達成されました。このため、Unixの人々は改行を改行として無効にし、代わりに改行を選択しました。これは、CRLF規則を使用して作成されたテキストを読む場合にもうまく機能しました。CRが飲み込まれ、LFがセパレータになります。


この正確な記憶をありがとう。BackspaceおよびCarriage Return(単独)も、太字または下線付き文字を生成するためにプリンタで使用されました。そして起源に戻ると、これらの2つのコマンドは1930年にすでに存在しており、「キャリッジ」を左端の位置に「戻し」、「打ち消す」か「新しい行」の助けを借りて新しい行の開始を許可します。ローラーを1ステップ回転させたキー。参照:en.wikipedia.org/wiki/IBM_Electric_typewriterを。そのため、「CR」+「LF」はコンピューター履歴の前に付きます。
ダン

また、一部のテレタイプでは、CRの後に非印刷文字が続き、次の印刷文字が到着する前に完全に循環するキャリッジ時間を与える必要があり、バックスペースをまったくサポートしていないため、CRの後にLFを送信することも注目に値するかもしれません費用は一切かかりませんでした。また、オーバープリントを達成する唯一の方法はCR経由でした。
supercat

「テレタイプの時代」はコンピューター時代の前に始まります。1960年代には、多くのコンピューターにオペレーター用のコンソールテレタイプがあり、さらに多くのコンピューターがASCIIを文字セットとして使用していました。
ウォルターミッティ

7

歴史的な質問をC言語に関する質問に翻訳することはできますが、改行とLinuxのすべてのPOSIX準拠システムまたはPOSIX準拠システムLF(または少なくともC '\n'文字が何であれ)使用しなければならない理由は、交差の結果ですCおよびPOSIXの要件の。Cは、「テキストファイル」と「バイナリファイル」を可能にしながら、異なること(実際にはテキストファイルがレコード・ベースのほかに、行レコードの配列からなることができるようにそれほど珍しいものを有することに'\n'翻訳へ/からCR/ LFDOS / Windows上のように)、POSIXは、テキストモードとバイナリモードが同じように動作することを義務付けています。これが主な理由は、コマンドラインツールがcat強力で便利です。バイナリのみ、またはテキストのみで機能し、両方ではない場合は、はるかに少なくなります。


13
この選択は、POSIXよりも何年も前のものです。jlliagreの答えで述べたように、それはUnixの始まりに戻り、Multicsからコピーされました。
バーマー

4
Linuxでの選択は、 POSIXよりも何年も前のものではありません。もちろん、POSIXは既存の慣行を成文化しました。それが存在する全体の理由だからです。
R ..

Linuxに関する限り、そもそも実際に選択することはできませんでした。Linuxで使用されるGnu標準ライブラリはPOSIXに現代的であり、Unixシステムで開発、テスト、および使用されたため、互換性の理由から明白な理由から改行を使用していました。Linuxカーネルは、Unixのようなシステムコールを標準Cライブラリ(GNUまたはその他)に提供するように設計されており、異なるテキストファイルとバイナリファイルを処理するために必要な複雑さを追加すると、既存のコードとの互換性が過剰になり、壊れてしまいます。それはトーバルズからは無意味だっただろう。
jlliagre

@jlliagre:ランダムな無償の非互換性ではなく、既存の慣行と互換性のあるものにすることは依然として選択でした。Linuxの成功を前提とする文脈では、これは選択肢ではなかったとしか言えません。たくさんの人がおもちゃの愛好家のOSを不思議な奇抜な選択肢でいっぱいにし、どこにも行きません。
R ..

@RIは、Linuxはカーネルにすぎず、GNUが動作するために本質的に必要であることを意味します(最初はTorvaldsの目標はgnuではなくminixと互換性を持つことでしたが、ここでは違いはありません)。改行の選択は、Linuxが書かれるかなり前に行われたため、Linuxとは無関係です。さまざまなLinuxリリースには、多かれ少なかれ無償の奇抜な選択がありますが、Linuxの成功を妨げるものではありませんでした。これらの選択の多くが後で再考されたという可能性が高い理由の1つです。
jlliagre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.