Ciągle słyszę ten termin i wszystkie wyszukiwania w Google prowadzą mnie do artykułów na temat kompilatorów. Chcę tylko zrozumieć, co oznacza pojęcie cel kompilacji: |
AKTUALIZACJA: Aby dać kontekst: słyszałem, że powiedział, że asembler jest celem kompilacji dla innych języków, takich jak C, C ++, Rust itp.
Odpowiedzi:
Kompilatory to w istocie tłumacze, którzy przyjmują dane wejściowe w jednym języku i wytwarzają dane wyjściowe w innym. Na przykład kompilator Eiffel Software pobiera dane w języku Eiffla i tworzy C. GCC dla Intela odczytuje dane w języku C i tworzy zespół x86. Asembler GAS dla Intela bierze asembler x86 i wytwarza kod obiektowy x86. Wszystkie te trzy rzeczy są technicznie kompilatorami.
Niezależnie od formatu dane wejściowe odczytywane przez kompilator nazywane są źródłami, a dane wyjściowe - celami . Ten ostatni termin pochodzi z jednej z jego definicji „zamierzony wynik”.
Większość kompilatorów jest zaprojektowana do tworzenia kodu asemblera lub kodu obiektowego dla konkretnego procesora lub architektury. Z tego powodu cel jest często używany w odniesieniu do samej architektury, a nie formatu wyjściowego.
Cel kompilatora nie musi być taki sam jak architektura, w której działa, aw przypadkach, w których tak się dzieje, program nazywa się kompilatorem krzyżowym . (Na przykład GCC można zbudować tak, aby działał na systemach x86 w celu kompilacji C w zestawie ARM.)
Ponadto istnieją pojedyncze kompilatory zdolne do generowania danych wyjściowych dla różnych celów w zależności od danych wejściowych, takich jak przełączniki w wierszu poleceń. Są to tak zwane kompilatory z wieloma celami .
źródło
W tłumaczeniu, bez względu na to, czy język jest językiem naturalnym, takim jak angielski, czy sztucznym, takim jak C, używamy źródła i celu terminologii, aby mówić o danych wejściowych i wyjściowych systemu tłumaczeń. W tłumaczeniu na język naturalny system jest kompetentnym ludzkim mózgiem zdolnym do tłumaczenia między dwoma językami. W językach programowania jest to kompilator.
Zatem źródłem kompilatora jest język programowania (C), podczas gdy celem jest kod bajtowy (instrukcje na poziomie maszyny). Często używamy celu w kompilacji, ponieważ różne systemy (architektury CPU) mają różne zestawy instrukcji, np. ARM, MIPS itp. Kompilator musi wiedzieć, który zestaw instrukcji jest celem, aby mógł utworzyć poprawne wyjście (kod bajtowy).
źródło
WebAssemby jest czymś najnowszym i największym, który konwertuje kod c / c ++ w formacie binarnym.
Oto link, w którym można zobaczyć jedną z aplikacji, jak szybko konwertuje prosty program czynnikowy w kodzie maszynowym.
Sprawdź tę bestię https://godbolt.org/
Możesz użyć tego przykładowego programu do uruchomienia w tej witrynie, aby zobaczyć zespół.
Kilka podstawowych informacji na temat hosta i celu, jak język programowania jest tłumaczony na 10101010.
GCC przekształca kod C / C ++ w kod asemblera. Narzędzie o nazwie „asembler” konwertuje kod asemblera na kod maszynowy, a narzędzie o nazwie „linker” łączy wiele plików kodu maszynowego w jeden plik wykonywalny (.EXE w systemie Windows). Większość tych kompilatorów pozwala na zapisanie wynikowego kodu asemblera w pliku, dzięki czemu można obejrzeć kod asemblera lub go zmodyfikować.
Asembler i linker są częścią łańcucha narzędzi, co oznacza, że zazwyczaj są dostarczane razem z kompilatorem.
Niektóre kompilatory (jak Microsoft) jednak bezpośrednio konwertują kod C / C ++ na język maszynowy, więc nie jest już potrzebny asembler. Wiele z tych kompilatorów nie jest w stanie utworzyć kodu asemblera, więc nie można zapisać kodu asemblera w pliku.
Nawiasem mówiąc: istnieją nawet kompilatory (nie dla C / C ++, ale dla innych języków programowania), które bezpośrednio tworzą plik .EXE, więc nie jest wymagany linker.
źródło