เหตุใด Linux จึงใช้ LF เป็นอักขระขึ้นบรรทัดใหม่


87

เท่าที่ฉันรู้ทุกระบบปฏิบัติการมีวิธีที่แตกต่างในการทำเครื่องหมายจุดสิ้นสุดของบรรทัด (EOL) ระบบปฏิบัติการเชิงพาณิชย์ใช้ carriage return สำหรับ EOL (carriage return และ line feed บน Windows, carriage return บน Mac เท่านั้น) ในทางตรงกันข้าม Linux เพียงใช้ line feed สำหรับ EOL

เหตุใด Linux จึงไม่ใช้ carriage return สำหรับ EOL (และเป็นตัวป้อนบรรทัดเท่านั้น)


77
Macs ไม่ได้ใช้ CR เฉพาะก่อนหน้า OS X ... ตอนนี้ใช้ * nix style LF ฉันเชื่อ
B Layer

33
ฉันคิดว่ามี / เคยใช้ระบบปฏิบัติการ Unixy จำนวนมากเช่นกัน
ilkkachu

20
อธิบายเกี่ยวกับวิกิพีเดีย โดยทั่วไป Multics ในช่วง 60 ปีที่ผ่านมา (ซึ่งเป็นแรงบันดาลใจให้กับ Unix ซึ่งเป็นแรงบันดาลใจให้กับ Linux) ได้เพิ่มระดับของ abstraction เพื่อหลีกเลี่ยงการเข้ารหัสข้อความที่ถูกกีดกันโดยข้อ จำกัด ของอุปกรณ์โทรพิมพ์จึงไม่จำเป็นต้องเข้ารหัสบรรทัดใหม่บนอักขระสองตัว แน่นอนในอีก 50 ปีต่อมา)
Stéphane Chazelas

74
ย่อหน้าที่สองเป็นคำถามที่ถูกต้อง แต่ย่อหน้าแรกนั้นเต็มไปด้วยความผิดพลาดที่เกินจริงและข้อผิดพลาดแบบทันทีที่ผู้จมน้ำต้องตอบโดยผู้ตอบคำถามต้องแก้ไขสถานที่ที่ผิดและผิดทั้งหมดก่อนที่จะถึงคำถาม
JdeBP

21
อะไร? ลินุกซ์เป็นค่าประมาณของมาตรฐานระบบปฏิบัติการเชิงพาณิชย์ที่เรียกว่า UNIX ระบบที่สอดคล้องกับ UNIX นั้นใช้เงินจำนวนมากในตอนนั้นและพวกเขายังคงทำอยู่ในปัจจุบัน
เดินทางที่หลงผิดใน

คำตอบ:


334

Windows ใช้CRLFเพราะสืบทอดมาจาก MS-DOS

MS-DOS ใช้CRLFเพราะมันเป็นแรงบันดาลใจจาก CP / M CRLFซึ่งใช้อยู่แล้ว

CP / M และระบบปฏิบัติการจำนวนมากจากแปดสิบและใช้ก่อนหน้านี้CRLFเพราะมันเป็นวิธีที่จะจบบรรทัดที่พิมพ์บนโทรพิมพ์ (กลับไปที่จุดเริ่มต้นของบรรทัดและข้ามไปที่บรรทัดถัดไปเช่นเดียวกับเครื่องพิมพ์ดีดปกติ) ทำให้การพิมพ์ไฟล์ง่ายขึ้นเพราะมีการประมวลผลล่วงหน้าน้อยลงหรือไม่จำเป็นต้องใช้ นอกจากนี้ยังมีข้อกำหนดทางกลที่ป้องกันไม่ให้อักขระตัวเดียวใช้งานได้ อาจต้องใช้เวลาสักครู่เพื่อให้แคร่พิมพ์กลับและแผ่นหมุน

GNU / Linux ใช้LFเพราะมันเป็นระบบปฏิบัติการยูนิกซ์โคลน 1

Unix ใช้อักขระเดียวLFตั้งแต่ต้นเพื่อประหยัดพื้นที่และสร้างมาตรฐานให้กับจุดสิ้นสุดของบรรทัดมาตรฐานซึ่งการใช้อักขระสองตัวนั้นไม่มีประสิทธิภาพและไม่ชัดเจน ตัวเลือกนี้ได้รับการสืบทอดมาจาก Multics ซึ่งใช้งานตั้งแต่ต้นปีพ. ศ. 2507 หน่วยความจำที่เก็บข้อมูลพลังงานซีพียูและแบนด์วิดธ์น้อยมากดังนั้นการประหยัดหนึ่งไบต์ต่อบรรทัดถือว่าคุ้มค่า เมื่อไฟล์ถูกพิมพ์ไดรเวอร์จะแปลงบรรทัดฟีด (ขึ้นบรรทัดใหม่) เป็นอักขระควบคุมที่อุปกรณ์เป้าหมายต้องการ

LFเป็นที่ต้องการCRเนื่องจากหลังยังคงมีการใช้งานเฉพาะ โดยการจัดตำแหน่งอักขระที่พิมพ์ไปยังจุดเริ่มต้นของบรรทัดเดียวกันจะอนุญาตให้เขียนทับอักขระที่พิมพ์แล้ว

แอปเปิ้ลในตอนแรกตัดสินใจที่จะยังใช้ตัวอักษรตัวเดียว แต่ด้วยเหตุผลบางเลือกหนึ่งที่อื่น ๆCR: เมื่อมันเปลี่ยนไปอินเตอร์เฟซ BSD LFก็ย้ายไป

ตัวเลือกเหล่านี้ไม่มีส่วนเกี่ยวข้องกับความจริงที่ว่า OS เป็นระบบเชิงพาณิชย์หรือไม่

1นี่คือคำตอบสำหรับคำถามของคุณ


20
Multics ใช้ Line Feed สอดคล้องกับ ISO / IEC 646 ร่วมสมัยซึ่งกำหนดไว้ว่าเป็นวิธีในการแสดงทั้งการขึ้นบรรทัดใหม่และการป้อนบรรทัดเข้าด้วยกันในอักขระเดียวหากต้องการการแสดงอักขระหนึ่งตัว
JdeBP

10
ฉันสงสัยว่าเหตุผลที่แท้จริงสำหรับการเลือกตัวละครเดียวคือเพื่อประหยัดพื้นที่ เหตุผลที่แท้จริงคือการกำหนดอักขระขึ้นบรรทัดใหม่เดียวที่ไม่ขึ้นกับอุปกรณ์เอาต์พุต (เทอร์มินัล ฯลฯ ) ไดรเวอร์เทอร์มินัล (หรือที่คล้ายกัน) จะดูแลการแปลงบรรทัดใหม่ให้เป็นลำดับอักขระควบคุมโดยทั่วไป CR LF สิ่งนี้จะช่วยให้การนามธรรมที่ดีเมื่อการเขียนโปรแกรมด้วยสตริง: ขึ้นบรรทัดใหม่จะถูกนำเสนอด้วยหนึ่งเดียว\nเป็นอิสระจากอุปกรณ์ส่งออกบางอย่าง
Johan Myréen

14
อย่างไรก็ตามกระดาษ 1970 โดย Saltzer และ Ossanna ( การประมวลผลสตรีมเทอร์มินัลระยะไกลใน Multics ) ค่อนข้างชัดเจนว่าความเป็นอิสระของอุปกรณ์เป็นเหตุผล
JdeBP

3
@JdeBP กระดาษนี้ระบุการลดลงในรูปแบบที่ยอมรับของกระแสของตัวละครที่ส่งผ่านไปยังและจากขั้วระยะไกลเป็นเรื่องของบทความนี้ การลดรูปแบบมาตรฐานเป็นวิธีการประหยัดพื้นที่ (เช่นกัน) การแสดงออกที่แตกต่างกันการใช้อักขระสองตัวคือการสูญเสียพื้นที่ที่ไม่มีประสิทธิภาพและไม่ชัดเจน
jlliagre

46
และโทรพิมพ์ได้รับสิ่งนี้จากเครื่องพิมพ์ดีดที่ไม่ใช่ไฟฟ้า CR-LF อธิบายถึงการกระทำเชิงกลที่คุณทำเมื่อคุณกดคันโยกทางด้านซ้าย ส่งคืน "carriage" ซึ่งถือแท่นวาง (ลูกกลิ้ง) ตลอดทางกลับไปทางขวา (ซึ่งวาง keystrike ที่ตำแหน่งแรกทางซ้าย) และเหวี่ยงแท่นหมุนความสูงหนึ่งบรรทัดเพื่อเลื่อนไปยังบรรทัดที่พิมพ์ได้ถัดไป ใช่ฉันยอมรับการแสดงอายุของฉันที่นี่
cdk เลิก

17

บทความวิกิพีเดียเกี่ยวกับ "Newline" ติดตามการเลือก NL เป็นตัวต่อบรรทัด (หรือตัวคั่น) กับ Multics ในปี 1964; โชคไม่ดีที่บทความมีแหล่งอ้างอิงจำนวนน้อย แต่ไม่มีเหตุผลที่จะสงสัยว่าสิ่งนี้ถูกต้อง มีประโยชน์ที่ชัดเจนสองประการสำหรับตัวเลือกนี้ผ่าน CR-LF: การประหยัดพื้นที่และความเป็นอิสระของอุปกรณ์

ทางเลือกหลักคือ CR-LF มาในรหัสควบคุมที่ใช้ในการเคลื่อนย้ายแคร่กระดาษบนเครื่องโทรพิมพ์โดยที่ CR จะคืนค่าการขนส่งกลับไปที่ตำแหน่งเดิมและ LF จะหมุนลูกกลิ้งกระดาษเพื่อย้ายตำแหน่งการพิมพ์ลงหนึ่ง เส้น อักขระควบคุมสองตัวปรากฏขึ้นในรหัส ITA2 ซึ่งมีอายุย้อนไปถึงปี 1924 และดูเหมือนว่ายังใช้งานอยู่ (ดู Wikipedia) เห็นได้ชัดว่า ITA2 นำพวกเขามาจากตัวแปร Murray ของรหัส Baudot ซึ่งวันที่ถึง 1901

สำหรับผู้อ่านที่อายุน้อยกว่ามันเป็นที่น่าสังเกตว่าในประเพณีเมนเฟรมไม่มีตัวละครขึ้นบรรทัดใหม่ ค่อนข้างไฟล์เป็นลำดับของบันทึกที่มีความยาวคงที่ (มักจะ 80 ตัวอักษรขึ้นอยู่กับบัตร punched) หรือความยาวตัวแปร; โดยทั่วไปแล้วบันทึกความยาวแปรผันจะถูกจัดเก็บด้วยการนับจำนวนอักขระที่จุดเริ่มต้นของแต่ละระเบียน หากคุณมีไฟล์เมนเฟรมประกอบไปด้วยลำดับของความยาวผันแปรที่บันทึกแต่ละไฟล์ที่มีเนื้อหาไบนารีโดยพลการการแปลงไฟล์ lossless นี้ให้เป็นไฟล์สไตล์ UNIX อาจเป็นการแปลงที่ยุ่งยาก

แน่นอนว่า Linux เป็นเพียงการนำระบบปฏิบัติการ Unix กลับมาใช้ใหม่และ Unix ได้ตัดสินใจในการออกแบบจาก Multics เป็นจำนวนมากดังนั้นจึงดูเหมือนว่าการตัดสินใจครั้งสำคัญเกิดขึ้นในปี 2507


12

คำตอบอื่น ๆ ได้สืบสายโซ่การถ่ายทอดทางพันธุกรรมย้อนกลับไปในทศวรรษ 1960 และโทรพิมพ์ แต่นี่คือแง่มุมหนึ่งที่ไม่ครอบคลุม

ในยุคของโทรพิมพ์มีหลายครั้งที่มันเป็นที่พึงปรารถนาที่จะทำอะไรบางอย่างที่เรียกว่า overstriking การทำ Overstriking บางครั้งใช้เพื่อบดบังรหัสผ่านเนื่องจากการลบรหัสผ่านนั้นไม่สามารถทำได้ ในบางครั้งการเขียนทับจะทำเพื่อให้ได้สัญลักษณ์ที่ไม่ได้อยู่ในแบบอักษร ตัวอย่างเช่นตัวอักษร O และเครื่องหมายทับจะสร้างสัญลักษณ์ใหม่
Overstriking ได้รับผลกระทบจากการใส่ค่าขนส่งคืนโดยไม่มีการป้อนบรรทัดบางครั้งใช้แบ็คสเปซ athough ด้วยเหตุผลนี้คนยูนิกซ์จึงตัดสินใจปฏิเสธการขึ้นบรรทัดใหม่เป็นตัวแยกบรรทัดและเลือกใช้การป้อนบรรทัดแทน นอกจากนี้ยังทำงานได้ดีสำหรับการอ่านข้อความที่ผลิตโดยใช้แบบแผน CRLF CR กลืนกินและ LF กลายเป็นตัวแยก


ขอบคุณสำหรับความจำที่แม่นยำนี้ Backspace และ Carriage Return (เพียงอย่างเดียว) ก็ถูกใช้บนเครื่องพิมพ์เพื่อสร้างตัวหนาหรือขีดเส้นใต้ และเพื่อกลับไปที่ต้นกำเนิดคำสั่งสองคำสั่งเหล่านี้มีอยู่แล้วในปี 1930 เพื่อสร้าง "carriage" "return" ให้อยู่ในตำแหน่งซ้ายสุดไม่ว่าจะ overstrike หรืออนุญาตให้เริ่มต้นบรรทัดใหม่ด้วยความช่วยเหลือของ "new line" กุญแจซึ่งทำให้หมุนลูกกลิ้งหนึ่งขั้นตอน ดู: en.wikipedia.org/wiki/IBM_Electric_typewriter ดังนั้น "CR" + "LF" กำลังออกเดทก่อนประวัติคอมพิวเตอร์
แดน

มันอาจจะเป็นที่น่าสังเกตว่า teletypes บางตัวต้องการให้ CR ตามด้วยอักขระที่ไม่ใช่การพิมพ์เพื่อให้เวลา carriage ครบวงจรก่อนที่อักขระการพิมพ์ต่อไปจะมาถึงและไม่รองรับ backspacing เลยดังนั้นการส่ง LF หลังจาก CR ไม่ต้องเสียค่าใช้จ่ายใด ๆ และวิธีเดียวที่จะทำให้การ overprinting สำเร็จผ่านทาง CR
supercat

"วันแห่งการโทรพิมพ์" เริ่มขึ้นก่อนยุคคอมพิวเตอร์ ในปี 1960 คอมพิวเตอร์หลายเครื่องมีคอนโซลโทรพิมพ์สำหรับผู้ให้บริการและยิ่งใช้ ASCII เป็นชุดอักขระ
วอลเตอร์ Mitty

7

ในขณะที่คุณสามารถแปลคำถามในอดีตเป็นคำถามเกี่ยวกับภาษา C เหตุผลที่ Linux และ POSIX-conforming หรือระบบ POSIX-ish ทั้งหมดต้องใช้LF(หรืออย่างน้อย'\n'อักขระC ) เนื่องจาก newline เป็นผลมาจากการแยก ของความต้องการของ C และ POSIX ในขณะที่ C อนุญาตให้ "ไฟล์ข้อความ" และ "ไฟล์ไบนารี" แตกต่างกัน (ในความเป็นจริงไฟล์ข้อความสามารถบันทึกตามประกอบด้วยลำดับของเร็กคอร์ดบรรทัดนอกเหนือจากสิ่งแปลกใหม่เช่นการ'\n'แปล / จากCR/ LFชอบบน DOS / Windows ) POSIX สั่งให้ข้อความและโหมดไบนารีทำงานเหมือนกัน นี่คือเหตุผลส่วนใหญ่ที่เครื่องมือบรรทัดคำสั่งชอบcatมีพลัง / มีประโยชน์ พวกเขาจะน้อยกว่ามากดังนั้นหากพวกเขาทำงานกับไบนารีหรือเฉพาะกับข้อความ แต่ไม่ใช่ทั้งสองอย่าง


13
ตัวเลือกนี้ถือ POSIX มาหลายปีแล้ว ดังที่ได้กล่าวไว้ในคำตอบของ jlliagre มันกลับไปที่จุดเริ่มต้นของ Unix ซึ่งคัดลอกมาจาก Multics
Barmar

4
ตัวเลือกใน Linuxไม่ได้ลงวันที่ล่วงหน้า POSIX เป็นเวลาหลายปี แน่นอน POSIX ประมวลสิ่งที่มีอยู่แล้วปฏิบัติเพราะนั่นคือเหตุผลทั้งหมดที่มีอยู่
..

เท่าที่ Linux เป็นห่วงไม่มีทางเลือกจริงที่จะทำในสถานที่แรก ไลบรารี่มาตรฐาน Gnu ซึ่งใช้โดย Linux นั้นใช้งานร่วมกับ POSIX และใช้ไลน์ฟีดตั้งแต่เริ่มต้นด้วยเหตุผลด้านความเข้ากันได้ที่ชัดเจนเนื่องจากได้รับการพัฒนาทดสอบและใช้งานบนระบบ Unix เคอร์เนล Linux ถูกออกแบบมาเพื่อให้ Unix เช่นการเรียกระบบไปยังไลบรารี C มาตรฐาน (GNU หรืออื่น ๆ ) และการเพิ่มความซับซ้อนที่จำเป็นในการจัดการไฟล์ข้อความที่แตกต่างกันและไฟล์ไบนารีจะได้รับเกินขีดและความเข้ากันได้กับรหัสที่มีอยู่ นั่นคงจะไร้สาระจาก Torvalds
jlliagre

@jlliagre: มันยังคงเป็นทางเลือกที่จะทำให้บางสิ่งบางอย่างเข้ากันได้กับการปฏิบัติที่มีอยู่มากกว่าความไม่ลงรอยกันแบบสุ่มฟรี คุณสามารถพูดได้ว่านั่นไม่ใช่ตัวเลือกในบริบทของความสำเร็จของลีนุกซ์ ผู้คนมากมายทำของเล่นมือสมัครเล่นระบบปฏิบัติการที่เต็มไปด้วยทางเลือกแปลกประหลาดและพวกเขาไม่เคยไปไหน
..

@RI หมายถึง Linux เป็นเพียงเคอร์เนลและจำเป็นอย่างยิ่งที่ GNU จะต้องทำงาน (ในขั้นต้น Torvalds มีเป้าหมายเพื่อให้สามารถทำงานร่วมกับ minix แทน gnu ได้ แต่นั่นก็ไม่ต่างอะไรกับที่นี่) ตัวเลือกบรรทัดใหม่ไม่เกี่ยวข้องกับลีนุกซ์เพราะมันใช้เวลานานก่อนที่จะเขียนลีนุกซ์. มีตัวเลือกที่แปลกประหลาดมากขึ้นหรือน้อยลงในลินุกซ์รุ่นต่าง ๆ พวกเขาไม่ได้ป้องกัน Linux ให้ประสบความสำเร็จ หนึ่งในเหตุผลที่เป็นไปได้ว่ามีตัวเลือกเหล่านี้จำนวนมากถูกมาเยือนในภายหลัง
jlliagre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.