Gibts eine Sprache deren Programme man "zur Laufzeit" ändern kann?
-
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
-
Hm, auf der anderen Seite ist Erlang leider nicht objektorientiert und auch nicht typsicher. Soweit ich das bisher überblicken konnte sind auch die Konsistenzchecks für neuen Code nicht enthalten (vermutlich weil sie nicht nötig sind).
Vielleicht lässt sich ein System wie ichs mir vorstelle mit Erlang als Backend realisieren, mal schauen.Debugging wird natürlich ein schwieriges Thema, allerdings sollten viele Fehlerquellen durch die Konsistenzchecks ausgeschlossen werden - wobei die auch nicht gerade einfach umzusetzen sein werden.
-
sothis_ schrieb:
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
Das ist doch mit jeder Sprache moeglich, man braucht nur einen Interpreter/On-Demand-Compiler* zu finden, bzw. zu schreiben.
On-Demand-Compiler waehre das man den Compiler jedesmal den Code neu uebersetzen laesst, wenn er sich geaendert hat.
-
.filmor schrieb:
Aber Erlang ist wohl die einzige Sprache, in der sowas vorgesehen ist
Common Lisp hatte ich schon erwähnt ...
Wenn ich manche Ansätze hier lese wird mir schlecht. Greenspun's 10th rule of programming lässt grüßen.
-
Java bietet mehrere Möglichkeiten, sowas zu realisieren, z.B. mit Hilfe von Eclipse Equinox (OSGi) oder indem man die Funktionen mit einer Scriptsprache bereit stellt (z.B. Ruby) und dieses dynamisch einbettet.
-
Bashar schrieb:
Wenn ich manche Ansätze hier lese wird mir schlecht. Greenspun's 10th rule of programming lässt grüßen.
Ist doch toll - gute Dinge weiß man oft erst zu würdigen, wenn man die schlechten Alternativen sieht. Abgesehen davon weißt du genauso gut wie jeder andere, dass es nicht die Lösung gibt und die Auswahl der Sprache und Technik von dutzenden Faktoren abhängen kann, die wir nicht kennen. Von daher besser zuviele und z.T. evtl. auch unsinnige Vorschläge als zu wenige.
-
kleine Historie zu dem Ganzen:
vor Jahren bin ich mal ein wenig in die Browsergame-Szene eingetaucht und vom User über den Supporter und Forenadmin zum Mitentwickler avanciert. Am Ende stand mit einer Handvoll Freunde die Idee im Raum, ein eigenes BG aufzubauen. Zu der Zeit bestand ein typisches Amateur-BG aus einer mySQL-Datenbank und einer Handvoll PhP-Scripte. Der typische Entwicklungslauf bestand aus PhP-Gefrickel, offline-nehmen des laufenden Systems, händischem Ändern der Datenbanken und einspielen der neuen Scripte und anschließendem onlinestellen des geänderten Systems, häufig ohne ausgiebige Tests (in der Anfangsphase bestand die Community aus einer Handvoll Leute die gleichzeitig Testteam waren und jede Neuerung so schnell wie möglich sehen wollten und entsprechend tolerant gegen Bugs waren).
Gerade die teils recht langen offline-Zeiten waren uns ein Dorn im Auge und wir haben an ein System für automatische Änderungen der Datenbanken etc. gedacht um das Ganze eben nicht so amateurhaft umzusetzen. Die Idee hat sich nach und nach verselbstständigt und wird seitdem immer ein wenig fortgesponnen, während das eigentliche Browsergame-Projekt aus Zeit- und anderen Gründen längst vom Tisch ist.Ein Browsergame (dafür wars ja vorgesehen) würde daher etwa wie folgt aufgebaut werden: eine PhP-GUI, dahinter (z.B. auf einem anderen Rechner) ein Server, der die Spielelogik in der gesuchten Sprache implementiert (und dadurch möglichst ohne Offlinezeiten zu ändern ist), und wiederum dahinter die Datenbank, die aber von dem Server automatisch verwaltet wird.
Da das ganze für Amateure schnell handhabbar sein soll haben wir an eine Sprache mit Java/C++-ähnlicher Syntax gedacht (irgendeine Programmiererfahrung muss man ja voraussetzen und Java/C++ sind ja doch recht weit verbreitet)
Zur Zeit bin ich allerdings der Einzige der sich noch ab und an mit dem Thema beschäftigt, was einen gewissen Ideen-Wildwuchs impliziert den ich in nächster Zeit Stück für Stück zu Papier bringen will um evtl. irgendwann erste kleine Tests in der Richtung zu starten.