Czy jest jakaś różnica między nimi? Zgodnie z książką Ullmana , kompilatory konwertują jeden język na inny (zwykle na niskim poziomie), podobnie jak asembler. Czym się różnią?
Czy jest jakaś różnica między nimi? Zgodnie z książką Ullmana , kompilatory konwertują jeden język na inny (zwykle na niskim poziomie), podobnie jak asembler. Czym się różnią?
Odpowiedzi:
Asembler tłumaczy kod asemblera na kod maszynowy. Tłumaczenie jest mechaniczne i może być wykonane tylko w jeden sposób. Natomiast kompilator ma większą swobodę podczas kompilacji odpowiedniego języka programowania - może na przykład optymalizować, a nawet nieoptymalizujące kompilatory wytwarzają inny kod. Kompilatory można również pisać w sposób, który oddziela „front-end” (odpowiadający językowi programowania) i „back-end” (odpowiadający architekturze komputerowej), podczas gdy w asemblerze oba są zawsze takie same.
Najważniejsze jest to, że pisanie kompilatora jest bardziej zabawne niż asembler. Języki asemblera są zwykle zaprojektowane tak, aby były prawie trywialne do analizowania i sprawdzania typu i zwykle obejmują wiele generatorów opartych na tabeli („kod operacji dodawania to 01110”, „dla instrukcji ładowania rejestr operandu docelowego jest określony bitami od 17 do 21 „). Zwykle najciekawszą częścią asemblera jest część, która przekształca symboliczne etykiety na liczby.
Jednak większość asemblerów może wykonać niewielką arytmetykę (dodając na przykład symboliczne etykiety z małymi stałymi), a większość asemblerów ma lub jest zintegrowana z narzędziem do przetwarzania makr. (W większości systemów uniksowych funkcja makr jest faktycznie zapewniana przez uruchomienie preprocesora C nad zestawem przed przekazaniem go do właściwego asemblera).
Asembler MIPS musiał pójść o krok dalej i podjął kilka interesujących decyzji dotyczących generowania kodu i dokonał niewielkiej optymalizacji. Język maszynowy MIPS wymaga na przykład różnych sekwencji kodu, aby załadować różne stałe, więc asembler musiał wybrać sekwencję kodu po zbudowaniu stałej . Co więcej, kod maszynowy MIPS miał pojęcie szczelin opóźniających , ale asembler był odpowiedzialny za ich wyodrębnienie i przedstawienie kompilatorowi bardziej „normalnego” języka asemblera abstrakcyjnego. Asembler MIPS musi więc wykonać szereg lokalnych instrukcji.
Rozróżnienie jest dodatkowo rozmyte przez niektóre Norman Ramsey pracy „s, w szczególności jego C-- przenośnego asemblerze. (Odpowiedni artykuł to Ramsey i Peyton Jones, „Pojedynczy język średniozaawansowany, który obsługuje wiele implementacji wyjątków”, Prog. Lang. Impl. I Dsgn. , (PLDI-21): 285–298, 2000 ). I na koniec jest również Wpisane Zgromadzenie Język David Walker i Greg Morrisett z asemblera, które mogą zagwarantować bezpieczeństwo pamięci.
Trochę uproszczonej odpowiedzi tutaj, rzeczywistość jest bardziej skomplikowana. Spodziewałbym się, że różnica między asemblerem (A) i kompilatorem (C) będzie między innymi:
Zwykle nazywamy język asemblera „niskim poziomem”, a język źródłowy kompilator rozumie „wysoki poziom” (jest to jednak rażące uproszczenie, ale nadal).
W języku asemblera możesz jako przykład wykonać operację dodawania, mówiąc:
W języku wysokiego poziomu możesz napisać:
Może to skutkować jedną instrukcją lub setkami instrukcji w zależności od szeregu okoliczności. Jednym z nich jest procesor, dla którego kompilator tworzy instrukcje.
Jak widać język źródłowy asemblera jest najczęściej: (A) jeden wiersz kodu źródłowego daje jeden wiersz kodów procesora CPU i bardzo zależy od tego, na który procesor celujesz. Kompilator języka wysokiego poziomu (C) obsługuje wszystkie te szczegóły - jeden wiersz kodu źródłowego może być zerowy, jeden lub wiele kodów operacyjnych procesora, a kompilator obsługuje szczegóły tego, co może zrobić procesor.
Obecnie kompilator często składa się z kilku różnych etapów. Można je nazwać frontend / backend lub być nazywane innymi rzeczami. Zwykle postrzegam je jako cztery etapy:
Pisanie dobrych kompilatorów to zawód wymagający wysokich umiejętności - tworzenie kompilatora w języku zabawek może być wykonane po południu przez amatora (lub cóż, nieco dłużej).