Tại sao Linux sử dụng LF làm ký tự dòng mới?


87

Theo tôi biết, mỗi hệ điều hành có một cách khác nhau để đánh dấu ký tự kết thúc (EOL). Các hệ điều hành thương mại sử dụng trả lại vận chuyển cho EOL (trả lại vận chuyển và cung cấp dòng trên Windows, chỉ trả lại vận chuyển trên máy Mac). Mặt khác, Linux chỉ sử dụng nguồn cấp dữ liệu cho EOL.

Tại sao Linux không sử dụng trả lại vận chuyển cho EOL (và thay vào đó là nguồn cấp dữ liệu duy nhất)?


77
Máy Mac không chỉ sử dụng CR kể từ trước OS X ... bây giờ tôi sử dụng kiểu * nix kiểu LF, tôi tin.
Lớp B

33
Tôi nghĩ rằng cũng đã có một số hệ điều hành Unixy thương mại.
ilkkachu

20
Giải thích trên Wikipedia . Về cơ bản Multics trong thập niên 60 vừa qua (lấy cảm hứng từ Unix, đã truyền cảm hứng cho Linux) đã thêm một số mức độ trừu tượng để tránh việc mã hóa văn bản bị vướng bận bởi các giới hạn của các thiết bị teletype nên nó không phải mã hóa dòng mới trên hai ký tự (mà thậm chí còn ít hơn ý nghĩa 50 năm sau tất nhiên).
Stéphane Chazelas

74
Đoạn thứ hai là một câu hỏi hợp lệ, nhưng đoạn đầu tiên chứa quá nhiều lỗi quá mức và lỗi hoàn toàn đến nỗi nó bị nhấn chìm, với những người trả lời phải sửa cả đống iffy và cơ sở bị lỗi trước khi họ kịp nhận câu hỏi.
JdeBP

21
Gì? Linux là một xấp xỉ miễn phí của một tiêu chuẩn hệ điều hành thương mại được gọi là UNIX. Các hệ thống tuân thủ UNIX tốn rất nhiều tiền trước đó và chúng vẫn còn hoạt động cho đến ngày nay.
errantlinguist

Câu trả lời:


334

Windows sử dụng CRLFvì nó thừa hưởng nó từ MS-DOS.

MS-DOS sử dụng CRLFvì nó được lấy cảm hứng từ CP / M đã sử dụng CRLF.

CP / M và nhiều hệ điều hành từ những năm tám mươi và trước đó được sử dụng CRLFvì đó là cách để kết thúc một dòng được in trên teletype (quay lại đầu dòng và nhảy sang dòng tiếp theo, giống như máy đánh chữ thông thường). Điều này đơn giản hóa việc in một tập tin vì có ít hoặc không cần xử lý trước. Ngoài ra còn có các yêu cầu cơ học ngăn không cho một nhân vật có thể sử dụng được. Một số thời gian có thể được yêu cầu để cho phép vận chuyển trở lại và trục lăn quay.

Gnu / Linux sử dụng LFvì nó là bản sao Unix . 1

Unix đã sử dụng một ký tự duy nhất LF, ngay từ đầu để tiết kiệm không gian và chuẩn hóa đến cuối dòng chính tắc, sử dụng hai ký tự là không hiệu quả và mơ hồ. Lựa chọn này được kế thừa từ Multics sử dụng nó từ đầu năm 1964. Bộ nhớ, bộ nhớ, sức mạnh CPU và băng thông rất thưa thớt nên việc tiết kiệm một byte trên mỗi dòng là việc đáng làm. Khi một tệp được in, trình điều khiển đã chuyển đổi nguồn cấp dữ liệu (dòng mới) thành các ký tự điều khiển theo yêu cầu của thiết bị đích.

LFđược ưa thích CRvì sau này vẫn có cách sử dụng cụ thể. Bằng cách định vị lại ký tự được in ở đầu cùng một dòng, nó cho phép vượt quá các ký tự đã gõ.

Apple ban đầu quyết định cũng sử dụng một ký tự duy nhất nhưng vì lý do nào đó đã chọn một ký tự khác : CR. Khi nó chuyển sang giao diện BSD, nó chuyển sang LF.

Những lựa chọn này không liên quan gì đến thực tế một hệ điều hành có thương mại hay không.

1 Đây là câu trả lời cho câu hỏi của bạn.


20
Multics đã sử dụng Line Feed theo thỏa thuận với ISO / IEC 646 hiện đại, quy định nó là cách để thể hiện cả lợi nhuận vận chuyển và nguồn cấp dữ liệu cùng nhau, trong một ký tự, nếu cần một đại diện một ký tự.
JdeBP

10
Tôi nghi ngờ lý do thực sự để chọn một nhân vật duy nhất là để tiết kiệm không gian. Lý do thực sự là để xác định một tự dòng mới độc lập với thiết bị đầu ra (thiết bị đầu cuối, v.v.) Trình điều khiển thiết bị đầu cuối (hoặc tương tự) sau đó đảm nhiệm việc chuyển đổi dòng mới thành chuỗi ký tự điều khiển phù hợp, điển hình là CR LF. Điều này cho phép một sự trừu tượng tốt đẹp khi lập trình với các chuỗi: dòng mới được trình bày với một \n, độc lập với một số thiết bị đầu ra cụ thể.
Johan Myréen

14
Tuy nhiên, bài báo năm 1970 của Saltzer và Ossanna ( Xử lý luồng ký tự đầu cuối từ xa trong Multics ) khá rõ ràng rằng sự độc lập của thiết bị lý do.
JdeBP

3
@JdeBP này giấy bang giảm tới hình thức kinh điển của dòng nhân vật đi đến và đi từ thiết bị đầu cuối từ xa là chủ đề của bài viết này . Giảm xuống một hình thức kinh điển là một cách để tiết kiệm không gian (quá). Thể hiện khác nhau, sử dụng hai ký tự là một sự lãng phí không gian không hiệu quả và mơ hồ.
jlliagre

46
Và teletypes có được điều này từ máy đánh chữ không điện. CR-LF mô tả hành động cơ học bạn thực hiện khi bạn đẩy cần gạt bên trái. Trả lại "cỗ xe" giữ trục lăn (con lăn) hoàn toàn quay về bên phải (đặt bàn phím ở vị trí đầu tiên bên trái) và xoay trục xoay một chiều cao để di chuyển đến dòng có thể đánh máy tiếp theo. Vâng, tôi thừa nhận cho thấy tuổi của tôi ở đây.
cdkMoose

17

Bài viết trên wikipedia về "Dòng mới" theo dõi sự lựa chọn của NL làm đầu cuối dòng (hoặc dấu phân cách) cho Multics vào năm 1964; Thật không may, bài viết có một vài trích dẫn về nguồn nhưng không có lý do để nghi ngờ điều này là chính xác. Có hai lợi ích rõ ràng cho lựa chọn này so với CR-LF: tiết kiệm không gian và độc lập thiết bị.

Giải pháp thay thế chính, CR-LF, bắt nguồn từ các mã điều khiển được sử dụng để di chuyển vật lý vận chuyển giấy trên máy teletype, trong đó CR sẽ đưa cỗ xe về vị trí ban đầu của nó, và LF sẽ xoay con lăn giấy để di chuyển vị trí in xuống hàng. Hai ký tự điều khiển xuất hiện trong mã ITA2 có từ năm 1924 và dường như vẫn còn được sử dụng (xem Wikipedia); rõ ràng ITA2 đã lấy chúng từ biến thể mã Baudot của Murray có từ năm 1901.

Đối với độc giả nhỏ tuổi, điều đáng chú ý là trong truyền thống máy tính lớn, không có nhân vật mới; đúng hơn là một tập tin là một chuỗi các bản ghi có độ dài cố định (thường là 80 ký tự, dựa trên thẻ đục lỗ) hoặc độ dài thay đổi; các bản ghi độ dài thay đổi thường được lưu trữ với số lượng ký tự ở đầu mỗi bản ghi. Nếu bạn có một tệp máy tính lớn bao gồm một chuỗi các bản ghi có độ dài thay đổi, mỗi tệp chứa nội dung nhị phân tùy ý, việc chuyển đổi một cách dễ dàng này thành tệp kiểu UNIX có thể là một chuyển đổi khó khăn.

Linux, tất nhiên, chỉ là một triển khai lại của Unix và Unix đã lấy nhiều quyết định thiết kế của nó từ Multics, vì vậy có vẻ như quyết định quan trọng đã được đưa ra vào năm 1964.


12

Các câu trả lời khác đã bắt nguồn từ chuỗi thừa kế từ những năm 1960 và teletypes. Nhưng đây là một khía cạnh họ không đề cập đến.

Trong thời của teletypes, có những lúc mong muốn làm một cái gì đó được gọi là quá mức. Overstriking đôi khi được sử dụng để che khuất mật khẩu, bởi vì việc xóa mật khẩu là không thể thực hiện được. Lần khác, quá mức đã được thực hiện để có được một biểu tượng không có trong phông chữ. Ví dụ, chữ O và dấu gạch chéo tạo ra một biểu tượng mới.
Overstriking đã được đạt được bằng cách đưa trở lại xe ngựa mà không có nguồn cấp dữ liệu, đôi khi backspace thể thao được sử dụng. Vì lý do này, những người unix đã quyết định chống lại sự vận chuyển trở lại như là dấu phân cách dòng và thay vào đó đã chọn cho nguồn cấp dữ liệu. Điều này cũng hoạt động tốt để đọc các văn bản được tạo bằng cách sử dụng quy ước CRLF. CR bị nuốt chửng và LF trở thành dải phân cách.


Cảm ơn bạn cho bộ nhớ chính xác này. Backspace và Vận chuyển trở lại (một mình) cũng được sử dụng trên máy in để tạo ra các ký tự in đậm hoặc gạch chân. Và để quay trở lại nguồn gốc, hai lệnh này đã tồn tại vào năm 1930 để làm cho "cỗ xe" "trở về" ở vị trí ngoài cùng bên trái của nó, hoặc để vượt qua hoặc cho phép bắt đầu một dòng mới với sự trợ giúp của "dòng mới" Phím làm cho con lăn quay một bước. Xem: vi.wikipedia.org/wiki/IBM_Electric_typewriter . Vì vậy, "CR" + "LF" đang hẹn hò trước lịch sử máy tính.
dan

Cũng có thể đáng chú ý rằng một số loại điện thoại yêu cầu CR phải được theo sau bởi một ký tự không in để cho thời gian vận chuyển hoàn toàn chu kỳ trước khi ký tự in tiếp theo đến và không hỗ trợ khoảng trống, vì vậy hãy gửi một LF sau CR không tốn kém gì, và cách duy nhất để thực hiện in chồng là thông qua CR.
supercat

"Những ngày của teletypes" bắt đầu trước kỷ nguyên máy tính. trong những năm 1960, nhiều máy tính đã có một máy điện báo điều khiển cho nhà điều hành và thậm chí còn sử dụng ASCII làm bộ ký tự của chúng.
Walter Mitty

7

Mặc dù bạn có thể dịch câu hỏi lịch sử thành câu hỏi về ngôn ngữ C, lý do mà Linux và tất cả các hệ thống tuân thủ POSIX hoặc POSIX-ish phải sử dụng LF(hoặc ít nhất là bất cứ '\n'ký tự C nào ) vì dòng mới là kết quả của giao lộ các yêu cầu của C và POSIX. Mặc dù C cho phép "tệp văn bản" và "tệp nhị phân" khác nhau (trên thực tế, tệp văn bản có thể dựa trên bản ghi bao gồm một chuỗi các bản ghi dòng, ngoài những thứ ít kỳ lạ hơn như đã '\n'dịch sang / từ CR/ LFnhư trên DOS / Windows ), POSIX bắt buộc văn bản và chế độ nhị phân hoạt động giống nhau. Đây phần lớn là lý do mà các công cụ dòng lệnh nhưcatmạnh mẽ / hữu ích; họ sẽ ít hơn nhiều vì vậy nếu họ chỉ làm việc với nhị phân, hoặc chỉ với văn bản, nhưng không phải cả hai.


13
Sự lựa chọn này có trước POSIX trong nhiều năm. Như đã đề cập trong câu trả lời của jlliagre, nó quay trở lại sự khởi đầu của Unix, nó đã sao chép nó từ Multics.
Barmar

4
Sự lựa chọn trong Linux không có trước POSIX trong nhiều năm. Tất nhiên POSIX đã mã hóa những gì đã tồn tại trong thực tế, vì đó là toàn bộ lý do tồn tại của nó.
R ..

Theo như Linux có liên quan, không có sự lựa chọn thực sự nào ngay từ đầu. Thư viện chuẩn Gnu được Linux sử dụng là đương đại với POSIX và đã sử dụng nguồn cấp dữ liệu từ khi ra đời vì lý do tương thích rõ ràng vì nó được phát triển, thử nghiệm và sử dụng trên các hệ thống Unix. Nhân Linux được thiết kế để cung cấp Unix như các cuộc gọi hệ thống đến thư viện C tiêu chuẩn (GNU hoặc khác) và thêm độ phức tạp cần thiết để xử lý các tệp văn bản khác nhau và các tệp nhị phân sẽ bị quá mức và phá vỡ tính tương thích với mã hiện có. Điều đó sẽ là vô nghĩa từ Torvalds.
jlliagre

@jlliagre: Vẫn là một lựa chọn để làm cho một cái gì đó tương thích với thực tiễn hiện có thay vì sự không tương thích vô cớ ngẫu nhiên. Bạn chỉ có thể nói rằng đó không phải là một lựa chọn trong bối cảnh giả định thành công của Linux. Rất nhiều người làm cho OS sở thích đồ chơi đầy những lựa chọn kỳ quặc vô cớ và họ không bao giờ đi đâu cả.
R ..

@RI có nghĩa là Linux chỉ là một hạt nhân và về cơ bản nó đòi hỏi GNU phải hoạt động (mục tiêu ban đầu của Torvalds là tương thích với minix thay vì gnu, nhưng điều đó không có gì khác biệt ở đây). Lựa chọn dòng mới không liên quan đến Linux vì nó đã được thực hiện một thời gian dài trước khi Linux được viết. Đã có rất nhiều sự lựa chọn kỳ quặc ít nhiều vô cớ trong các bản phát hành Linux khác nhau, họ đã không ngăn Linux thành công. Một trong những lý do có thể là nhiều lựa chọn trong số này đã được xem xét lại sau đó.
jlliagre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.