Ursprung der Strukturen und Klassen

8

Welche Design- und Implementierungsprobleme mussten Programmierer lösen, als sie sich entschieden, zuerst Strukturen und Klassen zu verwenden?

Wann ist das passiert und wer waren die Pioniere hinter diesen Ideen?

Beachten Sie, dass dies eine doppelte Frage ist, da Strukturen und Klassen zusammenhängen. Mir ist klar, dass Strukturen älter sind als Klassen. Es wäre großartig, wenn die Antwort getrennt über beide sprechen und einige Quellen zitieren würde.

xralf
quelle
Sie sind nicht so verwandt wie oft angenommen, und das Problem wird durch die Tatsache getrübt, dass C ++ Klassen implementiert, indem syntaktischer Zucker über Strukturen gelegt wird, die Funktionszeiger enthalten. Um das Wasser weiter zu trüben, erweiterte C ++ die Strukturen um tatsächliche Methodendefinitionen und machte das structSchlüsselwort dann optional, wenn die Struktur verwendet wird.
Gort the Robot
1
Der Geschichtswettbewerb dauert noch zwei Tage. :)
Chrisaycock
Vielen Dank an alle für die Antworten. Die Antworten, in denen IBM 1620, COBOL, Simula 67 und Giorgios pädagogische Erklärung des Prinzips erwähnt werden, bilden den Kern dessen, was ich als Antwort akzeptiere.
Xralf

Antworten:

5

Die Idee einer Struktur besteht darin, eine Sammlung von Variablen in einem einzigen Container zusammenzufassen. ZB wenn Sie drei Koordinaten haben

int x;
int y;
int z;

Vielleicht möchten Sie sie als Dateneinheit anzeigen und zusammenfassen:

struct point
{
    int x;
    int y;
    int z;
};

Sie können dies als eine Möglichkeit sehen, Ihre Daten zu modularisieren. Jetzt können Sie Variablen definieren, die alle drei Werte in einer Einheit enthalten:

struct point p1, p2;

In der prozeduralen Programmierung haben Sie Prozeduren oder Funktionen, die Daten und insbesondere Strukturen manipulieren, z

void shiftX(struct point *p, int offset);

Sie können die Funktion für eine Struktur aufrufen, indem Sie sie als Argument übergeben:

shiftX(&p1, -10);

Der Schritt von Strukturen zu Klassen besteht darin, zu sagen, dass Prozeduren / Funktionen zusammen mit Daten zu Einheiten gruppiert werden sollten: Wie Strukturen klassifizieren Entitäten mit derselben Struktur, klassifizieren Klassen Entitäten mit derselben Struktur und Operationen.

Jetzt können Sie schreiben:

class Point
{
  public:
    void shiftX(int offset);

    int x;
    int y;
    int z;
 };

und dann:

 Point p;

 ...

 p.shiftX(-10);

Auf diese Weise ist es einfacher, Vorgänge zu gruppieren, die mit derselben Art von Daten arbeiten. Sie können beispielsweise alle Operationen zusammenfassen, die auf Punkte in der Klassendefinition einwirken, anstatt sie als Funktionen mit einem oder mehreren Parametern vom Typ point über Ihren Code zu verteilen.

Darüber hinaus können Sie Struktur und Verhalten mithilfe der Vererbung verfeinern.

Zusammenfassen: Strukturen sind ein Konzept, mit dem Daten organisiert / modularisiert werden können. Klassen ermöglichen das Organisieren / Modularisieren von Daten und Operationen.

Giorgio
quelle
Ich mag den pädagogischen Ansatz Ihrer Antwort. Wenn ich es richtig verstehe, kann ich mehr über diese Idee erfahren, wenn ich etwas darüber lese, Simula 67wie WorldEngineer schreibt, und vielleicht wird irgendwo geschrieben, warum diese Idee unter anderen Programmiersprachen populär wurde.
Xralf
Die Idee wurde populär, weil sie eine hervorragende Möglichkeit ist, Code zu organisieren. Die Anwendungen sind zunehmend größer und komplexer geworden. Einige Betriebssysteme verfügen über mehr als 100 Millionen Codezeilen. Ein ziemlich schlechtes Maß für die tatsächliche Komplexität erfordert jedoch massive organisatorische Anstrengungen.
Welt Ingenieur
1
Die Alternative besteht darin, Module (Modula-2) oder Pakete (Ada, Java, Scala usw.) oder Einheiten (einige Pascal-Dialekte) zu verwenden. Auf diese Weise können Sie Typen und Operationen zusammenfassen. Klassen bieten jedoch eine engere Integration zwischen Daten und Operationen sowie zusätzliche Funktionen wie Vererbung.
Giorgio
@xralf: Wenn Sie vielleicht über Simula 67 lesen, können Sie mehr über die Motivationen für OOP erfahren. Übrigens hat Simula 67, soweit ich mich erinnern kann, bereits virtuelle Methoden. Virtuelle Methoden sind also eine wirklich alte Erfindung.
Giorgio
@WorldEngineer Ich dachte, dass Betriebssysteme in Assembly- und C-Sprache geschrieben sind und es Bibliotheken für die Code-Organisation gibt.
Xralf
5

Strukturen sind Datengruppen, die normalerweise typisiert werden. COBOL sah die erste weit verbreitete Verwendung von ihnen. Obwohl Analoga dazu vorher existierten. Das Designproblem besteht darin, mehrere Datensätze wie einen Namen, einen Beruf und eine Telefonnummer zu gruppieren. Die Idee einer "Aufzeichnung" ist viel älter als das Rechnen und taucht in der Mathematik und in vielen anderen Disziplinen auf.

Die objektorientierte Programmierung wurde ursprünglich für die Simulation entwickelt, bei der eine Reihe von Objekten ausgeführt werden, um ein System zu simulieren. Simula 67 war die erste, die diesen Programmierstil implementierte. Smalltalk war die erste vollständig objektorientierte Sprache, in der alles ein Objekt einschließlich Primitiven ist. Das ursprünglich gelöste Problem war die Simulation komplexer Systeme. Simula 67 wurde von Ole-Johan Dahl und Kristen Nygaard entworfen. Alan Kay (der einmal eine Frage zu Stack Overflow beantwortet hat ) hat Smalltalk entworfen, das immer noch verwendet wird.

Strukturen und Klassen sind ziemlich eng mit Typen verbunden, da beide bestimmte Parameter für einen Datensatz definieren. Klassen definieren die Zugriffsberechtigungen und -operationen weiter und ermöglichen so vollständig implementierte abstrakte Datentypen. Strukturen können als Teilmenge von Klassen in einer objektorientierten Sprache betrachtet werden. Sie wären eine Wrapper-Klasse, bei der alle Felder auf public gesetzt sind und keine Methoden außerhalb von Gettern und Setzern für diese Felder.

Weltingenieur
quelle
4

Informationen zu Strukturen finden Sie in diesem Wikipedia-Artikel . Kurz gesagt, sie scheinen so tief in der Informatik verankert zu sein, dass sie zuerst von Hardware unterstützt wurden (spezielle Anweisungen in IBM 1620, Lochkarten im Grunde als eine Datensatzinstanz und Babbages Analytical Engine (zumindest laut Wikipedia). COBOL war das erste weit verbreitete Sprache zur Unterstützung des Konstrukts.

Scarfridge
quelle
Ich mag diese Erklärung für Strukturen.
Xralf
3

"Strukturen" unterscheiden sich eigentlich völlig von "Klassen". Stellen Sie sich den alten Stil "struct" als Rekord vor. In QBASIC wurden sie sogar so genannt. Die Notwendigkeit ist ziemlich offensichtlich und obwohl ich nicht sagen kann, wer es erfunden hat ... würde ich mir vorstellen, dass es fast sofort auftauchte. OOP "Klassen" scheinen mit Simula ziemlich gut begonnen zu haben: http://en.wikipedia.org/wiki/Object-oriented_programming#History

Edward Strange
quelle
In Bezug auf die Absicht, ja, aber wenn Sie über C ++ sprechen, der einzige Unterschied zwischen a structund a classist , dass classstandardmäßig privatewährend structStandardwerte public.
Gort the Robot
Die Aufzeichnungen stammen mindestens aus dem 19. Jahrhundert, das etwas älter ist als C ++. Ich denke nicht, dass C ++ hier relevant ist.
Jörg W Mittag
@ JörgWMittag: Ich glaube dir, aber hast du irgendwelche Quellen oder Beispiele dafür?
FrustratedWithFormsDesigner