Skelett (Computerprogrammierung) - Skeleton (computer programming)

Die Skelettprogrammierung ist eine Art der Computerprogrammierung, die auf einfachen Programmstrukturen auf hoher Ebene und dem sogenannten Dummy-Code basiert . Programmskelette ähneln Pseudocode , ermöglichen jedoch das Parsen , Kompilieren und Testen des Codes. Dummy-Code wird in ein Programmgerüst eingefügt, um die Verarbeitung zu simulieren und Kompilierungsfehlermeldungen zu vermeiden . Es kann sich um leere Funktionsdeklarationen oder um Funktionen handeln, die nur für einen einfachen Testfall, bei dem die erwartete Antwort des Codes bekannt ist, ein korrektes Ergebnis zurückgeben.

Die Skelettprogrammierung ermöglicht einen Top-Down- Entwurfsansatz, bei dem ein teilweise funktionierendes System mit vollständigen Strukturen auf hoher Ebene entworfen und codiert wird. Dieses System wird dann schrittweise erweitert, um die Anforderungen des Projekts zu erfüllen. Programmskelette werden manchmal auch für allgemeine Beschreibungen von Algorithmen verwendet . Ein Programmgerüst kann auch als Vorlage verwendet werden, die die Syntax und Strukturen widerspiegelt, die üblicherweise in einer breiten Klasse von Problemen verwendet werden.

Skelettprogramme werden in dem Entwurfsmuster der Vorlagenmethode verwendet, das bei der objektorientierten Programmierung verwendet wird . Bei der objektorientierten Programmierung entspricht Dummy-Code einer abstrakten Methode , einem Methodenstub oder einem Scheinobjekt . In der Java RMI-Nomenklatur ( Java Remote Method Invocation ) kommuniziert ein Stub auf der Clientseite mit einem Skelett auf der Serverseite.

Ein Klassenskelett ist eine Gliederung einer Klasse , die in der Softwareentwicklung verwendet wird . Es enthält eine Beschreibung der Rollen der Klasse und beschreibt die Zwecke der Variablen und Methoden , implementiert sie jedoch nicht. Die Klasse wird später aus dem Skelett implementiert . Das Skelett kann auch als Schnittstelle oder abstrakte Klasse mit Sprachen bezeichnet werden, die einem polymorphen Paradigma folgen.

Hintergrund

Code, der normalerweise in Python gefunden wird und einer skelettbasierten Struktur folgt

Software, die heutzutage in Computern verwendet wird, ist aus einer Vielzahl von Gründen oft kompliziert. Dies kann bedeuten, dass nicht nur ein einzelner Programmierer es entwickeln kann oder dass andere Module oder Teile separat importiert werden müssen. Die Programme können auch für sich genommen zu komplex sein, einige mit mehreren Methoden, die gleichzeitig auf eine einzelne Variable zugreifen oder sogar Pixel für Anzeigen erzeugen . Skeleton-Code wird verwendet, um Programmierern dabei zu helfen, ihren Code mit den geringsten Fehlern während der Kompilierung zu entwickeln .

Skelettcode wird am häufigsten in der parallelen Programmierung verwendet , wird aber auch in anderen Situationen angewendet, z. B. in der Dokumentation in Programmiersprachen . Dies hilft, die Kernfunktionalität einer möglicherweise verwirrenden Methode zu vereinfachen. Es kann auch verwendet werden, um zu ermöglichen, dass eine kleine Funktion innerhalb eines größeren Programms vorübergehend ohne volle Funktionalität ausgeführt wird. Diese Programmiermethode ist einfacher als das Schreiben einer vollständigen Funktion, da diese Grundfunktionen keine Hauptfunktionen enthalten müssen und stattdessen während der Entwicklung fest codiert werden können. Sie beinhalten normalerweise syntaktisch korrekten Code, um die Methode einzuführen, sowie Kommentare, um die Funktionsweise des Programms anzuzeigen. Dies ist nicht immer erforderlich, um einen Text-Skelett-Code aufzurufen.


Beziehung zu Pseudocode

Ein generisches Beispiel für Pseudocode

Pseudocode wird am häufigsten bei der Entwicklung der Struktur einer neuen Software verwendet . Es ist eine einfache englische Darstellung einer bestimmten Funktion innerhalb eines größeren Systems oder kann sogar eine Darstellung eines ganzen Programms sein. Pseudocode ähnelt der Skelettprogrammierung, weicht jedoch darin ab, dass Pseudocode in erster Linie eine informelle Programmiermethode ist. Dummy-Code ist auch diesem sehr ähnlich, bei dem Code einfach als Platzhalter verwendet wird oder um die beabsichtigte Existenz einer Methode in einer Klasse oder Schnittstelle anzuzeigen.

Computerprogrammierer sind extrem abhängig von Pseudocode, so dass dies messbare Auswirkungen auf ihre Psyche hat . Ein typischer Programmierer ist so konditioniert von der Idee, vereinfachten Code auf irgendeine Weise zu schreiben, sei es durch Schreiben von Pseudocode oder Skelettcode oder sogar nur durch Zeichnen eines Diagramms, dass dies einen messbaren Einfluss darauf hat, wie gut er seine endgültige Implementierung schreiben kann. Dies wurde über eine Reihe von Anwendungen, mit verschiedenen Programmierern gefunden in verschiedenen Sprachen und variierten Arbeitsprogrammierparadigmen .

Diese Methode der Programmgestaltung wird meistens auch auf Stift und Papier durchgeführt, wodurch der Text weiter von dem entfernt wird, was tatsächlich implementiert werden soll. Die Skeleton-Programmierung ahmt dies nach, unterscheidet sich jedoch in der Art und Weise, wie sie üblicherweise in einer integrierten Entwicklungsumgebung oder in Texteditoren geschrieben wird . Dies unterstützt die Weiterentwicklung des Programms nach der ersten Entwurfsphase . Skeleton-Programme ermöglichen auch die Ausführung vereinfachter Funktionen, wenn sie ausgeführt werden.

Implementierung

Die Skelettprogrammierung kann in einer Reihe verschiedener Programmieranwendungen implementiert werden.

Dokumentation der Programmiersprache

Alle, wenn nicht die meisten Programmiersprachen, verfügen über Skelettcode, der bei der Definition aller integrierten Funktionen und Methoden verwendet wird . Dies bietet neueren Programmierern ein einfaches Mittel, um die Syntax und die beabsichtigte Implementierung der geschriebenen Methoden zu verstehen.

Java , eine objektorientierte Sprache , konzentriert sich stark auf eine strukturierte Dokumentationsseite mit vollständig getrennten Methoden für jeden Objektteil der Java-Pakete. Objektorientierte Sprachen konzentrieren sich bei ihren Implementierungen auf eine hierarchiebasierte Struktur und nicht auf einen einfachen Top-Down-Ansatz, der in anderen Sprachen zu finden ist. In 'Objekten' werden Daten und Variablen gespeichert, sodass ein in der Regel effizienteres Programm geschrieben werden kann. Diese Objekte verfügen über individuelle Funktionen, die auf interne Variablen zugreifen können, die als Methoden bezeichnet werden.

Jede Methode ist im selben Format definiert, wobei der Name der Methode sowie die Syntax, die in einer integrierten Entwicklungsumgebung verwendet werden soll, am oberen Rand eines Blocks deutlich sichtbar sind. Da sich Java auf Umfang , Datentypen und Vererbung konzentriert , ist diese Syntax für neue, wenn nicht alle Programmierer äußerst nützlich. Darauf folgt eine ausführliche Erläuterung der Funktionsweise der Methode mit den folgenden Fehlern.

Python verfolgt einen ähnlichen Ansatz, um die integrierten Methoden zu dokumentieren, ahmt jedoch die mangelnde Fixierung der Sprache auf Umfang und Datentypen nach. Diese Dokumentation enthält die Syntax jeder Methode sowie eine kurze Beschreibung und ein Beispiel für die typische Verwendung der Methode oder Funktion. Der im Beispiel bereitgestellte Skelettcode gibt Programmierern auf einen Blick ein gutes Verständnis der Funktion.

Klassendefinition

Klassen, die von Drittentwicklern hauptsächlich als Teil von Bibliotheken geschrieben wurden, zeigen ihre Programmierung auch in Form von Skelettcode. Dies hilft, alle in der Bibliothek neuen Personen über die Funktionsweise der Funktionen und Methoden zu informieren. P5.Js verwendet dieses Format auf ihrer Dokumentationsseite, um die beabsichtigte Verwendung bestimmter enthaltener Funktionen zu erläutern. Dies unterscheidet sich jedoch von der Dokumentation der Programmiersprache, bei der Skelettcode zum Anzeigen von Parametern verwendet wird und nicht alle möglichen Verwendungen der Methode.

Natural Language Interfaces (NLIs) werden typischerweise in Situationen gefunden , wo Programmierer versuchen , einen zu nehmen Eingang , in der Regel umgangssprachlich genannt (ohne die Verwendung von sprachspezifischen Programmierung Jargon ) und verwenden diese ein Programm oder ein Verfahren zu schaffen. Bei einer Implementierung wird ein kleiner Satz von Skelettcode verwendet, um die im Hintergrund ausgeführte Funktion zu implizieren.

Andere Formen von NLIs verwenden andere Formen der Eingabe, angefangen von anderen Benutzern, die verschiedene Sprachen sprechen, bis hin zu gestenbasierten Eingaben, um ein sehr ähnliches Ergebnis zu erzielen. Da Programmiersprachen hauptsächlich in Englisch entwickelt und geschrieben werden, fällt es Menschen, die andere Sprachen sprechen, schwer, neue Software zu entwickeln. In einigen Studien wurden NLIs verwendet, um Menschen in diesen Situationen zu unterstützen. Die Studie zeigte Klassen, die in Java unter Verwendung von NLIs geschrieben wurden. Dies beseitigte die Notwendigkeit, syntaktische Regeln zu lernen, bedeutete jedoch, dass die Klasse unter Verwendung eines grundlegenden Satzes von Skelettcode geschrieben wurde.

Polymorphismus-basierte Definitionen

Polymorphismus ist eine Ideologie , die mit dem folgenden objektorientierten Programmierparadigma , wo Methoden können überschreiben oder werden überlasten (Methoden mit dem gleichen Namen in einer Kindklasse , die Priorität gegenüber einem Verfahren , das in einer übergeordneten Klasse geschrieben dauern wird). Die Definition von Methoden basiert auf einem Skelett-Framework, das durch die Syntax der Sprache definiert wird .

Ähnlich wie bei der Klassenimplementierung kann Skeleton-Code verwendet werden, um die Methoden zu definieren, die Teil einer Schnittstelle sind . Eine Schnittstelle ist im Wesentlichen eine Blaupause einer Klasse, die es strengen objektorientierten Sprachen (wie Java ) ermöglicht, Klassen aus verschiedenen Paketen zu verwenden, ohne die internen Funktionen vollständig verstehen zu müssen. Schnittstellen definieren einfach die Methoden, die in der Klasse vorhanden sein müssen, sodass jeder andere die Methoden verwenden oder die Klasse für seine persönlichen Bedürfnisse implementieren kann.

public skeletonExample();

Eine abstrakte Klasse ist fast identisch mit einer Klassenimplementierung. Abhängig von der Sprache wird jedoch mindestens eine Methode als abstrakt definiert. Dies bedeutet, dass für alle untergeordneten Elemente dieser Klasse (alle Klassen, die erweitert oder implementiert werden) eine Methode definiert werden muss. Abstrakte Klassen haben einen sehr ähnlichen Definitionsstil wie Schnittstellen. Ein Schlüsselwort 'abstrakt' wird jedoch normalerweise verwendet, um die Tatsache zu identifizieren, dass es in untergeordneten Klassen implementiert werden muss.

public abstract skeletonExample();

Diese Beispiele verwenden die Java-Syntax.

Parallele Programmierung

Parallele Programmierung ist der Betrieb mehrerer Funktionen gleichzeitig, die am häufigsten zur Steigerung der Effizienz verwendet werden. Dies sind aufgrund ihrer Komplexität und Vernetzung mit der betreffenden Hardware in der Regel die am schwierigsten zu entwickelnden Programmtypen . Viele Entwickler haben versucht, Programme mit dieser Kernfunktionalität zu schreiben, dies wurde jedoch durch unterschiedliche Ergebnisse erreicht.

Algorithmische Skelett- Frameworks werden in der parallelen Programmierung verwendet, um die fraglichen Methoden für die spätere Entwicklung abstrakt zu beschreiben. Die Frameworks sind nicht auf einen einzelnen Typ beschränkt, und jeder dieser Typen dient unterschiedlichen Zwecken, um die Effizienz des Entwicklerprogramms zu steigern. Diese können in drei Haupttypen eingeteilt werden: datenparallel , aufgabenparallel und Auflösung.

Datenparallel

Diese Skelettalgorithmen werden verwendet, um Programme zu entwickeln, die mit großer datenbasierter Software arbeiten und normalerweise die Verbindungen zwischen Daten für die spätere Verwendung identifizieren. Datenparallele Algorithmen umfassen "Karten", "Gabeln" und "Reduzieren" oder "Scannen".

  • 'Maps' sind die am häufigsten verwendeten datenparallelen Algorithmen und umfassen normalerweise eine einzelne Operation, die für einen großen Datensatz ausgeführt wird. Um die Effizienz zu erhöhen, wird diese Operation bei mehreren Datensätzen gleichzeitig angewendet, bevor die Daten am Ende wieder zusammen strukturiert werden.
  • 'Gabeln' ähneln 'Karten', verwenden jedoch für bestimmte Datentypen eine andere Operation. Dies ist als Mehrfachdatenparallelität bekannt .
  • Mit 'Reduzieren' oder 'Scans' werden Präfixe auf einen Datensatz angewendet, bevor dann eine Operation auf die Daten angewendet wird. Diese unterscheiden sich von 'Maps', da sie zur Laufzeit der Methode selbst eine Reihe von Teilergebnissen aufweisen.

Aufgabenparallel

Diese Operationen arbeiten, wie der Name schon sagt, an Aufgaben. Jeder Algorithmus unter diesem ist aufgrund einer Änderung des Verhaltens zwischen Aufgaben unterschiedlich. Zu den parallelen Aufgabenalgorithmen gehören "Sequentials", "Farms", "Pipes", "If", "For" und "While".

  • 'Sequential' schließt und beendet einen verschachtelten Satz von Skelettalgorithmen. Die Methoden und Programme, die Teil der Skelette sind, werden vor dem Schließen als abschließende Aspekte des Programms aufgenommen.
  • 'Farmen' sind als eine Gruppe von Aufgaben, ein Arbeiter oder als ein Meister oder Sklave einer anderen Funktion bekannt. Die angegebenen Aufgaben werden ausgeführt, indem die Aufgaben über mehrere Threads repliziert und gleichzeitig ausgeführt werden. Dadurch wird die Last für einen bestimmten Thread aufgeteilt, wodurch effektiv eine Master / Slave-Beziehung zwischen den Threads erstellt wird.
  • 'Pipes' sind die traditionelleren Formen von Algorithmen, bei denen jede Methode oder Funktion in einer Sequenz ausgeführt wird. Dies folgt der Reihenfolge, in der der Programmierer seinen Code geschrieben hat. Dies wird parallel gemacht, indem verschiedene Aufgaben an einem Datensatz, der typischerweise eingegeben wird, gleichzeitig berechnet werden, um die Leistung und Geschwindigkeit zu verbessern. Jede gleichzeitige Berechnung wird als Stufe bezeichnet. Der Pipe-Algorithmus kann verschachtelt werden, wobei sich einer in einem anderen befindet, wobei jede Verantwortung aufgeteilt wird, um die Geschwindigkeit und auch die Anzahl der Stufen zu erhöhen.
  • 'If' gibt dem Programm eine bedingte Aufteilung von Aufgaben, wobei ein Satz von Skelettcode in zwei Hauptabschnitte aufgeteilt wird. Dem Programm wird eine bedingte Anweisung gegeben, die ihm einen bestimmten Algorithmus gibt, dem es folgen soll.
  • 'For' führt eine Aufgabe mehrmals aus, die beide vom Programmierer festgelegt wurden, um einen effizienteren Satz von Code zu ermöglichen. Die Häufigkeit, mit der der Code ausgeführt wird, ist ein voreingestellter Wert. Dies zeigt an , dass dies zur Laufzeit nicht geändert werden kann. Es muss die Aufgabe so oft wie angegeben erledigen.
  • 'While' ist ein Algorithmus, der der Funktionsweise eines 'for'-Algorithmus sehr ähnlich ist, bei dem eine Aufgabe mehrmals ausgeführt wird. In 'while'-Algorithmen berechnet das Programm die Aufgabe jedoch mehrmals, bevor eine bedingte Anweisung erfüllt ist. Dies bedeutet, dass der 'while'-Algorithmus seine Aufgabe bei jeder Ausführung unterschiedlich oft ausführen kann.

Auflösungsskelette

Diese Skelette unterscheiden sich sehr von den oben gefundenen typischen Skeletten. 'Resolution'-Algorithmen verwenden eine Kombination von Methoden, um ein bestimmtes Problem zu lösen. Das gegebene Problem des Algorithmus kann eine "Familie von Problemen" sein. Es gibt zwei Haupttypen dieser Skelette: "Teilen und Erobern" oder "Marke und Bindung".

  • 'Teilen und Erobern' verwendet ein Kartenskelett als Basis und kombiniert dieses mit einem Weile-Skelett, um das Problem zu lösen. In Kartenalgorithmen werden Funktionen auf Daten gleichzeitig angewendet. Bei 'Teilen und Erobern' wird auf den bereitgestellten Datensatz eine Funktion angewendet, die das Kartenskelett verwendet. Diese Funktion kann jedoch rekursiv mithilfe des 'while'-Algorithmus angewendet werden. Das 'while' wird nur unterbrochen, wenn das gesamte Problem gelöst ist.
  • 'Branch and Bound' ist ein Algorithmus, der auch Kartenalgorithmen verwendet. Anstatt jedoch den 'while'-Algorithmus anzuwenden, um die Aufgaben gleichzeitig auszuführen, teilt dieser Algorithmus die Aufgaben in Zweige auf. Jeder Zweig hat einen bestimmten Zweck oder "gebunden", wobei die bedingte Anweisung dazu führt, dass er gestoppt wird.

Verweise