Gibts eine Sprache deren Programme man "zur Laufzeit" ändern kann?



  • Vorab: Der Titel ist vllt. etwas missverständlich, ich weiß grad nicht wie ichs besser zusammenfassen soll:

    Seit einiger Zeit geistert mir folgendes Modell im Kopf herum:
    Man nehme einen Server, dieser bietet für seine Clients eine Reihe Funktionen (f1() ... fn() ) zum Aufrufen an. Ein Client kann sich also z.B. über TCP/IP mit dem Server verbinden, ihm eine entsprechende Anfrage schicken, und der Server schickt das Ergebnis der Funktion zurück.
    Das Verhalten der Funktionen ist in einer objektorientierten Sprache X definiert, die von den Funktionen verwendeten Objekte sollen eine längere Lebensdauer haben können als die Funktionen selbst, so dass z.B. verschiedene nacheinander aufgerufene Funktionen auf die gleichen Objekte zugreifen können. (Sicherung der Objekte z.B. in einer DB)

    Der Clou:
    während der Server läuft, soll der Programmierer
    - zusätzliche Funktionen schreiben können, die nach Einbindung durch den Server auch von Clients aurufbar sind
    - vorhandene Funktionen in ihrem Verhalten ändern, so dass nach der Einbindung durch den Server die nachfolgenden Funktionsaufrufe diese Änderungen spüren
    - neue Klassen definieren können, die dann von später geänderten/hinzugefügten Funktionen benutzt werden können
    - vorhandene Klassendefinitionen ändern können, z.B. einen Attributwert hinzufügen, inklusive der nötigen Initialisierungen und Änderungen bei den bereits vorhandenen Objekten der entsprechenden Klasse

    Ich habe von einer Sprache die sowas kann und der entsprechenden Laufzeitumgebung auf dem Server bisher noch nicht gehört. Bevor ich mich jetzt aber an die voraussichtlich sehr umfangreiche Arbeit mache, wollte ich lieber mal nachfragen ob jemand von sowas ähnlichem schonmal gehört hat, oder von Teillösungen die ich für die Geschichte evtl. verwenden könnte.



  • Ich weiss nich ob ich deine Anforderungen tatsächlich richtig verstanden habe,
    aber eine Interpretierte Programmiersprache würde denke ich deine Forderungen
    erfüllen.

    - zusätzliche Funktionen schreiben können, die nach Einbindung durch den Server auch von Clients aurufbar sind

    Neue Datei auf dem Server anlegen.
    Funktion entsprechend der Kodierung der Sprache eintragen.
    Global verfügbar machen.

    - vorhandene Funktionen in ihrem Verhalten ändern, so dass nach der Einbindung durch den Server die nachfolgenden Funktionsaufrufe diese Änderungen spüren

    und ...

    - neue Klassen definieren können, die dann von später geänderten/hinzugefügten Funktionen benutzt werden können

    und ...

    - vorhandene Klassendefinitionen ändern können, z.B. einen Attributwert hinzufügen, inklusive der nötigen Initialisierungen und Änderungen bei den bereits vorhandenen Objekten der entsprechenden Klasse

    Sicherstellen, das die vorversion erst dann wegfällt, bis die neue
    echt fertig geschrieben wurde.
    Global verfügbar machen ... is aber sehr sicherheitskritisch.

    Wie gesagt ... es muss sich dann um eine interpretierte Sprache handeln
    und es muss sich um autarke Funktionsgruppierungen handeln die zur Ausführungszeit
    gesperrt sind.

    Ansonsten schreibst du selbstmodifizierenden Code ... ganz kritisches Thema ...
    würd ich als Ausgeschlossen bezeichnen.



  • Wäre es für den Server denn akzeptabel, beim Laden der hinzugefügten Funktionen kurze Zeit zu warten, also in der Lade-Zeit die anderen Funktionen nicht zur Verfügung stellen zu können?



  • Mit Smalltalk sollte sowas kein Problem sein. Ob das allerdings geeignet ist für eine Server-Umgebung, weiß ich nicht (ich hab da gewisse Zweifel).



  • Christoph schrieb:

    Mit Smalltalk sollte sowas kein Problem sein.

    auch so nicht. wo ist da überhaupt ein problem? ausser vielleicht der server-cache, welcher die wirkung der änderungen verzögern könnte.
    🙂



  • => PHP



  • In Common Lisp ist das kein Problem und durchaus üblich, idR. allerdings um Dinge wie generierte Matcher für reguläre Ausdrücke oder Inferenzregeln zu compilieren. Einfach so irgendwelche Clienteingaben durch compile zu jagen ist grundsätzlich fragwürdig, man müsste das vorher irgendwie analysieren und sicherstellen, dass nichts böses passiert.



  • Da fast alle Skriptsprachen Monkey-Patching anbieten ist das bei quasi allen Skriptsprachen sogar zur Laufzeit möglich ohne etwas neu zu laden.
    Bei Ruby kannst du übrigens ganz generisch auf Funktionen zugreifen, da eine spezielle Funktion aufgerufen wird, wenn keine Funktion mit dem Namen gefunden wurde.

    Patching zur Laufzeit geht aber auch bei C++ mit entsprechenden Proxy-Klassen, da gehen dann auch so sachen, dass mehrere Objekte unterschiedlicher (Klasen-)Versionen co-existieren können. Nur müsstest du die (alten)Objekte auf die neue Klasse übertragen um die neuen Methoden nutzen zu können, wenn das sich immer sofort widerspiegeln soll.



  • dark-eye schrieb:

    [...]
    Sicherstellen, das die vorversion erst dann wegfällt, bis die neue
    echt fertig geschrieben wurde.
    Global verfügbar machen ... is aber sehr sicherheitskritisch.

    Das hab ich mir auch schon überlegt. Gerade wenn z.B. ein Attribut einer Klasse wegfällt müsste der Interpreter sicherstellen, dass die Änderung nicht ins System eingebaut wird bis nicht alle Zugriffe auf das entsprechende Attribut aus dem Code entfernt sind.

    Wie gesagt ... es muss sich dann um eine interpretierte Sprache handeln
    und es muss sich um autarke Funktionsgruppierungen handeln die zur Ausführungszeit gesperrt sind.
    Ansonsten schreibst du selbstmodifizierenden Code ... ganz kritisches Thema ...
    würd ich als Ausgeschlossen bezeichnen.

    hm selbstmodifizierender Code? Klingt interessant, daran hatte ich noch nicht gedacht. Ich hatte eher überlegt dass die Modifizierungsbefehle nicht aus Funktionen heraus aufgerufen werden können. Wenn man die Einschränkung allerdings umgehen kann.... Hui 😉

    Badestrand schrieb:

    Wäre es für den Server denn akzeptabel, beim Laden der hinzugefügten Funktionen kurze Zeit zu warten, also in der Lade-Zeit die anderen Funktionen nicht zur Verfügung stellen zu können?

    Möglichst kurz bis garnicht. Ich seh allerdings noch nicht wie es ganz ohne gehen sollte.



  • mit assembler, interpretersprachen und auch einigen compilersprachen ist selbstmodifizierender code grundsätzlich auf jeder von-neumann-architektur möglich. die größte einschränkung haben natürlich compilersprachen. wobei es kein problem darstellt, einen embedded compiler im programm zu integrieren, der so zur laufzeit neuen code erstellt 🙂



  • Christoph schrieb:

    Mit Smalltalk sollte sowas kein Problem sein. Ob das allerdings geeignet ist für eine Server-Umgebung, weiß ich nicht (ich hab da gewisse Zweifel).

    Smalltalk klingt gut (Squeak z.B.) - mal schauen obs da entsprechende Möglichkeiten gibt 🙂



  • pumuckl schrieb:

    Ich habe von einer Sprache die sowas kann und der entsprechenden Laufzeitumgebung auf dem Server bisher noch nicht gehört.

    Theoretisch geht das sogar auch unter C# und Co (Habe ein kurzes Beispiel auch schon in einen Buch gesehen, bei Interesse kann ich das auch heraussuchen, würde mir aber frühestens ab den 18.7 möglich sein).

    Auf Anhieb bin ich aber über folgende Links gestolpert:
    MSDN Visual C# General How to create a DLL at runtime?
    Create your own new Type and use it on run-time (C#)

    cu André



  • Erlang 😋



  • asc schrieb:

    Theoretisch geht das sogar auch unter C# und Co (Habe ein kurzes Beispiel auch schon in einen Buch gesehen, bei Interesse kann ich das auch heraussuchen, würde mir aber frühestens ab den 18.7 möglich sein).

    Die Links die du da gepostet hast zeigen soweit ich das erkennen kann nur, dass man solch eine Serverumgebung in C# implementieren kann - dass die Implementierung von sowas möglich sein sollte bin ich überzeugt, die Frage war halt ob es solch eine Implementierung schon gibt, möglichst mit den entsprechenden Überprüfungen die ich weiter oben angesprochen habe. Soweit ich das bisher gesehen habe leistet Smalltalk das leider nicht (ist nichtmal typsicher).



  • Hast du dir mal Gedanken über die Entwicklung mit solch einem System gemacht?

    Wie willst du sowas sinnvoll debuggen? Wer soll da nachher noch durchblicken?

    Ich sehe das Projekt jetzt schon auf www.thedailywtf.com



  • Schau dir doch auchmal pion net an da geht das mit modulen (.dlls, .so)



  • pumuckl schrieb:

    Die Links die du da gepostet hast zeigen soweit ich das erkennen kann nur, dass man solch eine Serverumgebung in C# implementieren kann - dass die Implementierung von sowas möglich sein sollte bin ich überzeugt, die Frage war halt ob es solch eine Implementierung schon gibt, möglichst mit den entsprechenden Überprüfungen die ich weiter oben angesprochen habe. Soweit ich das bisher gesehen habe leistet Smalltalk das leider nicht (ist nichtmal typsicher).

    Weitgehend lässt sich das von dir genannte doch auch mit einer statischen Lösung realisieren (Pluginsystem das dynamisch nachläd), und zumindestens mit C# 3 kann man Klassen doch auch um Funktionalitäten ergänzen (Wobei ich glaube das dies auf Methoden beschränkt ist, und nicht Attribute ermöglicht - ich meine nicht partitielle Klassen, komme aber grade nicht auf den Begriff).

    Ich weiß das damit nicht alles von dir gewünschte möglich wäre, aber eben so würde ich das umsetzen (und das Plugin konfigurierbar machen, so das man im laufenden Betrieb z.B. entscheiden kann das ab dem nächsten Aufruf nicht mehr die Methode xyz vom Plugin abc sondern die Methode xyz vom Plugin bcd aufgerufen werden soll).

    cu André



  • Nur eine schnelle Idee, aber evtl lässt sich das mit eingebettetem Python gut realisieren? Also einfach das Python-Zeugs mit Boost::Python laden, beim "Submit" von neuen Funktionen/veränderten Typen im Hintergrund das neue Python-Zeug laden (während mit dem alten noch gearbeitet wird), warten bis die aktuellen Sachen bearbeitet sind oder ggf. abbrechen während die neuen blockiert werden und dann mit dem neuen Py-Krams arbeiten.
    Für Fehler-Koordination, wenn sonst keine Py-Exceptions fliegen, könnte man auch eine Art "Test"-Zustand einführen; wenn in den ersten X Minuten nach dem "Submit" vom neuen Code eine Py-Exception geworfen wird, die Funktion mit dem alten Py-Code (der erst nach den X Minuten entladen wird) ausführen und den Fehler loggen. Oder irgendwie so.

    Kann aber auch sein, dass mein obiges Gedankengut irrer Schrott ist, mein Kopf ist im Moment ziemlich Grippe-vernebelt (Sonnenbrand + Grippe, bescheuerte Kombi..).



  • asc schrieb:

    (Wobei ich glaube das dies auf Methoden beschränkt ist, und nicht Attribute ermöglicht - ich meine nicht partitielle Klassen, komme aber grade nicht auf den Begriff).

    Extension Methods?



  • Es ist zwar schon "fast alle Skriptsprachen" gesagt worden. Aber weil es so schön ist und sich für's Web anbietet: Perl natürlich auch 🙂



  • Aber Erlang ist wohl die einzige Sprache, in der sowas vorgesehen ist 😉
    http://en.wikipedia.org/wiki/Erlang_(programming_language)#Hot_code_loading_and_modules


Anmelden zum Antworten