Little Endian ชนะแล้วหรือยัง?


34

เมื่อเร็ว ๆ นี้เมื่อสอนเกี่ยวกับการสู้รบของ Big vs. Little Endian นักเรียนคนหนึ่งถามว่ามันได้รับการตัดสินหรือไม่และฉันรู้ว่าฉันไม่รู้ ดูบทความ Wikipediaดูเหมือนว่าคู่ OS / สถาปัตยกรรมปัจจุบันที่นิยมที่สุดใช้ Little Endian แต่ Internet Protocol ระบุ Big Endian สำหรับการถ่ายโอนค่าตัวเลขในส่วนหัวของแพ็กเก็ต นั่นเป็นบทสรุปที่ดีของสถานะปัจจุบันหรือไม่? การ์ดเครือข่ายหรือซีพียูในปัจจุบันให้การสนับสนุนฮาร์ดแวร์สำหรับการสลับลำดับไบต์หรือไม่

คำตอบ:


25

ฉันยืนยันว่ามันไม่ชนะมากพอที่จะหยุดเรื่อง ARM ซึ่งเป็นพื้นฐานของตลาดมือถือทั้งหมดคือ bi-endian (โอ้นี่คือบาป!) ในแง่ที่ว่า x86 โดยทั่วไป "ชนะ" ตลาดเดสก์ท็อปฉันคิดว่าคุณสามารถพูดได้ว่า endian ตัวเล็ก ๆ ชนะ แต่ฉันคิดว่าได้รับความลึกของรหัสโดยรวม (ตื้น) และนามธรรม (มาก) ของแอปพลิเคชันในปัจจุบันจำนวนมาก มันเคยเป็น ฉันจำไม่ได้ว่า endianness เกิดขึ้นจริงในชั้นเรียนสถาปัตยกรรมคอมพิวเตอร์ของฉัน

ฉันสงสัยว่านักพัฒนาหลายคนไม่ได้ตระหนักถึง endianness หรือทำไมมันถึงสำคัญ เพราะสำหรับส่วนใหญ่ (และฉันหมายถึงส่วนใหญ่ ) ส่วนใหญ่มันไม่เกี่ยวข้องอย่างเต็มที่กับสภาพแวดล้อมการทำงานประจำวันของพวกเขา นี่คือความแตกต่างเมื่อ 30 ปีที่แล้วเมื่อทุกคนเขียนโค้ดให้ใกล้กับโลหะมากขึ้นเมื่อเทียบกับการจัดการไฟล์ข้อความบนหน้าจอด้วยวิธีที่แปลกใหม่

ความสงสัยทั่วไปของฉันคือการเขียนโปรแกรม Object Oriented เป็นจุดเริ่มต้นของการสิ้นสุดเกี่ยวกับ endianness ตั้งแต่ชั้นของการเข้าถึงและนามธรรมในระบบ OO ที่ดีซ่อนรายละเอียดการใช้งานจากผู้ใช้ เนื่องจากการใช้งานรวมถึงความ endianness ผู้คนคุ้นเคยกับมันไม่ได้เป็นปัจจัยที่ชัดเจน

ภาคผนวก: zxcdw กล่าวถึงความสะดวกในการพกพา อย่างไรก็ตามสิ่งที่เกิดขึ้นพร้อมกับการแก้แค้นในช่วง 20 ปีที่ผ่านมา? ภาษาโปรแกรมที่สร้างขึ้นบนเครื่องเสมือน แน่นอนว่าเครื่องเสมือนอาจมีความสำคัญ แต่ก็สามารถทำให้สอดคล้องกันมากสำหรับภาษานั้นจนถึงจุดที่เป็นปัญหา มีเพียงผู้ใช้ VM เท่านั้นที่ต้องกังวลเกี่ยวกับ endianness จากจุดยืนในการพกพา


2
ยังมีโดเมนที่เกี่ยวข้องจำนวนมากที่เกี่ยวข้องเช่นเมื่อเขียนโค้ดพกพาในรูปแบบใด ๆ Infact ซึ่งมันไม่สำคัญว่าเมื่อเขียนโค้ดแบบพกพาที่ไม่เชื่อมโยงกับแพลตฟอร์ม
zxcdw

@zxcdw ซึ่งนำเราไปสู่กองทัพของภาษาเครื่องเสมือนจริง ... ฉันไม่เคยคิดอย่างนั้น
วิศวกรโลก

ภาคผนวกของคุณไม่เป็นความจริงทั้งหมด (และฉันไม่เห็นด้วยกับ @zxcdw): endianness มีความสำคัญเฉพาะเมื่อการแปลระหว่างจำนวนเต็มหลายไบต์และกระแสข้อมูลไบต์และกลายเป็นปัญหาเมื่อดำเนินการโดยปริยายและแตกต่างกันระหว่างแพลตฟอร์ม ภาษาสมัยใหม่ส่วนใหญ่ (ไม่ว่าจะเป็น VM หรือไม่ก็ตาม) จะสามารถพกพาได้โดยให้คุณทำน้อยครั้ง (ด้วยจำนวนเต็มเป็นประเภทข้อมูลทึบแสง) จากนั้นมี endianness ที่ระบุทั้งอิสระของแพลตฟอร์มหรือเลือกโดยโปรแกรมเมอร์
Michael Borgwardt


2
@zxcdw - แม้ในแอสเซมเบลอร์คุณไม่จำเป็นต้องรู้คำสั่ง endian เสมอไป ตัวอย่างเช่นค่าคงที่ไม่จำเป็นต้องระบุไบต์ในแต่ละครั้ง สถานการณ์ค่อนข้างคล้ายกับรูปแบบของการทำให้เป็นอันดับใน C x & 0xFFเสมอ- ให้ไบต์ที่สำคัญน้อยที่สุดโดยไม่คำนึงถึงการสั่งซื้อของ endian (สมมติว่า bytes ของคุณคือ 8 บิตในแต่ละ) เพราะคุณได้ระบุบิตที่คุณสนใจตามค่าของมัน ไม่ใช่ตำแหน่งญาติในหน่วยความจำ
Steve314

4

Endians มีความสำคัญจริงๆเมื่อคุณถ่ายโอนระบบข้อมูลไบนารี

ด้วยความก้าวหน้าของความเร็วโปรเซสเซอร์ (และค่าใช้จ่ายที่ต่ำกว่ามากในการจัดเก็บ) การเชื่อมต่อข้อมูลไบนารี่กำลังกลายเป็นสิ่งที่หายากดังนั้นคุณจะไม่สังเกตเห็นพวกมันที่ชั้นแอพพลิเคชัน คุณกำลังใช้รูปแบบการถ่ายโอนข้อความ (XML / JSON) หรือคุณกำลังใช้นามธรรม abstraction เลเยอร์ที่ดูแลการแปลสำหรับคุณ (ดังนั้นคุณไม่ได้สังเกตว่ามีการแปล)

แต่เมื่อคุณเข้ารหัสที่ชั้นข้อมูลไบนารีคุณจะสังเกตเห็นและมันสำคัญมาก ตัวอย่างเช่นเมื่อฉันทำงานที่ VERITAS (ไซแมนเทคตอนนี้) ฉันกำลังสร้างซอฟต์แวร์ที่ถูกสร้างขึ้นบนแพลตฟอร์มฮาร์ดแวร์ 25 แพลตฟอร์มที่แตกต่างกัน


นักเรียนของฉันได้พัฒนาขึ้นสำหรับโทรศัพท์มือถือและใช้การประมวลผลแบบคลาวด์ดังนั้นพวกเขาจึงรู้ว่าโลกไม่ใช่พีซีและ Mac
Ellen Spertus

@Loki - เป็นไปได้ที่จะทำให้เป็นอนุกรมและยกเลิกการทำให้เป็นอนุกรมโดยไม่ทราบว่า endian ของเครื่อง คุณเพียงแค่ต้องรู้การเรียงลำดับข้อมูลในไฟล์ / สตรีม / อะไรก็ตาม ตัวอย่างเช่น(char) (x & 0xFF)ใน C ให้ไบต์ที่มีนัยสำคัญน้อยที่สุดโดยไม่คำนึงถึงปัญหา endian โดยสมมติว่าไบต์เป็น 8 บิต ฉันได้ออกแบบรูปแบบไฟล์ไบนารีโดยไม่ทราบว่าเครื่องจะทำงานบนซอฟต์แวร์โดยทั่วไปฉันเลือก endian สั่งซื้อสำหรับรูปแบบไฟล์โดยไม่สนใจฮาร์ดแวร์
Steve314

@ espertus: เป็นไปได้
Martin York

1
@ Steve314: ใช่แน่นอนคุณสามารถ เมื่อคุณกำลังทำงานกับ "ชั้นข้อมูลไบนารี" คุณสามารถกำหนดโครงร่างอะไรก็ตามที่คุณต้องการทำให้เป็นอนุกรมข้อมูลของคุณและมันก็ไม่ยากที่จะกำหนดรูปแบบที่พกพาได้ แม้ว่าโดยส่วนตัวแล้วฉันจะไม่สนใจที่จะประดิษฐ์ล้อที่ถูกสร้างขึ้นและผ่านการทดสอบอย่างดีมาตั้งแต่ยุค 60 เงยหน้าขึ้นมอง ` h2nlและครอบครัว ฟังก์ชั่นตระกูลนี้มอบวิธีพกพา (มาตรฐาน) ในการทำสิ่งต่าง ๆ ที่เหมาะสมที่สุดสำหรับแพลตฟอร์มของคุณ
Martin York

4

ไม่ไม่มีใครชนะ เราเป็นสายพันธุ์ที่เราล้มเหลวในการสร้างมาตรฐานการเรียงลำดับที่เราเก็บไบต์ของเราพร้อมกับทิศทางที่เราเขียนและด้านข้างของถนนที่เราขับรถ

ด้วยเหตุนี้ทุกคนที่ต้องการถ่ายโอนข้อมูลระหว่างสองระบบที่แตกต่างกันผ่านเครือข่ายหรือในไฟล์มีโอกาสเพียง 50% ของรุ่นแรกที่เหมาะสมของการถ่ายโอนข้อมูลรหัสของพวกเขาถูกต้องในสภาพแวดล้อมของพวกเขาและแม้ว่ามันจะทำงาน มีโอกาส 50% ที่จะทำงานกับลูกค้าของพวกเขา

ในการจัดการกับสิ่งนี้คุณต้องค้นหาแพลตฟอร์มเฉพาะฟังก์ชั่นที่มีชื่อเช่น "htonl" ในส่วนหัวที่มีชื่ออย่างชัดเจนย้อนกลับไปในยุค 70 เช่น "arpa / inet.h" เพราะสถานการณ์ยังไม่ดีขึ้นตั้งแต่นั้นมาและอาจจะไม่เคย .


10
ปรากฎว่าเรามีมาตรฐาน - แทนที่จะส่ง 4 ไบต์เพื่อแทนจำนวนเต็มเราส่งบล็อกของข้อความที่จัดรูปแบบด้วยข้อความส่วนหัวพิเศษวงเล็บมุมคำหลักและการแสดง ASCII ของ 4 ไบต์เหล่านั้น จุดสิ้นสุดการรับจะวิเคราะห์การจัดรูปแบบเพื่อรับข้อความจำนวนเต็มและแปลงกลับเป็น 4 ไบต์ นี่เรียกว่าความคืบหน้าฉันบอกแล้ว :-)
gbjbaanb

$ aptitude search xml | wc -l 677
Andrew Wagner

1

ยังไม่มีมติ:

  • ปัจจุบันระบบคอมพิวเตอร์ขนาดใหญ่ (เซิร์ฟเวอร์ / เดสก์ท็อป / แล็ปท็อป) ในปัจจุบันใช้สถาปัตยกรรมแบบ end-endian
  • คอมพิวเตอร์ขนาดเล็กส่วนใหญ่ (แท็บเล็ต / โทรศัพท์) ใช้สถาปัตยกรรมตัวประมวลผลที่เป็นอิสระของ endianness แต่ใช้ระบบปฏิบัติการที่ใช้คำสั่งเล็ก ๆ น้อย ๆ

ดังนั้นในระดับฮาร์ดแวร์ LE จึงเป็นเรื่องปกติมาก แต่:

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

คำสั่งซื้อทั้งสองจะอยู่กับเราในอนาคตอันใกล้


ส่วนใหญ่ของระบบที่ใหญ่ที่สุด (เช่น "เหล็กขนาดใหญ่") มักจะเป็นใหญ่ endian นั่นคือระบบมินิหรือเมนเฟรมที่เรียกว่า (ซึ่งประกอบขึ้นเป็นจำนวนมากในการประมวลผลแบ็กเอนด์ส่วนใหญ่ของเราไม่สนใจ)

@jdv แต่ระบบคอมพิวเตอร์ที่ใหญ่ที่สุด คือเครื่อง x86-64 ของ endian เล็ก ๆ น้อย ๆ และที่นั่นประสิทธิภาพมีความสำคัญ
user877329

ฉันไม่คิดว่าใคร ๆ ก็สามารถยืนยันได้ว่า endianness นั้นเป็นอะไรที่มากกว่าความสะดวกสบายในส่วนของนักออกแบบสถาปัตยกรรม (สำหรับสิ่งที่พวกเขาต้องการบรรลุ) ในขณะที่ฉันแสดงความคิดเห็นโบราณว่าเหล็กขนาดใหญ่เป็น BE แต่นี่ไม่ใช่เพราะมันเป็น BE แต่เพราะสถาปัตยกรรมนั้นเป็นเช่นนั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.