• Artykuły
  • Forum
  • Ciekawostki
  • Encyklopedia
  • Kompilator



    Podstrony: [1] 2 [3] [4]
    Przeczytaj także...
    Interpreter – program komputerowy wykonujący inne programy. Jest kluczowym elementem znacznej części implementacji języków skryptowych oraz języków kompilowanych do kodu bajtowego. Programista, zwany też potocznie koderem to osoba, która tworzy programy komputerowe w pewnym języku programowania. Termin ten może odnosić się także do specjalisty w jednej dziedzinie programowania. Większość programistów zna co najmniej kilka języków programowania (np. C, C++, Java), lecz specjalizuje się tylko w wybranych z nich. Nazwa głównego języka jest często dodawana do nazwy stanowiska, np. programista C++, aby podkreślić specjalizację.
    Trójetapowa struktura kompilatorów[ | edytuj kod]
    Główne etapy struktury kompilatorów

    Niezależnie od rzeczywistej ilości faz w strukturze kompilatorów, fazy te mogę być podzielona na 3 etapy nazywane front-endem, middle-endem i back-endem. Front-end weryfikuje składnię i semantykę w zależności od danego języka programowania. Middle-end wykonuje optymalizacje kodu, które są niezależne od docelowej architektury procesora. Back-end wykonuje dalsze analizy, transformacje i optymalizacje, które są specyficzne dla docelowej architektury procesora.

    COBOL (ang. COmmon Business Oriented Language) – język programowania stworzony z głównym przeznaczeniem do prac programistycznych w dziedzinach ekonomii i biznesu.Język wysokiego poziomu (autokod) – typ języka programowania, którego składnia i słowa kluczowe mają maksymalnie ułatwić rozumienie kodu programu dla człowieka, tym samym zwiększając poziom abstrakcji i dystansując się od sprzętowych niuansów. Kod napisany w języku wysokiego poziomu nie jest bezpośrednio „zrozumiały” dla komputera – większość kodu stanowią tak naprawdę normalne słowa, np. w języku angielskim. Aby umożliwić wykonanie programu napisanego w tym języku należy dokonać procesu kompilacji.

    Przykład kompilatora[ | edytuj kod]

    Następujący program implementuje bardzo prosty jednoprzebiegowy kompilator napisany w języku C. Ten kompilator kompiluje wyrażenia zdefiniowane w notacji infiksowej do ONP, a także do asemblera. Kompilator realizuje strategię rekurencyjnego zagłębiania się w wyrażenie. Każde wywołanie funkcji odpowiada napotkaniu symbolu nieterminalnego należącego do gramatyki języka.

    Gramatyka formalna – sposób opisu języka formalnego, czyli podzbioru zbioru wszystkich słów skończonej długości nad danym alfabetem.Analiza semantyczna w teorii kompilatorów to faza procesu kompilacji, wykonywana po analizie syntaktycznej, a przed generowaniem kodu, w której sprawdzana jest poprawność programu na poziomie znaczenia poszczególnych instrukcji oraz programu jako całości. Analiza semantyczna najczęściej operuje na drzewie składni, do którego dodaje dodatkowe informacja, np. typy wartości.
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MODE_POSTFIX 	0
    #define MODE_ASSEMBLY 	1
    
    char lookahead;
    int pos;
    int	compile_mode;
    char expression[20+1];
    
    void error()
    {
            printf("Syntax error!\n");
    }
    
    void match( char t )
    {
            if( lookahead == t )
            {
                    pos++;
                    lookahead = expression[pos];
            }
            else
                    error();
    }
    
    void digit()
    {
            switch( lookahead )
            {
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
    			if( compile_mode == MODE_POSTFIX )
    				printf("%c", lookahead);
    			else
    				printf("\tPUSH %c\n", lookahead);
    
                            match( lookahead );
                            break;
                    default:
                            error();
                            break;
            }
    }
    
    void term()
    {
            digit();
            while(1)
            {
                    switch( lookahead )
                    {
                            case '*':
                                    match('*');
                                    digit();
    
                                    printf( "%s", compile_mode == MODE_POSTFIX ? "*"
    					: "\tPOP B\n\tPOP A\n\tMUL A, B\n\tPUSH A\n");
    
                                    break;
                            case '/':
                                    match('/');
                                    digit();
    
                                    printf( "%s", compile_mode == MODE_POSTFIX ? "/"
    					: "\tPOP B\n\tPOP A\n\tDIV A, B\n\tPUSH A\n");
                                    break;
                            default:
                                    return;
                    }
            }
    }
    
    void expr()
    {
            term();
            while(1)
            {
                    switch( lookahead )
                    {
                            case '+':
                                    match('+');
                                    term();
    
                                    printf( "%s", compile_mode == MODE_POSTFIX ? "+"
    					: "\tPOP B\n\tPOP A\n\tADD A, B\n\tPUSH A\n");
                                    break;
                            case '-':
                                    match('-');
                                    term();
    
                                    printf( "%s", compile_mode == MODE_POSTFIX ? "-"
    					: "\tPOP B\n\tPOP A\n\tSUB A, B\n\tPUSH A\n");
                                    break;
                            default:
                                    return;
                    }
            }
    }
    
    int main ( int argc, char** argv )
    {
            printf("Please enter an infix-notated expression with single digits:\n\n\t");
            scanf("%20s", expression);
    
            printf("\nCompiling to postfix-notated expression:\n\n\t");
    	compile_mode = MODE_POSTFIX;
            pos = 0;
            lookahead = *expression;
            expr();
    
            printf("\n\nCompiling to assembly-notated machine code:\n\n");
            compile_mode = MODE_ASSEMBLY;
            pos = 0;
            lookahead = *expression;
            expr();
    
            return 0;
    }
    

    Przykład możliwego wyjścia, wygenerowanego podczas wykonania powyższego programu:

    Grace Murray Hopper, z d. Grace Brewster Murray (ur. 9 grudnia 1906 w Nowym Jorku, zm. 1 stycznia 1992 w Arlington w stanie Wirginia) – amerykańska pionierka informatyki, przez szereg lat służyła w United States Navy, w 1986 przeszła w stan spoczynku w stopniu kontradmirała (Rear Admiral - lower half).Asembler (z ang. assembler) – termin informatyczny związany z programowaniem i tworzeniem kodu maszynowego dla procesorów. W języku polskim oznacza on program tworzący kod maszynowy na podstawie kodu źródłowego (tzw. asemblacja) wykonanego w niskopoziomowym języku programowania bazującym na podstawowych operacjach procesora zwanym językiem asemblera, popularnie nazywanym również asemblerem. W tym artykule język programowania nazywany będzie językiem asemblera, a program tłumaczący – asemblerem.
    Please enter an infix-notated expression with single digits:
    
            3-4*2+2
    
    Compiling to postfix-notated expression:
    
            342*-2+
    
    Compiling to assembly-notated machine code:
    
            PUSH 3
            PUSH 4
            PUSH 2
            POP B
            POP A
            MUL A, B
            PUSH A
            POP B
            POP A
            SUB A, B
            PUSH A
            PUSH 2
            POP B
            POP A
            ADD A, B
            PUSH A

    Kompilatory w edukacji[ | edytuj kod]

    Konstrukcja kompilatorów i optymalizacja kompilatorów są wykładane na uniwersytetach jako część programu studiów informatycznych. Takie kursy są zazwyczaj uzupełniane implementowaniem przez studentów kompilatora pewnego edukacyjnego języka programowania. Dobrze udokumentowanym przykładem jest kompilator języka PL/0, który był pierwotnie używany przez Niklausa Wirtha do nauczania metod konstrukcji kompilatorów w latach siedemdziesiątych. Pomimo swojej prostoty kompilator PL/0 wprowadził do terminologii kilka pojęć, które odtąd stały się standardami w nauczaniu:

    Wydział Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego (WMIM UW, MIMUW) – wydział Uniwersytetu Warszawskiego kształcący w trybie dziennym na kierunkach:Dekompilator – program przekształcający język maszynowy lub kod bajtowy do postaci języka wyższego poziomu. Proces tłumaczenia kodu nazywa się dekompilacją. Dekompilacja nie odtwarza kodu źródłowego programu sprzed jego kompilacji, a jedynie postać źródłową w pewnym języku wyższego rzędu (zależnym od dekompilatora) i mającą identyczne działanie jak dekompilowany kod.
    1. Użycie Program Development by Stepwise Refinement
    2. Użycie recursive descent parser
    3. Użycie notacji EBNF do specyfikowania składni języka
    4. Użycie P-code podczas generowania przenośnego kodu wynikowego
    5. Użycie T-diagramów do formalnego opisu problemu bootstrappingu


    Podstrony: [1] 2 [3] [4]



    w oparciu o Wikipedię (licencja GFDL, CC-BY-SA 3.0, autorzy, historia, edycja)

    Warto wiedzieć że... beta

    Optymalizacja kodu wynikowego – proces, w którym dosłowna wersja kodu źródłowego, zazwyczaj w postaci jakiegoś drzewa, jest przekształcana w postać umożliwiającą sprawne wykonanie.
    Analiza składniowa (ang. parsing) – w informatyce i lingwistyce – proces analizy tekstu, w celu ustalenia jego struktury gramatycznej i zgodności z gramatyką języka. Słowo parsing pochodzi od (łac.) pars (ōrātiōnis), które oznacza część mowy.
    Preprocesor – w programowaniu – to program komputerowy, którego zadaniem jest przetworzenie kodu źródłowego, w sposób określony przez programistę za pomocą dyrektyw preprocesora, na kod wyjściowy – tak przetworzony kod źródłowy poddawany jest następnie analizie składniowej i kompilacji.
    Wydział Informatyki, Elektroniki i Telekomunikacji (WIEiT) – jeden z 16 wydziałów Akademii Górniczo-Hutniczej im. St. Staszica w Krakowie, powstały w wyniku podziału Wydziału Elektrotechniki, Automatyki, Informatyki i Elektroniki w 2012 roku.
    Program komputerowy (ang. computer program) - sekwencja symboli opisująca obliczenia zgodnie z pewnymi regułami zwanymi językiem programowania. Program jest zazwyczaj wykonywany przez komputer (np. wyświetlenie strony internetowej), czasami bezpośrednio – jeśli wyrażony jest w języku zrozumiałym dla danej maszyny lub pośrednio – gdy jest interpretowany przez inny program (interpreter). Program może być ciągiem instrukcji opisujących modyfikacje stanu maszyny ale może również opisywać obliczenia w inny sposób (np. rachunek lambda).
    Library of Congress Control Number (LCCN) – numer nadawany elementom skatalogowanym przez Bibliotekę Kongresu wykorzystywany przez amerykańskie biblioteki do wyszukiwania rekordów bibliograficznych w bazach danych i zamawiania kart katalogowych w Bibliotece Kongresu lub u innych komercyjnych dostawców.
    Definicja intuicyjna: Kod źródłowy to zapis programu komputerowego w formie czytelnej dla człowieka umożliwiający jego modyfikację i rozwój.

    Reklama

    Czas generowania strony: 0.026 sek.