Czym dokładnie jest cel kompilacji?

17

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.

ScionOfBytes
źródło
Radzę ci przeczytać artykuły o kompilatorach.
4
Artykuły na temat kompilatorów zakładają, że już o tym wiesz. To rozsądne pytanie.
Karl Bielefeldt
Myślałem więcej o artykułach w stylu wikipedii. I zgadzam się, że pytanie jest rozsądne. To była tylko sugestia, a nie krytyka.
4
Pytanie jest rozsądne, ale źle napisane. Termin „cel” może mieć różne znaczenia, dlatego poleciłbym podać odniesienie lub więcej kontekstu w miejscu, w którym go usłyszałeś lub o nim przeczytałeś.
Doc Brown
@DocBrown Słyszałem o tym w wielu kontekstach, ale ostatnio w kontekście asemblera jako celu kompilacji dla innych języków.
ScionOfBytes

Odpowiedzi:

17

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 .

Blrfl
źródło
2
Na marginesie warto wspomnieć, że termin ten jest również używany w bardziej uogólnionej formie w kontekście systemów kompilacji - celem jest wynik z dowolnego etapu kompilacji, który niekoniecznie musi być akcją kompilacji (np. tworzenie instalatora).
BartoszKP
2
kompilatory są tłumaczami, a nie filtrami.
1
@Birfl. oczywiście. „tr” oznacza tłumaczyć, a nie filtrować. filtry nie są tłumaczami, to po prostu oczywiste.
2
@Birfl: nie idę przez wikipedię. po prostu wytwarzanie jednego strumienia z drugiego nie jest niczym. rozróżnienie między filtrami a tłumaczami jest bardzo dobrze znane. filtr zawiera / wyklucza na podstawie predykatu. nie przekształca się. filtrować listę liczb całkowitych według parzystej? i otrzymujesz nietransformowane nawet liczby całkowite. przetłumacz tę samą listę za pomocą inc, a otrzymasz przekształconą wersję oryginalnej listy.
1
twoje konto kompilacji jest w porządku, z wyjątkiem terminu „filtr”.
4

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).

Chris Cirefice
źródło
0

WebAssemby jest czymś najnowszym i największym, który konwertuje kod c / c ++ w formacie binarnym.

  • WebAssembly ma działać z szybkością natywną, korzystając ze wspólnego sprzętu. Zaprojektowano go do integracji z platformą internetową.

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ół.

# include<stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    int res = square(4);
    printf("%d\n",res);
  return 0;
}
  • Zdefiniuj przenośny, binarny format oszczędzający czas i ładowanie, który będzie służył jako cel kompilacji, który można skompilować w celu wykonania z natywną szybkością, korzystając ze wspólnych możliwości sprzętowych dostępnych na wielu platformach, w tym na urządzeniach mobilnych i IoT.

Kilka podstawowych informacji na temat hosta i celu, jak język programowania jest tłumaczony na 10101010.

host=>pc :(windows, iOS, Linux, zOS, Solaris..etc)
target=>CPUhardware: (Intel x86, ARM, PowerPC, etc)
  1. 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ć.

  2. Asembler i linker są częścią łańcucha narzędzi, co oznacza, że ​​zazwyczaj są dostarczane razem z kompilatorem.

  3. 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.

WebAssembly: https://github.com/WebAssembly/design

zwisający wskaźnik
źródło