PlusPedia wird derzeit technisch modernisiert. Aktuell laufen Wartungsarbeiten. Für etwaige Unannehmlichkeiten bitten wir um Entschuldigung; es sind aber alle Artikel zugänglich und Sie können PlusPedia genauso nutzen wie immer.

Neue User bitte dringend diese Hinweise lesen:

Anmeldung - E-Mail-Adresse Neue Benutzer benötigen ab sofort eine gültige Email-Adresse. Wenn keine Email ankommt, meldet Euch bitte unter NewU25@PlusPedia.de.

Hinweis zur Passwortsicherheit:
Bitte nutzen Sie Ihr PlusPedia-Passwort nur bei PlusPedia.
Wenn Sie Ihr PlusPedia-Passwort andernorts nutzen, ändern Sie es bitte DORT bis unsere Modernisierung abgeschlossen ist.
Überall wo es sensibel, sollte man generell immer unterschiedliche Passworte verwenden! Das gilt hier und im gesamten Internet.
Aus Gründen der Sicherheit (PlusPedia hatte bis 24.07.2025 kein SSL | https://)

Bei PlusPedia sind Sie sicher: – Wir verarbeiten keine personenbezogenen Daten, erlauben umfassend anonyme Mitarbeit und erfüllen die Datenschutz-Grundverordnung (DSGVO) vollumfänglich. Es haftet der Vorsitzende des Trägervereins.

PlusPedia blüht wieder auf als freundliches deutsches Lexikon.
Wir haben auf die neue Version 1.43.3 aktualisiert.
Wir haben SSL aktiviert.
Hier geht es zu den aktuellen Aktuelle Ereignissen

Operno: Unterschied zwischen den Versionen

Aus PlusPedia
Zur Navigation springen Zur Suche springen
K LD fehlt
Neue Verfassung des ganzen Artikels
Zeile 1: Zeile 1:
'''Operno''' ist ein [[Objektorientierung|objektorientierter]] und dynamischer Token-[[Interpreter]], welcher von Josef Sniatecki entwickelt wurde. Mit dynamisch ist gemeint, dass viele Aufgaben des Interpreters zur [[Laufzeit (Informatik)|Laufzeit]] erledigt werden. Die folgenden detaillierten Beschreibungen beziehen sich auf die aktuelle Version 5.00 von Operno, die am  18.05.2009 erschienen ist.
'''Operno''' ist eine objektorientierte, dynamische und funktionale Programmiersprache, die von Josef Sniatecki ([[14. April]] [[1993]]) gegründet wurde und weiterhin erntwickelt wird. Die Sprache dient zur Erstellung von Skripts, die von einer Anwendung ausgeführt und mittels Objekte angesprochen werden können. Die Objekte werden dabei zur Laufzeit erstellt und Typisiert. Ebenso kann man Objekte zur Laufzeit löschen und wieder neu definieren.


== Orientierung ==
Zu den Sprachelementen gehört [[OOP]], zur Laufzeit modifizierbare Klassen, dynamisch erweiterbare Listen (Containerklasse), [[vektorielle Operationen]] für nicht überladene Operatoren, Präprozessor für [[Makros]] und [[Symbole]], Kontrollstrukturen (if, switch, while) und erweiterte Iterationsschleifen (for, repeat).
Der Operno-[[Interpreter]] legt viel Wert auf die Dynamik und die Lesbarkeit eines Skripts in Operno. Beispielsweise werden Funktionen zur Laufzeit definiert und können später gelöscht und wieder neu definiert werden. Zur Lesbarkeit des Skripts tragen eine leichte [[Syntax]] und [[Synonyme]] für bestimmte Zeichen bei.


== "Hello world!"-Programm ==
Zur Zeit besizt Operno eine deutsche Dokumentation, eine integrierte Entwicklungsumgebung und eine interaktive Konsole für die ausführung von eingebenen Anweisungen.
Hier eine Implementierung eines "Hello world!"-Programms in Operno:
<source lang="text">
out "Hello world!"
</source>


== Syntax ==
= Objekte =
Die [[Syntax]] von Operno ist flexibel und einfach zu lesen. Oftmals können verschiedene [[Algorithmen]] in mehreren Formen ausgedrückt werden. Dabei sind die verschiedenen Schreibweisen nach der Verarbeitung des Parsers unterschiedlich. D.h. es werden keine Optimierungen von Operno vorgenommen.


=== Namensgebung ===
Jedes Objekt kann eines von drei Typen annehmen:
Die Namensgebung in Operno hat starke Unterschiede zu vielen anderen [[Skriptsprachen]]. Namen können [[Umlaute]] enthalten und oftmals bietet sich auch die Möglichkeit an, Namen mit [[Leerzeichen]] zu definieren.
* Variable
* Funktion
* Gruppe


Beispiele:
== Variable ==
<source lang="text">
Eine Variable kann jeden klassifizierten Wert speichern und diesen zur Laufzeit wiederverwenden und modifizieren. Dabei können direkt Klassenmethoden und Instanz-Objekte mittels einer Variable aufgerufen werden. Die Typisierung erfolgt zur Laufzeit, wodurch man von einer dynamischen Typisierung spricht.
mein name = "Timmy"
höhe = 100
</source>


=== Zeilenverbindungsmöglichkeiten ===
=== Variants ===
Ein großer Vorteil der Syntax von Operno ist, dass sich Zeilen elegant durch bestimmte Operatoren am Ende einer Zeile verbinden lassen. Manuell lassen sich auch Zeilen durch "#" verbinden.
Eine Variable kann von der Klasse <code>variant</code> sein. Dies ist eine unbestimmte Klasse, wodurch eine Variable vom Typ <code>variant</code> jeden Wert zugewiesen bekommen kann, ohne ein Type-Casting vorzunehmen.


Beispiel:
Im folgenden Beispiel sind beide Parameter/Variablen <code>a</code> und <code>b</code> vom Typ <code>variant</code>, da keine Klassen angegeben werden:
<source lang="text">
<pre>
x = 5 +
sum(a, b){
  return a + b
}
 
out sum(10, 1)    'Gibt "11" aus
out sum("A", "BC") 'Gibt "ABC" aus
</pre>
 
== Funktion ==
Funktionen können in Operno mehrere Parameter erhalten und diese durch einen Block von Anweisungen verarbeiten. Der Rückgabewert kann in seiner Klasse bestimmt und auch unbestimmt sein.
 
=== Aufruf ===
 
Der Aufruf einer Funktion erfolgt durch das Erwähnen des Funktionsnamens. Werden Parameter verlangt, so gibt man eine Klammer mit Parametern nach dem Funktionsaufruf an:
<pre>
put hello world(){
  out "Hello world!"
}
 
sum(a, b) = a + b
 
put hello world 'Gibt "Hello world!" aus
out sum(1, 10)  'Gibt 11 aus
</pre>
 
=== Currying ===
 
Wird keine Parameterliste beim Aufruf angegeben, trotz dem Verlangen von Parametern, so werden überflüssige Parameter der aktuellen Funktion weitergegeben:
<pre>
put two values(a, b){
  out a
  out b
}
put four values(){
  put two values 'Die ersten zwei Parameter weitergeben
  out "--"
  put two values 'Die letzten zwei Parameter weitergeben
}
 
put four values(1, 2, 3, 4)
</pre>
 
Die Ausgabe:
<pre>
1
2
2
--
3
4
</pre>
=== Multi-Call ===
Ein sog. Multi-Call ist ein mehrfacher Aufruf durch das Aneinanderhängen von mehreren Parameterlisten. Die Ergebnisse dieser Aufrufe werden mittels einer Liste/Queue übergeben:
<pre>
sum(a, b) = a + b
out sum(1, 2)(8, 2)("A", "BC") 'Gibt "[3, 10, ABC]" aus
</pre>
== Gruppe ==
Eine Gruppe besitzt mehrere Kindobjekte (engl. child objects), die ebenso eine Gruppe sein können, wodurch Verschachtelungen möglich sind. Zugelich können Gruppen auch Klassen sein, indem sie Klassenmethoden (Funktionen) besitzen und bei einer Deklaration einer Variable als Typ/Klasse angegeben werden.
Die Unterobjekte können durch einen zur Laufzeit ausgewerteten [[String]] angesprochen werden, ähnlich wie bei [[JavaScript]].


out x 'Gibt 7 aus.
= Syntax =


y = 100 #
Die Syntax von Operno ist stark mit der Art der Ausführung verbunden, da Operno ein Token-Interpreter ist. Somit besteht kaum ein Unterschied zwischen dem ursprünglichen Code und der generierten Tokensequenz. Da die Syntax flexibel ist, was durch Synonyme von Schlüsselwörtern und Symbolen erreicht wird, können Anweisungen in verschiedenen Varianten implementiert werden.
+ 3


out y 'Gibt 103 aus.
== Namensgebung ==
</source>


=== Definitionen ===
Namen von Objekten können Sonderzeichen und Leerzeichen beinhalten. Dabei werden Leerzeichen nach dem Parsen entfernt, indem die Namen in die [[Lower-Camel-Case]]-Form umgewandelt wird:
Objekte lassen sich meist ohne zusätzliche [[Schlüsselwort (Informatik)|Schlüsselwörter]] (engl. ''keywords'') definieren. Beispielsweise können Variablen durch die erste Zuweisung eines Wertes definiert werden. Besonders die Definition von Funktionen unterscheidet sich zu vielen anderen Skriptsprachen:
<pre>
'Zwei gleiche Variablen mit Sonderzeichen:
meine größe = 1.84
meineGröße += 0.1
</pre>


<source lang="text">
= Funktionales Programmieren =
sum(a, b) a + b


say hello(name){
Die Kontrollstrukturen <code>if</code> und <code>switch</code> können ebenso wie die Iterationsschleifen <code>for</code> und <code>repeat</code> Werte zurückgeben. Somit können diese Skriptsteuerungen innerhalb einer auszuwertenden Anweisung einbauen, um somit die Auswertung variabler aufzustellen.
out "Hello, " + name + "!"
out "This was an example."
}
</source>


== Objekte ==
Beispiel (<code>x</code> bekommt einen Wert von <code>if</code> zugewiesen):
Operno ist sehr objektorientiert. Dadurch sind Standardtypen, wie Integer, Float, String usw. als Objekte angelegt. Somit können sich Ruby ähnliche Ausdrücke ergeben:
<pre>
b = 1
x = if(b == 0)(
  "zero"
)else if(b == 1)(
  "one"
)else(b == 2)(
  "two"
)
</pre>


<source lang="text">
= Objektorieniertes Programmieren =
out "abc":upper case 'Gibt "ABC" aus
out 123:negative    'Gibt -123 aus
</source>


Gleichzeitig orientiert sich Operno an ein ähnliches System, wie [[Dateien]] verarbeitet werden: Ordner-Objekte können mehrere Unterobjekte (auch Kindobjekte (engl. ''Child-objects'')) tragen.
Jeder Wert besitzt in Operno eine Klasse, die Instanz-Objekte und Klassenmethoden besitzt. Instanz-Objekte können durch ein Backslash ("\") angesprochen und Klassenmethoden durch einen Doppelpunkt aufgerufen werden. Zusätzlich besitzt jede Klasse Methoden, die automatisch zu bestimmten Ereignissen (z.B. der Konstruktor) aufgerufen werden.


Beispiel:
Beispiel:
<source lang="text">
<pre>
myself{
person{
name = "John"
  _new(){
age = 25
    this def name.string, age.integer
  }
  _def(){
    this pop
  }
  _form(){
    return "name: #(name)
            age:  #(age)"
  }
}
}


out myself\name 'Gibt "John" aus.
myself.person("Josef", 16)
out myself\age  'Gibt 25 aus.
out myself 'Gibt "name: Josef
</source>
          '      age: 16" aus
 
Da Operno als dynamisch gilt, können Objekte jeder Zeit gelöscht und wieder neu definiert werden. Die neue [[Definition]] ist nicht von der Vorherigen abhängig.


Beispiel:
out "Hello world":u case 'Ergibt "HELLO WORLD"
<source lang="text">
</pre>
x = 5              'Als Integer definiert.
del x              'Die Variable existiert nicht mehr.
x = "Hello world!" 'Nun als String definiert.
</source>


== Vorteile und Nachteile ==
= [[Präprozessor]] =
=== Vorteile ===
* Operno ist gut lesbar
* Objekte lassen sich zur Laufzeit völlig modifizieren
* Man erreicht schnell Ziele auf der Kalkulations-Basis
* Operno lässt sich als [[Dynamic Link Library|DLL]] in anderen Projekten einbinden


=== Nachteile ===
Da Operno einen rekursiven [[Parser]] besitzt, kann vor der Ausführung der Präprozessor Anweisungen verarbeiten, um einen Code zu optimieren. Somit ist z.B. Ein Makro eine Funktion, die Zeichenketten erhält und einen Code als Zeichenkette zurückgibt. Neben Makros können auch Symbole definiert werden, sowie Dateien eingebunden werden.
* Durch die Dynamik fehlt es an Geschwindigkeit
* Funktionen aus anderen Sprachen lassen sich nicht importieren


== Quellen ==
== Quellen ==
* Dieser Beitrag wurde vom Entwickler des Operno-Interpreters verfasst
* Dieser Beitrag wurde vom Entwickler selbst ertsellt


== Weblinks ==
== Weblinks ==
* [http://josef-s.npage.de/] Homepage des Entwickler
* [http://josef-s.npage.de/] Homepage des Entwicklers
* [https://sourceforge.net/projects/operno/] Projekt-Seite auf SourceForge


[[Kategorie:Software]]
[[Kategorie:Software]]
== Quelle ==
Entnommen aus der:
[http://de.wikipedia.org/w/index.php?title=Operno Wikipedia]
[http://de.wikipedia.org/w/index.php?title=Operno&action=history Autoren]
{{Link_LD_fehlt}}
[[Kategorie:WikiPedia Deleted]]

Version vom 12. Dezember 2009, 13:13 Uhr

Operno ist eine objektorientierte, dynamische und funktionale Programmiersprache, die von Josef Sniatecki (14. April 1993) gegründet wurde und weiterhin erntwickelt wird. Die Sprache dient zur Erstellung von Skripts, die von einer Anwendung ausgeführt und mittels Objekte angesprochen werden können. Die Objekte werden dabei zur Laufzeit erstellt und Typisiert. Ebenso kann man Objekte zur Laufzeit löschen und wieder neu definieren.

Zu den Sprachelementen gehört OOP, zur Laufzeit modifizierbare Klassen, dynamisch erweiterbare Listen (Containerklasse), vektorielle Operationen für nicht überladene Operatoren, Präprozessor für Makros und Symbole, Kontrollstrukturen (if, switch, while) und erweiterte Iterationsschleifen (for, repeat).

Zur Zeit besizt Operno eine deutsche Dokumentation, eine integrierte Entwicklungsumgebung und eine interaktive Konsole für die ausführung von eingebenen Anweisungen.

Objekte

Jedes Objekt kann eines von drei Typen annehmen:

  • Variable
  • Funktion
  • Gruppe

Variable

Eine Variable kann jeden klassifizierten Wert speichern und diesen zur Laufzeit wiederverwenden und modifizieren. Dabei können direkt Klassenmethoden und Instanz-Objekte mittels einer Variable aufgerufen werden. Die Typisierung erfolgt zur Laufzeit, wodurch man von einer dynamischen Typisierung spricht.

Variants

Eine Variable kann von der Klasse variant sein. Dies ist eine unbestimmte Klasse, wodurch eine Variable vom Typ variant jeden Wert zugewiesen bekommen kann, ohne ein Type-Casting vorzunehmen.

Im folgenden Beispiel sind beide Parameter/Variablen a und b vom Typ variant, da keine Klassen angegeben werden:

sum(a, b){
  return a + b
}

out sum(10, 1)     'Gibt "11" aus
out sum("A", "BC") 'Gibt "ABC" aus

Funktion

Funktionen können in Operno mehrere Parameter erhalten und diese durch einen Block von Anweisungen verarbeiten. Der Rückgabewert kann in seiner Klasse bestimmt und auch unbestimmt sein.

Aufruf

Der Aufruf einer Funktion erfolgt durch das Erwähnen des Funktionsnamens. Werden Parameter verlangt, so gibt man eine Klammer mit Parametern nach dem Funktionsaufruf an:

put hello world(){
  out "Hello world!"
}

sum(a, b) = a + b

put hello world 'Gibt "Hello world!" aus
out sum(1, 10)  'Gibt 11 aus

Currying

Wird keine Parameterliste beim Aufruf angegeben, trotz dem Verlangen von Parametern, so werden überflüssige Parameter der aktuellen Funktion weitergegeben:

put two values(a, b){
  out a
  out b
}
put four values(){
  put two values 'Die ersten zwei Parameter weitergeben
  out "--"
  put two values 'Die letzten zwei Parameter weitergeben
}

put four values(1, 2, 3, 4)

Die Ausgabe:

1
2
--
3
4

Multi-Call

Ein sog. Multi-Call ist ein mehrfacher Aufruf durch das Aneinanderhängen von mehreren Parameterlisten. Die Ergebnisse dieser Aufrufe werden mittels einer Liste/Queue übergeben:

sum(a, b) = a + b

out sum(1, 2)(8, 2)("A", "BC") 'Gibt "[3, 10, ABC]" aus

Gruppe

Eine Gruppe besitzt mehrere Kindobjekte (engl. child objects), die ebenso eine Gruppe sein können, wodurch Verschachtelungen möglich sind. Zugelich können Gruppen auch Klassen sein, indem sie Klassenmethoden (Funktionen) besitzen und bei einer Deklaration einer Variable als Typ/Klasse angegeben werden.

Die Unterobjekte können durch einen zur Laufzeit ausgewerteten String angesprochen werden, ähnlich wie bei JavaScript.

Syntax

Die Syntax von Operno ist stark mit der Art der Ausführung verbunden, da Operno ein Token-Interpreter ist. Somit besteht kaum ein Unterschied zwischen dem ursprünglichen Code und der generierten Tokensequenz. Da die Syntax flexibel ist, was durch Synonyme von Schlüsselwörtern und Symbolen erreicht wird, können Anweisungen in verschiedenen Varianten implementiert werden.

Namensgebung

Namen von Objekten können Sonderzeichen und Leerzeichen beinhalten. Dabei werden Leerzeichen nach dem Parsen entfernt, indem die Namen in die Lower-Camel-Case-Form umgewandelt wird:

'Zwei gleiche Variablen mit Sonderzeichen:
meine größe = 1.84
meineGröße += 0.1

Funktionales Programmieren

Die Kontrollstrukturen if und switch können ebenso wie die Iterationsschleifen for und repeat Werte zurückgeben. Somit können diese Skriptsteuerungen innerhalb einer auszuwertenden Anweisung einbauen, um somit die Auswertung variabler aufzustellen.

Beispiel (x bekommt einen Wert von if zugewiesen):

b = 1
x = if(b == 0)(
  "zero"
)else if(b == 1)(
  "one"
)else(b == 2)(
  "two"
)

Objektorieniertes Programmieren

Jeder Wert besitzt in Operno eine Klasse, die Instanz-Objekte und Klassenmethoden besitzt. Instanz-Objekte können durch ein Backslash ("\") angesprochen und Klassenmethoden durch einen Doppelpunkt aufgerufen werden. Zusätzlich besitzt jede Klasse Methoden, die automatisch zu bestimmten Ereignissen (z.B. der Konstruktor) aufgerufen werden.

Beispiel:

person{
  _new(){
    this def name.string, age.integer
  }
  _def(){
    this pop
  }
  _form(){
    return "name: #(name)
            age:  #(age)"
  }
}

myself.person("Josef", 16)
out myself 'Gibt "name: Josef
           '      age:  16" aus

out "Hello world":u case 'Ergibt "HELLO WORLD"

Präprozessor

Da Operno einen rekursiven Parser besitzt, kann vor der Ausführung der Präprozessor Anweisungen verarbeiten, um einen Code zu optimieren. Somit ist z.B. Ein Makro eine Funktion, die Zeichenketten erhält und einen Code als Zeichenkette zurückgibt. Neben Makros können auch Symbole definiert werden, sowie Dateien eingebunden werden.

Quellen

  • Dieser Beitrag wurde vom Entwickler selbst ertsellt

Weblinks

  • [1] Homepage des Entwicklers
  • [2] Projekt-Seite auf SourceForge