PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java / Formeln in Datenbank


oliver123
2006-01-02, 13:49:04
Hallo Zusammen,

ich habe eine Datenbankanwendung in der verschiedene Berechnungen durchgeführt werden. Für die verschiedenen Berechnungen sind wiederum Formeln hinterlegt. In der Datenbank stehen rund 400 Formeln. Diese Formeln will ich nun in Java ausführen. Eine Formel besteht z.B. aus

EP*0.1/FL1*0.33*(FL2+0.83)

EP,FL1 und FL2 sind Variablen.

Wie wäre denn der schnellste und Fehlerunanfälligste Weg das auszuführen. Händisches Parsen erscheint mir etwas Fehleranfällig. Ich bin noch auf
Rhino (eval()) und JavaCC gestossen, wie macht ihr sowas? JavaCC scheint mir für das Vorhaben geeignet zu sein.

Trap
2006-01-02, 14:23:20
Das kommt ganz darauf an was die Formeln genau bedeuten und wofür sie verwendet werden.

Ist 0.1==1/10 oder soll man 0.1 als Gleitkommazahl lesen? Bei Gleitkommazahlen gilt das Assoziativgesetz nichtmehr, daher ist dann die genaue Reihenfolge der Operationen wichtig.

Eine Möglichkeit wäre die Formeln passend zu verpacken, sie dem Java-Compiler vorzuwerfen und dann per Classloader zu laden.

Gast
2006-01-02, 14:58:17
Was genau steht denn in der Datenbank? Steht da als String das was du gepostet hast? Oder ist das schon geparsed? Falls ja wie? Als Baum? Falls nicht solltest du das eben in Java erst mal machen. Gibt genügend Beispiele im Web für mathematische Formelparser.

Coda
2006-01-02, 16:07:46
Kann man mit Java wie in .NET Bytecode erzeugen?

Senior Sanchez
2006-01-02, 16:26:29
Kann man mit Java wie in .NET Bytecode erzeugen?

Übersehe ich gerade Ironie-Tags oder kapier ich den Witz nicht? *g*
Erläutere mal bitte näher, was du mit dieser Aussage meinst *g*

HellHorse
2006-01-02, 16:30:56
Kann man mit Java wie in .NET Bytecode erzeugen?
Ja, ist aber mühsam da meist direkt Bytecode und nicht IR oder ähnlich.

Es ist alles eine Frage des Speeds. Die einfachste Lösung ist wohl zu parsen (muss siewieso gemacht werden) und dann den Parsetree zu `interpretieren' (visiten). Wenn es wirklich so simpel wie das Beispiel ist, kannst du den Parser auch von Hand schreiben, ansonsten wie schon erwähnt ANTLR, JavaCC und Konsorten.

Rhino und eval() tönt lustig :D allerdings musst den String auch irgendwie parsen um and die Variablennamen zu kommen oder liegen die sepparat in der DB?

Edit:
Etwas ähnliches BeanShell (http://www.beanshell.org/javadoc/bsh/Interpreter.html). Da hast du aber immer noch das Problem, das du die Variablen binden musst.

RoKo
2006-01-02, 16:31:35
Kann man mit Java wie in .NET Bytecode erzeugen?
Nein. Wäre hierfür aber auch etwas übertrieben ;)

HellHorse
2006-01-02, 16:34:46
Übersehe ich gerade Ironie-Tags oder kapier ich den Witz nicht? *g*
Erläutere mal bitte näher, was du mit dieser Aussage meinst *g*
Er meint vermutlich zur Laufzeit Bytecode generieren. So könnte man die Formel z.B. in eine Methode kompilieren. Zur Laufzeit.

Trap
2006-01-02, 16:42:45
Nein. Wäre hierfür aber auch etwas übertrieben ;)
Doch, natürlich kann man in Java zur Laufzeit bytecode erzeugen: http://asm.objectweb.org/

Würde ich aber dem Java-Compiler überlassen, zumindest wenn man dafür sorgen kann, dass auf dem Rechner wo die Anwendung läuft die JDK installiert ist.

RoKo
2006-01-02, 17:37:19
Doch, natürlich kann man in Java zur Laufzeit bytecode erzeugen: http://asm.objectweb.org/
Hübsch, kannte ich noch nicht.
Würde ich aber dem Java-Compiler überlassen, zumindest wenn man dafür sorgen kann, dass auf dem Rechner wo die Anwendung läuft die JDK installiert ist.
Für den Fall hier selbstverständlich, ansonsten zu ineffizient ;)

oliver123
2006-01-03, 02:06:18
Danke für eure Tipps. Ich werde es dann wohl doch selber parsen. Die Formeln werden nur wenig komplexer also eigentlich nur Grundrechenarten, nix kompliziertes. Ich schau mir das Thema mit den Formelparsern nochmal genauer an.

Coda
2006-01-03, 03:07:08
Übersehe ich gerade Ironie-Tags oder kapier ich den Witz nicht? *g*
Erläutere mal bitte näher, was du mit dieser Aussage meinst *g*Man kann in .NET direkt Bytecode erzeugen der dann vom JIT ausgeführt wird. Das ist für Compiler aller Art (Regexp z.B.) sehr nützlich wenn das Resultat oft verwendet werden.

Köppchen
2006-01-03, 23:09:11
Ich würde den aufwand viel selber zu parsen nicht treiben.
Es gibt einen Haufen Scriptsprachen welche man in Java einbinden kann.
Aktuell ist groovy aufgrund des zugehörigen JSR vermutlich das naheliegende. Aber es gibt auch viele weitere Scriptsprachen wie z.B. Jython (Python), Jacl (Tcl) die sich zur Laufzeit ausführen lassen. Diese Scriptsprachen bieten in der Regel auch die Möglichkeit als String übergebene Codestücke auszuführen.
D.h. ich würde aus der Formel ein Stück Scriptsprache generieren (oder die Formel direkt in der Scriptsprache hinterlegen) und dann diesen Code ausführen lassen.

Coda
2006-01-04, 02:30:04
Tjaja jetzt sollte man boost::spirit haben ;)

HellHorse
2006-01-04, 19:10:37
Ich würde den aufwand viel selber zu parsen nicht treiben.
OMG, dafür einen rekursiv absteigenden Parser von Hand zu schreiben ist doch kein Aufwand, und das sage ich als bekennede faule Sau. IIRC gibt's sogar irgendwo im Forum schon einen.
Alternativ findet man sowas meist in den Manuals von Parsergeneratoren als Beispiel ;)

ethrandil
2006-01-09, 02:01:19
OMG, dafür einen rekursiv absteigenden Parser von Hand zu schreiben ist doch kein Aufwand, und das sage ich als bekennede faule Sau. IIRC gibt's sogar irgendwo im Forum schon einen.
Alternativ findet man sowas meist in den Manuals von Parsergeneratoren als Beispiel ;)
Du hast ein gutes Gedächtnis ;)

http://www.forum-3dcenter.org/vbulletin/showthread.php?t=60420

- Eth