Czy Little Endian wygrał?

34

Ucząc ostatnio o bitwie Big vs. Little Endian, uczeń zapytał, czy została rozstrzygnięta, i zdałem sobie sprawę, że nie wiem. Patrząc na artykuł z Wikipedii , wydaje się, że najpopularniejsze obecnie pary OS / architektura używają Little Endian, ale protokół internetowy określa Big Endian do przesyłania wartości liczbowych w nagłówkach pakietów. Czy byłoby to dobre podsumowanie obecnego statusu? Czy obecne karty sieciowe lub procesory zapewniają sprzętową obsługę przełączania kolejności bajtów?

Ellen Spertus
źródło

Odpowiedzi:

25

Twierdziłbym, że nie tyle wygrane, co przestały mieć znaczenie. ARM, który składa się w zasadzie na cały rynek mobilny, jest bi-endian (och, herezja!). W tym sensie, że x86 po prostu „wygrał” rynek komputerów stacjonarnych. Przypuszczam, że można powiedzieć, że wygrał mały Endian, ale myślę, że biorąc pod uwagę ogólną głębokość kodu (płytkość) i abstrakcję (wiele) wielu dzisiejszych aplikacji, jest to o wiele mniejszy problem niż to kiedyś było. Nie przypominam sobie, by Endianness pojawił się naprawdę na mojej lekcji architektury komputerowej.

Podejrzewam, że wielu programistów nie zdaje sobie nawet sprawy z endianizmu ani dlaczego jest to ważne. Ponieważ dla ogromnej (i mam na myśli ogromną ) większości jest to całkowicie nieistotne dla ich codziennego środowiska pracy. Inaczej było 30 lat temu, kiedy wszyscy kodowali znacznie bliżej metalu, w przeciwieństwie do manipulowania plikami tekstowymi na ekranie w fantazyjny i dramatyczny sposób.

Moje ogólne podejrzenie jest takie, że programowanie obiektowe było początkiem końca dbania o endianizm, ponieważ warstwy dostępu i abstrakcji w dobrym systemie OO ukrywają szczegóły implementacji przed użytkownikiem. Ponieważ wdrożenie obejmuje endianizm, ludzie przyzwyczaili się, że nie jest to wyraźny czynnik.

Dodatek: zxcdw wspomniał o możliwości przenoszenia. Co jednak zemściło się w ciągu ostatnich 20 lat? Języki programowania zbudowane na maszynach wirtualnych. Oczywiście endianność maszyny wirtualnej może mieć znaczenie, ale można ją uczynić bardzo spójną dla tego jednego języka do tego stopnia, że ​​zasadniczo nie jest to problemem. Tylko implementatorzy maszyn wirtualnych musieliby się martwić o endianowość z punktu widzenia przenośności.

Inżynier świata
źródło
2
Nadal istnieje wiele bardzo istotnych dziedzin, w których ma to znaczenie, na przykład podczas pisania dowolnej formy przenośnego kodu. W rzeczywistości, gdzie prawdopodobnie nie ma znaczenia, jest pisanie nieprzenośnego kodu, który jest powiązany z platformą.
zxcdw
@zxcdw, który prowadzi nas bezpośrednio do armii języków maszyn wirtualnych ... Nie myślałem o tym.
Inżynier świata
Twoje uzupełnienie nie jest do końca prawdziwe (i nie zgadzam się z @zxcdw): endianness ma znaczenie tylko przy tłumaczeniu między liczbami całkowitymi wielobajtowymi i strumieniami bajtów i staje się problemem, gdy jest wykonywany niejawnie i różni się w zależności od platformy. Większość współczesnych języków (opartych na maszynach wirtualnych lub nie) osiąga przenośność, wykonując je rzadko (z liczbami całkowitymi jako nieprzezroczystym typem danych), a następnie ma endianness albo określony niezależnie od platformy, albo jawnie wybrany przez programistę.
Michael Borgwardt,
2
@MichaelBorgwardt ARM robi arium.com/pdf/Endianness.pdf
Inżynier świata
2
@zxcdw - nawet w asemblerze nie zawsze musisz znać porządek endianów. Na przykład stałe nie muszą być określane bajt naraz. Sytuacja jest nieco podobna do pewnego stylu serializacji w C - x & 0xFFzawsze daje najmniej znaczący bajt bez względu na porządek endian (zakładając, że twoje bajty to 8 bitów każdy), ponieważ określiłeś bity, którymi jesteś zainteresowany, ich wartością, nie ich względna pozycja w pamięci.
Steve314,
4

Endians naprawdę ma znaczenie tylko w przypadku przesyłania systemów danych binarnych.

Wraz z postępem szybkości procesora (i znacznie niższym kosztem przechowywania) interfejsy danych binarnych stają się coraz rzadsze, więc nie można ich zauważyć w warstwie aplikacji. Używasz tekstowego formatu przesyłania (XML / JSON) lub używasz abstrakcji warstwy danych, która zajmuje się tłumaczeniem za ciebie (więc nawet nie zauważysz, że istnieje tłumaczenie).

Ale kiedy kodujesz w warstwie danych binarnych, zauważasz to i jest to bardzo ważne. Na przykład, kiedy pracowałem w VERITAS (teraz Symantec), budowałem oprogramowanie, które było budowane na 25 różnych platformach sprzętowych (nie tylko big / little endian istnieją inne typy).

Martin York
źródło
Moi uczniowie opracowali również telefony komórkowe i korzystali z przetwarzania w chmurze, więc wiedzą, że świat to nie komputery PC i Mac.
Ellen Spertus
@Loki - możliwe jest serializowanie i usuwanie serializacji bez znajomości endianu maszyny. Musisz naprawdę znać kolejność bajtów danych w plikach / strumieniach / czymkolwiek. Na przykład (char) (x & 0xFF)w C daje najmniej znaczący bajt bez względu na problemy endianowe, przy założeniu, że bajt ma 8 bitów. Zaprojektowałem binarne formaty plików, nie znając maszyn, na których oprogramowanie będzie działało - w zasadzie wybrałem endian zamawiając format pliku bez dbania o sprzęt.
Steve314,
@espertus: Pewnie możliwe.
Martin York
1
@ Steve314: Tak, oczywiście, że możesz. Podczas pracy nad „warstwą danych binarnych” możesz opracować dowolny schemat, który chcesz serializować swoje dane, i nie jest trudno opracować schematy, które są przenośne. Chociaż osobiście nie zawracałbym sobie głowy ponownym wynalezieniem koła, które zostało zbudowane i dobrze przetestowane od lat 60-tych. Wyszukaj ` h2nl i rodzinę. ta rodzina funkcji zapewnia przenośny (standardowy) sposób robienia rzeczy, który jest optymalny dla twojej platformy.
Martin York,
4

Nie, nikt nie wygrał. My, gatunek, nie udało nam się ujednolicić kolejności, w jakiej przechowujemy nasze bajty, wraz z kierunkiem, w którym piszemy, i bokiem ulicy, którą jedziemy.

W rezultacie każdy, kto chce przesyłać dane między dwoma różnymi systemami za pośrednictwem sieci lub pliku, ma tylko około 50% szans na poprawność początkowej wersji swojego kodu zrzutu danych w swoim środowisku, a nawet jeśli działa , ma 50% szans na pracę u klienta.

Aby sobie z tym poradzić, należy poszukać funkcji specyficznych dla platformy o nazwach takich jak „htonl” w nagłówkach, których nazwy oczywiście sięgają lat 70-tych, takich jak „arpa / inet.h”, ponieważ od tego czasu sytuacja się nie poprawiła i prawdopodobnie nigdy się nie poprawi .

Andrew Wagner
źródło
10
okazuje się, że ustandaryzowaliśmy - zamiast wysyłać 4 bajty reprezentujące liczbę całkowitą, wysyłamy blok tekstu sformatowany specjalnym tekstem nagłówka, nawiasami kątowymi, słowami kluczowymi i reprezentacją ASCII tych 4 bajtów. Odbiorca następnie analizuje formatowanie w celu uzyskania tekstu liczb całkowitych i konwertuje go z powrotem na 4 bajty. Nazywa się to postępem, jak mi powiedziano :-)
gbjbaanb,
$ aptitude search xml | wc-l 677
Andrew Wagner
1

Nadal nie ma konsensusu:

  • Większość większych systemów komputerowych (serwer / komputer stacjonarny / laptop) korzysta obecnie z architektur little-endian
  • Większość mniejszych komputerów (tabletów / telefonów) korzysta z architektury procesorów niezależnych od endianizmu, ale działa na systemach operacyjnych, które używają kolejności little-endian

Na poziomie sprzętowym LE jest znacznie bardziej powszechny. Ale:

  • Większość komunikacji między komputerami odbywa się przy użyciu protokołów określających kolejność big-endian
  • Bardzo duża część oprogramowania na świecie działa na platformie wirtualnej, która domyślnie ustawia kolejność big-endian za każdym razem, gdy dane są zapisywane w pamięci zewnętrznej.

Oba zamówienia będą u nas w dającej się przewidzieć przyszłości.

Jules
źródło
Większość największych systemów (tj. „Duże żelazo”) to zazwyczaj big-endian. Oznacza to, że tak zwane systemy mini lub mainframe (które stanowią ogromną część przetwarzania zaplecza, o których większość z nas nie dba).
@jdv Ale większość największych systemów komputerowych to małe komputery endian x86-64, a tam wydajność ma znaczenie.
user877329,
Nie sądzę, aby ktokolwiek mógł twierdzić, że endianizm jest czymś więcej niż wygodą ze strony projektantów architektury (dla wszystkiego, co chcą osiągnąć). W chwili, gdy wypowiedziałem ten starożytny komentarz, duże żelazo było BE. Ale to nie dlatego, że jest BE, ale dlatego, że architektura jest właśnie taka.