Mengapa Linux menggunakan LF sebagai karakter baris baru?

87

Sejauh yang saya tahu, setiap sistem operasi memiliki cara yang berbeda untuk menandai karakter end of line (EOL). Sistem operasi komersial menggunakan carriage return untuk EOL (carriage return dan line feed pada Windows, carriage return hanya pada Mac). Linux, di sisi lain, hanya menggunakan umpan baris untuk EOL.

Mengapa Linux tidak menggunakan carriage return untuk EOL (dan hanya line feed saja)?

Bagas Sanjaya
sumber
77
Mac belum pernah menggunakan CR hanya sejak sebelum OS X ... sekarang gunakan * nix style LF, saya percaya.
B Layer
33
Saya pikir ada / telah sejumlah komersial OS Unixy: s juga.
ilkkachu
20
Dijelaskan di Wikipedia . Pada dasarnya Multics pada 60-an terakhir (yang menginspirasi Unix, yang mengilhami Linux) menambahkan beberapa level abstraksi untuk menghindari penyandian teks yang dibatasi oleh keterbatasan perangkat teletype sehingga tidak perlu menyandikan baris baru pada dua karakter (yang membuat lebih sedikit lagi merasakan 50 tahun kemudian tentu saja).
Stéphane Chazelas
74
Paragraf kedua adalah pertanyaan yang valid, tetapi paragraf pertama penuh dengan penyederhanaan yang berlebihan dan kesalahan langsung sehingga menenggelamkannya, dengan penjawab harus memperbaiki sejumlah tempat yang rapuh dan salah sebelum mereka bahkan sampai ke pertanyaan.
JdeBP
21
Apa? Linux adalah perkiraan gratis dari standar OS komersial yang disebut UNIX. Sistem yang memenuhi persyaratan UNIX menghabiskan banyak uang saat itu dan masih dilakukan sampai sekarang.
errantlinguist

Jawaban:

334

Penggunaan Windows CRLFkarena mewarisinya dari MS-DOS.

Penggunaan MS-DOS CRLFkarena terinspirasi oleh CP / M yang sudah menggunakan CRLF.

CP / M dan banyak sistem operasi dari tahun delapan puluhan dan sebelumnya digunakan CRLFkarena itu adalah cara untuk mengakhiri garis yang dicetak pada teletype (kembali ke awal baris dan lompat ke baris berikutnya, sama seperti mesin tik biasa). Ini disederhanakan mencetak file karena ada lebih sedikit atau tidak diperlukan pra-pemrosesan. Ada juga persyaratan mekanis yang mencegah satu karakter untuk dapat digunakan. Beberapa waktu mungkin diperlukan untuk memungkinkan kereta untuk kembali dan pelat untuk memutar.

Gnu / Linux menggunakan LFkarena itu adalah klon Unix . 1

Unix menggunakan karakter tunggal LF,, dari awal untuk menghemat ruang dan membakukan ke end-of-line kanonik, menggunakan dua karakter tidak efisien dan ambigu. Pilihan ini diwarisi dari Multics yang menggunakannya sedini 1964. Memori, penyimpanan, daya CPU dan bandwidth sangat jarang sehingga menghemat satu byte per baris patut dilakukan. Ketika sebuah file dicetak, driver itu mengonversi umpan baris (baris baru) ke karakter kontrol yang diperlukan oleh perangkat target.

LFlebih disukai CRkarena yang terakhir masih memiliki penggunaan khusus. Dengan memposisikan ulang karakter yang telah dicetak ke awal baris yang sama, itu memungkinkan untuk melakukan overstrike karakter yang sudah diketik.

Apel awalnya memutuskan untuk juga menggunakan satu karakter tapi untuk beberapa alasan memilih yang satu: CR. Ketika beralih ke antarmuka BSD, ia pindah ke LF.

Pilihan-pilihan ini tidak ada hubungannya dengan fakta bahwa suatu OS bersifat komersial atau tidak.

1 Ini adalah jawaban untuk pertanyaan Anda.

Jlliagre
sumber
20
Multics menggunakan Line Feed dalam perjanjian dengan ISO / IEC 646 kontemporer, yang menetapkannya sebagai cara untuk mewakili carriage return dan line feed secara bersamaan, dalam satu karakter, jika diperlukan representasi satu karakter.
JdeBP
10
Saya ragu alasan sebenarnya untuk memilih satu karakter adalah untuk menghemat ruang. Alasan sebenarnya adalah untuk menentukan karakter baris baru tunggal yang tidak tergantung pada perangkat output (terminal, dll.) Driver terminal (atau serupa) kemudian mengonversi baris baru ke urutan karakter kontrol appripriate, biasanya CR LF. Hal ini memungkinkan abstraksi yang bagus ketika memprogram dengan string: baris baru disajikan dengan tunggal \n, terlepas dari beberapa perangkat keluaran tertentu.
Johan Myréen
14
Meskipun demikian, makalah 1970 oleh Saltzer dan Ossanna ( Remote stream character stream processing dalam Multics ) cukup jelas bahwa independensi perangkat adalah alasannya.
JdeBP
3
@JdeBP Makalah ini menyatakan reduksi ke bentuk kanonik dari aliran karakter yang lewat ke dan dari terminal jarak jauh adalah subjek dari makalah ini . Mengurangi ke bentuk kanonik adalah cara untuk menghemat ruang (juga). Dinyatakan secara berbeda, menggunakan dua karakter adalah pemborosan ruang yang tidak efisien dan ambigu.
jlliagre
46
Dan teletypes mendapatkan ini dari mesin tik non-listrik. CR-LF menjelaskan tindakan mekanis yang Anda ambil saat menekan tuas di sebelah kiri Anda. Kembalikan "kereta" yang menahan pelat (penggulung) sepanjang jalan kembali ke kanan (yang menempatkan keystrike pada posisi pertama di sebelah kiri) dan memutar engkol satu putaran rotasi tinggi satu baris untuk pindah ke garis yang dapat diketik berikutnya. Ya, saya harus menunjukkan usia saya di sini.
cdkMoose
17

Artikel wikipedia pada "Newline" melacak pilihan NL sebagai terminator garis (atau pemisah) ke Multics pada tahun 1964; sayangnya artikel ini memiliki beberapa kutipan untuk sumber tetapi tidak ada alasan untuk meragukan ini benar. Ada dua manfaat yang jelas untuk pilihan ini dibandingkan CR-LF: penghematan ruang, dan independensi perangkat.

Alternatif utama, CR-LF, berasal dari kode kontrol yang digunakan untuk memindahkan kereta kertas secara fisik pada mesin teletype, di mana CR akan mengembalikan kereta ke posisi asal, dan LF akan memutar rol kertas untuk menggeser posisi cetak ke bawah. baris. Dua karakter kontrol muncul dalam kode ITA2 yang tanggal kembali ke 1924 dan yang tampaknya masih digunakan (lihat Wikipedia); rupanya ITA2 membawa mereka dari varian Murray dari kode Baudot yang berasal dari tahun 1901.

Untuk pembaca yang lebih muda perlu dicatat bahwa dalam tradisi mainframe, tidak ada karakter baris baru; bukan file adalah urutan catatan yang entah panjang tetap (sering 80 karakter, berdasarkan kartu berlubang) atau panjang variabel; catatan panjang variabel biasanya disimpan dengan jumlah karakter di awal setiap catatan. Jika Anda memiliki file mainframe yang terdiri dari urutan catatan panjang variabel yang masing-masing berisi konten biner sewenang-wenang, mengonversi ini tanpa kehilangan ke file gaya UNIX bisa menjadi konversi yang rumit.

Linux, tentu saja, hanyalah implementasi ulang Unix, dan Unix mengambil banyak keputusan desainnya dari Multics, jadi sepertinya keputusan kunci dibuat pada tahun 1964.

pengguna32929
sumber
12

Jawaban lain telah menelusuri rantai pewarisan kembali ke tahun 1960-an, dan teletype. Tapi inilah satu aspek yang tidak mereka bahas.

Pada zaman teletype, ada saat-saat ketika diinginkan untuk melakukan sesuatu yang disebut overstriking. Overstriking kadang-kadang digunakan untuk mengaburkan kata sandi, karena menghapus kata sandi itu tidak bisa dilakukan. Di lain waktu, overstriking dilakukan untuk mendapatkan simbol yang tidak ada dalam font. Misalnya, huruf O dan garis miring menghasilkan simbol baru.
Overstriking dicapai dengan memasukkan carriage return tanpa umpan baris, kadang-kadang backspace juga digunakan. Untuk alasan ini, orang-orang unix memutuskan menentang carriage return sebagai pemisah garis, dan memilih untuk umpan baris sebagai gantinya. Ini juga bekerja dengan baik untuk membaca teks yang diproduksi menggunakan konvensi CRLF. CR ditelan, dan LF menjadi pemisah.

Walter Mitty
sumber
Terima kasih atas memori yang akurat ini. Backspace dan Carriage Return (sendiri) juga digunakan pada printer untuk menghasilkan karakter yang tebal atau bergaris bawah. Dan untuk kembali ke asal-usulnya, kedua perintah ini sudah ada pada tahun 1930 untuk membuat "kereta" "kembali" ke posisi paling kiri, baik untuk menaiki kereta atau mengizinkan untuk memulai garis baru dengan bantuan "garis baru" kunci yang dibuat memutar rol satu langkah. Lihat: en.wikipedia.org/wiki/IBM_Electric_typewriter . Jadi "CR" + "LF" berkencan sebelum sejarah komputer.
dan
Mungkin juga perlu dicatat bahwa beberapa teletype mengharuskan CR diikuti oleh karakter non-cetak untuk memberikan waktu pengangkutan sepenuhnya siklus sebelum karakter pencetakan berikutnya tiba, dan tidak mendukung backspacing sama sekali, jadi mengirim LF setelah CR tidak memerlukan biaya apa pun, dan satu-satunya cara untuk mencapai pencetakan berlebih adalah melalui CR.
supercat
"Hari-hari teletype" dimulai sebelum era komputer. pada tahun 1960 banyak komputer memiliki teletype konsol untuk operator, dan bahkan lebih banyak menggunakan ASCII sebagai set karakter mereka.
Walter Mitty
7

Meskipun Anda dapat menerjemahkan pertanyaan historis menjadi pertanyaan tentang bahasa C, alasan mengapa Linux dan semua sistem POSIX-conforming atau POSIX-ish harus menggunakan LF(atau setidaknya apa pun '\n'karakter C ) karena baris baru merupakan konsekuensi dari persimpangan persyaratan C dan POSIX. Sementara C memungkinkan "file teks" dan "file biner" berbeda (pada kenyataannya file teks dapat berbasis catatan yang terdiri dari urutan catatan baris, selain hal-hal yang kurang eksotis seperti '\n'diterjemahkan ke / dari CR/ LFseperti pada DOS / Windows ), POSIX mengamanatkan bahwa mode teks dan biner berperilaku sama. Ini sebagian besar alasan alat baris perintah sukacatkuat / bermanfaat; mereka akan jauh lebih sedikit jika mereka hanya bekerja dengan biner, atau hanya dengan teks, tetapi tidak keduanya.

R ..
sumber
13
Pilihan ini sudah ada sebelum POSIX bertahun-tahun. Seperti yang disebutkan dalam jawaban jlliagre, ia kembali ke awal Unix, yang menyalinnya dari Multics.
Barmar
4
Pilihan di Linux tidak mendahului POSIX selama bertahun-tahun. Tentu saja POSIX mengkodifikasi praktik yang sudah ada, karena itu adalah alasan utama keberadaannya.
R ..
Sejauh menyangkut Linux, tidak ada pilihan nyata untuk membuat di tempat pertama. Pustaka standar Gnu yang digunakan oleh Linux sezaman dengan POSIX, dan telah menggunakan line-feed sejak awal karena alasan kompatibilitas yang jelas karena dikembangkan, diuji dan digunakan pada sistem Unix. Kernel Linux dirancang untuk menyediakan pemanggilan sistem seperti Unix ke pustaka C standar (GNU atau lainnya) dan menambahkan kerumitan yang diperlukan untuk menangani file teks yang berbeda dan file biner akan berlebihan dan merusak kompatibilitas dengan kode yang ada. Itu tidak masuk akal dari Torvalds.
jlliagre
@ jlliagre: Itu masih merupakan pilihan untuk membuat sesuatu yang kompatibel dengan praktik yang ada daripada ketidakcocokan serampangan acak. Anda hanya bisa mengatakan itu bukan pilihan dalam konteks mengasumsikan kesuksesan Linux. Banyak orang membuat mainan hobi OS penuh pilihan aneh dan mereka tidak pernah pergi ke mana pun.
R ..
@RI berarti Linux hanya sebuah kernel dan pada dasarnya diperlukan GNU untuk bekerja (awalnya tujuan Torvalds adalah agar kompatibel dengan minix bukan gnu, tetapi itu tidak membuat perbedaan di sini). Pilihan baris baru tidak terkait dengan Linux karena dibuat lama sebelum Linux ditulis. Ada banyak pilihan aneh atau kurang serampangan dalam berbagai rilis Linux, mereka tidak mencegah Linux untuk menjadi sukses. Salah satu alasannya adalah karena banyak dari pilihan ini ditinjau kembali nanti.
jlliagre