miku: Verständnisfrage: Was bedeutet "zur Laufzeit"?

Hallo zusammen,

ich wollte mal nachragen was genau es genau bedeutet wenn es z.B. heißt dass Werte zur Laufzeit noch geändert werden können? (also dynamisch)

Konkret: Mit Skriptsprachen wie Ruby oder Groovy oder ähnlichem ist das ja laut Dokumentation möglich, mit Java aber nicht. Was genau ist jetzt damit gemeint wenn da steht "..sind im Gegensatz zu Java dynamische Konstruktionen möglich, es sind also Änderungen zur Laufzeit möglich"

Wäre nett wenn da jemand eine kleine Erklärung parat hat.

Grüße

  1. Hallo zusammen,

    ich wollte mal nachragen was genau es genau bedeutet wenn es z.B. heißt dass Werte zur Laufzeit noch geändert werden können? (also dynamisch)

    Konkret: Mit Skriptsprachen wie Ruby oder Groovy oder ähnlichem ist das ja laut Dokumentation möglich, mit Java aber nicht. Was genau ist jetzt damit gemeint wenn da steht "..sind im Gegensatz zu Java dynamische Konstruktionen möglich, es sind also Änderungen zur Laufzeit möglich"

    Wäre nett wenn da jemand eine kleine Erklärung parat hat.

    Grüße

    Ich tippe mal darauf, das es bedeutet, das man, während das Programm/der Script läuft (auf dem PC?), von extern (außerhalb des Programms/Scripts) eingreifen und Variablen ändern kann.

    Da ich aber diese Sprachen nicht 100%tig kenne, weis ich nicht exakt wie es gemeint ist.

    K.a. ob dir das weiterhilft, aber das ist meine Verständnis von dem Satz.

  2. Moin!

    ich wollte mal nachragen was genau es genau bedeutet wenn es z.B. heißt dass Werte zur Laufzeit noch geändert werden können? (also dynamisch)

    Die "Laufzeit" ist der Zeitpunkt, zu dem das Programm ausgeführt wird und die Dinge tun soll, die einprogrammiert wurden.

    Konkret: Mit Skriptsprachen wie Ruby oder Groovy oder ähnlichem ist das ja laut Dokumentation möglich, mit Java aber nicht. Was genau ist jetzt damit gemeint wenn da steht "..sind im Gegensatz zu Java dynamische Konstruktionen möglich, es sind also Änderungen zur Laufzeit möglich"

    Der Klassiker hierfür ist die Funktion eval(). Damit wird, während das Programm läuft, weiterer Programmcode, der dynamisch in eine Variable gepackt wurde, ausgeführt. Damit das aber funktioniert, muss der gesamte Mechanismus, der vorher schon mal aus dem Quellcode das jetzt laufende Programm gemacht hat, nochmal mit dem Variableninhalt durchlaufen werden.

    Sowas funktioniert nicht in jeder Programmiersprache - üblicherweise sind Skriptsprachen diejenigen, die sowas haben, und compilierte Sprachen haben so ein Feature nicht.

    Allerdings: Jegliche Art von dynamischer Codeausführung bedeutet ja, dass der Code vorher dynamisch zusammengesetzt werden muss (wäre er statisch, könnte man sich die Konstruktion mit eval() schenken). Dynamischer Code ist aber eine schwierige Angelegenheit: Der Parser wird sich zwar melden, wenn böse Syntaxfehler dynamisch eingebaut wurden, aber wenn Sicherheitslücken bestehen, kann man sich als Programmierer auch ganz böse ins Knie schießen, wenn über dynamische Variablen fremder Code eingeschleppt und ausgeführt wird.

    Und selbst, wenn das nicht passiert: Vollkommen dynamischer Code ist einfach nicht testbar, weil man nie die unterschiedlichsten Möglichkeiten komplett abdecken kann. Wenn es hingegen nur eine bestimmte Menge von Varianten gibt, dann benötigt man kein eval(), sondern kann für jede Variante den Code explizit schreiben, konkret testen, und mit einer Fallunterscheidung dann dorthin verzweigen.

    eval() ist evil! Man sollte drauf verzichten.

    - Sven Rautenberg

    1. Danker erstmal für die ausführliche Antwort und das Beispiel.

      Die "Laufzeit" ist der Zeitpunkt, zu dem das Programm ausgeführt wird und die Dinge tun soll, die einprogrammiert wurden.

      Nur damit ich das nicht falsch verstehe.

      Das bedeutet aber nicht dass ich folgendes machen kann oder etwa doch?

      Beispiel:

      Ich habe ein Javaprogramm das ein Skript aufruft (sei es Ruby, Groovy oder was auch immer).

      In diesem Skript steht irgendwo eine Ausgabe z.B. "Hallo". Dann starte ich das Javaprogramm, es wird "Hallo" ausgegeben und jetzt ändere ich im Skript das "Hallo" in "Tschüß" (während das Programm läuft).
      Dann wird aber nicht nachräglich noch "Tschüß" ausgegeben oder?

      Ich hoffe du weißt was ich damit sagen will.

      Grüße

      1. In diesem Skript steht irgendwo eine Ausgabe z.B. "Hallo". Dann starte ich das Javaprogramm, es wird "Hallo" ausgegeben und jetzt ändere ich im Skript das "Hallo" in "Tschüß" (während das Programm läuft).
        Dann wird aber nicht nachräglich noch "Tschüß" ausgegeben oder?

        Du kannst eigentlich in jeder Programmiersprache Werte ändern, das nennt man Variabeln.

        Du kannst aber nicht nachträglich den Quelltext einer laufenden Anwendung ändern, auch in keiner Skriptsprache. Du kannst aber zur Laufzeit neuen Code erzeugen, aber nicht von aussen.

        Struppi.

        1. Du kannst aber nicht nachträglich den Quelltext einer laufenden Anwendung ändern, auch in keiner Skriptsprache. Du kannst aber zur Laufzeit neuen Code erzeugen, aber nicht von aussen.

          OK, das wollte ich wissen. Dann habe ich glaub ich auch dein Beispiel verstanden. Dass als während der Laufzeit noch weitere Funktionen aufgerufen werden können (z.B. durch Variablen).

          btw: Sind das hier dann eigentlich Closures? Dazu hab ich auch mal was gefragt.

            
          
          > var x =  ClassCreator();  
          > var y =  ClassCreator();  
          
          
          1. btw: Sind das hier dann eigentlich Closures? Dazu hab ich auch mal was gefragt.

            » var x =  ClassCreator();
            » var y =  ClassCreator();

              
            Nö, das sind sogenannte [Fabrikmethoden](http://de.wikipedia.org/wiki/Fabrikmethode), die habe ich hier in dem Beispiel angewendet, da die Vererbung mit JS manchmal etwas tricky ist.  
              
            Closures sind im Prinzip Funktionen in Funktionen.  
              
            Struppi.
            
          2. Moin!

            btw: Sind das hier dann eigentlich Closures? Dazu hab ich auch mal was gefragt.

            »» var x =  ClassCreator();
            »» var y =  ClassCreator();

              
            Closures handeln vom Behalten von Variablenwerten für Funktionsaufrufe, obwohl diese Variablen eigentlich schon wieder unverfügbar sind, weil deren Scope verlassen wurde. Siehe [Wikipedia: Closure](http://de.wikipedia.org/wiki/Closure).  
              
            Ab PHP Version 5.3 werden dort auch Closures verfügbar sein: <http://wiki.php.net/rfc/closures>  
              
            Vielleicht krieg' ich es dann ja mal etwas besser hin, mich mit diesem Konzept zu beschäftigen, denn es hat folgenden seltsamen Effekt auf mich: Wenn man nicht genau hinschaut, ist (zumindest in Javascript) ein Closure die natürlichste Sache der Welt. Und sobald man drüber nachdenkt, verknotet sich das Gehirn. ;)  
              
             - Sven Rautenberg
            
            1. [...] Wenn man nicht genau hinschaut, ist (zumindest in Javascript) ein Closure die natürlichste Sache der Welt. Und sobald man drüber nachdenkt, verknotet sich das Gehirn. ;)

              Ja, ich hab jetzt auch schon mehrere Versuche gestartet Closures richtig zu verstehen aber es hapert (wie man gesehen hat) doch schon an den Anfängen.

              Naja, liegt vielleicht auch daran dass ich keine JavaScript kann und der Entwurf von Closures in Java wieder verworfen wurde.

              Grüße

              1. Moin.

                Naja, liegt vielleicht auch daran dass ich keine JavaScript kann und der Entwurf von Closures in Java wieder verworfen wurde.

                Auch in Java sind Closures in begrenztem Umfang durch den Umweg über innere Klassen möglich, z.B.

                  
                    final String foo = "bar";  
                    new Thread(new Runnable() {  
                        public void run() {  
                            System.out.println(foo);  
                        }  
                    }).start();  
                
                

                Christoph

                1. Hi Christoph,

                  Auch in Java sind Closures in begrenztem Umfang durch den Umweg über innere Klassen möglich, z.B.

                  final String foo = "bar";
                      new Thread(new Runnable() {
                          public void run() {
                              System.out.println(foo);
                          }
                      }).start();

                    
                    
                  Danke für die Anmerkung, daran hab ich nicht gedacht.  
                    
                  Grüße
                  
      2. Moin!

        Ich habe ein Javaprogramm das ein Skript aufruft (sei es Ruby, Groovy oder was auch immer).

        In diesem Skript steht irgendwo eine Ausgabe z.B. "Hallo". Dann starte ich das Javaprogramm, es wird "Hallo" ausgegeben und jetzt ändere ich im Skript das "Hallo" in "Tschüß" (während das Programm läuft).
        Dann wird aber nicht nachräglich noch "Tschüß" ausgegeben oder?

        Nein, da ändert sich nichts auf magische Weise. Es sei denn, du programmierst es so, dass diese nachträgliche Änderung irgendwie erkannt, signalisiert und zur Ausgabe durchgereicht wird. Das wäre allerdings ein extrem komplexer Vorgang, und sowas hast du mit deinem Beispiel mit Sicherheit nicht gemeint.

        Vielleicht als zweite Meinung: Wikipedia: Laufzeit, dort der Abschnitt "Informatik".

        - Sven Rautenberg

        1. Nein, da ändert sich nichts auf magische Weise.[....] und sowas hast du mit deinem Beispiel mit Sicherheit nicht gemeint.

          Nein, da hast du recht. Dabei handelte es sich dann wohl nur um ein Verständnisproblem meinerseits. :)

          Vielleicht als zweite Meinung: Wikipedia: Laufzeit, dort der Abschnitt "Informatik".

          Hübsche Übersicht, danke. Hätte ich auch selbst draufkommen können *schäm*

          Danke ebenfall an euch anderen. =)

    2. ich wollte mal nachragen was genau es genau bedeutet wenn es z.B. heißt dass Werte zur Laufzeit noch geändert werden können? (also dynamisch)

      Die "Laufzeit" ist der Zeitpunkt, zu dem das Programm ausgeführt wird und die Dinge tun soll, die einprogrammiert wurden.

      Addendum (ohne den ganzen Thread gelesen zu haben.)

      Perl kennt ein Konzept, nachdem Code auch vor oder nach der Runtime ausgeführt werden kann.

      Hier:
      http://perldoc.perl.org/perlmod.html#BEGIN%2C-UNITCHECK%2C-CHECK%2C-INIT-and-END
      Wird das ausführlich gezeigt.

      Ich verwende öfters einen BEGIN{} block um die Validität eines Requests auf ein CGI Script zu prüfen. Warum überhaupt das Script zu Ende kompilieren, wenn es nicht notwendig ist?

      mfg Beat

      --
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische
      1. Moin!

        Perl kennt ein Konzept, nachdem Code auch vor oder nach der Runtime ausgeführt werden kann.

        Hier:
        http://perldoc.perl.org/perlmod.html#BEGIN%2c-UNITCHECK%2c-CHECK%2c-INIT-and-END
        Wird das ausführlich gezeigt.

        Finde ich nicht wirklich. Wenn Code ausgeführt wird, dann ist "Runtime". Und Code in speziellen Blöcken, die sortiert nacheinander ausgeführt werden, ist eben ausgeführter Code - also "Runtime", auch für BEGIN.

        Dass Perl da eventuell optimiert und das Parsing anderer Blöcke solange aufschiebt, bis die Ausführung unvermeidbar ansteht, ist kein Argument, nur die Ausführung des Hauptblocks als "Runtime" zu bezeichnen.

        - Sven Rautenberg

  3. Konkret: Mit Skriptsprachen wie Ruby oder Groovy oder ähnlichem ist das ja laut Dokumentation möglich, mit Java aber nicht. Was genau ist jetzt damit gemeint wenn da steht "..sind im Gegensatz zu Java dynamische Konstruktionen möglich, es sind also Änderungen zur Laufzeit möglich"

    Wäre nett wenn da jemand eine kleine Erklärung parat hat.

    D.h. das während des Skriptes Objekte beliebig geändert werden können. Neben dem von Sven erwähnten eval (was ich in Perl relativ häufig verwende) sind das so banale Dinge, wie einem Objekt eine neue Funktion gönnen. Als Java Programmierer kennt man vermutlich diese Orgien von Setter- und Getterfunktion, auch wenn sich er IDEs gibt, die dabei helfen, ist das doch mühsame Handarbeit.

    In JS kann man sich die Arbeit sparen

      
    function Fields( fields ) {  
    	var private_data = {};  
    	for(var i = 0; i < fields.length; i++)  
    	this[fields[i]] = function(val) { // <-- Das ist die entscheidene Zeile  
    		if(typeof val != 'undefined') private_data[fields[i]] = val;  
    		return private_data[fields[i]];  
    	};  
    }  
      
    function ClassCreator() {  
    	function C() {}  
    	C.prototype = new Fields( ['feld1', 'feld2', 'feld3'] );  
    	C.constructor = C;  
    	return new C();  
    }  
      
      
    var x =  ClassCreator();  
    var y =  ClassCreator();  
    x.feld1('test x');  
    y.feld1('test y');  
      
    alert(x.feld1())  
    alert(y.feld1())  
    
    

    Struppi.