<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=LPC_%28Programmiersprache%29</id>
	<title>LPC (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=LPC_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=LPC_(Programmiersprache)&amp;action=history"/>
	<updated>2026-05-28T09:49:10Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=LPC_(Programmiersprache)&amp;diff=61602&amp;oldid=prev</id>
		<title>imported&gt;Buzzom: /* Weblinks */ Link korrigiert, war falsch verlinkt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=LPC_(Programmiersprache)&amp;diff=61602&amp;oldid=prev"/>
		<updated>2025-12-20T16:11:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Weblinks: &lt;/span&gt; Link korrigiert, war falsch verlinkt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;LPC&amp;#039;&amp;#039;&amp;#039; ist eine [[Objektorientierte Programmierung|objektorientierte]] [[Programmiersprache]], in der Syntax ähnlich wie [[C (Programmiersprache)|C]] oder [[C++]], für Netzwerk-Textabenteuerspiele ([[Multi User Dungeon]]s, kurz MUDs).&lt;br /&gt;
&lt;br /&gt;
LPC ist eine Mischung aus Interpreter- und Compilersprache. LPC-MUDs erlauben in der Regel, zur [[Laufzeit (Informatik)|Laufzeit]] Programme hinzuzufügen, zu starten und auch nachträglich zu ändern, ohne das ganze Spiel neu zu starten. Der LPC-Code wird von einem [[Compiler]] zuerst in einen [[Bytecode]] umgewandelt und danach von einem [[Interpreter]] ausgeführt.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Die Bezeichnung LPC leitet sich vom Erfinder der Sprache, [[Lars Pensjö]], ab.&amp;lt;ref&amp;gt;Xyllomer.de: {{Internetquelle | url=https://www.xyllomer.de/system/lpc.php | titel=The LPC Reference Manual | abruf=2016-04-20}}&amp;lt;/ref&amp;gt; Pensjö entwickelte LPC Anfang der 1990er-Jahre und orientierte sich dabei an der Programmiersprache C. Von der ähnlichen Syntax abgesehen gibt es jedoch nur wenige Gemeinsamkeiten der beiden Sprachen.&lt;br /&gt;
&lt;br /&gt;
Bei den ursprünglichen Implementierungen von LPC waren [[Compiler]] und [[Bytecode]]-[[Interpreter]] Bestandteile eines einzelnen Programms, das grundlegende, für den Betrieb eines Multi User Dungeons notwendige Funktionalität zur Verfügung stellte, den sogenannten &amp;#039;&amp;#039;Gamedriver&amp;#039;&amp;#039; oder kurz &amp;#039;&amp;#039;Driver&amp;#039;&amp;#039;. Auch das MUD Amylaar trug wesentliche Teile zum Treiber bei. Dazu gehört vor allem der Betrieb als [[Server]], zu dem mit einem [[Telnet]]- oder einem speziellen MUD-[[Client]] eine Verbindung hergestellt werden kann. Diese Software wurde unter dem Namen [[LPMud]] verbreitet; eine moderne Weiterentwicklung auf Basis des ursprünglichen LPMud-Quellcodes hört auf die Bezeichnung [[LDMud]] (nach den Initialen des Maintainers). Eine weitere Implementierung desselben Konzeptes inklusive der Sprache LPC ist [[MudOS]].&lt;br /&gt;
&lt;br /&gt;
Aus LPC ging die unabhängige Scriptsprache [[Pike (Programmiersprache)|Pike]] hervor. Diese hat bisher keinen hohen Verbreitungsgrad erreicht.&lt;br /&gt;
&lt;br /&gt;
== Merkmale ==&lt;br /&gt;
LPC unterstützt die folgenden Programmiertechniken:&lt;br /&gt;
&lt;br /&gt;
* [[Prozedurale Programmierung]]&lt;br /&gt;
* [[Modulare Programmierung]]&lt;br /&gt;
* [[Strukturierte Programmierung]]&lt;br /&gt;
* [[Objektorientierte Programmierung]] (mit [[Vererbung (Programmierung)|Mehrfachvererbung]])&lt;br /&gt;
* [[Datentyp|Programmierung mit selbstdefinierten Datentypen]] ([[Abstrakter Datentyp|abstrakte Datentypen]])&lt;br /&gt;
* [[Datentyp|Schwach typisierte]] [[Variable (Programmierung)|Variablen]]&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu anderen C-ähnlichen Sprachen ==&lt;br /&gt;
Die grundlegende Syntax von LPC entspricht der der Sprache C. Dazu gehören die verwendeten Zeichen zur Kennzeichnung von Blöcken, Funktionen, Argumenten und Argumentlisten sowie die Benutzung des [[Semikolon]]s als Endzeichen eines Statements.&lt;br /&gt;
&lt;br /&gt;
Im Unterschied zu C kennt LPC keine stark typisierten Variablen. Eine [[Variable (Programmierung)|Variable]] kann zwar mit einem vorher bestimmten Typ angelegt werden, dann jedoch trotzdem einen Wert eines anderen Typs aufnehmen. Zusätzlich existiert der Typ &amp;#039;&amp;#039;mixed&amp;#039;&amp;#039; für untypisierte Variablen.&lt;br /&gt;
&lt;br /&gt;
Das wirkt sich auch auf Rückgabewerte und Parameter von Funktionen aus: im Normalfall müssen in der [[Signatur (Programmierung)|Funktionssignatur]] weder die Argumente noch Rückgabewert mit Typen versehen werden. Man kann jedoch durch Angabe von [[Präprozessor]]-Direktiven eine Überprüfung auf gültige Argumente zum Übersetzungszeitpunkt erzwingen:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;#pragma strong_types&amp;#039;&amp;#039; – Typen für Argumente und Rückgabewert müssen angegeben werden&lt;br /&gt;
* &amp;#039;&amp;#039;#pragma strict_types&amp;#039;&amp;#039; – der Rückgabewert von an fremden Objekten gerufenen Methoden muss gecastet werden&lt;br /&gt;
&lt;br /&gt;
=== Die Klassenbibliothek eines MUDs ===&lt;br /&gt;
Die Sprache LPC kennt nur eine geringe Zahl von Standardfunktionen (&amp;#039;&amp;#039;efuns&amp;#039;&amp;#039;). Diese sind im ausführenden Programm (&amp;#039;&amp;#039;gamedriver&amp;#039;&amp;#039;), also beispielsweise [[LPMud]] oder [[LDMud]], implementiert. Zusätzlich hat jedes MUD, das mit einer solchen Software betrieben wird, eine eigene Klassenbibliothek (&amp;#039;&amp;#039;MUDlib&amp;#039;&amp;#039;). Die MUDlib enthält Schnittstellen, mit denen der gamedriver einen Teil der Verantwortung an sie zurückgeben kann. Dazu gehört unter anderem das Erzeugen eines Spielerobjektes für einen einloggenden Spieler oder die Fehlerbehandlung. Es gibt hierbei keine Standard-MUDlib, die von allen MUDs genutzt würde. Einige sich im Einsatz befindliche MUDlibs sind jedoch [[Open Source]] oder auf andere Weise frei verwendbar. Aufbauend auf wenigen frei verfügbaren MUDlibs sind mehrere weit verbreitete MUDlib-Zweige entstanden, die in vielen MUDs eingesetzt werden. Im deutschsprachigen Raum sind beispielsweise Abkömmlinge der MUDlibs der MUDs [[MorgenGrauen (Computerspiel)|MorgenGrauen]] einerseits und [[UNItopia]] andererseits verbreitet.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede bezogen auf die Laufzeitumgebung ===&lt;br /&gt;
Von der sprachlichen Seite abgesehen unterscheidet sich LPC auch in mehreren Punkten in Bezug auf die Definition der [[Laufzeitumgebung]] von anderen [[Programmiersprache]]n. Durch die ursprüngliche Zielsetzung als Sprache eines Online-Rollenspiels, bei dem mehrere Entwickler mit unterschiedlichen Rechten eigenen Code einbringen können, enthält die Laufzeitumgebung beispielsweise sogenannte &amp;#039;&amp;#039;privilegierte Funktionen&amp;#039;&amp;#039;, die nur nach vorheriger Überprüfung durch ein &amp;#039;&amp;#039;Master-Objekt&amp;#039;&amp;#039; des MUDs von einem normalen Objekt aufgerufen werden können.&lt;br /&gt;
&lt;br /&gt;
Aktuelle LPC-Laufzeitumgebungen unterstützen keine [[Thread (Informatik)|Threads]]. In einem einzelnen Thread werden nacheinander alle anfallenden Aufgaben erledigt. Dadurch ergibt sich notwendigerweise eine Begrenzung der Laufzeit, die für die Behandlung eines zusammenhängenden Ereignisses gesetzt ist. In LDMuds kann diese Begrenzung dynamisch für einzelne Funktionsaufrufe aufgehoben oder gesetzt werden.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Besonderheit ist die fast vollständige Gleichwertigkeit der eingebauten Funktionen (&amp;#039;&amp;#039;efuns&amp;#039;&amp;#039;) mit von der Klassenbibliothek eines MUDs (&amp;#039;&amp;#039;MUDlib&amp;#039;&amp;#039;) vorgegebenen &amp;#039;&amp;#039;simul_efuns&amp;#039;&amp;#039;. Auf diese Weise ist es möglich, Standardfunktionen zu überschreiben oder den Zugriff darauf zu verbieten.&lt;br /&gt;
&lt;br /&gt;
=== Unterschiede bei der Objektorientierung ===&lt;br /&gt;
LPC kennt im Gegensatz zu vielen [[Objektorientierte Programmierung|objektorientierten Programmiersprachen]] keine Unterscheidung zwischen [[Klasse (Objektorientierung)|Klassen]] und [[Objekt (Programmierung)|Objekten]]. Im Normalfall wird aus einer [[Quelltext]]-[[Datei]] ein einzelnes Objekt erzeugt. Alle im Speicher befindlichen Objekte können jedoch dupliziert (&amp;#039;&amp;#039;geklont / cloned&amp;#039;&amp;#039;) werden. Der Vorgang des &amp;#039;&amp;#039;Clonens&amp;#039;&amp;#039; ist vergleichbar mit dem der [[Objekt (Programmierung)|Instanziierung]] bei anderen Programmiersprachen; allerdings sind der Klon (&amp;#039;&amp;#039;clone&amp;#039;&amp;#039;) und das Original (&amp;#039;&amp;#039;blueprint&amp;#039;&amp;#039;) gleichberechtigt und können beide theoretisch auf die gleiche Weise eingesetzt werden. Dabei ist aber zu berücksichtigen, dass das Objektuniversum der LPC-Welt jedem Objekt ein quasi-physisches „befindet-sich-in“-Attribut zuordnet (das Avatar-Objekt des Spielers befindet sich in einem Raum, die Habseligkeiten des Spielers befinden sich in diesem virtuellen Körper usw.), und dass ein Blueprint, der einmal die Welt betreten hat, zwar noch bewegt, aber nicht mehr geklont werden kann; nur wenn das Blueprint-Objekt zerstört und aus dem Quelltext neu erzeugt wird, befindet es sich wieder außerhalb der Welt. (Das Enthaltensein ist eine elementare Eigenschaft des Gamedrivers, nicht der MUDlib.)&lt;br /&gt;
&lt;br /&gt;
=== Besondere Konstrukte ===&lt;br /&gt;
LPC kennt das Konzept des &amp;#039;&amp;#039;Shadowing&amp;#039;&amp;#039;. Dabei handelt es sich um eine Möglichkeit, alle Zugriffe auf eine Funktion eines Objektes von außen abzufangen, beispielsweise um sie zu filtern oder ganz zu unterbinden, ähnlich dem [[Decorator]]-Muster. Das Prinzip wird angewandt, indem ein Objekt mit der &amp;#039;&amp;#039;efun&amp;#039;&amp;#039; shadow() sich als „Schatten“ eines beliebigen anderen Objektes registriert. Bei einem Aufruf einer Funktion des Zielobjektes, der nicht innerhalb des Zielobjektes direkt geschieht, wird dann die gleichnamige Funktion im Schatten-Objekt aufgerufen, falls dieses Objekt eine solche Funktion enthält. Existiert im Schatten-Objekt keine Funktion gleichen Namens, wird der Aufruf wie ein normaler Funktionsaufruf in einem Objekt ohne Schatten behandelt. Das Schatten-Objekt hat ebenfalls die Möglichkeit, Funktionen im Zielobjekt, das es „überschattet“, aufzurufen.&lt;br /&gt;
&lt;br /&gt;
=== Besondere Datentypen ===&lt;br /&gt;
Funktionen sind in LPC keine [[First-Class-Objekt]]e (Funktionen erster Ordnung). Dennoch kennt die Sprache Funktionsreferenzen. Aus der Welt der [[Funktionale Programmierung|Funktionalen Programmierung]] entlehnt ist der Name &amp;#039;&amp;#039;closure&amp;#039;&amp;#039; für diesen Datentyp, in Anlehnung an den Begriff [[Closure (Funktion)|Closure]]. Die referenzierte Funktion kann auch mit der Funktion lambda() zur Laufzeit dynamisch erzeugt werden. Dabei wird aus einem [[Feld (Datentyp)|Array]] von Closures und [[Symbol]]en &amp;#039;&amp;#039;zur Laufzeit&amp;#039;&amp;#039; eine neue Funktion erzeugt, die dann, wie jede andere closure, als Wert übergeben oder als Funktion aufgerufen werden kann. Die in der [[LPMud]]-Variante LDMud eingesetzte LPC-Fortentwicklung enthält zusätzlich die Möglichkeit, zur [[Compilezeit]] Closures auf formlos angegebene Inline-Funktionen zu erzeugen. Dazu wird die sogenannte Smiley-Notation verwandt, bei der normaler LPC-Code innerhalb von (: und :) vom Compiler in eine normale Funktion des Objektes umgesetzt wird und der Ausdruck an der Stelle seines Auftretens durch eine auf diese Funktion verweisende closure ersetzt wird.&lt;br /&gt;
&lt;br /&gt;
[[Feld (Datentyp)|Arrays]] existieren in LPC und können im Code mit den einzelnen Elementen, durch Kommata getrennt und von ({ und }) umschlossen, erzeugt werden. Der Zugriff auf einzelne Elemente geschieht mit dem Indexoperator [] vergleichbar zu C. Zusätzlich gibt es Standardfunktionen zur Behandlung von Arrays. Arrays sind, ebenso wie andere Variablen auch, nicht typisiert. Das bedeutet, dass die Elemente eines Arrays unterschiedliche Typen haben können. Weitere Arrays sind ebenfalls als Elemente eines Arrays erlaubt. Dadurch ist es in LPC möglich, komplexe Strukturen als Arrays aufzubauen. Eine Variable, die ein Array halten können soll, wird durch einen dem Elementtyp hintangestellten [[Sternchen (Schriftzeichen)|Asterisk]] (*) gekennzeichnet. Dabei wird jedoch keine Typprüfung vorgenommen. Variablen vom Typ &amp;#039;&amp;#039;mixed&amp;#039;&amp;#039; können ebenfalls ein Array enthalten.&lt;br /&gt;
&lt;br /&gt;
LPC kennt zusätzlich außerdem sogenannte [[Assoziatives Datenfeld|assoziative Arrays]] vergleichbar mit den Wörterbüchern der Sprache [[Python (Programmiersprache)|Python]]. In LPC wird dafür die Bezeichnung &amp;#039;&amp;#039;mapping&amp;#039;&amp;#039; verwandt. Diese mappings sind als [[Hashtabelle]] implementiert. In einem assoziativen Array kann einem Schlüsselelement ein Wert zugeordnet werden. Eine Besonderheit der assoziativen Arrays in LPC ist die pro mapping variable Anzahl von Werten pro Schlüssel. So kann ein Mapping beispielsweise zu jedem Schlüssel eine beliebige, aber innerhalb des mappings gleiche Anzahl von Werten enthalten. Um diese Werte anzusprechen, kann zusätzlich zum Schlüssel bei einer Indizierungsoperation noch ein numerischer Index angegeben werden.&lt;br /&gt;
&lt;br /&gt;
== Hallo-Welt-Programm in LPC ==&lt;br /&gt;
Das folgende Objekt gibt &amp;#039;&amp;#039;beim ersten Laden&amp;#039;&amp;#039; den Text „Hallo, Welt!“ aus, da die create()-Methode üblicherweise beim Laden/Clonen von Objekten automatisch aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
void create() {&lt;br /&gt;
  write(&amp;quot;Hallo, Welt!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Komplexeres Beispielobjekt ==&lt;br /&gt;
LPC wird hauptsächlich zur Beschreibung von Objekten in Rollenspielen eingesetzt. Solche Objekte sind in vielen Fällen Gegenstände, Einwohner oder Räume einer virtuellen Welt. Die [[Klassenbibliothek]] (MUDlib) enthält deshalb typischerweise Objekte, die ganz allgemein einen Gegenstand – oder eine bestimmte Klasse von Gegenständen – repräsentiert. Ähnliches gilt für Räume, Monster und alle anderen Objekte, die häufig in verschiedenen Variationen erzeugt werden müssen.&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel bezieht sich auf die Anwendung von LPC zusammen mit einer vorhandenen Klassenbibliothek, die nicht zum Lieferumfang von LPMud gehört. Es implementiert einen Apfel und erbt von einem Standardobjekt, das vom Spieler essbare Nahrung implementiert. Dazu gehört unter anderem die zur Implementierung des Ess-Vorgangs im Spiel notwendige Logik. Im erbenden Objekt müssen so nur noch die Werte von Eigenschaften eingestellt werden, die im Rahmen der Möglichkeiten der Basisklasse die Auswirkungen des Verzehrs bestimmen. Die in diesem Beispiel referenzierte MUDlib stellt hierzu die Funktion SetProp() zur Verfügung. Die Namen der Eigenschaften sind dabei Präprozessor-Makros. Es ist, je nach MUD, auch üblich, auf Eigenschaften über einzelne [[Accessor-Methode|Accessor-Funktionen]] zuzugreifen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
inherit &amp;quot;/std/food&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;properties.h&amp;gt;&lt;br /&gt;
#include &amp;lt;language.h&amp;gt;&lt;br /&gt;
#include &amp;lt;food.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void create()&lt;br /&gt;
{&lt;br /&gt;
  if(!is_clone(this_object())) return;&lt;br /&gt;
  ::create();&lt;br /&gt;
  SetProp(P_SHORT, &amp;quot;Ein Apfel&amp;quot;);&lt;br /&gt;
  SetProp(P_LONG, &amp;quot;Dieser Apfel ist schoen prall und rot. Er schmeckt sicher vorzueglich.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  AddId( ({&amp;quot;apfel&amp;quot;, &amp;quot;\napfel&amp;quot;}) );&lt;br /&gt;
  SetProp(P_NAME, &amp;quot;Apfel&amp;quot;);&lt;br /&gt;
  SetProp(P_GENDER, MALE);&lt;br /&gt;
  SetProp(P_VALUE, 50);&lt;br /&gt;
  SetProp(P_WEIGHT, 50);&lt;br /&gt;
  SetProp(P_MATERIAL, ([ MAT_FRUIT: 100 ]) );&lt;br /&gt;
  SetProp(P_FOOD_INFO,&lt;br /&gt;
     ([ F_HEAL: ({10,10}),&lt;br /&gt;
        F_SOAK: 5,&lt;br /&gt;
        F_MSG: &amp;quot;Du isst den leckeren roten Apfel.&amp;quot;,&lt;br /&gt;
        F_MSG_ROOM: &amp;quot;isst einen leckeren roten Apfel.&amp;quot;]) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://midgardmud.de/lpc/ LPC Anfänger-Handbuch]: LPC-Einstieg: Programmieren lernen mit LDMud und MG/Midgard-Mudlib&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Lpc}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Skriptsprache]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmiersprache]]&lt;br /&gt;
[[Kategorie:Computerspiel-Entwicklung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Buzzom</name></author>
	</entry>
</feed>