2009-10-04 23 views
14

Programuję od lat (głównie w języku Python), ale nie rozumiem, co dzieje się za kulisami podczas kompilowania lub wykonywania kodu.Nauka programowania języków programowania

W duchu numeru question zapytałem wcześniej o systemy operacyjne, szukam łagodnego wprowadzenia do inżynierii języka programowania. Chcę być w stanie zdefiniować i zrozumieć podstawy takich pojęć jak kompilator, interpreter, kod natywny, kod zarządzany, maszyna wirtualna i tak dalej. Jaki byłby zabawny i interaktywny sposób, aby się o tym dowiedzieć?

+2

Ostateczne pytanie dotyczące zasobów kompilatora na stronie SO: http: // stackoverflow.com/questions/1669/learning-to-write-a-compiler Istnieje kilka sugerowanych zasobów, które wymagają prostego podejścia: jeśli potrafisz programować, jesteś gotowy na naukę metod kompilatora. Nie bój się. Lubię tutorial Crenshaw. – dmckee

+0

^To jest doskonała lista zasobów. Dzięki. –

Odpowiedz

12

kod do wykonania w skrócie

programu (code) doprowadza się do kompilatora (lub tłumacza).

Znaki służą do tworzenia tokenów (+, identyfikatory, liczby), a ich wartość jest przechowywana w czymś zwanym tablicą symboli.

Te żetony składa się w formułę: (int a = 6 + b * c;). Głównie w postaci drzewa składni:

     = 
        /\ 
       / \ 
        a  + 
        /\ 
        / \ 
        6  * 
         /\ 
         b c 

Wewnątrz interpretatora drzewo jest wykonywane bezpośrednio.

Z kompilatorem drzewo zostaje ostatecznie przetłumaczone na kod pośredni lub kod assemblera.

Masz teraz co najmniej jeden "plik obiektowy". Zawierają one kod asemblera bez dokładnych skoków (ponieważ te wartości nie są jeszcze znane, szczególnie jeśli cele są w innych plikach obiektów). Pliki obiektowe są łączone razem z łącznikiem, który wypełnia puste miejsca dla skoków (ans referencji). Wyjściem linkera jest biblioteka (która również może być połączona) lub plik wykonywalny.

Po uruchomieniu pliku wykonywalnego dane programu są kopiowane do pamięci i istnieje inne połączenie z odpowiednimi lokalizacjami pamięci. A potem następuje kontrola do pierwszej instrukcji.

3

This site has a great series z wykładów na temat struktury i interpretacji programów komputerowych, która jest dokładnie tym, czego chcesz się nauczyć. Towarzyszący podręcznik jest również użyteczny, ponieważ nie czytałem go osobiście. Myślę, że oglądanie wykładów jest całkiem niezłe, dostaje około 60% drogi.

0

Można znaleźć wiele wykładów .Do przykład w iTunes U

2

Zaraz, to jest ogromny pytanie z tonami napisanych książek o tym wszystkim. Naprawdę wątpię, że dostaniesz przyzwoitą odpowiedź w SO na ten temat. Musisz dostać się do lokalnego sklepu z książkami lub odebrać kilka lekcji comp.

Aby daje szybki Intro:

  • Compiler: Program, który konwertuje napisany kod do instrukcji, które są natywnie rozumianych przez procesor.
  • Tłumacz: Program czytający napisany kod i "w locie" tłumaczy i podaje odpowiednie instrukcje rodzimego procesora.
  • Kod zarządzany: Kod uruchamiany na maszynie wirtualnej, np. aby zapewnić zgodność między platformami (Java).
  • Maszyna wirtualna: Program emulujący zachowanie, a raczej API pełnowymiarowego środowiska komputerowego. Między innymi daje to pewne korzyści bezpieczeństwa i kompatybilność z wieloma platformami.
4

kompilatory, interpretatory i maszyny wirtualne to tylko przykłady szczegółów implementacji. To, czego możesz szukać, to teoria języków programowania, gramatyka generatywna, tłumacze języków i prawdopodobnie potrzebujesz architektury komputerowej, aby powiązać teorię z implementacjami.

Osobiście dowiedziałem się od Sebesta's book. Daje bardzo szerokie wprowadzenie do tematu bez wchodzenia w najdrobniejsze szczegóły. Ma również dobry rozdział na temat historii języków programowania (~ 20 języków - 3 artykuły na język). Ma ładne wyjaśnienie gramatyki i teorii języków w ogóle. Ponadto daje dobre wprowadzenie do schematu, prologu i paradygmatów programowania (logiczne, funkcjonalne, imperatywne, zorientowane obiektowo).

^Koncentruje się bardziej na paradygmacie nadrzędnym niż na pierwszych dwóch.

1

Kiedy dowiedziałem się o programowaniu, gdzieś w drugiej połowie ubiegłego wieku, dowiedziałem się, że wszystko musi zostać zamienione na kod maszynowy. Języki skryptów decydowałyby o tym, który kod wywoływać w oparciu o skryptowy kod. Skompilowany kod zostanie najpierw skompilowany do kodu p, który oznacza wstępnie skompilowany kod, który musi być połączony z innym skompilowanym kodem w celu utworzenia pełnej aplikacji. Wcześniej podobał mi się Turbo Pascal, po prostu dlatego, że Turbo Pascal został skompilowany bezpośrednio do kodu machione i nie używał pośredniego p-kodu pośredniego. Oznacza to, że do Turbo Pascal 4.0, który stworzył *. Tpu skompilowane jednostki. Większość innych kompilatorów będzie zamiast tego kompilować do formatu .obj.

Po utworzeniu Java, coś stosunkowo nowego zaczęło być popularne. Zasadniczo kompilator Java kompiluje kod do jakiegoś binarnego pliku skryptu. Skrypt ten można następnie zinterpretować, chociaż wkrótce ten mechanizm również się zmienił.

W dzisiejszych czasach tłumacze prawie wymarli. Większość języków skryptowych zostanie najpierw skompilowana do kodu maszynowego, kod maszynowy jest następnie przechowywany w niektórych pamięciach podręcznych, a zatem może być wykonywany naprawdę szybko, bez konieczności ponownego interpretowania powtarzających się instrukcji. Działa to dobrze dla skryptów tekstowych i binarnych. PHP byłoby przykładem skryptu tekstowego. Java i .NET są skryptami binarnymi, ponieważ zazwyczaj kompilujesz kod do tego formatu skryptu binarnego. (Będą to inaczej, ale wydaje mi się, że binarne skrypty brzmią lepiej.)

Zasadniczo chodzi o to, aby przekonwertować kod na kod maszynowy, wykorzystując wszelkie dostępne środki. Było wiele sposobów na zrobienie tego i jest to trochę skomplikowane, aby wszystko było jasne.

Pamiętam też czas, kiedy mogłem napisać aplikację C++, w której instrukcje SQL byłyby zlokalizowane wewnątrz samego kodu. Było to bardzo praktyczne, ale wymagało preprocesora, który najpierw przeanalizowałby instrukcje SQL z kodu, aby przekonwertować to na inne instrukcje C++ i zastępując instrukcje SQL bardziej złożonymi poleceniami C++. Potem cała kompilacja zostanie skompilowana do p-kodu. Następnie musisz połączyć go z dodatkowymi bibliotekami SQL i wreszcie masz plik wykonywalny.

4

W kategoriach podstawowych piszesz: source files. Są to fantazyjne pliki tekstowe, które są pobierane przez compiler, które wyprowadzają pewną formę kodu wykonywalnego (co wykonuje, zależy od typu kodu, o którym mówisz).Kompilator ma kilka części:

  • Niektóre formy preprocessing na pliku, który obsługuje makra i podobne (jak z C).
  • A A parser, która pobiera pliki źródłowe, sprawdza, czy są one zgodne z regułami syntaktycznymi Twojego języka i przekształca plik w strukturę danych w pamięci, która jest łatwiejsza do manipulowania przez inne części programu. Nazywa się to drzewem Abstract Syntax lub AST.
  • Pewna forma analizy AST, która weryfikuje, czy faktycznie napisany kod nie narusza żadnych reguł języka (np. Rekursji w języku, który jej nie obsługuje), a także wielu innych rzeczy.
  • Optimization, takie jak optymalizacja ogona, optymalizacja pętli i wiele innych rodzajów optymalizacji.
  • Code generation, który jest faktycznym procesem pobrania ostatecznej informacji AST i wszelkich innych wygenerowanych danych i przekształcenia go w plik binarny, który można wykonać lub zinterpretować.

Interpreter:

tłumacza to program, który odbywa się w jakiejś formie danych binarnych, które reprezentuje program nie skompilowany do kodu wykonywalnego bezpośrednio przez maszynę docelową i uruchamia polecenia wewnątrz. Przykładami są python, java i lua.

Native code:

Jest to kod, który został opracowany w natywnych instrukcji bezpośrednio wykonywalne przez maszynę docelową. Na przykład; jeśli używasz architektury x86, to C++ skompiluje się do pliku wykonywalnego, który jest zrozumiały dla procesora.

Virtual Machine:

ta jest na ogół zbudowany z programu symulacji konstrukcji i pracy procesora. Może być tak proste, jak program czytający w języku bytecode i uruchamia operacje w języku macierzystym w oparciu o polecenia reprezentowane przez kod bajtowy (chociaż wywołanie tego może być rozciągnięte na maszynie wirtualnej) lub może być tak skomplikowane, jak całkowite symulowanie zachowania procesor i wszystkie powiązane urządzenia peryferyjne.

te inne odpowiedzi mają w sobie dobre strony, ale te informacje i linki powinny zacząć. Wszelkie inne pytania, po prostu zapytaj!

(Większość Ten artykuł został napisany z pomocą wikipedii choć niektórzy został napisany z pamięci)

1

Ten series of lectures ze Stanford obejmuje kilka języków programowania do bitów i nakrętek, w tym Python (choć mam tylko obejrzałem kilka C).

2

Jeśli chcesz wiedzieć, jak przejść z kodu źródłowego do czegoś, co faktycznie działa na komputerze docelowym, powinieneś otrzymać kopię słynnego Red Dragon Book. Użyłem go do budowania analizatorów i analizatorów leksykalnych. Choć pochodzi z 1986 roku, i jestem pewien, że nastąpił postęp w tym okresie, o ile mogę powiedzieć, że nie został przekroczony jako tekst.

Wygląda na to, że Addison-Wesley zrobił przedruk swojego poprzednika, Księgi Zielonego Smoka, i przekazuje go jako coś nowego, więc uważaj, aby uzyskać oryginalny artykuł.

Powiązane problemy