2016-02-24 10 views
6

Jak rozumiem, kod C jest kompilowany do kodu maszynowego (złożenia) na czyimś komputerze, i staje się plikiem exe, który może być uruchamiany na wielu różnych procesorach (maszynach). Ale skoro różne procesory mają swój własny unikalny kod assemblera, jak ten kod może działać? Czy skompilowany exe nie byłby w stanie uruchomić tylko jednego procesora?Jak można uruchomić kod C na różnych procesorach?

+5

Wiele różnych modeli procesorów może należeć do tej samej "rodziny" i korzystać z tego samego języka komputera. –

+7

To trochę tak, jak ten sam benzyn może być używany w wielu, ale nie we wszystkich, samochodach, mimo że każdy samochód ma własny silnik. –

+0

Ale plik exe nie może działać na wszystkich maszynach z systemem Windows, nawet jeśli mają one zupełnie inny procesor. – Melkor

Odpowiedz

14

Podczas kompilacji programu do kodu maszyny, należy wybrać zestaw instrukcji kodu maszynowego, być może tryb uruchamiania maszyny (jeśli dotyczy) i format, w którym przechowywany jest kod wynikowy.

Wszystkie te opcje ograniczają platformę docelową, na której można wykonać kod.

  • rozkazów zasadniczo zależy od typu procesora: x86 ("kompatybilny z IBM"), PowerPC, ARM, MIPS, DEC Alpha, Motorola 68k ... W każdej rodzinie procesora, istnieje wiele pod-funkcje i generacje do wyboru (np. dla x86 są i386, SSE, AVX, ...). Nowsze procesory mogą być w stanie wykonać kod ograniczony do starszych generacji, więc może istnieć wspólny podzbiór.

  • Tryb procesora na x86 zależy od środowiska: tryb rzeczywisty dla programów MS-DOS i wszystko, co uruchamiasz podczas uruchamiania, tryb chroniony, różne tryby adresowania mogą być dostępne w niektórych sytuacjach (tryb nierealny) ...

  • Format binarny musi być rozpoznawany przez system operacyjny lub bardziej ogólnie przez mechanizm ładowania: PE dla Windows, ELF dla współczesnego systemu Linux, a.out w dawnych czasach ... system może dostarczać ładowarki dla wielu formatów binarnych.

To tylko najbardziej podstawowy poziom parametrów platformy, które wybierzesz podczas kompilacji, a Twój program będzie działać tylko na platformach, które zgadzają się na ten wybór. Istnieje jednak wiele praktycznych ograniczeń dla programów rzeczywistych, takich jak interfejs systemów operacyjnych i dostępność bibliotek szkieletowych, które również muszą się zgadzać. Na przykład, chociaż nie jest trudno odczytywać i uruchamiać pliki binarne systemu Windows PE w systemie Linux, kod w nim zawarty nie ma sensu w systemie Linux, ponieważ używa on przerwań oprogramowania specyficznych dla systemu Windows. Jednak przechwytywanie i tłumaczenie tych jest całkiem możliwe, aby uruchomić te binaria na Linuksie.

+2

Również (konkretnie) format pliku PE zawiera pole, które jawnie ** określa **, dla jakiego procesora jest przeznaczony: "' Komputer "CPU, do którego przeznaczony jest ten plik. Określone są następujące ID procesora: .. . "(https://msdn.microsoft.com/en-us/library/ms809762.aspx). – usr2564301

+0

_ "Interfejs systemów operacyjnych i dostępność bibliotek szkieletowych, które również muszą się zgadzać" _ Myślę, że to jest kluczowa rzecz do rozważenia tutaj (dla OP): nawet jeśli większość komputerów korzysta z procesora x86, a oni (ogólnie) mówią tym samym językiem, często system operacyjny jest czynnikiem decydującym o przenośności skompilowanych programów. Windows exe nie może działać na OSX, ani na linuksie bez emulatora lub warstwy tłumacza/środowiska wykonawczego pomiędzy (tak jak Java jest skompilowana do uruchamiania na maszynie JVM, a nie bezpośrednio na sprzęcie) –

+0

@EliasVanOotegem: Tak. Na przykład wino przechwytuje wywołania systemowe systemu Windows i zapewnia odpowiednią implementację w systemie Linux oraz dostarcza podstawowe biblioteki Windows (zaimplementowane dla systemu Linux), aby można było uruchamiać wiele różnych programów systemu Windows w systemie Linux. (Wyobrażam sobie, że może zrobić to samo na MacOS i BSD?) –

Powiązane problemy