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.


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 .


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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.