Mathefunktion zur Laufzeit einlesen und dann verarbeiten

Status
Nicht offen für weitere Antworten.
C

Carl

Gast
Hallo!

Mich interessiert ob folgende möglich ist:

Der User soll zur Laufzeit eine beliebige Funktion eingeben, die anschließend z.B. integriert wird. Es soll auf keinen Fall auf einen Funktionenpool o.ä. zugegriffen werden. Ich habe etwas gegoogelt und habe nur einen Hinweis auf BCEL bzw. GNU erhalten, auf deren Seiten wurde ich jedoch nicht schlauer. Was ich bis jetzt weiß:

Der Eingelesene Code muss nachträglich kompiliert werden. Jedoch wie geht so was? Hat da jemand eine gute Infoquelle?


Danke im voraus


Carl
 

Wildcard

Top Contributor
Was ist den der 'Funktionspool'?
Ich kann mir aus dieser Beschreibung auch nicht wirklich herleiten was du machen willst.
 
C

Carl

Gast
Also ich möchte folgendes erreichen:

1. Das Programm wird gestartet

2. Der User gibt eine Funktion per Tastatur ein, er soll also nicht aus z.B. 5 Funktionen eine auswählen können mit welcher er Arbeiten will, sondern eine beliebige Funktion eingeben können.
Um die Sache zu vereinfachen, kann man annehmen, dass die Funktion Java-Syntax konform (also nicht x^3 sondern x*x*x) einzugeben ist.

3. Danach wird mittels Trapezformel das angenäherte Integral berechnet und ausgegeben.

Das ganze muss mit Java geschehen.

Punkt 1 und 3 sind kein Problem. Jedoch bei Punkt 2 habe ich keine Ahnung wie man das anstellt, da man meiner Ansicht nach den eingegebenen Code nachträglich compilieren muss.


Carl
 

Marco13

Top Contributor
Es gibt ... erstmal, theoretisch 2 Möglichkeiten:
1. Du könntest die Funktion (zusammen mit dem ansonsten noch benötzigten Code) in eine .java-Datei schreiben, diese dann (mit dem Java-Internen Java-Compiler) compilieren, die .class-Datei laden, dir mit reflection ein Objekt dieser Klasse erstellen, und auf diesem Objekt dann deine Funktion aufrufen. Funktioniert prima. Hab ich mal gemacht. War aber nur ein Test - es ist nämlich (SEHR zurückhaltend formuliert: ) "unkonventionell".
Sinnvoller wäre die zweite Möglichkeit:
2. Du könntest in die FAQ schauen. Dort ist beschrieben, wie man einen Mathematischen Ausdruck auswerten kann. Das dort gepostete Programm muss evtl. noch etwas erweitert werden.
 
C

Carl

Gast
Hallo,

also die 2. Möglichkeit kommt wegen der suboptimalen Laufzeit nicht in Frage.
Die erste Möglichkeit ist das was ich suche. Ich hab gerade eben gesehen, dass das mit Java 6 ohne zusätzliche Programme möglich ist.

Danke für die Hilfe


Carl
 

Illuvatar

Top Contributor
Also mit Java 6 (oder auch vorher, da musst du aber extra was runterladen) solltest du eine mitgelieferte Script-Engine verwenden. Denn das, was wirklich am langsamsten ist, ist wohl die erste Möglichkeit, da dabei erst noch kompiliert werden muss.
Wenn du das, was in der FAQ beschrieben ist, selbst programmierst und optimierst, dürfte das wohl das schnellste sein. Allerdings höchstens unmerklich schneller (auch bei vielen Werten) als das mit der ScriptEngine, dafür deutlich aufwändiger.
 
S

SlaterB

Gast
was gibts da nicht zu verstehen?
ein Interpreter braucht Objekte für die einzelnen Zahlen, Variablen und Rechenoperationen, muss verzweigen, Bäume entlanglaufen, Operationen aufrufen (Daten in Stack speichern und später wiederherstellen), nach Klammern und sonstigen Regeln schauen..,

dagegen sagt ein compiliertes Programm nur Piep und ist fertig..

alles was das compilierte Programm rechnet muss der Interpreter auch machen,
dazu aber der Riesenoverhead das ganze zu organisieren..
 

Marco13

Top Contributor
@Illuvatar: Das compilieren benötigt EINMAL mehr Zeit - ist dann aber SAU schnell im Vergleich zu einem selbstgestrickten Parser. Spätestens, wenn man die (immer gleiche) Funktion dann ein paar tausend mal mit verschiedenen Werten aufruft, ist das compilierte sicher schneller.
 

Wildcard

Top Contributor
Davon abgesehen das Reflection einen ziemlichen overhead erzeugt und alles andere als schnell ist,
ist auch das parsen ein einmaliger Vorgang.
Danach wird genau wie mit der kompilierten Lösung auf Objekten gearbeitet ohne den Reflection Flaschenhals.
 

Illuvatar

Top Contributor
Ergänzung zu Wildcard @SlaterB:

Der Compiler muss genauso die Bäume entlanglaufen, Objekte erstellen, nach Klammern etc. schauen (zudem noch die Klassendefinitionen etc. parsen), usw.

(außerdem wäre noch zu sagen, dass das mit der ScriptEngine aber tatsächlich nichts wäre, da diese wirklich jedesmal neu parsen würde)
 
S

SlaterB

Gast
also ich stelle mir das so vor, dass eine geparste Lösung z.B. für
x*x

ein Mal-Objekt brauch und ein x-Objekt,

um nun die Formel für ein bestimmten Wert zu berechnen,
muss man mühsam das eine (oder mehrere) x-Objekt suchen, darin den Wert setzen,
und dann die Formel durchlaufen lassen,
also ganz generisch erst mal linken Teil + rechten Teil ausrechnen und im Mal-Objekt dann die calculate()-Operation aufrufen
(ich beziehe mich da auf den Parser in der FAQ),
locker 10 Operationsaufrufe wenn nicht viel viel mehr und wer weiß was noch alles zu tun ist

kompiliert ist es dagegen
public double operation1(double x) {
return x*x;
}

das soll NICHT schneller sein?
wie funktioniert denn ein ebenso schneller Parser?

inwiefern Reflection-Overhead auftritt mag ich nicht beurteilen, das kann gerne sein,
aber wenn's auf die Zeit ankommt muss man dann eben eine ganze Klasse schreiben die ne Minute/ halbe Stunde/ xy Zeit rechnet,
dann fällt der EINE Reflection-Aufruf wohl nicht mehr ins Gewicht ;)

-------

@Illuvatar:
es geht nicht ums Kompilieren (einmaliger Zeitaufwand), sondern um den Aufwand der Interpretation bei der Anwendung der Formel
 

Illuvatar

Top Contributor
Ich bin mittlerweile der Meinung, dass du bei hinreichend vielen Aufrufen wahrscheinlich schon Recht hast. Aber nichtsdestotrotz muss man ja wohl sowohl den Zeitaufwand fürs Kompilieren/Parsen als auch den Zeitaufwand fürs Interpretieren/Ausrechnen miteinberechnen. Und das Interpretieren von der kompilierten Klasse ist zwar sicher schneller, dafür ist aber sicherlich das Parsen schneller als das Kompilieren - und diese Sachen muss man eben abwiegen.
 
S

SlaterB

Gast
da stimme ich gerne zu,
es kommt immer darauf an worauf man sich bezieht
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Build-Zeitpunt (Datum und Uhrzeit) irgendwie während der Laufzeit zugänglich machen..? Allgemeine Java-Themen 4
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
M Laufzeit LinkedList Allgemeine Java-Themen 9
M verbesserte Laufzeit bei LinkedList Allgemeine Java-Themen 7
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
J Jasper Reports - Subreport zur Laufzeit ändern Allgemeine Java-Themen 6
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
M Sinn von Kompilierung zur Laufzeit Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
S Laufzeit Primzahlgenerator Allgemeine Java-Themen 18
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
F Classpath Programmteile zur Laufzeit nachladen Allgemeine Java-Themen 6
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
H ResourceBundle während Laufzeit bearbeiten Allgemeine Java-Themen 3
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
P Generic zur Laufzeit Allgemeine Java-Themen 4
A ar während der Laufzeit überschreiben Allgemeine Java-Themen 20
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
J Resourcen waehrend der Laufzeit aendern? Allgemeine Java-Themen 9
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
X Update einer Jar während der Laufzeit Allgemeine Java-Themen 8
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
S UML zur Laufzeit ändern Allgemeine Java-Themen 10
E Wert von enum zur Laufzeit festlegen. Allgemeine Java-Themen 5
L Methode in Thread mit langer Laufzeit unterbrechen (ANT executeTarget) Allgemeine Java-Themen 4
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
P Java Konsole zur Laufzeit einblenden Allgemeine Java-Themen 4
P Klassenwahl zur Laufzeit Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
E formartierte Ausgabe zur Laufzeit Allgemeine Java-Themen 2
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
Stillmatic Debuggen/ Laufzeit von Methoden Allgemeine Java-Themen 2
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
M Klasse zur Laufzeit ersetzen Allgemeine Java-Themen 10
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4
G Jar File zur Laufzeit ändern. Allgemeine Java-Themen 4
T Java - Compilieren während Laufzeit Allgemeine Java-Themen 3
Y JARs austauschen zur Laufzeit Allgemeine Java-Themen 11
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11
C Innere Klassen zur Laufzeit Instanzieren Allgemeine Java-Themen 4
T Zur Laufzeit erben? Allgemeine Java-Themen 22
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
L Zur Laufzeit eine Klasse laden, die auf jar-File zugreift Allgemeine Java-Themen 15
V Java-Programm weiss zur Laufzeit wie es gestartet wurde? Allgemeine Java-Themen 6
N Endlosschleifen automatisiert erkennen (Code oder Laufzeit)? Allgemeine Java-Themen 6
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
G Datei durchsuchen, lange Laufzeit! Allgemeine Java-Themen 2
A log4j 1.3 und ändern der log Konfiguration zur Laufzeit Allgemeine Java-Themen 4
Apo Zur Laufzeit Klassen mit Packages laden? Allgemeine Java-Themen 2
G genauen Typ einer generischen Klasse zur Laufzeit ermitteln Allgemeine Java-Themen 2
F Typ eines Objekts zur Laufzeit bestimmen? Allgemeine Java-Themen 8
T xverify-parameter : Workaround zur Laufzeit? Allgemeine Java-Themen 8
M Bibliotheksname zur Laufzeit ermitteln (Classloader) Allgemeine Java-Themen 7
G Klasse wird zur Laufzeit nicht gefunden? Allgemeine Java-Themen 3
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
MQue Laufzeit Allgemeine Java-Themen 4
D Lautstärke einzelner AudioClips zur Laufzeit verändern Allgemeine Java-Themen 4
G Klassen zur Laufzeit einbinden Allgemeine Java-Themen 3
J Bibliotheken erst zur Laufzeit laden Allgemeine Java-Themen 5
R Drag und Drop - Fehler während Laufzeit Allgemeine Java-Themen 14
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
A Class File zur Laufzeit laden ohne den Binary Name zu kennen Allgemeine Java-Themen 11
M Überprüfen einer zur Laufzeit geladenen Klasse Allgemeine Java-Themen 3
H Klassen aus einem Ordner zur Laufzeit laden. Allgemeine Java-Themen 6
S Laufzeit und Compilefehler Allgemeine Java-Themen 6
S JPanel zur Laufzeit verbergen bzw. wieder anzeigen lassen Allgemeine Java-Themen 4
F Objektname zur Laufzeit festlegen? Allgemeine Java-Themen 12
I Sprache zur Laufzeit des Programms ändern Allgemeine Java-Themen 3
G Laufzeit eines aus Java gestarteten Programms beobachten Allgemeine Java-Themen 3
S Log4J: Logdatei zur Laufzeit ermitteln. Allgemeine Java-Themen 2
I Zur Laufzeit ermitteln, ob Klasse in JAR-Datei Allgemeine Java-Themen 2
R iText.jar wird zur Laufzeit nicht gefunden Allgemeine Java-Themen 4
J ResourceBundle / properties-datei während der Laufzeit verän Allgemeine Java-Themen 6
H Methode einer zur Laufzeit generierten Instanz aufrufen Allgemeine Java-Themen 2
M Formel in einem String während Laufzeit berechnen. Allgemeine Java-Themen 4
S Bookmark HTML Datei einlesen, alle Links erhalten und manche editieren..? (aktuell JSoup) Allgemeine Java-Themen 4
killig Textdatei einlesen und in HashMap speichern (duplikate entfernen) Allgemeine Java-Themen 12
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
Master3000 Java Datei mehrmals einlesen Allgemeine Java-Themen 4
R Sonderzeichen aus Datei einlesen und in Datei ausgeben. Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben