Eiffel (Programmiersprache)

Eiffel ist eine ISO-standardisierte, objektorientierte Programmiersprache, die von Bertrand Meyer (ein Befürworter der Gegenstand-Orientierung und Autor des Objektorientierten Softwareaufbaus) und Eiffel Software entworfen ist. Das Design der Sprache wird mit dem Programmierverfahren von Eiffel nah verbunden. Beide basieren auf einer Reihe von Grundsätzen, einschließlich des Designs durch den Vertrag, die Trennung der Befehl-Abfrage, den Grundsatz des gleichförmigen Zugangs, den Grundsatz der einzelnen Wahl, den offen geschlossenen Grundsatz und die Trennung der Auswahl-operand.

Viele Konzepte, die am Anfang von Eiffel später eingeführt sind, haben ihren Weg in Java, C#, und andere Sprachen gefunden. Neue Sprachdesignideen, besonders durch den Ecma/ISO Standardisierungsprozess, setzen fort, in die Sprache von Eiffel vereinigt zu werden.

Eigenschaften

Die Schlüsseleigenschaften der Sprache von Eiffel schließen ein:

  • Eine objektorientierte Programm-Struktur, in der eine Klasse als die grundlegende Einheit der Zergliederung dient.
  • Das Design durch den Vertrag dicht mit anderen Sprachkonstruktionen integriert.
  • Automatisches Speichermanagement, das normalerweise durch die Müll-Sammlung durchgeführt ist.
  • Erbe, einschließlich der Mehrfachvererbung, Wiederdefinition, "wählt" nonkonformistisches Erbe "aus", und andere Mechanismen haben vorgehabt, Erbe sicher zu machen.
  • Beschränkte und zwanglose allgemeine Programmierung
  • Ein gleichförmiges Typ-System, das sowohl Wert als auch Bezugssemantik behandelt, in der alle Typen, einschließlich grundlegender Typen wie GANZE ZAHL, klassengestützt werden.
  • Das statische Schreiben
  • Leere Sicherheit oder statischer Schutz gegen Aufforderungen ungültiger Verweisungen, durch den Mechanismus der beigefügten Typen.
  • Agenten oder Gegenstände, die Berechnung wickeln, die nah mit Verschlüssen und Lambda-Rechnung verbunden ist.
  • Sobald Routinen oder Routinen nur einmal für das Gegenstand-Teilen bewertet haben und Initialisierung dezentralisiert haben.
  • Die Schlüsselwort-basierte Syntax in der Tradition des Algols/Pascal, aber ohne Separatoren, insofern als Strichpunkte mit der für Routinen verfügbaren Maschinenbediener-Syntax fakultativ sind.
  • Fall-Gefühllosigkeit
  • Simple Concurrent Object-Oriented Programming (SCOOP) erleichtert Entwicklung von vielfachen, gleichzeitig aktiven Ausführungsfahrzeugen an einem Niveau der Abstraktion über den spezifischen Details dieser Fahrzeuge (z.B vielfache Fäden ohne spezifisches mutex Management).

Designabsichten

Eiffel betont Aussagebehauptungen über den Verfahrenscode und versucht, das Bedürfnis nach Buchhaltungsinstruktionen zu beseitigen.

Eiffel vermeidet Codiertricks, oder das Codieren von als Optimierung beabsichtigten Techniken deutet zum Bearbeiter an. Das Ziel ist nicht nur, den Code lesbarer zu machen, sondern auch Programmierern zu erlauben, sich auf die wichtigen Aspekte eines Programms zu konzentrieren, ohne sich in Durchführungsdetails zu verlieren. Die Einfachheit von Eiffel ist beabsichtigt, um einfache, ausziehbare, wiederverwendbare und zuverlässige Antworten auf Rechenprobleme zu fördern. Bearbeiter für in Eiffel geschriebene Computerprogramme stellen umfassende Optimierungstechniken, solcher als automatisch im Futter zur Verfügung, die den Programmierer des Teils der Optimierungslast entlasten, während sie Code erzeugen, dessen Leistungsfähigkeit mit diesem des Codes vergleichbar ist, der in C ++ geschrieben ist.

Hintergrund

Eiffel wurde durch die Eiffel Software, eine von Bertrand Meyer gegründete Gesellschaft ursprünglich entwickelt. Objektorientierter Softwareaufbau enthält eine ausführliche Behandlung der Konzepte und Theorie der Gegenstand-Technologie, die zum Design von Eiffel geführt hat.

Die Designabsicht hinter der Sprache von Eiffel, den Bibliotheken und den Programmierverfahren ist, Programmierern zu ermöglichen, zuverlässige, wiederverwendbare Softwaremodule zu schaffen. Eiffel unterstützt Mehrfachvererbung, genericity, polymorphism, encapsulation, vor dem Typ sichere Konvertierungen und Parameter-Kovarianz. Der wichtigste Beitrag von Eiffel zur Softwaretechnik ist Design durch den Vertrag (DbC), in dem Behauptungen, Vorbedingungen, Postbedingungen und Klasse invariants verwendet werden, um zu helfen, Programm-Genauigkeit zu sichern, ohne Leistungsfähigkeit zu opfern.

Das Design von Eiffel basiert auf der objektorientierten Programmiertheorie, mit nur dem geringen Einfluss anderer Paradigmen oder Sorge für die Unterstützung des Vermächtnis-Codes. Eiffel unterstützt formell abstrakte Datentypen. Unter dem Design von Eiffel sollte ein Softwaretext im Stande sein, seine Designdokumentation aus dem Text selbst, mit einer formalisierten Durchführung des "Abstrakten Datentyps" wieder hervorzubringen.

Durchführungen und Umgebungen

EiffelStudio ist eine einheitliche Entwicklungsumgebung, die entweder unter einer offenen Quelle oder unter einer kommerziellen Lizenz verfügbar ist. Es bietet eine objektorientierte Umgebung für die Softwaretechnik an. EiffelEnvision ist eine Einfügefunktion für Microsoft Visual Studio, der Benutzern erlaubt, Projekte von Eiffel aus dem Microsoft Visual Studio IDE zu editieren, zu kompilieren, und bei ihnen die Fehler zu beseitigen. EiffelStudio und EiffelEnvision sind für den nichtkommerziellen Gebrauch frei. Vier andere offene Quelldurchführungen sind verfügbar: "Der Eiffel Bearbeiter" tecomp, Abdeckschirm Eiffel, SmartEiffel — die GNU-Durchführung, die auf einer älteren Version der Sprache — und Visueller Eiffel gestützt ist.

Mehrere andere Programmiersprachen vereinigen in Eiffel zuerst eingeführte Elemente. Sather hat zum Beispiel ursprünglich auf Eiffel basiert, aber ist seitdem abgewichen, und schließt jetzt mehrere funktionelle Programmiereigenschaften ein. Die interaktiv lehrende Sprache Blau, Vorzeichen von BlueJ, ist auch mit Sitz in Eiffel. Der Apple Media Tool schließt einen mit Sitz in Eiffel Apple Media Language ein.

Spezifizierungen und Standards

Die Eiffel Sprachdefinition ist ein internationaler Standard des ISO. Der Standard wurde von ECMA International entwickelt, die zuerst den Standard am 21. Juni 2005 als Normaler ECMA-367 genehmigt hat. Im Juni 2006 haben ECMA und ISO die zweite Version angenommen. Im November 2006 hat ISO zuerst diese Version veröffentlicht. Der Standard kann gefunden und kostenlos auf der ECMA Seite verwendet werden. Die ISO Version ist in jeder Hinsicht außer der Formatierung identisch.

Eiffel Software, "haben Der Eiffel Bearbeiter" tecomp und das Eiffel-library-developer Abdeckschirm dazu verpflichtet, den Standard durchzuführen; Eiffel Software EiffelStudio 6.1 und "Der Eiffel Bearbeiter" tecomp führt einige der neuen Hauptmechanismen — insbesondere Reihenagenten, assigner Befehle, Klammer-Notation, nonkonformistisches Erbe und beigefügte Typen durch. Die Mannschaft von SmartEiffel hat sich von diesem Standard abgewandt, um seine eigene Version der Sprache zu schaffen, die sie glauben, um am ursprünglichen Stil von Eiffel näher zu sein. Gegenstand-Werkzeuge haben nicht bekannt gegeben, ob zukünftige Versionen seines Bearbeiters von Eiffel den Standard erfüllen werden.

Der Standard zitiert das folgende, Vorgänger Eiffel-sprachige Spezifizierungen:

  • Bertrand Meyer: Prentice Hall, der zweite Druck, 1992 (zuerst Druck: 1991)
  • Bertrand Meyer: (Revision des vorhergehenden Zugangs), andauernd, 1997-Gegenwart-, an, und
  • Bertrand Meyer: Prentice Hall: Erstausgabe, 1988; die zweite Ausgabe, 1997.
  • Bertrand Meyer: Berührung der Klasse: Zum Programm Gut mit dem Gegenstand und Vertragsspringer-Verlag, 2009 internationale Standardbuchnummer 978-3540921448 lxiv + Voll-farbiger 876-Seite-Druck, zahlreiche Farbfotografien erfahrend

Die jetzige Version des Standards vom Juni 2006 enthält einige Widersprüchlichkeiten (z.B kovariante Wiederdefinitionen). Das ECMA Komitee hat jede Zeitachse und Richtung darauf noch nicht bekannt gegeben, wie man die Widersprüchlichkeiten auflöst.

Syntax und Semantik

Gesamte Struktur

Ein Eiffel "System" oder "Programm" sind eine Sammlung von Klassen. Über dem Niveau von Klassen definiert Eiffel Traube, die im Wesentlichen eine Gruppe von Klassen sind, und vielleicht Subtrauben (Trauben verschachtelt hat). Trauben sind nicht eine syntaktische Sprachkonstruktion, aber eher eine organisatorische Standardtagung. Normalerweise wird eine Anwendung von Eiffel mit jeder Klasse in einer getrennten Datei und jeder Traube in einem Verzeichnis-organisiert, der Klassendateien enthält. In dieser Organisation sind Subtrauben Unterverzeichnisse. Zum Beispiel, unter der umgebenden und organisatorischen Standardvereinbarung, könnte der Name einer Datei sein, die eine Klasse genannt X definiert.

Eine Klasse enthält Eigenschaften, die "Routinen", "Mitgliedern", "Attributen" oder "Methoden" auf anderen objektorientierten Programmiersprachen ähnlich sind. Eine Klasse definiert auch seinen invariants, und enthält andere Eigenschaften, wie eine "Zeichen"-Abteilung für die Dokumentation und metadata. Die Standarddatentypen von Eiffel, solcher als, und, sind alle selbst Klassen.

Jedes System muss eine Klasse als "Wurzel", mit einem seiner als "Wurzelverfahren benannten Entwicklungsverfahren" benennen lassen. Durchführung eines Systems besteht daraus, ein Beispiel der Wurzelklasse zu schaffen und sein Wurzelverfahren durchzuführen. Allgemein schafft das Tun so neue Gegenstände, neue Eigenschaften von Anrufen und so weiter.

Eiffel hat fünf grundlegende rechtskräftige Instruktionen: Anweisung, Gegenstand-Entwicklung, alltäglicher Anruf, Bedingung und Wiederholung. Die Kontrollstrukturen von Eiffel sind im Erzwingen der strukturierten Programmierung streng: Jeder Block hat genau einen Zugang und genau einen Ausgang.

Scoping

Verschieden von vielen objektorientierten Sprachen, aber wie Plausch, erlaubt Eiffel keine Anweisung in Felder von Gegenständen, außer innerhalb der Eigenschaften eines Gegenstands, der die praktische Anwendung des Grundsatzes der Informationsverheimlichung oder Datenabstraktion ist, formelle Schnittstellen für die Datenveränderung verlangend. Um es auf der Sprache anderer objektorientierter Programmiersprachen zu stellen, sind alle Felder von Eiffel "privat", und "Setter" sind erforderlich, um Werte zu modifizieren. Ein Ergebnis davon ist, dass "Setter", und normalerweise tun, kann den invariants durchführen, für den Eiffel Syntax zur Verfügung stellt.

Während Eiffel direkten Zugang zu den Eigenschaften einer Klasse durch einen Kunden der Klasse nicht erlaubt, berücksichtigt es wirklich die Definition "assigner Befehl" wie:

: set_some_attribute

(v:)

some_attribute: = v

</Code>

Während ein geringer Bogen zur gesamten Entwickler-Gemeinschaft, um etwas zu erlauben, wie direkter Zugang aussehend (z.B dadurch den Informationsverheimlichungsgrundsatz brechend), die Praxis gefährlich ist, wie es verbirgt oder die Wirklichkeit eines "Setters" verfinstert, der wird verwendet. In der Praxis ist es besser, den direkten Anruf zu einem Setter zu lesen, anstatt einen direkten Zugang zu einer Eigenschaft wie als im Beispiel-Code oben einzubeziehen.

Verschieden von anderen Sprachen, Begriffe von "öffentlichen", "privaten" und so weiter habend, verwendet Eiffel eine exportierende Technologie, um den scoping zwischen Kunden- und Lieferant-Klassen genauer zu kontrollieren. Außerdem kann die verwendete Exportlogik statisch durch den Bearbeiter überprüft werden, der frühere Entdeckung von Spielraum-Verletzen-Anrufen in der Übersetzungszeit aber nicht Durchlaufzeit erlaubt. Zum Beispiel (unten) ist "{NIEMAND}" "dem privaten" auf anderen Sprachen ähnlich. Spielraum hat diesen Weg zu einer "Merkmalsreihe" angewandt (z.B alles unter dem `Eigenschaft-Schlüsselwort entweder zum folgenden Merkmalsreihe-Schlüsselwort oder zu das Ende der Klasse) kann in Nachkomme-Klassen mit dem "Export"-Schlüsselwort geändert werden.

zeigen Sie {NIEMAND} - Initialisierung

default_create

- Initialisieren Sie ein neues dezimales `null-Beispiel.

tun Sie

make_zero

Ende

</syntaxhighlight>

Wechselweise der Mangel an {x} bezieht Exportbehauptung {IRGENDWELCHER} ein und ist dem "Publikum" scoping von anderen Sprachen ähnlich.

Eigenschaft - Konstanten

</syntaxhighlight>

Schließlich kann scoping zu jeder Klasse im Projektweltall von Eiffel auswählend und genau kontrolliert werden wie:

Eigenschaft {DEZIMALZAHL, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER} - Zugang

</syntaxhighlight>

Hier wird der Bearbeiter nur den zwischen den lockigen geschweiften Klammern verzeichneten Klassen erlauben, auf die Eigenschaften innerhalb der Eigenschaft-Gruppe (z.B Dezimalzahl, DCM_MA_DECIMAL_PARSER, DCM_MA_DECIMAL_HANDLER) zuzugreifen.

"Hallo, Welt!"

Ein Blick und Gefühl einer Programmiersprache werden häufig mit "Hallo, Welt befördert!" Programm. Solch ein in Eiffel geschriebenes Programm könnte sein:

Klasse

HELLO_WORLD

schaffen Sie

machen Sie

Eigenschaft

machen Sie

tun Sie

Druck ("Hallo, Welt! %N")

Ende

Ende

</syntaxhighlight>

Dieses Programm enthält die Klasse. Der Konstrukteur (schaffen Routine), für die Klasse, genannt, ruft die Systembibliotheksroutine an, um eine Nachricht an die Produktion zu schreiben.

Design durch den Vertrag

Das Konzept des Designs durch den Vertrag ist zu Eiffel zentral. Die Verträge behaupten, was wahr sein muss, bevor eine Routine (Vorbedingung) durchgeführt wird, und was halten muss, um nach den alltäglichen Schlüssen (Postbedingung) wahr zu sein. Auf Klasse Verträge von Invariant definieren das, welche Behauptungen sowohl vorher als auch nach jeder Eigenschaft einer Klasse für wahr halten müssen, wird (sowohl Routinen als auch Attribute) zugegriffen. Außerdem kodifizieren Verträge in den rechtskräftigen Codeentwickler und die Entwerfer-Annahmen über die Betriebsumgebung der Eigenschaften einer Klasse oder der Klasse als Ganzes mittels des invariant.

Der Eiffel Bearbeiter wird entworfen, um die Eigenschaft und Klassenverträge in verschiedenen Niveaus einzuschließen. EiffelStudio führt zum Beispiel die ganze Eigenschaft und Klassenverträge während der Ausführung in der "Arbeitstisch-Weise durch." Wenn ein rechtskräftiger geschaffen wird, wird der Bearbeiter über die Projekteinstellungsdatei angewiesen (z.B. ECF Datei), um jeden Satz von Verträgen entweder einzuschließen oder auszuschließen. So kann eine rechtskräftige Datei kompiliert werden, um jedes Niveau des Vertrags entweder einzuschließen oder auszuschließen, dadurch dauernde Niveaus der Einheit und Integrationsprüfung mitbringend. Außerdem können Verträge ständig über die in EiffelStudio gefundene Autotesteigenschaft und methodisch ausgeübt werden.

Das Design durch Vertragsmechanismen wird mit der Sprache dicht integriert und führt Wiederdefinition von Eigenschaften im Erbe:

  • Alltägliche Vorbedingung: Die Vorbedingung kann nur durch das Erbe geschwächt werden; jeder Anruf, der den Anforderungen des Vorfahren entspricht, trifft diejenigen des Nachkommen.
  • Alltägliche Postbedingung: Die Postbedingung kann nur durch das Erbe gestärkt werden; jedes vom Vorfahren versicherte Ergebnis wird noch vom Nachkommen zur Verfügung gestellt.
  • Klasse invariant: Bedingungen, die beide vorher (außer vor der Entwicklung) und danach für wahr halten müssen (außer postzerstören), der Zugang zu einer Klasseneigenschaft (Routine oder Attribut). Weil der invariant so häufig überprüft wird, macht er es gleichzeitig die teuerste und stärkste Form der Bedingung oder des Vertrags.

Außerdem unterstützt die Sprache eine "Kontrolle-Instruktion" (eine Art "behaupten Sie") und Schleife invariants.

Leere Sicherheit

Leere Sicherheit, wie das statische Schreiben, ist eine andere Möglichkeit, um Softwarequalität zu verbessern. Leer-sichere Software wird vor Durchlaufzeit-Fehlern geschützt, die durch Anrufe zu leeren Verweisungen verursacht sind, und wird deshalb zuverlässiger sein als Software, in der Anrufe zu leeren Zielen vorkommen können. Die Analogie zum statischen Schreiben ist eine nützliche. Tatsächlich konnte leer-sichere Fähigkeit als eine Erweiterung auf das Typ-System oder ein Schritt außer dem statischen Schreiben gesehen werden, weil der Mechanismus, um leere Sicherheit zu sichern, ins Typ-System integriert wird.

Der Wächter gegen leere Zielanrufe kann über den Begriff der Verhaftung und (durch die Erweiterung) Abstand (z.B abnehmbares Schlüsselwort) gesehen werden. Die leer-sichere Möglichkeit kann in einem kurzen gesehen werden arbeiten des Beispiel-Codes nach, der oben verwendet ist:

:

wenn some_attribute al_attribute

do_something (al_attribute)

Ende

(a_value: SOME_TYPE)

... das Tun von etwas mit `a_value'...

</Code>

Das Codebeispiel zeigt oben, wie der Bearbeiter die Zuverlässigkeit dessen statisch richten kann, ob beigefügt oder am Punkt losgemacht wird, wird es verwendet. Namentlich berücksichtigt das Schlüsselwort eine "Verhaftung lokal" (z.B)., der scoped zu nur dem Block des durch die Wenn-Behauptungskonstruktion eingeschlossenen Codes ist. So, innerhalb dieses kleinen Blocks des Codes, die lokale Variable (z.B). kann statisch versichert werden, nichtleer (d. h. leer-sicher zu sein).

Eigenschaften, Befehle und Abfragen

Die primäre Eigenschaft einer Klasse ist, dass sie eine Reihe von Eigenschaften enthält. Da eine Klasse eine Reihe von Laufzeitgegenständen oder "Beispiele" vertritt, ist eine Eigenschaft eine Operation auf diesen Gegenständen. Es gibt zwei Arten von Eigenschaften: Abfragen und Befehle. Eine Abfrage gibt Auskunft über ein Beispiel. Ein Befehl modifiziert ein Beispiel.

Die Unterscheidung der Befehl-Abfrage ist für die Methode von Eiffel wichtig. Insbesondere:

  • Grundsatz des gleichförmigen Zugangs: Aus dem Gesichtswinkel von einem Softwarekunden, der einen Anruf zu einer Klasseneigenschaft macht, ob eine Abfrage ein Attribut (Feld in jedem Gegenstand) oder eine Funktion (Algorithmus) ist, sollte keinen Unterschied machen. Zum Beispiel konnte a_vehicle.speed ein Attribut sein, das von der Darstellung des Gegenstands zugegriffen ist; oder es konnte durch eine Funktion geschätzt werden, die Entfernung vor der Zeit teilt. Die Notation ist dasselbe in beiden Fällen, so dass es leicht ist, Darstellung zu ändern, ohne den Rest der Software zu betreffen.
  • Trennungsgrundsatz der Befehl-Abfrage: Abfragen müssen das Beispiel nicht modifizieren. Das ist nicht eine Sprachregel, aber ein methodologischer Grundsatz. So im guten Stil von Eiffel findet man nicht "bekommen" Funktionen, die etwas ändern und ein Ergebnis zurückgeben; stattdessen gibt es Befehle (Verfahren), um Gegenstände und Abfragen zu ändern, um Information über den Gegenstand zu erhalten, sich aus dem Vorangehen Änderungen ergebend.

Überbelastung

Eiffel erlaubt Argument-Überbelastung nicht. Jeder Eigenschaft-Name innerhalb einer Klasse stellt immer zu einer spezifischen Eigenschaft innerhalb der Klasse kartografisch dar. Ein Name, innerhalb einer Klasse, bedeutet ein Ding. Diese Designwahl hilft der Lesbarkeit von Klassen, durch das Vermeiden einer Ursache der Zweideutigkeit, über die Routine durch einen Anruf angerufen wird. Es vereinfacht auch den Sprachmechanismus; insbesondere das ist, was den Mehrfachvererbungsmechanismus von Eiffel möglich macht.

Namen können natürlich in verschiedenen Klassen wiederverwendet werden. Zum Beispiel wird die Eigenschaft (zusammen mit seinem Infix-Decknamen) in mehreren Klassen definiert: usw.

Genericity

Eine allgemeine Klasse ist eine Klasse, die sich durch den Typ ändert (z.B Liste [TELEFON], eine Liste von Telefonnummern; RECHNUNG [G-> ACCOUNT_TYPE], RECHNUNG [ERSPARNISSE] und RECHNUNG [ÜBERPRÜFUNG], usw. berücksichtigend). Klassen können allgemein sein, um auszudrücken, dass sie durch Typen parametrisiert werden. Allgemeine Rahmen erscheinen in eckigen Klammern:

Benotungsliste [G]...

</syntaxhighlight>

G ist als ein "formeller allgemeiner Parameter" bekannt. (Eiffel bestellt "Argument" für Routinen vor, und verwendet "Parameter" nur für allgemeine Klassen.) Mit solch einer Erklärung G vertritt innerhalb der Klasse einen willkürlichen Typ; so kann eine Funktion einen Wert des Typs G zurückgeben, und eine Routine ein Argument dieses Typs nehmen kann:

Artikel: G beenden wirklich...

gestellt (x: Beenden Sie... G)

</syntaxhighlight>

Und sind "allgemeine Abstammungen" dieser Klasse. Erlaubte Kombinationen (mit,) sind

n: = il.item

wl.put (w)

</syntaxhighlight>

und sind die "wirklichen allgemeinen Rahmen" in diesen allgemeinen Abstammungen.

Es ist auch möglich, formelle Rahmen 'beschränkt' zu haben, für die der wirkliche Parameter von einer gegebenen Klasse, der "Einschränkung" erben muss. Zum Beispiel in

Klasse HASH_TABLE [G, SCHLÜSSEL-> HASHABLE]

</syntaxhighlight>

eine Abstammung ist nur gültig, wenn von erbt (wie sie tatsächlich in typischen Bibliotheken von Eiffel tut). Innerhalb der Klasse, durch das Mittel beschränkt, das dafür möglich ist, für alle Eigenschaften, als darin zu gelten.

Erbe-Grundlagen

Um von ein oder mehr andere zu erben, wird eine Klasse eine Klausel am Anfang einschließen:

Klasse C erbt

Ein

B

-... Rest der Klassenbehauptung...

</syntaxhighlight>

Die Klasse kann wiederdefinieren (überreiten) einige oder alle geerbten Eigenschaften. Das muss am Anfang der Klasse durch eine Subklausel der Erbe-Klausel, als in ausführlich bekannt gegeben werden

Klasse C erbt

Ein

definieren Sie f, g wieder, h beenden

B

definieren Sie u wieder, v beenden

</syntaxhighlight>

Sieh http://archive.eiffel.com/doc/online/eiffel50/intro/language/tutorial-10.html für eine ganze Diskussion des Erbes von Eiffel.

Aufgeschobene Klassen und Eigenschaften

Klassen können definiert werden mit aber nicht mit anzuzeigen, dass die Klasse nicht direkt realisiert werden darf. Non-instantiatable Klassen werden abstrakte Klassen auf einigen anderen objektorientierten Programmiersprachen genannt. Im Eiffel Sprachgebrauch kann nur eine "wirksame" Klasse realisiert werden (es kann ein Nachkomme einer aufgeschobenen Klasse sein). Eine Eigenschaft kann auch durch das Verwenden des Schlüsselwortes im Platz einer Klausel aufgeschoben werden. Wenn eine Klasse irgendwelche aufgeschobenen Eigenschaften hat, muss sie, wie aufgeschoben, erklärt werden; jedoch kann eine Klasse ohne aufgeschobene Eigenschaften dennoch selbst aufgeschoben werden.

Aufgeschobene Klassen spielen etwas von derselben Rolle als Schnittstellen auf Sprachen wie Java, obwohl viele objektorientierte Programmiertheoretiker glauben, dass Schnittstellen selbst größtenteils eine Antwort auf Javas Mangel an der Mehrfachvererbung sind (den Eiffel hat).

Umbenennung

Eine Klasse, die von ein oder mehr andere erbt, bekommt alle seine Eigenschaften standardmäßig unter ihren eigentlichen Namen. Es kann jedoch ihre Namen durch Klauseln ändern. Das ist im Fall von der Mehrfachvererbung erforderlich, wenn es Namenzusammenstöße zwischen geerbten Eigenschaften gibt; ohne Umbenennung würde die resultierende Klasse den Grundsatz ohne Überbelastung verletzen, der oben bemerkt ist, und würde folglich ungültig sein.

Tupel

Tupel-Typen können als eine einfache Form der Klasse angesehen werden, nur zur Verfügung zu stellen, schreibt zu und das entsprechende "Setter"-Verfahren. Ein typischer Tupel-Typ liest

TUPEL [SCHNUR des Namens:; Gewicht: ECHT; Datum: DATUM]

</syntaxhighlight>

und konnte verwendet werden, um einen einfachen Begriff der Geburtsaufzeichnung zu beschreiben, wenn eine Klasse nicht erforderlich ist. Ein Beispiel solch eines Tupels ist einfach eine Folge von Werten mit den gegebenen Typen in Anbetracht des in Klammern wie

["Brigitte", 3.5, Last_night]

</syntaxhighlight>Auf

Bestandteile solch eines Tupels kann zugegriffen werden, als ob die Tupel-Anhängsel Attribute einer Klasse zum Beispiel waren, wenn zugeteilt worden ist, hat das obengenannte Tupel dann Wert 3.5.

Dank des Begriffs des Assigner-Befehls (sieh unten) kann Punktnotation auch verwendet werden, um Bestandteile solch eines Tupels, als in zuzuteilen

t.weight: = t.weight + 0.5

</syntaxhighlight>

Die Tupel-Anhängsel sind fakultativ, so dass es auch möglich ist, einen Tupel-Typ als zu schreiben. (In einigen Bearbeitern ist das die einzige Form des Tupels, weil Anhängsel mit dem ECMA Standard eingeführt wurden.)

Die genaue Spezifizierung dessen ist z.B, dass es Folgen von mindestens drei Elementen, die ersten drei beschreibt, die von Typen beziehungsweise sind. Infolgedessen passt sich an (kann zugeteilt werden), und zu (ohne Rahmen), der höchste Tupel-Typ, dem sich alle Tupel-Typen anpassen.

Agenten

Der "Agent"-Mechanismus von Eiffel wickelt Operationen in Gegenstände. Dieser Mechanismus kann für die Wiederholung, Ereignis-gesteuerte Programmierung und anderen Zusammenhänge verwendet werden, in denen es nützlich ist, Operationen um die Programm-Struktur zu passieren. Andere Programmiersprachen, besonders, die funktionelle Programmierung betonen, erlauben ein ähnliches Muster mit Verlängerungen, Verschlüssen oder Generatoren; die Agenten von Eiffel betonen das objektorientierte Paradigma der Sprache, und verwenden eine Syntax und Semantik, die ähnlich ist, um Blöcke im Plausch und Ruby zu codieren.

Zum Beispiel, um den Block für jedes Element durchzuführen, würde man schreiben:

my_list.do_all (Reagenz my_action)

</syntaxhighlight>

Um nur auf der Element-Zufriedenheit durchzuführen, kann eine Beschränkung/Filter hinzugefügt werden:

my_list.do_if (Reagenz my_action, Reagenz my_condition)

</syntaxhighlight>

In diesen Beispielen, und sind Routinen. Das Vorbefestigen von ihnen mit Erträgen ein Gegenstand, der die entsprechende Routine mit allen seinen Eigenschaften, insbesondere die Fähigkeit vertritt, mit den passenden Argumenten genannt zu werden. So, wenn diesen Gegenstand vertritt (zum Beispiel, weil das Argument für ist), die Instruktion

a.call ([x])

</syntaxhighlight>

wird die ursprüngliche Routine mit dem Argument nennen, als ob wir die ursprüngliche Routine direkt genannt hatten:. Argumente dafür werden als ein Tupel hier passiert.

Es ist möglich, einige Argumente für einen Agenten zu behalten, öffnen und machen andere haben geschlossen. Die offenen Argumente werden als Argumente passiert für: Sie werden zur Zeit des Reagenz-Gebrauches zur Verfügung gestellt. Die geschlossenen Argumente werden zur Zeit der Reagenz-Definition zur Verfügung gestellt. Zum Beispiel, wenn zwei Argumente, die Wiederholung hat

my_list.do_all (Reagenz action2 (? y))

</syntaxhighlight>

wiederholt für aufeinander folgende Werte dessen, wo die zweiten Argumente gesetzt darauf geblieben sind. Das Fragezeichen zeigt ein offenes Argument an; ist ein geschlossenes Argument des Agenten. Bemerken Sie, dass die grundlegende Syntax eine Kurzschrift für mit allen offenen Argumenten ist. Es ist auch möglich, das Ziel eines durch die Notation offenen Agenten zu machen, wo der Typ des Ziels ist.

Die Unterscheidung zwischen offenem und geschlossenem operands (operands = Argumente + Ziel) entspricht der Unterscheidung zwischen bestimmten und freien Variablen in der Lambda-Rechnung. Ein Reagenz-Ausdruck solcher als mit einem operands hat geschlossen, und einige öffnen sich entspricht einer Version der ursprünglichen auf dem geschlossenen operands mit Currysoße zubereiteten Operation.

Der Agent-Mechanismus erlaubt auch, einen Agenten ohne Berücksichtigung einer vorhandenen Routine (solcher als,), durch Reihenagenten als in zu definieren

my_list.do_all (Reagenz (s: SCHNUR)

verlangen Sie

not_void: s / = Leere

tun Sie

s.append_character (',')

sichern Sie

angehangen: s.count = alter s.count + 1

Ende)

</syntaxhighlight>

Der Reihenagent ist gegangen hier kann die ganze Ausrüstung einer normalen Routine, einschließlich der Vorbedingung, Postbedingung, Rettungsklausel (nicht verwendet hier), und eine volle Unterschrift haben. Das vermeidet, Routinen zu definieren, wenn alles es ist erforderlich, eine in einen Agenten zu wickelnde Berechnung ist. Das ist insbesondere für Verträge, als in einer invariant Klausel nützlich, die ausdrückt, dass alle Elemente einer Liste positiv sind:

my_list.for_all (Reagenz (x: GANZE ZAHL): BOOLEAN Resultieren wirklich: = (x> 0) Ende)

</syntaxhighlight>

Der aktuelle Reagenz-Mechanismus verlässt eine Möglichkeit des Laufzeittyp-Fehlers (wenn eine Routine mit n Argumenten zu einem Agenten passiert wird, der M Argumente mit der M dessen erwartet. Mehrere Vorschläge für eine rein statische Korrektur dieses Problems, sind einschließlich eines Sprachänderungsvorschlags durch Ribet und al verfügbar.

Einmal Routinen

Ein Ergebnis einer Routine kann mit dem Schlüsselwort im Platz dessen versteckt werden. Die nichtersten Anrufe zu einer Routine verlangen keine zusätzliche Berechnung oder Betriebsmittelzuweisung, aber geben einfach ein vorher geschätztes Ergebnis zurück. Ein allgemeines Muster für "einmal Funktionen" soll geteilte Gegenstände zur Verfügung stellen; der erste Anruf wird den Gegenstand schaffen, nachfolgende werden die Verweisung auf diesen Gegenstand zurückgeben. Das typische Schema ist:

shared_object: SOME_TYPE

einmal

schaffen Sie Result.make (args)

- Das schafft den Gegenstand und gibt eine Verweisung darauf durch `das Ergebnis' zurück.

Ende

</syntaxhighlight>

Der zurückgegebene Gegenstand — im Beispiel — kann selbst veränderlich sein, aber seine Verweisung bleibt dasselbe.

Häufig "sobald führen Routinen" eine erforderliche Initialisierung durch: Vielfache Anrufe zu einer Bibliothek können einen Anruf zum Initialisierungsverfahren einschließen, aber nur der erste derartige Anruf wird die erforderlichen Handlungen durchführen. Das Verwenden dieser Muster-Initialisierung kann dezentralisiert werden, das Bedürfnis nach einem speziellen Initialisierungsmodul vermeidend. "Sobald Routinen" im Zweck und der Wirkung zum Singleton-Muster auf vielen Programmiersprachen, und zum verwendeten in der Pythonschlange ähnlich sind.

Standardmäßig "sobald wird Routine" einmal pro Faden genannt. Die Semantik kann einmal pro Prozess oder einmal pro Gegenstand durch das Qualifizieren davon mit "einmal Schlüssel" z.B angepasst werden.

Konvertierungen

Eiffel stellt einen Mechanismus zur Verfügung, Konvertierungen zwischen verschiedenen Typen zu erlauben. Die Mechanismen koexistieren mit dem Erbe und ergänzen es. Um jede Verwirrung zwischen den zwei Mechanismen zu vermeiden, macht das Design den folgenden Grundsatz geltend:

: (Umwandlungsgrundsatz) Ein Typ kann sich nicht sowohl anpassen und sich zu einem anderen umwandeln.

Zum Beispiel kann sich dem anpassen, aber wandelt sich zu um (und erbt davon nicht).

Der Umwandlungsmechanismus verallgemeinert einfach die Ad-Hoc-Umwandlungsregeln (solcher als tatsächlich zwischen und), die auf den meisten Programmiersprachen bestehen, sie anwendbar auf jeden Typ machend, so lange der obengenannte Grundsatz beobachtet wird. Zum Beispiel, wie man erklären kann, wandelt sich eine Klasse dazu um; das macht es möglich, eine Schnur von einem Datum einfach durch zu schaffen

my_string: = my_date

</syntaxhighlight>

als eine Abkürzung, für eine ausführliche Gegenstand-Entwicklung mit einem Umwandlungsverfahren zu verwenden:

schaffen Sie my_string.make_from_date (my_date)

</syntaxhighlight>

Um die erste Form möglich als ein Synonym für das zweite zu machen, genügt es, um das Entwicklungsverfahren (Konstrukteur) in einer Klausel am Anfang der Klasse zu verzeichnen.

Als ein anderes Beispiel, wenn es solch ein Umwandlungsverfahren gibt, das davon verzeichnet ist, dann kann man ein Tupel einem Datum direkt zuteilen, die passende Konvertierung, als in verursachend

Bastille_day: = [14, "Juli", 1789]

</syntaxhighlight>

Das Ausnahme-Berühren

Ausnahme, die in Eiffel behandelt, basiert auf den Grundsätzen des Designs durch den Vertrag. Zum Beispiel kommt eine Ausnahme vor, wenn ein Anrufer einer Routine scheitert, eine Vorbedingung zu befriedigen, oder wenn eine Routine keine versprochene Postbedingung sichern kann. In Eiffel wird das Ausnahme-Berühren für den Kontrollfluss nicht verwendet oder Dateneingangsfehler zu korrigieren.

Ein Eiffel Ausnahme-Dressierer wird mit dem Schlüsselwort definiert. Innerhalb der Abteilung führt das Schlüsselwort die Routine wieder durch. Zum Beispiel verfolgt die folgende Routine die Zahl von Versuchen der Durchführung der Routine, und verhandelt nur eine bestimmte Anzahl von Zeiten neu:

connect_to_server (Server: STECKDOSE)

- Stehen Sie zu einem Server in Verbindung oder geben Sie nach 10 Versuchen auf.

verlangen Sie

Server / = Leere und dann server.address / = Leere

lokaler

Versuche: GANZE ZAHL

tun Sie

server.connect

sichern Sie

verbunden: Server is_connected

Rettung

wenn Versuche

Dieses Beispiel wird für irgendetwas außer den einfachsten Programmen jedoch wohl rissig gemacht, weil Verbindungsmisserfolg erwartet werden soll. Für die meisten Programme mag ein alltäglicher Name würde besser sein, und die Postbedingung würde keine Verbindung versprechen, ihn bis zum Anrufer verlassend, um passende Schritte zu machen, wenn die Verbindung nicht geöffnet würde.

Parallelität

Mehrere sind Netzwerkanschluss und das Einfädeln von Bibliotheken, wie EiffelNet und EiffelThreads verfügbar. Ein Parallelitätsmodell für Eiffel, der auf den Konzepten des Designs durch den Vertrag gestützt ist, ist SCHAUFEL oder Einfache Gleichzeitige Objektorientierte Programmierung, noch nicht ein Teil der offiziellen Sprachdefinition, aber verfügbar in EiffelStudio.

KAMEE ist eine (undurchgeführte) Schwankung der SCHAUFEL für Eiffel.

Parallelität wirkt auch mit Ausnahmen aufeinander. Asynchrone Ausnahmen können lästig sein (wo eine Routine eine Ausnahme erhebt, nachdem sein Anrufer selbst fertig gewesen ist).

Maschinenbediener und Klammer-Syntax, assigner Befehle

Die Ansicht von Eiffel von der Berechnung ist im Sinn völlig objektorientiert, dass jede Operation hinsichtlich eines Gegenstands, des "Ziels" ist. So zum Beispiel eine Hinzufügung wie

+ b

</syntaxhighlight>

wird begrifflich verstanden, als ob es der Methode-Anruf war

a.plus (b)

</syntaxhighlight>

mit dem Ziel, der Eigenschaft und dem Argument.

Natürlich ist der erstere die herkömmliche Syntax und gewöhnlich bevorzugt. Maschinenbediener-Syntax macht es möglich, jede Form durch das Erklären der Eigenschaft zu verwenden (zum Beispiel darin, aber das gilt für andere grundlegende Klassen und kann in irgendwelchem anderer für der solch ein Maschinenbediener passend verwendet werden):

plus der Deckname "+" (anderer: GANZE ZAHL): GANZE ZAHL

-... Normale Funktionsbehauptung...

Ende</syntaxhighlight>

Die Reihe von Maschinenbedienern, die als "Deckname" verwendet werden können, ist ziemlich breit; sie schließen vorherbestimmte Maschinenbediener solcher als "+" sondern auch "freie Maschinenbediener ein, die" aus nichtalphanumerischen Symbolen gemacht sind. Das macht es möglich, spezielles Infix und Präfix-Notationen zum Beispiel in Mathematik- und Physik-Anwendungen zu entwerfen.

Jede Klasse kann außerdem eine Funktion aliased zu" []", der "Klammer"-Maschinenbediener haben, die Notation als ein Synonym dafür erlaubend, wo die gewählte Funktion ist. Das ist für Behälterstrukturen wie Reihe, Hash-Tabellen, Listen usw. besonders nützlich. Zum Beispiel kann der Zugang zu einem Element einer Hash-Tabelle mit Schnur-Schlüsseln geschrieben werden

Zahl: = phone_book ["JILL SMITH"]

</syntaxhighlight>

"Befehle von Assigner" sind ein dazugehöriger Mechanismus, der in demselben Geist entworfen ist, feste, günstige im Fachwerk der objektorientierten Programmierung wiederinterpretierte Notation zu erlauben. Befehle von Assigner erlauben einer Anweisung ähnlicher Syntax, "Setter"-Verfahren zu nennen. Eine richtige Anweisung kann der Form nie sein, weil das Informationsverheimlichung verletzt; Sie müssen für einen Setter-Befehl (Verfahren) gehen. Zum Beispiel kann die Hash-Tabelle-Klasse die Funktion und das Verfahren haben

Artikel-Deckname" []" (Schlüssel: SCHNUR): ELEMENT [3]

- Das Element des Schlüssels `Schlüssel'.

- ((Hauer)-Abfrage)

tun Sie ... Ende

gestellt (e: ELEMENT; Schlüssel: SCHNUR)

- Fügen Sie das Element `e' ein, es mit dem Schlüssel `Schlüssel' vereinigend.

- ((Setter)-Befehl)

tun Sie ... Ende</syntaxhighlight>

Um dann ein Element einzufügen, müssen Sie einen ausführlichen Anruf zum Setter-Befehl verwenden:

[4] phone_book.put (New_Person, "JILL SMITH")

</syntaxhighlight>

Es ist möglich, das gleichwertig als zu schreiben

[5] phone_book ["JILL SMITH"]: = New_Person

</syntaxhighlight>

(ebenso, der ein Synonym für ist), hat die Behauptung von jetzt Anfängen (Ersatz für [3]) mit zur Verfügung gestellt

Artikel-Deckname" []" (Schlüssel: SCHNUR): ELEMENT Teilt gestellten zu

</syntaxhighlight>

Das erklärt als der Assigner-Befehl, der damit vereinigt ist, und, verbunden mit dem Klammer-Decknamen, macht [5] gesetzlich und gleichwertig zu [4]. (Es konnte auch geschrieben werden, ohne die Klammer als auszunutzen.

Zeichen: Die Argument-Liste des assigner von a wird beschränkt zu sein: (der Rücktyp von a; das ganze Argument von a hat... Schlagseite)

Lexikalisch und Syntax-Eigenschaften

Eiffel ist nicht mit dem Fall empfindlich. Die Jetons, und zeigen alle denselben Bezeichner an., Sieh jedoch, die "Stil-Regeln" unten.

Anmerkungen werden durch (zwei Konsekutivspuren) eingeführt und strecken sich bis zu das Ende der Linie aus.

Der Strichpunkt, als Instruktionsseparator, ist fakultativ. Den größten Teil der Zeit wird der Strichpunkt gerade weggelassen, außer, vielfache Instruktionen auf einer Linie zu trennen. Das läuft auf weniger Durcheinander auf der Programm-Seite hinaus.

Es gibt kein Nisten der Eigenschaft und Klassenbehauptungen. Infolgedessen ist die Struktur einer Klasse von Eiffel einfach: einige Klassenniveau-Klauseln (Erbe, invariant) und eine Folge von Eigenschaft-Behauptungen, allen an demselben Niveau.

Es ist üblich, um Eigenschaften in getrennte "Eigenschaft-Klauseln" für mehr Lesbarkeit mit einem Standardsatz von grundlegenden Eigenschaft-Anhängseln zu gruppieren, die in einer Standardordnung zum Beispiel erscheinen:

Klasse HASH_TABLE [ELEMENT, SCHLÜSSEL-> erben HASHABLE] TISCH [ELEMENT]

Eigenschaft - Initialisierung

-... Behauptungen von Initialisierungsbefehlen (Entwicklungsverfahren/Konstrukteure)...

Eigenschaft - Zugang

-... Behauptungen von non-boolean fragen auf dem Gegenstand-Staat, z.B Artikel...

Eigenschaft - Status-Bericht

-... Behauptungen von boolean fragen auf dem Gegenstand-Staat, z.B is_empty...

Eigenschaft - Element-Änderung

-... Behauptungen von Befehlen, die die Struktur ändern, stellen Sie z.B...

- usw.

Ende

</syntaxhighlight>

Im Gegensatz zu lockigsten Klammer-Programmiersprachen macht Eiffel eine klare Unterscheidung zwischen Ausdrücken und Instruktionen. Das stimmt mit dem Trennungsgrundsatz der Befehl-Abfrage der Methode von Eiffel überein.

Stil-Vereinbarung

Viel von der Dokumentation von Eiffels kennzeichnender Stil-Vereinbarung des Gebrauches, entworfen, um einen konsequenten Blick-Und-Gefühl geltend zu machen. Etwas von dieser Vereinbarung gilt für das Codeformat selbst und andere zur drucktechnischen Standardübergabe des Codes von Eiffel in Formaten und der Veröffentlichungen, wo diese Vereinbarung möglich ist.

Während die Sprache gegen den Fall unempfindlich ist, schreiben die Stil-Standards den Gebrauch von Vollkapitalen für Klassennamen , volluntere Umschaltung für Eigenschaft-Namen , und anfänglichen Kapitalen für Konstanten vor. Der empfohlene Stil deutet auch an unterstreichen, um Bestandteile eines Mehrwortbezeichners, als darin zu trennen.

Die Spezifizierung von Eiffel schließt Richtlinien ein, um Softwaretexte in Schriftsatz-Formaten zu zeigen: In Schlüsselwörtern in kühnen, benutzerbestimmten Bezeichnern und Konstanten wird, Anmerkungen, Maschinenbediener und Satzzeichen in, mit dem Programm-Text in als im vorliegenden Artikel gezeigt, um es aus dem erklärenden Text zu unterscheiden. Zum Beispiel, "Hallo, Welt!" Programm, das oben gegeben ist, würde als unten in der Dokumentation von Eiffel gemacht:

HELLO_WORLD

schaffen Sie

machen Sie

Eigenschaft

machen Sie tun Sie

Druck ("Hallo, Welt!")

Ende

Ende </Schriftart>

Schnittstellen zu anderen Werkzeugen und Sprachen

Eiffel ist eine rein objektorientierte Sprache, aber stellt eine offene Architektur zur Verfügung, um mit der "Außen"-Software auf jeder anderen Programmiersprache zu verbinden.

Es ist zum Beispiel zur Programm-Maschine möglich - und Betriebssystem-Niveau-Operationen in C. Eiffel stellt eine aufrichtige Schnittstelle C Routinen, einschließlich der Unterstützung für "ReihenC" (das Schreiben des Körpers einer Routine von Eiffel in C, normalerweise für kurze Maschinenniveau-Operationen) zur Verfügung.

Obwohl es keinen Direktanschluss zwischen Eiffel und C gibt, viele Bearbeiter von Eiffel (Ist visueller Eiffel eine Ausnahme) Produktion C Quellcode als eine Zwischensprache, um einem C Bearbeiter, für die Optimierung und Beweglichkeit zu gehorchen. Als solcher sind sie Beispiele von transcompilers. Der Eiffel Bearbeiter tecomp kann Code von Eiffel direkt (wie ein Dolmetscher) durchführen, ohne über ein Zwischenglied C zu gehen, codieren oder strahlen C-Code aus, der zu einem C Bearbeiter passiert wird, um optimierten heimischen Code zu erhalten. Auf.NET erzeugt der Bearbeiter von EiffelStudio direkt CIL (Allgemeine Zwischensprache) Code. Der Bearbeiter von SmartEiffel kann auch Produktion Java bytecode.

Links

  • Teilmenge

Äthylen / Ezra
Impressum & Datenschutz