Ausführen von fremden Code

Fischkralle

Mitglied
Hey Leute,
Wollte mal wissen, wie ihr das handhabt verschiedene Sprachen zusammen zu führen.
Ich habe mir ein kleines Programm geschrieben, in dem ich ein wenig mit reflection rum experimentiert habe.
Funktioniert alles wunderbar, nur wollte ich jetzt auch mal einen C# Code mit meinem Java Programm ausführen.
Also ich möchte jetzt keine Anwendung aus Java raus starten, sondern den Code in meinem Programm ausführen.
Welche Möglichkeiten habe ich dafür und wie setzte ich das am Geschicktesten um.
 
Wenn ich in Java programmiere und eine Library, die in einer anderen Sprache entwickelt wurde, einbinden soll, dann sieht meine Strategie sieht so aus:
1. Vermeiden - kritisch hinterfragen, ob das wirklich nötig ist.
2. Ich baue eine Facaden-Anwendung in Java um die Library herum und lasse diese zB per RMI mit meiner Hauptanwendung kommunizieren.

In der Facaden-Anwendung verwende ich dann JNI um beispielsweise auf eine Windows-DLL zzugreifen.

Damit "rette" ich die Plattformunabhängigkeit meiner Haupt-Anwendung.
Da nun beide Teile in unterschiedlichen Prozessen laufen, können Speicher/Resource-Probleme der Library meine Hauptanwendung nicht mehr beeinflussen.
 
Hmm……
Das Hilft mir jetzt nicht wirklich weiter.
Ich denke ich werde mein Vorhaben einmal erklären.

Also, ich habe ein “Spiel“ in Java geschrieben.
Also nicht wirklich ein Spiel, sondern ehr ein Programm, welches *.jar Dateien über Reflection einlädt und mit diesem Eingeladenen Code eine der beiden Spielfiguren Steuert.
Die Andere Figur wird mit einem anderen eingeladenen Code gesteuert.

Das Programm lädt also Bots ein und lässt diese gegeneinander spielen. Jetzt sind in meinem Freundeskreis die Stimmen laut geworden, warum das Ganze nicht in C oder C# (oder noch anderen Sprachen ) geschrieben wurde.
Also möchte ich es hin bekommen, das mein Programm auch C# Dateien einließt und dort die update() Methode zur Steuerung einer Figur aufruft.
 
Für mich hört sich das eher nach einer Art Plugin an.

Es nun mal so das man mit Java keinen C# Code ausführen kann. Du kannst versuchen ihn zur Laufzeit nach Java zu migrieren und zu kompilieren (was aber nicht wirklich funktionieren wird da eine 1:1 Migration je nach Code nicht möglich ist, und händisches nachbessern erfordert)
 
Zuletzt bearbeitet:
Wie ich schon schrieb, würde ich nicht versuchen, dass alles in ein Programm zu packen.
Ich würde das als Client/Server-Anwendung designen.
Server : Das Spiel und die Darstellung der Figur(en)
Client : Figur(en) - also deren Steuerung

Client und Server kommunizieren dann beispielsweise über TCP/IP.
Den "Befehlssatz" für das Spiel musst du natürlich definieren. Wenn es nicht zeitkritisch ist, würde ich die Befehle im Klartext belassen. Dann kannst du mit einem Monitor mitschauen, welche Nachrichten da fließen. Inhaltlich wird der Client wahrscheinlich Informationen vom Spiel anfordern und dann die Figur steuern.
Außerdem kommen noch ein paar Verwaltung-Funktionen dazu: Anmelden beim Server, ...

Als erstes löst du das für Java und später kannst du da für weitere Sprachen Clients bauen.
Der Client kann dann aus 2 Layern bestehen:
* Kommunikation zum Server
* Plugin Mechanismus für die Figur-Strategie

Die Gegner können dann mit ihren Strategie-Jars (oder DLLs oder...) kommen und das dann in den Client ihrer Sprache reinhängen.
 
Zuletzt bearbeitet:
Eine Server Client Version?
Da stellen sich mit ja schon wieder neue Fragen.
Ich bekomme es z.B. nicht hin die eigene public IP heraus zu bekommen. Ich bekomme immer nur die LAN IP.
Zudem habe ich ein Problem mit den Ports. Auf welchen Port soll der Server antworten? Der Client hat ja den, von mir genommenen, Port nicht offen.

Aber das muss doch auch irgendwie Lokal gehen. Kann man da nicht eine Schnittstelle zwischen hängen oder so?
 
Client/Server meine ich jetzt im Sinne der Aufgabenteilung. Beide Componenten können natürlich auch auf nur einem Rechner laufen.
TCP/IP kannst du ja auch auf einem Rechner verwenden. localhost oder 127.0.0.1 ist die IP-Adresse mit der du Ports auf der eigenen Maschine ansprechen kannst.

Falls du es später ausbauen willst, brauchst du zumindest nichts mehr programmieren, wenn du mehrere Rechner einbeziehen willst.

Für den Server reservierst du eine Port-Range, auf die er reagiert.
Die Clients bekommen eine kleine Konfigurationsdatei, in denen du jedem Client einen Port zuweist.
 
Wie hast du den fremden Code denn vorliegen? Wenn du die Möglichkeit hast ihn als DLL einzubinden, dann guck dir mal JNI/JNA an.
 
Ich kann allen meinen Vorrednern nur zustimmen. Du kannst keinen Code einer anderen Sprache ausführen; das ist wie wenn du versuchen würdest, einen Arabsichen Text zu lesen ohne Arabisch zu können.

Wie gesagt liegt der Weg zum ziel hier in Schnittstellen, die nicht von der Programmiersprache abhängen.
 
@Tobse
Ich hab mal was von Cross-Compilern gehört, die eine Sprache in die andere übersetzen können sollen. Wäre das nicht genau das, was der TE sucht oder habe ich da was falsch verstanden?
 
@Tobse
Ich hab mal was von Cross-Compilern gehört, die eine Sprache in die andere übersetzen können sollen. Wäre das nicht genau das, was der TE sucht oder habe ich da was falsch verstanden?

Wenn das so einfach möglich wäre, wäre es genau das, was der TE braucht. Diese Technik bringt aber einige, äußerst komplexe Probleme mit sich:

- So ziemlich jeder Code setzt auf die Standardbibliothek der Sprache auf. Die Standardbliothek muss also auch übersetzt werden. Das ist grundsätzlich kein Problem; aber: die sind ja zum Teil auch in C geschrieben, um Win32/Kernel API calls machen zu können. Dieser C/C++ Code arbeitet mit der entsprechenden VM eng zusammen und muss von einem Menschen an die Zielsprache angepasst werden (als Quellcode, nicht Maschinencode).
- Im Bytecode erfüllt jeder Opcode eine ganz spezielle Funktion mit der einen oder anderen Nebenwirkung. Der Compiler der Ursprungssprache hat den Bytecode ggf. dahingehend compiliert (und optimiert), diese Nebeneffekte und eigenheiten auszunuzten. Jeder Opcode der Ausgangssprache, welcher nicht ein 100%-iges Gegenstück in der Zielsprache hat muss mit sehr viel Vorsicht übersetzt werden. Das ist extrem Fehleranfällig und benötigt ggf. Finetuning, das bisher nur Menschen leisten können.
- Übersetzt man den Sourceode anstatt den Bytecode treten die Probleme mit den Opcodes eine Ebene höher auf: die Nebeneffekte mancher Befehle werden z.T. vom Programmierer ausgenutzt (ich zumindest mache das regelmäßig). Damit diese Zusammenhänge einwandfrei funktionieren setzt eine 1:1 identische umgebung in beiden Sprachen vorraus. Diese zu schaffen erfordert wahrscheinlich auch einen Menschen.

Im Endeffekt läuft es darauf hinaus: Hat man eine große Codebasis kann einem der Crosscompiler viel Arbeit abnehmen. Das Ergenis muss aber ggf. angepasst werden und in jedem Fall pinibel getestet werden.
 
Hmm.....
eine Schnittstelle wäre genau das, was ich brauche.
Den Code zu übersetzen würde nicht in mein Konzept passen.

Ich glaube um mein Vorhaben zu erklären stelle ich am besten mal mein Projekt vor.

Gehen wir einmal 3-4 Jahre zurück.
2011 startete Google mit ihrer AI-Challenge die Ameisen Kolonien.

=> Home | AI Challenge

Ich hatte mir nun vorgenommen, dies nach zu bauen.
Hier hebe ich mal ein kurzes Video zum aktuellen Stand des Projekts.
(Ich gebe zu, die Bots, welche schon da sind, sind nicht dumm sondern viel mehr blöd. 🙂)

YouTube

Google hatte es ja auch geschafft verschiedene Sprachen gegeneinander antreten zu lassen.

Meine Frage nun:
Wie haben die Google Menschen das gemacht.
 
Zuletzt bearbeitet:
[...]
Google hatte es ja auch geschafft verschiedene Sprachen gegeneinander antreten zu lassen.
Meine Frage nun:
Wie haben die Google Menschen das gemacht.

Die Bots lesen von der Standardeingabe und schreiben auf die Standardausgabe in einem fest vorgegebenen Format. Zumindest sieht das nach einem kurzen Blick in die Tutorial-Bots so aus.

Das is im weitesten Sinne eine Art Messaging. Das Übersetzen von Daten in ein bestimmtes Format und mittels eines irgendwie gearteten Kommunikationskanals übertragen ist heute weit verbreitet. Ein einfaches Format wäre z.B. JSON und dafür gibts in fast für jede gängige Sprache diverse Bibliotheken die dann das Parsen usw. unterstützen.
 
Klasse,
so wie du das mit demJSON Format erklärt hast, ist das genau das, was ich brauche danke.

Ich werde mir heute Abend mal ein wenig Lektüre darüber ansehen.

Ich melde mich noch mal, ob es klappt und somit die Lösung wäre.
 

Neue Themen


Zurück
Oben