2010-06-24 4 views
10

Was sind meine Optionen in Bezug auf eine schnelle funktionale Sprache für die Verwendung von Bibliotheken in einer plattformübergreifenden Qt C++ - Anwendung?Gute plattformübergreifende funktionale Sprache für die Verwendung in einer C++ - Anwendung?

Es scheint fast alle Sprachen (funktional oder nicht) haben eine Möglichkeit, C/C++ - Code auf einfache Weise aufzurufen. Ich möchte den umgekehrten Weg gehen - schreibe eine Anwendung in Qt mit C++ für Stateful Business Logik, GUIs und so weiter, aber lehne ab und benutze eine funktionale Sprache für die Core-Berechnungsbibliothek.

Welche sind auf diese Weise einfach zu verwenden? Kann beispielsweise OCaml-Code in eine statische Bibliothek kompiliert werden und dann von einer C++ - App verwendet werden?

Danke, Rickard

+0

Auch: Es besteht eine Abhängigkeit von der Geschwindigkeit, da der Funktionscode so schnell wie möglich einige schwere Berechnungen durchführen würde (Lösen von PDEs mittels Finite-Differenzen-Methoden). – Rickard

Antwort

5

Haskell hat diese Fähigkeit, wenn die Interaktion mit Qt/qmake und Buildprozess mit ghc ein wenig Trickserei zum Laufen zu bringen nehmen kann:

http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

Es gibt auch ein Projekt HaskellDirect genannt, die ähnlich scheint wie auch für Ihren Zweck:

http://www.haskell.org/hdirect/

+0

Ich bin versucht, diese Straße zu gehen. Es ist ein kleines nicht-kommerzielles Projekt, so dass nicht viel außer meiner Freizeit gefährdet ist. Ich nehme an, dass die Haskell-Laufzeit keine Probleme mit der Parallelität haben wird und dass ich die Bibliothek von mehreren Threads gleichzeitig aufrufen kann? Ich werde diese Antwort wahrscheinlich bald akzeptieren, auch wenn dies vielleicht eine subjektive Frage war und keine eindeutige "richtige" Antwort gegeben wurde. – Rickard

2

AutoCAD verwendet AutoLisp so mein Vorschlag wäre, Lisp sein.

+0

Ich habe zu wenig Erfahrung mit Lisp, aber ich frage mich, ob der Lisp-Compiler kann c-Verbrauchsrate Bytecode, so dass ich einfach Funktionen in der Bibliothek aufrufen kann? Ich möchte vermeiden, einen in der Anwendung eingebetteten Interpreter verwalten zu müssen (wie wenn man Python in eine C-App einbettet und mit Referenzzählung und PyObject * s herumfummeln muss, nur um eine Funktion aufzurufen). – Rickard

+0

Şerbănoiu: Ja, aber AutoLisp wurde speziell zum Einbetten in AutoCAD erstellt. Dies bedeutet nicht, dass alle Lisps automatisch die Eigenschaft haben, dass ihre Funktionen einfach aus C++ - Code aufgerufen werden können.Beachten Sie, dass er nicht versucht, eine Sprache in seine C++ - App einzubetten, sondern kompilierten Bibliothekscode, der in einer anderen Sprache geschrieben wurde, von seiner App aus aufzurufen. – sepp2k

2

würde ich versucht seine qtHaskell zu überprüfen, und die ganze Sache in Haskell zu tun. Meine Meinung basiert auf Don Stewarts bemerkenswerten Erfolg unter xmonad in Haskell.

+0

Es ist verlockend, aber ich möchte so wenig wie möglich auf Ports von Bibliotheken (wie qt) verlassen. Bestimmte Dinge sind auch sehr leicht mit Klassen in C++ zu tun, wenn es um State-Keeping-Logik geht. Danke trotzdem für deine Antwort - ich werde sicherlich die Möglichkeit in Betracht ziehen. – Rickard

1

Lisp und Haskell sind ausgezeichnete funktionale Sprachen, aber wenn wir die Leichtigkeit der Bindung von C/C++ Code zusammen mit der Sprache betrachten, würde ich Lua empfehlen.

Es ist extrem einfach, C-Funktionen sofort mit lua zu verbinden, der Interpreter ist eine sehr kompakte und einfach zu erstellende Bibliothek, gehört zu den schnellsten Skriptsprachen überhaupt, und mit luabind können Sie problemlos C++ - Klassen binden , Template-Instanziierungen, etc. Ich musste in der Vergangenheit Bindings für zahlreiche Skriptsprachen machen und ich habe noch nie eine gefunden, die so einfach ist wie Lua. Es wird auch mit swig unterstützt, wenn Sie es vorziehen, Dinge durch swig zu binden, die es Ihrer Anwendung ermöglichen, mehrere Skriptsprachen zu unterstützen.

Aus reinsprachiger Sicht macht es der Meta-Feature/Metaprogrammierungs-Aspekt von lua (vergleichbar mit Lisp) sehr einfach, alle Arten von Programmierparadigmen zu unterstützen, obwohl ich persönlich es für die funktionale Programmierung am besten finde. Es ist extrem anpassbar und gut geeignet für den Embedded-Einsatz.

Da Sie jedoch bereits qt verwenden, könnte qtHaskell auch eine gute Wahl sein.

+0

Vielleicht ist Lua eine viel bessere Wahl für solche Sachen, aber ich kenne die Probleme, die mit der Einbettung und dem Ausführen von Python-Code aus einer C/C++ - App einhergehen. Es ist so viel mehr Arbeit, als nur einige Runtime zu initialisieren und Funktionen aufzurufen. Ich schaue mir aber die C-api in der Lua-Dokumentation an. Ich habe große Dinge über die Geschwindigkeit von Lua gehört, also ist es sicherlich interessant. Danke für deine Antwort. – Rickard

Verwandte Themen