<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=ScriptEngines%2Fde</id>
		<title>ScriptEngines/de - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/index.php?action=history&amp;feed=atom&amp;title=ScriptEngines%2Fde"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=ScriptEngines/de&amp;action=history"/>
		<updated>2026-05-12T04:29:30Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/index.php?title=ScriptEngines/de&amp;diff=54022&amp;oldid=prev</id>
		<title>Manni: Created page with &quot;{{Quicklinks|ScriptEngines}} &lt;br /&gt;  == Skript-Engines ==  OpenSimulator unterstützt das Skripten über Skript-Engines. Skript-Engines sind normale Regionsmodule.  Diese Seit...&quot;</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/index.php?title=ScriptEngines/de&amp;diff=54022&amp;oldid=prev"/>
				<updated>2024-03-05T10:43:40Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{Quicklinks|ScriptEngines}} &amp;lt;br /&amp;gt;  == Skript-Engines ==  OpenSimulator unterstützt das Skripten über Skript-Engines. Skript-Engines sind normale Regionsmodule.  Diese Seit...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Quicklinks|ScriptEngines}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Skript-Engines ==&lt;br /&gt;
&lt;br /&gt;
OpenSimulator unterstützt das Skripten über Skript-Engines. Skript-Engines sind normale Regionsmodule.&lt;br /&gt;
&lt;br /&gt;
Diese Seite behandelt gemeinsame Teile von Skript-Engines.&amp;lt;br&amp;gt;&lt;br /&gt;
OpenSimulator hat derzeit zwei öffentliche Skript-Engines, XEngine und YEngine.&amp;lt;br&amp;gt;&lt;br /&gt;
Für weitere Informationen siehe bitte [[XEngine]] und [[YEngine]].&lt;br /&gt;
&lt;br /&gt;
Für Informationen zur alten DotNetEngine, die in OpenSimulator 0.6.8 veraltet war und anschließend aus dem Kernbaum entfernt wurde, siehe bitte [[DotNetEngine]] und [[OpenSim.Region.ScriptEngine]].&lt;br /&gt;
&lt;br /&gt;
:Hinweis: Diese Seite stellt ein Implementierungsziel dar. Vieles davon funktioniert bereits, aber einige Teile sind noch nicht implementiert.&lt;br /&gt;
&lt;br /&gt;
== OpenSim.ini-Einstellungen ==&lt;br /&gt;
Mehrere Skript-Engines können jetzt gleichzeitig aktiv sein. Die Direktive script_engine in der OpenSim.ini wird nicht mehr verwendet!&lt;br /&gt;
Stattdessen finden Sie im Abschnitt [Startup] jetzt&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
DefaultScriptEngine = &amp;quot;XEngine&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
XEngine ist standardmäßig aktiviert. Um es auf eine andere Engine zu ändern, ändern Sie die Kommentare, um die Zeile zu aktivieren&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
DefaultScriptEngine = (irgendein Engine-Name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
XEngine kann auch deaktiviert werden, indem Sie&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[XEngine]&lt;br /&gt;
Enabled = false&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
setzen.&lt;br /&gt;
Diese sind standardmäßig auf true gesetzt.&lt;br /&gt;
&lt;br /&gt;
OpenSimulator sollte in der Lage sein, mehrere Skript-Engines gleichzeitig auszuführen, aber dies sollte vermieden werden.&lt;br /&gt;
&lt;br /&gt;
== Verwendung mehrerer Skript-Engines ==&lt;br /&gt;
&lt;br /&gt;
Um ein Skript auf einer bestimmten Engine auszuführen, beginnen Sie das Skript mit einer ersten Zeile wie:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//XEngine: oder //someOtherEngineName:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Optional kann dies durch einen Sprachcode ergänzt werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//XEngine:lsl&lt;br /&gt;
//someOtherEngineName:lsl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Beachten Sie: Es gibt einen kleinen Seiteneffekt. Wenn Sie Ihr Skript mit irgendetwas wie&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
//beliebiger Text:&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
(beginnend mit &amp;quot;//&amp;quot; und endend mit &amp;quot;:&amp;quot;) starten, erhalten Sie einen Fehler&lt;br /&gt;
&lt;br /&gt;
''&amp;quot;Ausgewählte Engine nicht verfügbar. Skript wird auf XEngine ausgeführt.&amp;quot;''&lt;br /&gt;
&lt;br /&gt;
Eine Skript-Engine definiert eine Möglichkeit, ein Skript zu laden und auszuführen. Sie verwendet Compiler und Laufzeiten, um dies zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Compiler nehmen Skripttext und wandeln ihn in eine .NET-Assembly um. Eine solche Assembly muss auf eine Laufzeit verweisen, die API-Stubs bereitstellt.&lt;br /&gt;
&lt;br /&gt;
Derzeit existiert ein Compiler für lsl.&lt;br /&gt;
&lt;br /&gt;
Eine Laufzeit existiert für die LSL-API und für die OSSL-API. [[LSL Status/Functions]]&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Verzeichnisstruktur (unter /OpenSim/Region/) beschrieben:&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;margin-left:20px;&amp;quot;&lt;br /&gt;
|ScriptEngines/XEngine/||Die Engine selbst. Methoden zum Verwalten von Threads, AppDomains usw.&lt;br /&gt;
|-&lt;br /&gt;
|ScriptEngines/Interfaces/||Gemeinsame Schnittstellen, die zur Erstellung von Skript-Engines und -Komponenten verwendet werden&lt;br /&gt;
|-&lt;br /&gt;
|ScriptEngines/Shared/CodeTools/||Der aktuelle Compiler&lt;br /&gt;
|-&lt;br /&gt;
|ScriptEngines/Shared/Api/Interface/||Die API-Schnittstellen (siehe unten)&lt;br /&gt;
|-&lt;br /&gt;
|ScriptEngines/Shared/Api/Implementation/||Die API-Implementierungen (siehe unten)&lt;br /&gt;
|-&lt;br /&gt;
|ScriptEngines/Shared/Api/Runtime/||Die API-Laufzeiten (siehe unten)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine API wird als Implementierung, Schnittstelle und Laufzeit definiert. Der Grund für diesen scheinbar komplizierten Ansatz liegt darin, dass Skripte in AppDomains ausgeführt werden, die vom normalen OpenSimulator-Code getrennt sind.&lt;br /&gt;
&lt;br /&gt;
Die Erstellung einer API ist ziemlich unkompliziert, aber es müssen einige Namenskonventionen beachtet werden, damit die Api korrekt funktioniert. Die Skriptlaufzeit verwendet Reflexion, um Api-Laufzeiten mit Implementierungen abzugleichen, und sie verwendet Namen, um diese Abgleiche zu finden.&lt;br /&gt;
&lt;br /&gt;
Erstellen Sie zuerst Ihre API-Implementierung.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace OpenSim.Region.ScriptEngine.Shared.Api&lt;br /&gt;
 {&lt;br /&gt;
     public class XXX_Api: MarshalByRefObject, IXXX_Api, IScriptApi&lt;br /&gt;
     {&lt;br /&gt;
        internal IScriptEngine m_ScriptEngine;&lt;br /&gt;
        internal SceneObjectPart m_host;&lt;br /&gt;
        internal uint m_localID;&lt;br /&gt;
        internal UUID m_itemID;&lt;br /&gt;
&lt;br /&gt;
csharp&lt;br /&gt;
&lt;br /&gt;
    public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID)&lt;br /&gt;
    {&lt;br /&gt;
        m_ScriptEngine = ScriptEngine;&lt;br /&gt;
        m_host = host;&lt;br /&gt;
        m_localID = localID;&lt;br /&gt;
        m_itemID = itemID;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public void myApiFunction()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird der Klassenname (XXX_Api) von Reflexion verwendet, er muss mit &amp;quot;_Api&amp;quot; enden, um als Api erkannt zu werden.&lt;br /&gt;
&lt;br /&gt;
Platzieren Sie die Datei in OpenSim/Region/ScriptEngines/Shared/Api/Implementaton/.&lt;br /&gt;
&lt;br /&gt;
Nach Konvention sollte sie XXX_Api.cs genannt werden.&lt;br /&gt;
&lt;br /&gt;
Als Nächstes erstellen Sie eine Schnittstelle, um die Api mit der Laufzeit zu verbinden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces&lt;br /&gt;
 {&lt;br /&gt;
     public interface IXXX_Api&lt;br /&gt;
     {&lt;br /&gt;
         void myApiFunction();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Platzieren Sie diese Datei in OpenSim/Region/ScriptEngines/Api/Interface, benannt als IXXX_Api.&lt;br /&gt;
&lt;br /&gt;
Jetzt wird die Stub-Datei benötigt, um das Skript mit der Api zu verbinden. Diese Stub-Datei wird in die Skript-AppDomain geladen und sollte keine Verarbeitung enthalten. Sie leitet lediglich die Aufrufe an die Api außerhalb der AppDomain weiter.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
 namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase&lt;br /&gt;
 {&lt;br /&gt;
     public partial class ScriptBaseClass : MarshalByRefObject&lt;br /&gt;
     {&lt;br /&gt;
         public IXXX_Api m_XXX_Functions;&lt;br /&gt;
&lt;br /&gt;
csharp&lt;br /&gt;
&lt;br /&gt;
     public void ApiTypeXXX(IScriptApi api)&lt;br /&gt;
     {&lt;br /&gt;
         if(!(api is IXXX_Api))&lt;br /&gt;
             return;&lt;br /&gt;
&lt;br /&gt;
         m_XXX_Functions = (IXXX_Api)api;&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     public void myApiFunction()&lt;br /&gt;
     {&lt;br /&gt;
         m_XXX_Functions.myApiFunction();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Speichern Sie dies in OpenSim/Region/ScriptEngines/Shared/Api/Runtime, benannt als XXX_Stub.cs&lt;br /&gt;
&lt;br /&gt;
Hier ist der Name ApiTypeXXX die obligatorische Bezeichnung, nach der die Skript-Engine diese Api erkennt und mit der API-Implementierung verknüpft.&lt;br /&gt;
&lt;br /&gt;
Bitte beachten Sie, dass Ihre Api hier Teil einer teilweisen Klasse wird, die wiederum die Basisklasse des Skripts wird.&lt;br /&gt;
&lt;br /&gt;
Beim Laden des Skripts wird die Api-Laufzeit (Stub) mit einem Verweis auf die IScriptApi-Schnittstelle der Implementierung aufgerufen. Diese wird dann als benutzerdefinierte Schnittstelle verwendet, um auf die Funktionsimplementierungen zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
Der Grund, warum wir die Implementierung nicht direkt referenzieren können, besteht darin, dass dies dazu führen würde, dass die gesamte Implementierung in die Skript-AppDomain geladen wird. Wir müssen dies vermeiden, um den Speicherbedarf gering zu halten.&lt;br /&gt;
&lt;br /&gt;
Das Verzeichnis OpenSim/Region/ScriptEngines/Shared/CodeTools enthält alle Compiler, Konverter und andere Code-Manipulationstools. Es wird von allen Skript-Engines gemeinsam genutzt. Aufgrund des gemeinsam genutzten Compilers können die Skript-Engines auch kompilierte Assemblys gemeinsam nutzen, sodass jedes Skript nicht für jede Skript-Engine neu kompiliert werden muss.&lt;br /&gt;
&lt;br /&gt;
== Code-Generierung ==&lt;br /&gt;
&lt;br /&gt;
Die Generierung von LSL-Code in C# ist für alle Skript-Engines gemeinsam. Dies wird derzeit durch die Übersetzung von LSL-Code in C#-Code und dessen anschließende Kompilierung erreicht. Der kompilierte Code ruft dann Methoden in LSL_Api.cs (OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs) auf, die den LSL-Funktionen entsprechen, oder Methoden in OSSL_Api.cs für OSSL-Funktionen usw.&lt;br /&gt;
&lt;br /&gt;
Seit OpenSimulator 0.7.4 gibt es auch einen Mechanismus, um Skriptfunktionen aus Regionsmodulen verfügbar zu machen, ohne OpenSimulator selbst zu patchen. Weitere Details finden Sie unter [[OSSL_Script_Library/ModInvoke]].&lt;br /&gt;
&lt;br /&gt;
Die Analyse des LSL-Skripts wird von CSCodeGenerator.Convert() (OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs) gestartet. Dies nimmt das LSL und verwendet einen Parser/Lexer, um es in einen abstrakten Syntaxbaum (AST) umzuwandeln, bevor es dann über den LSL2CSCodeTransformer in C# konvertiert wird.&lt;br /&gt;
&lt;br /&gt;
Der Parser (lsl.parser.cs) und Lexer (lsl.lexer.cs) werden mit Malcolm Crowes Compiler-Tools in C# aus dem trunk/managed/lsl2cs-Verzeichnis im [[Opensim-libs_git_repository|opensim-libs-Repository]] aus den Dateien lsl.parser und lsl.lexer generiert. '''Beachten Sie, dass Sie bei einer Neugenerierung dies tun müssen ändern Sie die vorletzte Zahl im Array arr in der generierten Klasse ArgumentDeclarationList_5 in lsl.parser.cs von 1 auf 0. Wir müssen herausfinden, warum dieser Fehler auftritt.'''&lt;br /&gt;
&lt;br /&gt;
Das konvertierte C# wird dann zu einer DLL kompiliert durch die OpenSimulator Compiler-Klasse (über die Methode PerformScriptCompile(), die auch die LSL -&amp;gt; C#-Konvertierung ausführt, wie oben beschrieben).&lt;br /&gt;
&lt;br /&gt;
Sie können das transformierte C# sehen, das kompiliert wurde, indem Sie&lt;br /&gt;
&amp;lt;source lang='ini'&amp;gt;&lt;br /&gt;
[XEngine]&lt;br /&gt;
WriteScriptSourceToDebugFile = true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in Ihrer OpenSim.ini-Datei einstellen. Dies wird im Verzeichnis bin/ScriptEngines/&amp;lt;region-id&amp;gt;/ mit dem Dateinamen CommonCompiler_source_CommonCompiler_compiled_&amp;lt;script-asset-id&amp;gt;.lsl erscheinen.&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting]]&lt;br /&gt;
[[Category:German Translations]]&lt;/div&gt;</summary>
		<author><name>Manni</name></author>	</entry>

	</feed>