Język maszynowy

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Przykład kodu maszynowego (kolumna druga rozpoczynająca się od 6C 36 00) uwidocznionego za pomocą monitora kodu maszynowego

Język maszynowy, kod maszynowyzestaw rozkazów procesora, w którym zapis programu wyrażony jest w postaci liczb binarnych stanowiących rozkazy oraz ich argumenty.

Był to jedyny język programowania komputerów zerowej generacji z wyjątkiem komputera Z4, a powszechny w początkowym okresie rozwoju komputerów pierwszej generacji.

Kod maszynowy może być generowany w procesie kompilacji (w przypadku języków wysokiego poziomu) lub asemblacji (w przypadku języków niskiego poziomu). W trakcie procesu generowania kodu maszynowego często tworzony jest przenośny kod pośredni zapisywany w pliku obiektowym. Następnie kod ten pobrany z pliku obiektowego poddawany jest konsolidacji (linkowaniu) z kodem w innych plikach, w celu utworzenia ostatecznej postaci kodu maszynowego, który będzie zapisany w pliku wykonywalnym.

Język maszynowy jest nieprzenośny, ponieważ każda architektura procesora ma swój własny model programowy, a więc m.in. listę rozkazów maszynowych.

Kod maszynowy[edytuj | edytuj kod]

Kod maszynowy to postać programu komputerowego (zwana postacią wykonywalną lub binarną) przeznaczona do bezpośredniego lub prawie bezpośredniego wykonania przez procesor. Jest ona dopasowana do konkretnego typu procesora i wyrażona w postaci rozumianych przez niego kodów rozkazów i ich argumentów. Jest to postać trudna do bezpośredniej analizy przez człowieka, dlatego by ułatwić sobie zadanie, używa się monitorów kodu maszynowego lub deasemblerów.

W systemach z rodziny DOS/Windows w kodzie maszynowym zapisane są programy umieszczone w plikach typu com i exe. Pliki com mogą mieć maksymalnie wielkość 64 kB, więc wszystkie odwołania w programie są bliskie, toteż problemy z odwołaniami dalekimi nie istnieją. Pliki typu exe zawierają ponadto dodatkowe informacje, np. adresy dalekich skoków, które są ustawiane w momencie wczytywania programu do pamięci komputera (w 16-bitowym trybie pracy procesora), a także informacje potrzebne do łączenia programu z bibliotekami dynamicznymi (DLL). W 32- i 64-bitowym trybie procesora każdy uruchomiony proces (program) ma przydzieloną własną wirtualną przestrzeń adresową, co izoluje go od innych programów i czyni go niezależnym.

Kod maszynowy nie może być wykonywany przez procesory innego typu, niż ten, dla którego został napisany. Niesie to za sobą wiele problemów związanych z przenośnością oprogramowania. Aby ich uniknąć rozpowszechnia się programy w formie kodu źródłowego (np. oprogramowanie FLOSS) lub w formie kodu pośredniego (np. Java, .NET).

Generowanie kodu maszynowego następuje za pomocą translatora, który przekształca czytelny dla programisty zapis w języku programowania w odpowiadające mu kody instrukcji maszynowych. Postać i treść kodu maszynowego zależy nie tylko od kodu źródłowego programu, ale też od translatora, systemu operacyjnego, wersji bibliotek, typu procesora i jego języka maszynowego. Języki wysokiego poziomu wraz z odpowiednimi bibliotekami i kompilatorami umożliwiającą użycie tego samego programu źródłowego do budowy programu pracującego na różnych systemach operacyjnych, różnych procesorach, itd. Niepoprawnie napisany kod źródłowy może powodować problemy podczas procesu translacji na niektóre postacie kodu maszynowego.

Jeśli chodzi o kod źródłowy w asemblerze, to jest silnie związany z konkretną architekturą procesora i zazwyczaj nie można go uruchomić na innej bez wprowadzania zmian.