Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 05:23

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: ScriptSprachen für C++
BeitragVerfasst: Mi Sep 09, 2009 13:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

u.A. durch den Game-Framework Thread wurde ich grad wieder daran erinnert das ich mich schon länger um eine ScriptSprache kümmern wollte..
Da aber das ja durchaus ein nicht zu unkomplexes thema ist, wollte ich hier doch mal schauen ob es nicht gute lösungen bereits gibt :)

Was kennt ihr denn so für scriptsprachen die man in C++ einbinden kann?
Ich persönlich kenne eigentlich nur LUA.. und das sagt mir sowohl von der einbindung im Code als auch von der syntax nicht zu..

Gibt es andere gute, C-syntax mäßige ScriptSprachen die man frei verwenden kann?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 09, 2009 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Mir geht es ähnlich. EIne zeitlang hatte ich ECMA beforzugt, aber dadurch das man für OpenGL 3.x recht viel mathe krams selbst machen muss und man dor keine operatoren überladen kann. Ist der nutzen schon fast bei null angelangt. Die scripte würden einfach nicht mehr wie scripte, sondern eher wie zusammgehacktes C ohne typen aussehen....

Ich hab schon überlegt ob man z.B. squirrel anpassen könnte was auch sehr C ähnlich ist, aber im endefekt wäre hier eine saubere neue implementierung notwendig um alles so zu unterstützen wie ich es bräuchte....

Ich würde eher in die richtung GLSL syntax tendieren aber zusätzliche datentypen für strings.

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 09, 2009 21:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Hm, Horazonts Thorium Scripting Language ist zwar imho mehr Pascallike, aber sie hat den Vorteil, dass man reale Funktionen des Hostsystems einbinden kann. Und es bliebe "in der Familie" ;-)

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 10, 2009 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ziz, nur leider ist Thorium in FreePascal geschrieben und müsste erstmal nach C++ portiert werden. Was schon bei späßen wie RTTI nen horror wird.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Im irc sind uns einige ideen gekommen. Da RTTI in C++ auf den klassennamen beschränkt ist (und auch nur dann geht wenn mindestends eine virtuelle funktion vorhanden ist und somit für einfache datentypen nicht funktioniert) und somit auch keine reflektion möglich ist (nur der compiler kennten die member bei namen), wird die einzigste möglichkeit sein einen Meta Objekt Compiler zu schreiben, der ähnlich wie bei Qt arbeitet.

Die informationen was gewrapt werden soll (und unter welchen bedingungen) muss dann mit in den klassenheader geschrieben werden.

Der MOC würde dann alle herader des Projektes durcharbeiten und alle wrapping informationen sammeln. Diese werden zum schluss auf vollständigkeit geprüft. So das z.B. keine unbekannten klassen als argumente verwendet werden können.
Zum schluss wird aus all den gewrappten funktionen eine virtuelle maschine zusammengebaut.

Im gegensatz zu anderen Scriptinterpretern, gibt es keinen genormten funktionsaufruf der immer gleiche argumente hat. Dies führt schnell zu langsamen selbst geschrieben wrapping code, da man erst festellen muss ob man genug argumente hat, sie erst einmal casten muss (quasi immer mit kopiernen verbunden)

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 12:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hey,

ich sitz grad wieder vor 3ds Max und muß mal wieder nen plugin schreiben wo ich auch grad unterstützung für MaxScript einbinden muß... und, ohne von dem MOC-Vorhaben wegzuwollen frage ich mich wie die das gelöst haben - so rein interesse halber.

Man registriert alle funktionen die im MaxScript zur verfügung gestellt werden in etwa so:

Code:
  1. void myFunction(int param1, char *param2)
  2. {
  3.   [...]
  4. }
  5.  
  6. int otherFunction(int meow, bool bla, bool blubb)
  7. {
  8.   [...]
  9.   return 42;
  10. }
  11.  
  12. ScriptInterface myInterface (
  13.   TYPE_VOID, myFunction, "myFunction", 2, TYPE_INT, TYPE_STRING,
  14.   TYPE_INT, otherFunction, "otherFunction, 3, TYPE_INT, TYPE_BOOL, TYPE_BOOL,
  15.   END
  16. );


So, mehr muß man da nicht machen um eine funktion für MaxScript zu publishen...
Jetzt frage ich mich, wie hand habt der das intern...?

Wenn ich jetzt via MaxScript meine funktion aufrufe "myFunction(23, "Hallo")".. dann geht der vermutlich (irgendwie optimiert bestimmt, aber vom grundprinzip) alle registrierten funktionen durch und schaut ob er die funktion mit dem namen "myFunction" findet.

Wenn er sie dann gefunden hat sieht er "Okay, die will 2 Parameter.. einmal INT und einmal STRING".

Jetzt hat er also die 2 Parameter die aus MaxScript kommen (nehmen wir mal an er hat sie schon in pointer auf die korrekten werde im speicher verwandelt)... also einen pointer auf ein integer "42" und einen pointer auf einen string "Hallo", sowie einen pointer auf die funktion "myFunction" und die information das die 2 parameter will..

Wie ruft er die nun im endeffekt auf..?
Man kann ja nicht dynamisch zur laufzeit nen funktions aufruf zusammen basteln.. aber im preprozessor passiert es definitiv auch nicht (Das oben ist kein #define.. sondern nen constructor mit var_args).

Ich bin da etwas ratlos wie die das gelöst haben grade irgendwie.. kann es mir nur so erklären das sie das ganze auf ASM ebene gemacht haben.. aber, keine ahnung :/

Irgendwer ne idee?

Aya~

PS: MaxScript ist übrigens eine extrem schnelle Script sprache finde ich..


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Aufrufen von Scriptfunktionen aus dem hauptprogram kann dynamisc erfolgen. Umgekehr ist es nicht so einfach, da die funktionen der scriptsprache bekann sein müssen. Und wenn diese nicht zu compilezeit bekannt sind gibt es nur zwei möglichkeiten:

EInen Assembler Hack der den funktionsaufruf versucht nachzubauen.
Oder einen genormten funktionsaufruf, bei dem die arumente in einer art variantliste gespeichert sind

Ich bin da halt für die 3te möglichkeit und würde das schon voher vom compiler lösen lassen.....

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 13:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
oc2k1 hat geschrieben:
EInen Assembler Hack der den funktionsaufruf versucht nachzubauen.
Oder einen genormten funktionsaufruf, bei dem die arumente in einer art variantliste gespeichert sind

Nen genormter funktions aufruf kann es nicht sein, denn ich kann meine funktionen schreiben wie ich will (siehe beispiel oben)... also muß es ja via assembler gemacht werden.. oder hat noch wer ne andere idee?

oc2k1 hat geschrieben:
Ich bin da halt für die 3te möglichkeit und würde das schon voher vom compiler lösen lassen.....

Ja ich ja auch, aber mich interessiert es halt trotzdem wie andere es lösen.. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 14:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Denk daran, das due ein script geschrieben hast. Da kann man im schlimmstem fall die argumente auf einen selbsgebauten stack schreiben und die funktion mit ihrem namen als string ansprechen.
(Das hasen des funktionsnamens und das anschließende suchen nicht wirklich die schnellste methode ist kann man sich wohl denken....)

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
oc2k1 hat geschrieben:
Denk daran, das due ein script geschrieben hast. Da kann man im schlimmstem fall die argumente auf einen selbsgebauten stack schreiben und die funktion mit ihrem namen als string ansprechen.
(Das hasen des funktionsnamens und das anschließende suchen nicht wirklich die schnellste methode ist kann man sich wohl denken....)

Mir geht es nicht darum wie ich aus C++ eine funktion im script aufrufe, sondern andersrum.. aus dem Script heraus eine C++ funktion.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Solange der script engine zur compilezeit die funktionsdefinition bekannt ist , ist es kein problem. Es gäbe da den sonderfall, das man au einer scriptsprache eine funktion aus einer dynamischen lib aufrufen will. Das würde nur mit assembler code gehen (oder man müste genau für die funktion einen prototypen mit exakt gleichen argumenten in der engine unterstützen)
Aber ob man dieses feature haben will ist sehr fraglich..... sobald ein script auf dlls zugreifen kann, kann es aus seiner Sandbox ausbrechen.

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 11, 2009 17:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
oc2k1 hat geschrieben:
Solange der script engine zur compilezeit die funktionsdefinition bekannt ist , ist es kein problem. Es gäbe da den sonderfall, das man au einer scriptsprache eine funktion aus einer dynamischen lib aufrufen will. Das würde nur mit assembler code gehen (oder man müste genau für die funktion einen prototypen mit exakt gleichen argumenten in der engine unterstützen)
Aber ob man dieses feature haben will ist sehr fraglich..... sobald ein script auf dlls zugreifen kann, kann es aus seiner Sandbox ausbrechen.


Das ist es ja was ich versuche zu erklären... der scriptengine bei 3ds Max sind zur compile-zeit NICHT die funktionsdefinitionen bekannt... lediglich deren namen und anzahl/typen der parameter. -> Wie machen die das?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 07:04 
Offline
DGL Member

Registriert: Mo Mär 16, 2009 10:22
Beiträge: 26
Die Antworten stehen doch schon oben.

1. Es wird manuell der Stack mit den entsprechenden Variablen gefüllt ( Die hast du der Scriptengine ja mitgeteilt) und dann über die Funktionsadresse (die hast du der der Scriptengine auch überlassen) die FUnktion aufgerufen. Der Rückgabewert kann ausgelesen werden, da du den Typ der Scriptengine ja mitgeteilt hast! Tada!

2. Eher unwahrscheinlich: es liegen lauter Funktionsprototypen vor, und es wird der genommen, der auf deine Definition passt.


Für eine eigene Scriptengine könnte man sowas wie 2. machen, wenn man erstmal wenig Aufwand haben möchte. Man überlegt sich ein paar c++ Funktionentypen (z.b. int xxx ( int, string) ) die man eigentlich nur braucht, und übergibt der Scriptengine die Zeiger zu solchen Funktionen, und jeweils einen string zur Identifikation. Die Scriptengine ruft dann über den Zeiger die Funktionen auf, falls sie in einem Script auf den entsprechenden String stößt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 23:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Habt Ihr eigentlich schon mal Python in Betracht gezogen? Ist ein ziemlich mächtige Scriptsprache und die gibt es praktisch auf jeder Plattform. Nur zur Erinnerung: Blender hat einen Python Interpreter eingebaut. http://docs.python.org/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Sep 12, 2009 23:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Traude hat geschrieben:
Habt Ihr eigentlich schon mal Python in Betracht gezogen? Ist ein ziemlich mächtige Scriptsprache und die gibt es praktisch auf jeder Plattform. Nur zur Erinnerung: Blender hat einen Python Interpreter eingebaut. http://docs.python.org/


Jep habe ich überlegt, aber ich mag Python nicht besonders... ich mag die syntax einfach nicht.. :)

Ich hatte vor einiger zeit mal in ein Programm eine Python anbindung integrieren müßen (Allerdings in C#, nicht C++).. und fand das von der art wie man es einbindet auch nicht sooo toll..

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]