Чому Linux використовує LF як символ нового рядка?


87

Наскільки мені відомо, кожна операційна система має різний спосіб позначити символ кінця рядка (EOL). Комерційні операційні системи використовують повернення каретки для EOL (повернення та передача рядків у Windows, повернення каретки лише на Mac). Linux, з іншого боку, просто використовує канали ліній для EOL.

Чому Linux не використовує повернення каретки для EOL (а виключно лінійну стрічку)?


77
Маки не використовували CR лише з моменту початку X X ... зараз я використовую * nix style LF.
B Layer

33
Я думаю, що є / були і деякі комерційні ОС Unixy: також.
ilkkachu

20
Пояснено у Вікіпедії . В основному, мультимедіа останніх 60-х років (що надихнуло Unix, що надихнуло Linux) додало певного рівня абстракції, щоб уникнути обмеження кодування тексту обмеженнями телетипних пристроїв, тому йому не довелося кодувати новий рядок двома символами (що робить ще менше сенс через 50 років звичайно).
Стефан Шазелас

74
Другий абзац є вагомим питанням, але перший абзац настільки сповнений надмірних спрощень та відвертих помилок, що його заглушають, і відповідачі повинні виправити цілу купу нерівних та несправних приміщень, перш ніж вони навіть прийдуть до питання.
JdeBP

21
Що? Linux - це безкоштовне наближення комерційного стандарту ОС під назвою UNIX. Системи, сумісні з UNIX, тоді коштували чималих грошей, і вони існують і сьогодні.
блудниця

Відповіді:


334

Windows використовує, CRLFтому що він успадкував його від MS-DOS.

MS-DOS використовує, CRLFтому що він був натхненний CP / M, який вже використовувався CRLF.

CP / M та багато операційних систем з вісімдесятих і раніше використовувались, CRLFоскільки це був спосіб закінчити рядок, надрукований на телетип (повернутися до початку рядка та перейти до наступного рядка, як і звичайні друкарські машинки). Це спростило друк файлу, оскільки попередня обробка була меншою або взагалі не потрібна. Існували також механічні вимоги, які перешкоджали застосуванню одного символу. Може знадобитися деякий час, щоб дозволити повернути вагон і повернути валик.

Gnu / Linux використовує, LFтому що це клон Unix . 1

Unix використовував один символ, LFвід початку для економії місця та стандартизації до канонічного кінця рядка, використовуючи два символи було неефективним та неоднозначним. Цей вибір був успадкований від Multics, який використовував його ще в 1964 році. Пам'ять, накопичувач, потужність процесора та пропускну здатність були дуже рідкісними, тому для економії одного байта на рядок варто було зробити. Коли файл було надруковано, драйвер перетворював стрічку (новий рядок) на контрольні символи, необхідні цільовому пристрою.

LFбуло віддано перевагу CRтому, що останні все ще мали специфічне використання. Перестановивши надрукований символ на початок того ж рядка, це дозволило перекреслити вже введені символи.

Apple , спочатку вирішили використовувати один символ , але з якихось - то причин вибрав іншу: CR. Коли він перейшов на інтерфейс BSD, він перейшов до LF.

Цей вибір не має нічого спільного з тим, чи є ОС комерційною чи ні.

1 Це відповідь на ваше запитання.


20
Мультимедіа використовували лінію подачі лінійки відповідно до сучасного ISO / IEC 646, який прописав його як спосіб представити як повернення вагона, так і подачу ліній разом, в одному символі, якщо потрібно однозначне представлення.
JdeBP

10
Я сумніваюся, що справжньою причиною вибору одного персонажа було економія місця. Справжня причина полягала в тому, щоб визначити єдиний символ нового рядка, який не залежить від пристрою виводу (термінал тощо). Драйвер терміналу (або подібного) потім дбає про перетворення нової лінії у відповідну послідовність символів управління, як правило, CR LF. Це дозволяє приємно абстрагуватися при програмуванні з рядками: новий рядок представлений єдиним \n, незалежно від якогось конкретного пристрою виведення.
Йохан Мірен

14
Тим не менш, в документі Saltzer and Ossanna ( віддалена обробка потоків символів терміналу в Multics ) 1970 року цілком зрозуміло, що причиною цього стала незалежність пристрою .
JdeBP

3
@JdeBP У цьому документі йдеться про зменшення до канонічної форми потоку символів, що передаються на віддалені термінали та з них, і є предметом даної роботи . Зведення до канонічної форми було також способом економії місця (теж). Висловлене по-різному, використання двох символів було неефективною і неоднозначною тратою місця.
jlliagre

46
І телетайпи отримали це від неелектричних машинок. CR-LF описує механічну дію, яку ви здійснюєте, коли натискаєте на важіль зліва. Поверніть «візок», який утримує валик (валик) всю дорогу назад праворуч (що ставить натискання клавіші на перше положення ліворуч) і закрутіть валик повороту на одну лінію, щоб перейти до наступної друкарської лінії. Так, я зізнаюся, тут показую свій вік.
cdkMoose

17

У статті Вікіпедії про "Newline" простежується вибір NL в якості термінатора (або роздільника) для Multics у 1964 році; на жаль, у статті є мало цитат до джерел, але немає підстав сумніватися, що це правильно. У порівнянні з CR-LF є два очевидних переваги: ​​економія місця та незалежність пристрою.

Основна альтернатива, CR-LF, бере початок у контрольних кодах, які використовуються для фізичного переміщення каретки паперу на телемашині, де CR повертає каретку у вихідне положення, а LF повертає валик для паперу для переміщення положення друку вниз рядок. Два контрольних символи відображаються в коді ITA2, який починається з 1924 року і який, мабуть, досі використовується (див. Вікіпедія); Мабуть, ITA2 взяв їх із варіанту Мюррея коду Бодо, який датується 1901 роком.

Для молодших читачів варто зазначити, що в традиції мейнфрейму не було нової символіки; скоріше файл - це послідовність записів, які мали або фіксовану довжину (часто 80 символів на основі перфокарт), або змінну довжину; Записи змінної довжини, як правило, зберігаються з числом символів на початку кожного запису. Якщо у вас є файл мейнфрейму, що складається з послідовності записів змінної довжини, кожна з яких містить довільний бінарний вміст, перетворення цього збитку у файл у стилі UNIX може бути складним перетворенням.

Linux, звичайно, була лише повторною реалізацією Unix, і Unix прийняла багато своїх дизайнерських рішень від Multics, тому, схоже, ключове рішення було прийнято в 1964 році.


12

Інші відповіді простежують спадковий ланцюг ще до 1960-х років та телетипи. Але ось один аспект вони не висвітлювали.

У часи телетипів були випадки, коли бажано було робити щось, що називалося перенапруженням. Завищення пароля іноді використовувалося для затемнення пароля, оскільки видалення пароля було просто недоцільним. В інший час було зроблено завищення, щоб отримати символ, який не був у шрифті. Наприклад, літера O і косою рисою створюють новий символ.
Перевищення швидкості було досягнуто шляхом введення повернення на вагон без подачі ліній, іноді використовувався складний простір. З цієї причини люди Unix вирішили проти повернення перевезення як роздільника лінії, а замість цього вибрали подачу лінії. Це також добре спрацювало з читанням текстів, створених на основі конвенції CRLF. КР ковтає, а НЧ стає сепаратором.


Дякую за цю точну пам’ять. На принтері також використовувалися зворотний простір та повернення каретки (окремо) для отримання жирних або підкреслених символів. І щоб повернутися до витоків, ці дві команди вже існували в 1930-х роках, щоб змусити "вагон" повернутися "в крайнє ліве положення, або переступити, або дозволити розпочати новий рядок за допомогою" нового рядка " клавіша, яка змусила обертати ролик на один крок. Дивіться: en.wikipedia.org/wiki/IBM_Electric_typewriter . Тож "CR" + "LF" датуються перед історією комп'ютерів.
дан

Можливо, варто також відзначити, що деякі телетипні файли вимагають, щоб на КР дотримувався недрукувальний символ, щоб дати часу перевезення повністю циклічно, перш ніж з'явиться наступний друкований символ, і взагалі не підтримує зворотний проміжок, тому надсилаючи LF після CR нічого не коштувало, і єдиний спосіб досягти надрукування - це через CR.
supercat

"Дні телетипів" починаються ще до епохи комп'ютера. у 1960-х роках багато комп'ютерів мали консольний телетайп для оператора, а ще більше використовували ASCII як набір символів.
Вальтер Мітті

7

Хоча ви могли перевести історичне запитання у питання про мову С, причина, по якій Linux та всі системи, що відповідають POSIX або POSIX-ish, повинні використовувати LF(або хоча б те, що '\n'є символом C ), оскільки новий рядок є наслідком перетину вимог C та POSIX. Хоча C дозволяє "текстові файли" та "бінарні файли" відрізнятися (адже текстові файли можуть бути засновані на записі, що складається з послідовності записів рядків, крім менш екзотичних речей, таких як '\n'переклад на / з CR/ LFяк у DOS / Windows ), POSIX передбачає, що текстовий та двійковий режим поводяться однаково. Це багато в чому причина, що інструменти командного рядка люблятьcatпотужні / корисні; їх було б набагато менше, тому якби вони працювали лише з двійковим або лише з текстом, але не з обома.


13
Цей вибір передував POSIX протягом багатьох років. Як згадується у відповіді jlliagre, вона сходить до початку Unix, який скопіював її з Multics.
Вармар

4
Вибір у Linux не передував POSIX протягом багатьох років. Звичайно, POSIX кодифікував те, що вже було існуючою практикою, оскільки це була вся його причина для існування.
R ..

Що стосується Linux, то реального вибору зробити в першу чергу не було. Стандартна бібліотека Gnu, яка використовується Linux, є сучасною для POSIX, і використовувала лінійну стрічку з моменту її створення з очевидних причин сумісності, оскільки вона була розроблена, протестована та використана в системах Unix. Ядро Linux було розроблено для надання системних дзвінків, подібних Unix, до стандартної бібліотеки C (GNU або ін.), І додавання складності, необхідної для обробки текстових файлів та бінарних файлів, було б надмірним і порушувало сумісність із існуючим кодом. Це було б безглуздо від Торвальда.
jlliagre

@jlliagre: Це все ж був вибір зробити щось сумісне з існуючою практикою, а не випадкові безперешкодні несумісності. Ви можете лише сказати, що це не був вибір у контексті сприйняття успіху Linux. Дуже багато людей роблять іграшків для любителів іграшок повними безсумнівно хитрих виборів, і вони нікуди не йдуть.
Р ..

@RI означає, що Linux - це лише ядро, і він, по суті, вимагав GNU для роботи (спочатку метою Torvalds було сумісність з minix замість gnu, але це не має ніякого значення). Вибір нового рядка не пов'язаний з Linux, оскільки він був зроблений задовго до написання Linux. У різних випусках Linux було багато більш-менш безтурботних вибагливих виборів, вони не завадили досягти успіху в Linux. Однією з причин, можливо, було те, що багато хто з цих виборів були переглянуті пізніше.
jlliagre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.