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.
 

Dompteur

Top Contributor
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.
 

Fischkralle

Mitglied
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.
 

Joose

Top Contributor
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:

Dompteur

Top Contributor
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:

Fischkralle

Mitglied
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?
 

Dompteur

Top Contributor
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.
 

Gucky

Top Contributor
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.
 

Tobse

Top Contributor
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.
 

Saheeda

Top Contributor
@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

Top Contributor
@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.
 

Fischkralle

Mitglied
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:

nvidia

Bekanntes Mitglied
[...]
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.
 

Fischkralle

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T .Jar kann man nicht ausführen Allgemeine Java-Themen 18
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
S Buttons nacheinander ausführen Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
P Bat Datei in Java ausführen Allgemeine Java-Themen 2
J Jar-Datei ausführen Allgemeine Java-Themen 7
T Projekt baut nicht mehr/lässt sich nicht mehr ausführen Allgemeine Java-Themen 6
F jar File ausführen Allgemeine Java-Themen 14
Hatsi09 Jar datei ausführen verursacht NumberFormatException Allgemeine Java-Themen 9
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
J CMD Befehl in Java Consolenprogramm ausführen Allgemeine Java-Themen 6
L Python in Java ausführen Allgemeine Java-Themen 4
L Eclipse Java Code ausführen Allgemeine Java-Themen 18
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
N Script mit Java ausführen Allgemeine Java-Themen 21
F Java automatisch ausführen Allgemeine Java-Themen 3
J Alle Unit Tests in Maven Modul Projekt ausführen Allgemeine Java-Themen 7
D Verknüpfung mit Java Ausführen Allgemeine Java-Themen 1
H jar-Datei mit java.exe anstatt mit javaw.exe ausführen Allgemeine Java-Themen 9
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Classpath Java App ausführen Allgemeine Java-Themen 2
Javafan01 .sh datei in Java ausführen Allgemeine Java-Themen 1
Javafan01 Ausführen Allgemeine Java-Themen 1
das_leon Hotkey ausführen Allgemeine Java-Themen 1
A Input/Output VBS-Datein mit Java Ausführen Allgemeine Java-Themen 2
K Server mieten, Berechnungen darauf ausführen Allgemeine Java-Themen 14
L HTML Formular ausführen Allgemeine Java-Themen 1
Tommy Nightmare Ausführen von CMD Befehlen Allgemeine Java-Themen 10
H .Sh Datei ausführen programmieren Allgemeine Java-Themen 5
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
M *.class Files ausführen Allgemeine Java-Themen 2
C Ausführen einer .JAR Datei Allgemeine Java-Themen 5
J Batch datei öffnen und als Admin ausführen Allgemeine Java-Themen 43
J Ältere applets ausführen? Allgemeine Java-Themen 0
A Linux bash script ausführen Allgemeine Java-Themen 16
Viktim Bash Script in Java ausführen Allgemeine Java-Themen 6
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
T Programme ausführen.. Allgemeine Java-Themen 3
H Java Anwendungen ausführen Allgemeine Java-Themen 3
T Während des Programmlaufs andere Programme ausführen Allgemeine Java-Themen 1
T .jar über cmd ausführen (später dann batch) Allgemeine Java-Themen 6
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
buggy84 Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig Allgemeine Java-Themen 18
T Git-Befehle mit Java ausführen Allgemeine Java-Themen 5
Neumi5694 Datei mit erhöhten Rechten ausführen Allgemeine Java-Themen 2
Bananabert Java mit bestimmter GPU ausführen Allgemeine Java-Themen 7
F Mencoder unter Java Ausführen Allgemeine Java-Themen 0
L Jar-Datei in Web ausführen Allgemeine Java-Themen 1
U CMD Befehle als Admin ausführen Allgemeine Java-Themen 6
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
D swingset3.jnlp lässt sich nicht ausführen Allgemeine Java-Themen 2
S Shell Commands mit absolutem Pfad ausführen Allgemeine Java-Themen 2
G Umgebungsvariable Jar im Netzlaufverk ausführen Allgemeine Java-Themen 4
K Eclipse Fehler beim Ausführen meines Programms in Eclipse Allgemeine Java-Themen 11
F paintComponent() nicht automatisch ausführen? Allgemeine Java-Themen 5
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
M Java Anwendung ausführen Allgemeine Java-Themen 5
J Code ausführen bei JVM-Zerstörung Allgemeine Java-Themen 15
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
Hoppelmann Befehlszeile an bestimmtem Ort ausführen Allgemeine Java-Themen 2
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
C Rechnung genau 8 mal ausführen Allgemeine Java-Themen 5
aze Jar ausführen über Runtime.execute funktioniert nicht Allgemeine Java-Themen 4
S NoSuchMethodError beim Ausführen einer C Methode über JNI Allgemeine Java-Themen 5
C Umgebungsvariable Java-Datei in anderem Verzeichnis ausführen Allgemeine Java-Themen 2
F Jar auf Netzlaufwerk ausführen Allgemeine Java-Themen 2
Gossi Java Code in einer GUI eingeben und ausführen? Allgemeine Java-Themen 2
D Code später ausführen Allgemeine Java-Themen 8
Wirago (runnable) JAR-File ausführen Allgemeine Java-Themen 6
S Fehler beim ausführen des HTML Allgemeine Java-Themen 7
T jar Archiv auf Server ausführen Allgemeine Java-Themen 3
J CMD direkt in Java ausführen Allgemeine Java-Themen 11
B UNIX Shell befehl über JavaCode ausführen Allgemeine Java-Themen 19
J Threads Methode in Mainthread ausführen Allgemeine Java-Themen 5
A Jasperreports automatisch ausführen lassen Allgemeine Java-Themen 5
P jar-Datei lässt sich nicht ausführen Allgemeine Java-Themen 5
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
R Jar Datei ausführen Allgemeine Java-Themen 7
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
L Java Quellcode auf Windows 7 ausführen? Allgemeine Java-Themen 3
J Java Datei ausführen Allgemeine Java-Themen 8
DStrohma Kommandozeilen-Programm unendlich lang ausführen Allgemeine Java-Themen 13
truesoul Runtime.getRuntime().exec nebenbei ausführen Allgemeine Java-Themen 12
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
E Externes bat sichtbar ausführen Allgemeine Java-Themen 4
M in Abhänigkeit vom FileFilter, externes Programm ausführen Allgemeine Java-Themen 12
C ausgelesene SQL-Statements ausführen Allgemeine Java-Themen 21
L Programm um eine bestimmte Uhrzeit ausführen Allgemeine Java-Themen 4
Q .exe ausführen in Ort Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben