Low-Level-Lua-Interpreter

7

Gibt es eine Möglichkeit, Lua-Code aus einem C / C ++ - Programm auf einer feineren Ebene als ein Standardfunktionsaufruf "lua_pcall" auszuführen? Idealerweise würde ich gerne in der Lage sein, eine Liste von Low-Level-Bytecode-Anweisungen zu durchlaufen (vorausgesetzt, dass solche Dinge vorhanden sind) und sie einzeln auszuführen, sodass ich meinen eigenen Scheduler schreiben konnte, der mehr Kontrolle über Dinge als nur das Ausführen hatte eine komplette Lua-Funktion von Anfang bis Ende.

Der Grund, warum ich dies tun möchte, ist, weil ich C-Funktionen implementieren möchte, die der Lua-Code aufrufen kann, was dazu führen würde, dass das Programm wartet, bis eine bestimmte (möglicherweise langatmige) Aktion beendet wurde, bevor die Ausführung fortgesetzt wird. Es würde einen hohen Anteil solcher Funktionsaufrufe in einem typischen Lua-Skript geben, so dass die Idee, es neu zu schreiben, um Rückrufe zu verwenden, sobald die Aktion abgeschlossen ist, nicht wirklich praktisch ist.

    
andygeers 14.03.2009, 20:14
quelle

4 Antworten

14

Die Frage vielleicht seitlich stellen, aber Sie könnten Lua-Koroutinen anstelle von benutzerdefiniertem C-Zeug verwenden, um zu warten, bis ein Ereignis eintritt.

Beispielsweise könnte eine Coroutine eine waitForEvent () - Funktion aufrufen. Dort können Sie zu einem anderen Coro wechseln, bis dieses Ereignis eintritt, und dann mit dem ersten fortfahren. Werfen Sie einen Blick auf die Lua Coro Docs , um mehr darüber zu erfahren.

    
Jesse Rusak 14.03.2009, 20:22
quelle
6

Jders Vorschlag, Koroutinen zu verwenden, wird sehr gut funktionieren, wenn Sie diese lange wartenden C-Routinen schreiben können, indem Sie Lua's kooperatives Threading-Feature (Explicit Yield) verwenden. Sie werden immer noch lua_pcall () verwenden, um Lua einzugeben, aber der Einstiegspunkt ist Ihre Coroutine-Manager-Funktion.

Dies funktioniert jedoch nur, wenn die C-Routinen nichts tun, während sie warten. Wenn sie lange ausgeführt werden, weil sie beispielsweise etwas berechnen, müssen Sie mehrere Betriebssystemthreads ausführen. Lua ist threadsafe - einfach mehrere Threads erstellen und lua_open () in jedem Thread ausführen.

Von Ссылка

  

Die Lua-Bibliothek definiert kein globales   Variablen überhaupt. Es behält alles bei   Zustand in der dynamischen Struktur   lua_State und ein Zeiger darauf   Struktur wird als Argument übergeben   alle Funktionen in Lua. Dies   Implementierung macht Lua wiedereintrittsfähig und   bereit, in Multithread verwendet zu werden   Code.

Sie können die beiden Ansätze auch kombinieren. Wenn Sie eine Wrapper-Lua-Funktion haben, um einen OS-Thread zu starten, können Sie nach dem Start des Threads nachgeben. Der Coroutinen-Manager verfolgt die Threads und setzt eine Coroutine fort, wenn der gestartete Thread beendet ist. Dadurch können Sie einen einzelnen Lua-Interpreter mit mehreren Worker-Threads verwenden, die reinen C-Code ausführen.

    
Ken Fox 14.03.2009 20:56
quelle
5

Wenn Sie den OS-Threading-Weg gehen, sehen Sie sich bitte Lua Lanes an. Ich würde sehen, dass es die perfekte Lösung für das ist, was Sie erreichen wollen (= werfen Sie ein Addon-Modul in den Mix und Sie werden klaren, verständlichen und einfachen Code mit nahtlos eingebautem Multithreading erstellen).

Bitte teilen Sie uns mit, wie Ihr Problem gelöst wurde. :)

    
akauppi 15.03.2009 23:10
quelle
2

Hilft die Debugging-Oberfläche ?

    
Jonathan Leffler 14.03.2009 20:19
quelle

Tags und Links