Dlaczego „grubych plików binarnych” nie stosuje się szerzej w aplikacjach wieloplatformowych?

27

O ile mi wiadomo, tak zwane „duże pliki binarne” - pliki wykonywalne zawierające kod maszynowy dla wielu systemów - są naprawdę używane tylko na komputerach Apple, a nawet tam wygląda na to, że korzystały z nich tylko dlatego, że musiały przejść z PowerPC do x86.

Obecnie wiele programów jest wieloplatformowych i wydaje się, że utworzenie jednego grubego pliku binarnego byłoby pod wieloma względami prostsze niż śledzenie kilkunastu różnych pobrań dla każdej kombinacji systemu operacyjnego i architektury, nie wspominając już o przenoszeniu klientowi, którego chce.

Mogę wymyślić wiele domysłów, dlaczego takie podejście nigdy się nie przyjęło, na przykład:

  • Brak narzędzi do kompilacji wielu plików binarnych dla wielu systemów operacyjnych jest niemożliwy
  • Musisz przetestować kod w każdym systemie operacyjnym, więc musisz już mieć systemy, które mogą kompilować się natywnie dla każdego systemu operacyjnego
  • Najwyraźniej programy 32-bitowe „po prostu działają” na komputerach 64-bitowych
  • Łączenie dynamiczne działa inaczej w każdym systemie operacyjnym, więc „gruba biblioteka” może nie działać, nawet gdyby „gruba aplikacja” działała

Ale ponieważ zawsze pracuję z biblioteką lub frameworkiem, który ukrywa przede mną wszystkie szczegóły związane z systemem operacyjnym i architekturą, nie wiem, czy to prawda, ani czy jest jeszcze więcej problemów, których nie znam o. Więc, jakie są rzeczywiste powody binarne tłuszczowe nie są powszechnie wykorzystywane do tworzenia multi-architekturę i / lub oprogramowania multi-OS? (poza Apple)

Ixrec
źródło
5
Czy istnieje poważny problem, który to rozwiązałoby? Gdy przechodzę do strony pobierania głównych aplikacji wieloplatformowych, automatycznie wykrywają one używany system operacyjny i wskazują właściwy kierunek. Użytkownicy systemu Linux mają menedżerów pakietów. Wydaje mi się, że wszystko, co by to zrobiło, to powiększenie rozmiarów pobierania.
Doval
4
Nie wiem dużo o grubych plikach binarnych, ale czy nie potrzebują one wsparcia z systemu operacyjnego (szczególnie z modułu ładującego)? Nie widzę więc odwołania do „oprogramowania dla wielu systemów operacyjnych”, ponieważ nie ma możliwości, aby dostawcy systemów operacyjnych uzgodnili format interoperacyjny.
7
Ponieważ mamy kod bajtowy i maszyny wirtualne, które lepiej rozwiązują ten problem.
Robert Harvey
2
Zastanawiam się, czy w ogóle można stworzyć plik wykonywalny polyglota, który działa zarówno w systemie Windows, jak i niektórych systemach * NIX?
aaaaaaaaaaaa
2
Dla rekordu historycznego, pliki binarne tłuszczu pochodzą z przejścia 68k -> PPC, a nie przejścia PPC -> x86.
Mark

Odpowiedzi:

9

Podejście binarne typu tłuszcz ma sens, jeśli:

  1. Obie architektury współistnieją w tym samym systemie
  2. Wszystko inne jest mniej więcej takie samo dla wszystkich architektur

Dlatego nie są używane do kodu wieloplatformowego (oba kryteria nie mają zastosowania) lub do obsługi różnych dystrybucji Linuksa za pomocą jednego pliku binarnego (1. nie dotyczy, 2. dotyczy do pewnego stopnia).

W systemie Linux oba kryteria będą nadal obowiązywać, jeśli chcesz obsługiwać zarówno 32-bitowy, jak i 64-bitowy w jednej dystrybucji Linuksa . Ale po co zawracać sobie głowę, jeśli trzeba już obsługiwać wiele dystrybucji?

W systemie Windows przejście z wersji 16-bitowej na 32-bitową nastąpiło początkowo wraz z wprowadzeniem systemu Windows NT, który pod wieloma względami był dużym odchyleniem od 16-bitowego świata Windows (pamięć wirtualna, kontrola dostępu dla wielu użytkowników, zmiany API ...). Po tych wszystkich zmianach lepiej było trzymać światy 32-bitowe i 16-bitowe oddzielnie. NT miał już koncepcję „podsystemów” obsługujących różne „systemy operacyjne” (Win32, POSIX), więc uczynienie Win16 trzecim podsystemem było prostym wyborem.

Przejście z Win32 na Win64 nie wymagało podobnych poważnych zmian, ale Microsoft i tak zastosował podobne podejście, prawdopodobnie dlatego, że zostało to sprawdzone i wypróbowane.

oefe
źródło
11

Internetowa logistyka dystrybucji wieku dezinwestytuuje binaria tłuszczu na dwa sposoby:

  1. Punkt sprzedaży nie obejmuje dóbr fizycznych, a zatem faworyzuje mniej jednostek SKU, jak ma to miejsce, gdy produkty konkurują o powierzchnię sklepową, a klienci mają ograniczone możliwości dokonania zakupu.

  2. Koszty przepustowości sprzyjają dostarczeniu minimum niezbędnych bitów dla konkretnego pakietu oprogramowania. Wysyłka grubego pliku binarnego w dół zmniejsza zarówno zadowolenie klienta, jak i efektywność infrastruktury sprzedawcy.

Tłuszczowe pliki binarne miały większy sens, gdy oprogramowanie zmniejszało fizycznie nośniki.

Ben Rudgers
źródło
1
W przypadku wdrożeń oprogramowania koszt przepustowości i tak jest obecnie prawie nieistotny. Jeśli nadal występuje problem, poczekaj jeszcze 5 minut.
Robert Harvey
2
@RobertHarvey, ale to 5 minut Wolałbym nie czekać.
Arturo Torres Sánchez
2

Jednym z powodów, dla których binarne pliki binarne się nie powiodły, jest to, że istnieje więcej niż specyfikacja ABI i procesora (właściwie zestaw instrukcji ), aby unieważnić binarny plik wykonywalny. Binarny plik wykonywalny często zależy w dużej mierze od innych zasobów, w szczególności bibliotek dynamicznych (patrz piekło DLL ), usług zewnętrznych (pomyśl o DBMS takich jak PostGreSQL ....), konfiguracji systemu (np. Lokalizacji plików konfiguracyjnych /etc/w systemie Linux) itp. . etc ....

Tylko w przypadku systemu Linux / x86-64 w praktyce trudno jest sprawić, aby binarny plik wykonywalny mógł działać w każdej dystrybucji Linuksa (ponieważ często jest powiązany z konkretnymi wersjami libclub libstdc++). FatELF istnieje, ale nie jest bardzo udany.

Nawet przy dobrze zdefiniowanym ABI i zestawie instrukcji optymalizacja byłaby różna dla różnych marek procesorów - patrz flaga -mtune=native optymalizacji x86 GCC .

Apple częściowo udało się mieć binarne pliki binarne tylko dlatego, że zapewniają bardzo zamknięty ekosystem zasobów obliczeniowych.

Darmowe oprogramowanie to kolejny sposób rozwiązania problemu związanego z przenośnością: jeśli aplikacja jest wolnym oprogramowaniem (starannie zakodowanym pod kątem przenośności), dość łatwo można ją przenieść do podobnych systemów. I nawet jeśli oryginalny kod źródłowy nie działa zgodnie z przeznaczeniem w twoim systemie, możesz go dostosować (lub zapłacić komuś za wykonanie pracy) zwykle dość łatwo (oczywiście darmowe oprogramowanie powiązane z konkretnym systemem operacyjnym lub ABI lub procesorem nie jest łatwe do port, zapłacisz za to więcej wysiłków). Pomagają również standardy takie jak POSIX lub Linux Standard Base .

Możesz zapłacić (lub poprosić) kogoś o przeniesienie (wolnego) oprogramowania z dostępnym kodem źródłowym, ale przeniesienie binarnego pliku wykonywalnego jest nierealne.

W końcu istnieje kilka ram ułatwiających przenoszenie na kilka systemów operacyjnych (pod warunkiem, że dostępny jest kod źródłowy), np. Qt i POCO .

Nawet użycie dobrze określonego kodu bajtowego, takiego jak JVM, nie zawsze jest gwarancją przenośności: niektóre aplikacje Java są znane z tego, że nie są przenośne (np. Ponieważ oczekują określonej hierarchii plików i nazewnictwa).

BTW, systemy komputerowe są dziś prawdopodobnie znacznie mniej heterogeniczne niż w latach 80. i na początku lat 90. (lub w erze komputerów mainframe).

W końcu grube pliki binarne są grube: wydasz dużo zasobów (czas kompilacji, przepustowość, rozmiar pliku wykonywalnego) na problem z przenośnością, który może nie dotyczyć wielu osób. Pamiętaj o aforyzmie: „nie ma przenośnego oprogramowania, tylko oprogramowanie, które zostało przeniesione” (na niektóre systemy).

Basile Starynkevitch
źródło
4
Nie zgadzam się z opinią, że uczynienie oprogramowania „bezpłatnym” czyni go również łatwym do przenoszenia.
Robert Harvey
3
Nie sprawia, że ​​oprogramowanie jest przenośne, ale pozwala komuś poświęcić wysiłek na przeniesienie go na inną platformę (czego nie można realistycznie zrobić, jeśli nie masz dostępu i prawa do modyfikacji kodu źródłowego)
Basile Starynkevitch
2
@RobertHarvey może nie istnieć zasadnicze ogniwo w zasadzie, ale istnieje kilka całkowicie pragmatycznych powodów, dla których Wolne Oprogramowanie rozprzestrzeniło się bardzo szeroko na tak wielu platformach i stworzyło tak wiele narzędzi do budowania między platformami i łańcuchów narzędzi.
itsbruce
Aplikacja zamkniętego źródła, która całkowicie zależy od otwartych, przenośnych platform i bibliotek, będzie nieco łatwiejsza do przeniesienia na inne platformy przez właściciela aplikacji zamkniętego źródła. Mówię to na podstawie mojej rozkoszy z pierwszej ręki, gdy dowiedziałem się, że „kodowanie do stylu OpenCV” jest wszystkim, czego potrzebujesz (na potrzeby przetwarzania obrazu). Oczywiście GUI nadal wymaga innych frameworków, takich jak Qt itp. (Chociaż nie mam doświadczenia z pierwszej ręki).
rwong
4
@RobertHarvey Nie. Darmowe oprogramowanie, które jest absolutnie bałagan do portu nadal absolutny bałagan do portu - po prostu zwiększyć powierzchnię, w której może złapać kogoś, kto dba o użyciu go na określonej architekturze lub OS wystarczy do portu to, czy wskazują ścieżkę, które mogłyby uczyń przenoszenie czegoś, co nie powoduje krwawienia.
Tim Post