New Immissions/Updates:
boundless - educate - edutalab - empatico - es-ebooks - es16 - fr16 - fsfiles - hesperian - solidaria - wikipediaforschools
- wikipediaforschoolses - wikipediaforschoolsfr - wikipediaforschoolspt - worldmap -

See also: Liber Liber - Libro Parlato - Liber Musica  - Manuzio -  Liber Liber ISO Files - Alphabetical Order - Multivolume ZIP Complete Archive - PDF Files - OGG Music Files -

PROJECT GUTENBERG HTML: Volume I - Volume II - Volume III - Volume IV - Volume V - Volume VI - Volume VII - Volume VIII - Volume IX

Ascolta ""Volevo solo fare un audiolibro"" su Spreaker.
CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Interpreter - Wikipedia

Interpreter

aus Wikipedia, der freien Enzyklopädie

Dieser Artikel beschäftigt sich mit dem allgemeinem Begriff Interpreter in der Softwaretechnik, weitere Bedeutungen unter Interpreter (Begriffsklärung)

Ein Interpreter (im Sinne der Softwaretechnik) ist ein Software-Programm, das einen Programm-Quellcode im Gegensatz zu Assemblern oder Compilern nicht in eine auf dem System direkt ausführbare Datei umwandelt, sondern den Quellcode einliest, analysiert und ausführt. Die Analyse des Quellcodes erfolgt also zur Laufzeit des Programms.

Der größte Nachteil der Interpretersprachen ist die im Vergleich zu compilierten Programmen deutlich langsamere Ausführungsgeschwindigkeit. Reine Interpreter lesen und analysieren den Quellcode eines Programmes und führen dann die entsprechenden Aktionen durch. Dies ist im Vergleich zu Compilersprachen, bei denen das Programm vor seiner Ausführung in Maschinencode übersetzt wird, der dann vom Prozessor direkt ausgeführt wird, sehr zeitaufwendig. Der Vorteil liegt darin, dass reine Interpreter auf jeder Rechnerarchitektur lauffähig sind, wenn der Quellcode des Interpreters (der selbst häufig in C geschrieben ist) dort übersetzt werden kann.

Inhaltsverzeichnis

[Bearbeiten] Geschwindigkeitssteigerungen

Eine Kompromisslösung ist ein Just-In-Time-Compiler (JIT-Compiler), bei dem das Programm erst zur Laufzeit, jedoch direkt in Maschinencode übersetzt wird. Danach wird der übersetzte Code direkt vom Prozessor ausgeführt. Durch Zwischenspeicherung des Maschinencode müssen mehrfach durchlaufene Programmteile nur einmal übersetzt werden. Auch ermöglicht der JIT-Compiler eine stärkere Optimierung des Binärcodes. Allerdings sind solche Interpreter natürlich nur auf einer bestimmten Rechnerarchitektur lauffähig, weil sie Maschinencode für diese Architektur erzeugen.

Eine weitere Zwischenstufe sind Bytecode-Interpreter. Dabei wird der Quelltext zur Laufzeit vor seiner Ausführung in einen einfachen Zwischencode übersetzt, der dann von einem Interpreter, auch häufig als virtuelle Maschine bezeichnet, ausgeführt wird.

Und eine weitere Zwischenstufe besteht darin, Befehle zum Eingabezeitpunkt in leichter decodierbare Tokens umzuwandeln, die aber bei (List-)Ausgabe wieder in Klartext zurückgewandelt werden.

[Bearbeiten] Interpretersprachen

Bekannte Interpretersprachen sind BASIC, Perl, Python, Ruby, PHP und viele andere. Auch die Skriptsprachen (wie z. B. Javascript) können zu den Interpretersprachen gezählt werden.

Bekannte Programmiersprachen, die üblicherweise in Bytecode übersetzt werden, sind Java, C#, Perl und Python.

Für manche Sprachen (etwa Smalltalk) gibt es je nach Anbieter Interpreter, Bytecode-Interpreter, JIT-Compiler oder Compiler in andere Sprachen (beispielsweise nach C Compiler oder .NET).

Der Übergang zwischen reinen Interpretern und reinen Compilern ist fließend.

[Bearbeiten] Ein einfacher Interpreter

Folgendes in der Programmiersprache C implementierte Programm stellt einen Interpreter für eine sehr einfache Programmiersprache dar. Die hiermit definierte Programmiersprache unterstützt keinerlei Kontrollstrukturen, kann allerdings verschiedene Werte unter vom Programmierer definierten Variablennamen speichern

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
        char* varname;
        char* value;
} var;

var*    variables;
int             var_cnt         = 0;

int putvar( char* varname, char* value )
{
        int             i;

        strupr( varname );
        
        /* Suche Speicherplätze und fülle mit neuen Wert,
           falls schon vorhanden */
        for( i = 0; i < var_cnt; i++ )
        {
                if( strcmp( variables[i].varname, varname ) == 0 )
                {
                        if( variables[i].value != (char*) NULL )
                                free( variables[i].value );

                        variables[i].value = strdup( value );
                        return 0;
                }
        
        }

        /* Neue Variable anlegen */
        if( var_cnt == 0 )
                variables = (var*)malloc( sizeof( var ) );
        else
                variables = (var*)realloc( (var*) variables,
                        (var_cnt + 1) * sizeof( var ) );

        variables[ var_cnt ].varname = strdup( varname );
        variables[ var_cnt ].value = strdup( value );
        var_cnt++;
}

char* getvar( char* varname )
{
        int             i;

        strupr( varname );
        
        /* Suche Speicherplätze und gebe Wert zurück */
        for( i = 0; i < var_cnt; i++ )
        {
                if( strcmp( variables[i].varname, varname ) == 0 )
                {
                        return variables[i].value;
                }       
        }

        return "";
}


char* getnexttoken( char** line )
{
        char*   start;

        while( **line == '\t' || **line == ' ' )
                (*line)++;

        start = *line;

        do
        {
                (*line)++;
        }
        while( **line != ' ' && **line != '\n' );

        **line = '\0';
        (*line)++;

        return start;
}

char* getargument( char* line )
{
        char*           arg;
        static char     str             [ 80 + 1 ];

        arg = getnexttoken( &line );
        strupr( arg );
        
        /* Argument ermitteln und verarbeiten */
        if( strcmp( arg, "INPUT" ) == 0 )
        {
                gets( str );
                return str;
        }
        else if( strcmp( arg, "VALUE" ) == 0 )
                return getvar( getnexttoken( &line ) );
        else if( strcmp( arg, "TEXT" ) == 0 )
                return line;
        else
                return "";    
}

int execute( char* line )
{
        char*   statement;
        char*   var;
        char    value           [ 80 + 1 ];
        int             calcvalue       = 0;

        statement = getnexttoken( &line );
        strupr( statement );

        /* Anweisungen verarbeiten */
        if( strcmp( statement, "PRINT" ) == 0 )
                printf("%s", getargument( line ) );
        else if( strcmp( statement, "STORE" ) == 0 )
        {
                var = getnexttoken( &line );
                putvar( var , getargument( line ) );
        }
        else if( strcmp( statement, "CLS" ) == 0 )
                system("cls");
        else if( strcmp( statement, "NEWLINE" ) == 0 )
                printf("\n");
        else if( strcmp( statement, "ADD" ) == 0 || strcmp( statement, "SUBSTRACT") == 0 ||
                strcmp( statement, "DIVIDE") == 0 || strcmp( statement, "MULTIPLY") == 0 )
        {
                var = getnexttoken( &line );

                if( strcmp( statement, "ADD" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) + atoi( getargument( line ) );
                else if( strcmp( statement, "SUBSTRACT" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) - atoi( getargument( line ) );
                else if( strcmp( statement, "DIVIDE" ) == 0 )
                        calcvalue = atoi( getvar( var ) ) / atoi( getargument( line ) );
                else
                        calcvalue = atoi( getvar( var ) ) * atoi( getargument( line ) );
                
                sprintf(value, "%d", calcvalue );
                putvar( var, value );           
        }
        else
        {
                return -1;
        }

        return 0;
}

int main( int argc, char** argv )
{
        FILE*   source          = (FILE*)NULL;
        char    line            [ 1024 + 1 ];

        if( argc < 2 )
        {
                printf("Verwendung:\t\tLITERAL <dateiname>\n");
                return -1;
        }

        source = fopen( argv[1], "rt" );
        if( source != (FILE*) NULL )
        {
                while( fgets( line, 1024, source ) != (char*)NULL )
                {
                        line[ strlen( line ) - 1 ] = '\0';
                        if( execute( line ) < 0 )
                                break;
                }

                fclose( source );
        }
        else
        {
                printf("Fehler: Datei nicht gefunden.");
                return -1;
        }

        return 0;
}

Ein Taschenrechnerprogramm, welches Werte multipliziert, ließe sich für diesen Interpreter so definieren:

cls
print text Geben Sie bitte einen Wert ein: 
store wert1 input
print text Geben Sie bitte einen weiteren Wert ein: 
store wert2 input
multiply wert1 value wert2
print text Das Ergebnis der Berechnung lautet: 
print value wert1
newline

Dieses Programm würde bei der Ausführung mit obigem Interpreter zu folgender Ausgabe führen:

Geben Sie bitte einen Wert ein: 5
Geben Sie bitte einen weiteren Wert ein: 4
Das Ergebnis der Berechnung lautet: 20


[Bearbeiten] Siehe auch

[Bearbeiten] Weblinks

Static Wikipedia (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu