9 คะแนน โดย GN⁺ 2024-10-14 | 8 ความคิดเห็น | แชร์ทาง WhatsApp

ความหมายของ carriage return และ line feed

  • Carriage Return (CR): ย้ายเคอร์เซอร์ไปที่ขอบซ้ายของบรรทัดเดิม
  • Line Feed (LF): ย้ายเคอร์เซอร์ลงไปหนึ่งบรรทัด และเลื่อนบรรทัดก่อนหน้าให้ขึ้นด้านบน
  • Newline (NL): ย้ายเคอร์เซอร์ลงไปหนึ่งบรรทัดและย้ายไปที่ขอบซ้าย

ข้อสังเกต

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

ภูมิหลังทางประวัติศาสตร์

  • เครื่องพิมพ์โทรเลขพิมพ์ได้ประมาณ 5 ตัวอักษรต่อวินาที
  • ธรรมเนียมของ CRLF มีที่มาจากข้อจำกัดทางกลไกของเครื่องพิมพ์โทรเลขในทศวรรษ 1950
  • ในยุคของ Multix และ Unix เริ่มมีการตระหนักว่าการใช้ CRLF แทน NL นั้นไม่มีประสิทธิภาพ

สถานการณ์ในปัจจุบัน

  • ปัจจุบัน CR แทนด้วย U+000d ส่วน LF และ NL แทนด้วย U+000a
  • เครื่องสมัยใหม่ส่วนใหญ่ใช้ U+000a เป็น NL เท่านั้น
  • โปรโตคอลบางตัวยังคงบังคับใช้ CRLF แต่ซอฟต์แวร์ส่วนใหญ่รองรับ NL ตัวเดียว

ข้อเรียกร้องให้ลงมือทำ

  • เปลี่ยนชื่อ code point U+000a จาก "line feed" เป็น "newline"
  • หยุดส่ง CR ที่ไม่จำเป็น
  • สำหรับโปรโตคอลที่ต้องการ CRLF ให้ส่งเฉพาะ NL
  • แก้ไขซอฟต์แวร์ที่ทำให้เกิดข้อผิดพลาดเมื่อได้รับ NL โดยไม่มี CR

สรุปและผู้เขียน

  • จุดจบของ CRLF เป็นสิ่งที่ควรเกิดขึ้นมานานแล้ว เราควรร่วมมือกันกำจัดซากตกค้างจากยุคเก่านี้
  • ผู้เขียน: D. Richard Hipp ผู้สร้าง SQLite

# สรุปโดย GN⁺

  • บทความนี้อธิบายภูมิหลังทางประวัติศาสตร์ของ CRLF และความไม่มีประสิทธิภาพในยุคปัจจุบัน พร้อมเรียกร้องให้เลิกใช้
  • CRLF เป็นธรรมเนียมที่เกิดจากข้อจำกัดทางกลไก และในปัจจุบันสร้างความซับซ้อนที่ไม่จำเป็น
  • หัวข้อนี้อาจเป็นประโยชน์อย่างยิ่งต่อโปรแกรมเมอร์และนักพัฒนาซอฟต์แวร์ และมีความสำคัญต่อการส่งข้อมูลอย่างมีประสิทธิภาพ
  • แม้เมื่อใช้โปรโตคอลหรือระบบอื่นที่มีฟังก์ชันคล้ายกัน ก็ควรทบทวนความจำเป็นของ CRLF ด้วย

8 ความคิดเห็น

 
cosine20 2024-10-14

บางทีก็ยังใช้ line feed อยู่นะ....

 
doolayer 2024-10-14

แรงใช้ได้เลยนะเนี่ย โหดจัด

 
savvykang 2024-10-14

ตามการแก้ไขเมื่อวันที่ 14 ตุลาคม ระบุว่าได้ถอนข้อเสนอการเปลี่ยนแปลงแล้ว

นี่ไม่ใช่แค่การเปลี่ยนระบบเดียว แต่เป็นงานที่ต้องค่อย ๆ ปรับเปลี่ยนทั้งโปรโตคอลและทุกระบบที่ได้รับผลกระทบ ดังนั้นในมุมมองของผม ผู้เขียนน่าจะยังไม่รอบคอบพอ

 
constexprif 2024-10-14

พวกเขาคิดหรือว่าประโยชน์ที่ได้จากการเลิกใช้นั้นมากกว่าต้นทุนในการเลิกใช้มัน?

 
alstjr7375 2024-10-14

CR+LF มีประวัติศาสตร์อันยาวนาน...

อ้อ.. ถึงว่าเป็นเหตุผลแบบนี้..

 
bakyeono 2024-10-14

CRLF ไม่ได้เป็นสเปกที่นิยามผิดเสียหน่อย แต่เป็นสิ่งที่สะท้อนสภาพแวดล้อมของฮาร์ดแวร์ในยุคนั้น...
ดูเหมือนว่าจะลืมเรื่องความเข้ากันได้แบบย้อนหลังไป และคิดถึงแค่ช่วงเวลานี้เท่านั้น
หรือว่าเราควรจะรื้อโปรโตคอลใหม่ทุกครั้งที่สเปกฮาร์ดแวร์เปลี่ยน?

 
halfenif 2024-10-14

ไม่ได้เห็นด้วยหรือคัดค้านกับการเลิกใช้มันนะ

แต่ทำไมถึงนึกถึงปัญหา Millennium bug ขึ้นมาก็ไม่รู้?

 
GN⁺ 2024-10-14
ความคิดเห็นบน Hacker News
  • การอัปเดตโปรโตคอลเดิมให้ใช้ NL อาจก่อให้เกิดบั๊กแฝงได้ และ HTTP/1.1 ก็ถูกแทนที่ด้วย HTTP/2 ไปแล้ว
    • มีการโต้แย้งว่าในโปรโตคอลใหม่การไม่บังคับใช้ CRLF เป็นเรื่องสมเหตุสมผล แต่ไม่จำเป็นต้องไปอัปเดตโปรโตคอลเดิม
  • การไม่ปฏิบัติตาม CRLF ก็ไม่ต่างจากการจงใจใส่บั๊กเข้าไป
    • เซิร์ฟเวอร์ HTTP ของ SQLite ถูกอัปเดตให้ใช้ \n แทน \r\n แต่สิ่งนี้ทำให้ความเข้ากันได้กับไคลเอนต์ HTTP ของ Zig พัง
  • มีความเห็นว่าควรทำให้คนรุ่นหลังไม่ต้องมาคอยกังวลเรื่อง CRLF อีก
    • โดยบอกว่าควรสอนการใช้ไฟล์ .gitattribute และปลูกฝังให้ไม่ชอบ Byte Order Mark
  • การเลือกใช้ตัวจบบรรทัดแบบไม่เป็นมาตรฐานของ Unix เป็นความผิดพลาด และทำให้เกิดปัญหาความเข้ากันได้มานานหลายทศวรรษ
    • CRLF เป็นคนละส่วนกันใน API ของเทอร์มินัล และหลายโปรแกรมก็พึ่งพาการทำงานที่ถูกต้องของทั้ง CR และ LF
  • CRLF เป็นหนึ่งในองค์ประกอบที่สำคัญน้อยที่สุดของมาตรฐาน
    • การทำลายมาตรฐานถือเป็นแนวทางใหม่ และโดยส่วนตัวแล้วเป็นท่าทีที่รู้สึกแปลก
  • SMTP ระบุไว้อย่างชัดเจนว่าลำดับการจบข้อความคือ CR LF . CR LF และก็มีอิมพลีเมนเทชันที่รับรู้ LF . LF ด้วย
    • เป็นไปได้ว่ากฎดั้งเดิมของ SMTP อาจไม่สำคัญอีกต่อไปแล้ว
  • CRLF อาจก่อความเสี่ยงกับอุปกรณ์จำนวนมาก และควรลดข้อยกเว้นให้น้อยลง
  • ไม่มีการกล่าวถึงปัญหาที่เกิดขึ้นเมื่อมีการใช้ตัวจบบรรทัดแบบปะปนกัน
    • ไม่มีอักขระชื่อ NL อยู่จริง และปุ่ม "ENTER" บนคีย์บอร์ดทุกตัวจะส่ง CR
    • วิธีการปัจจุบันกำลังทำงานได้ดีอยู่แล้ว