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)
Odpowiedzi:
Podejście binarne typu tłuszcz ma sens, jeśli:
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.
źródło
Internetowa logistyka dystrybucji wieku dezinwestytuuje binaria tłuszczu na dwa sposoby:
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.
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.
źródło
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
libc
lublibstdc++
). 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).
źródło