Welche Programmiersprache ist objektorientierter: Ruby oder Java?

Java Objektorientierte Programmierung

Eine kurze Geschichte

Wie im vorherigen Abschnitt erläutert, ermöglicht eine objektorientierte Programmiersprache objektorientierte Programmiertechniken wie Kapselung, Vererbung, Modularität und Polymorphismus. Simula (1967) ist allgemein als die erste Sprache anerkannt, die die Hauptmerkmale einer objektorientierten Sprache aufweist. Es wurde für die Erstellung von Simulationsprogrammen erstellt. Die Idee der objektorientierten Programmierung gewann in den 1970er Jahren mit der Einführung von Smalltalk (1972 bis 1980), das die Konzepte von Klasse und Botschaft von Simula umfasste, an Bedeutung. Smalltalk ist die Sprache, mit der ein Großteil der Theorie der objektorientierten Programmierung entwickelt wurde. In den frühen 1980er Jahren integrierte Bjorn Stroustrup die objektorientierte Programmierung in die C-Sprache. Die resultierende Sprache hieß C ++ und war die erste objektorientierte Sprache, die kommerziell weit verbreitet war. In den 1990er Jahren entwickelte eine von James Gosling geleitete Gruppe bei sun eine ähnliche Version von C ++ namens Java, mit der Geräte, Peripheriegeräte und Appliances eine gemeinsame Programmierschnittstelle besitzen sollten [7]. Im Jahr 2000 kündigte Microsoft 3 sowohl die .NET-Plattform als auch eine neue Programmiersprache namens C # an. C # ähnelt in vielerlei Hinsicht C ++ und Java. Ruby und Python sind Skriptsprachen, die das objektorientierte Paradigma unterstützen, und wir hielten es für interessant, einige Skript-OOPLs in diese Umfrage aufzunehmen. Die Eigenschaften von Smalltalk, Java, C ++, C #, Eiffel, Ruby und Python werden in diesem Abschnitt beschrieben.

In reinen OOPLs wird alles durchgängig als Objekt behandelt, von Primitiven wie ganzen Zahlen bis hin zu ganzen Klassen, Prototypen, Modulen usw. Sie sollen das objektorientierte Paradigma erleichtern, ja sogar durchsetzen. Von den Sprachen, die wir in Betracht gezogen haben, sind Smalltalk, Eiffel und Ruby reine OOPLs. Sprachen wie C ++, Java, C # und Python wurden hauptsächlich für die objektorientierte Programmierung entwickelt, sie enthalten jedoch auch einige prozedurale Elemente. Aus diesem Grund fallen sie in die Kategorie der Hybrid-OOPLs.

Smalltalk

Smalltalk [19] war die erste objektorientierte Programmiersprache für allgemeine Zwecke. Es ist eine rein dynamisch typisierte objektorientierte Sprache. Smalltalk unterstützt ein einheitliches Objektmodell. Alles, womit sich ein Programmierer befasst, ist ein Objekt, einschließlich primitiver Typen (wie Zahlen) und benutzerdefinierter Typen. Clients können auf die Funktionalität einer Klasse nur zugreifen, indem sie genau definierte Methoden aufrufen. Daher werden alle Vorgänge durch Senden von Nachrichten an Objekte ausgeführt. Smalltalk unterstützt die Möglichkeit, Objekte zu instantiieren (im Gegensatz zur Verwendung prototypischer Objekte). Smalltalk unterstützt die vollständige Vererbung, wobei der Unterklasse alle Aspekte der übergeordneten Klasse zur Verfügung stehen. Smalltalk unterstützt keine Mehrfachvererbung. Eine Mehrfachvererbung kann eine erhebliche Wartungslast verursachen, da Änderungen in einer übergeordneten Klasse mehrere Pfade in der Vererbungshierarchie betreffen. Erste Implementierungen von Smalltalk unterstützen die Referenzzählung für die automatische Speicherverwaltung. Die Idee ist, den Programmieraufwand zu reduzieren. Darüber hinaus wird die Kapselung in Smalltalk nicht erzwungen, da sie den direkten Zugriff auf die Instanz-Slots und die vollständige Sichtbarkeit der Slots ermöglicht.

C ++

C ++ [17] wurde bei Bell Labs von Bjarne Stroustrup (1979) entwickelt. Es wurde hauptsächlich für die Systemprogrammierung entwickelt und erweitert die Programmiersprache C. C ++ ist eine objektorientierte Version von C. Die C-Programmiersprache wurde um Unterstützung für statisch typisierte objektorientierte Programmierung, Ausnahmebehandlung, virtuelle Funktionen und generische Programmierung erweitert. C ++ ist keine reine objektorientierte Sprache, da sowohl prozedurale als auch objektorientierte Entwicklung. Es bietet Mehrfachvererbung und Ausnahmebehandlung, jedoch keine Speicherbereinigung. C ++ verwendet die Bindung zur Kompilierungszeit, was 4 bedeutet, dass der Programmierer die spezifische Klasse eines Objekts oder zumindest die allgemeinste Klasse angeben muss, zu der ein Objekt gehören kann. Dies sorgt für eine hohe Laufzeiteffizienz und eine geringe Codegröße, beeinträchtigt jedoch einen Teil der Leistung von Wiederverwendungsklassen [13]. Im Gegensatz zu Java verfügt es über eine optionale Grenzwertprüfung und bietet Zugriff auf Systemfunktionen auf niedriger Ebene. C ++ – Zeiger können verwendet werden, um bestimmte Speicherorte zu manipulieren, eine Aufgabe, die zum Schreiben von Betriebssystemkomponenten auf niedriger Ebene erforderlich ist.

Java

Java [16] ist eine objektorientierte Sprache, die von Sun Microsystems eingeführt wurde. Es hat eine ähnliche Syntax wie C ++, wodurch es einfacher zu erlernen ist. Java ist jedoch nicht mit C ++ kompatibel und erlaubt keine einfachen Programmierkonstrukte (z. B. Zeiger), um die Typensicherheit zu gewährleisten. Java unterstützt keine Zeigerarithmetik im C / C ++ – Stil, die es dem Garbage Collector ermöglicht, referenzierte Objekte zu verschieben, und die Typensicherheit gewährleistet. Java hat wie Smalltalk eine Garbage Collection und läuft auf einer geschützten Java Virtual Machine. Java ist eine portable Sprache, die über den Webbrowser des Computers auf jedem internetfähigen Computer ausgeführt werden kann. Ein Hauptvorteil der Verwendung von Java-Bytecode ist die Portabilität, da der Bytecode unabhängig vom Betriebssystem auf einem bestimmten Computer ausgeführt werden kann. Das Ausführen von interpretierten Programmen ist jedoch fast immer langsamer als das Ausführen von Programmen, die mit nativen ausführbaren Dateien kompiliert wurden [16]. Darüber hinaus verfügt Java über eine Klassenhierarchie mit dem Klassenobjekt im Stammverzeichnis und bietet eine einmalige Vererbung von Klassen. Neben Klassen bietet Java Schnittstellen mit Mehrfachvererbung. Java wird als unreine objektorientierte Sprache angesehen, da seine eingebauten Typen keine Objekte (z. B. ganze Zahlen) sind und grundlegende arithmetische Operationen (wie das Hinzufügen von ‘+’) als eingebaute Operatoren anstelle von Nachrichten an Objekte implementiert wurden .

C #

C # [6] ist ein Teil der OOP-Sprache des .NET Frameworks. C # ist kein reines OOPL, da es neben dem objektorientierten Paradigma auch funktionale, imperative und komponentenorientierte Programmierung umfasst. Es hat eine objektorientierte Syntax, die auf C ++ basiert und stark von Java beeinflusst wird. In einigen Communities wird es als Microsoft-Version von Java angesehen. Wie Java verfügt es über eine Garbage Collection und ist in eine Zwischensprache kompiliert, die von der Laufzeitumgebung Common Language Runtime (CLR) ausgeführt wird, die der JVM ähnelt. Das C # -Konzept von Klassen und Instanzen sowie Vererbung und Polymorphismus sind relativ standardisiert. Methoden sind wegen der Einführung von sogenannten Eigenschaften und Delegaten etwas interessanter

Eiffel

Eiffel [26] ist eine proprietäre Sprache, die 1985 als reine objektorientierte Sprache entwickelt wurde. Das Design basiert auf Klassen. Alle Nachrichten sind an eine Klasse gerichtet. Eine Klasse kann einige ihrer Attribute für die Sichtbarkeit des Clients exportieren und andere ausblenden. Eiffel ermöglicht die Verwendung von Zusicherungen, die formale Eigenschaften von Membermethoden in Bezug auf Voraussetzungen, Post-Bedingungen und Klasseninvarianten ausdrücken. Mehrfachvererbung ist in Eiffel erlaubt. Das Namenskonfliktproblem wird behoben, indem die geerbten Namen umbenannt werden können. Doppelte Namen sind illegal. Es stehen mehrere weitere Klauseln zur Featureanpassung zur Verfügung, um die Mehrfachvererbung sicher zu machen. Um falsche Definitionen der vererbten Funktionen zu vermeiden, werden auch alle in übergeordneten Klassen definierten Zusicherungen vererbt. Auf diese Weise können Klassendesigner enge Einschränkungen definieren, die sicherstellen, dass ihre Unterklassen nicht wesentlich von der erwarteten Semantik abweichen. Die Möglichkeit, einem Oberklassenzeiger ein Unterklassenobjekt zuzuweisen, wird mit einer statischen Prüfung versehen, um sicherzustellen, dass dies der Fall ist. Die Kapselung wird in Eiffel gut unterstützt. Der Klassen-Designer steuert die Sichtbarkeit von Klassen-Features. Eine Methode kann explizit allen oder einigen oder keiner der Unterklassen zur Verfügung gestellt werden. Die Daten können schreibgeschützt exportiert werden. Es gibt keinen syntaktischen Unterschied zwischen einem Attributzugriff und dem Zugriff auf eine Methode ohne Parameter. Es gibt jedoch keine Kontrolle über die geerbten Attribute. Eine Unterklasse erbt alle Attribute und kann die Sichtbarkeit der Attribute ändern.

Rubin

Ruby ist eine objektorientierte Skriptsprache, die 1993 von Matsumiko Yukihiro entwickelt wurde. Es hat einen ähnlichen Zweck wie Python oder Perl. Ruby ist eine objektorientierte Programmiersprache, die auf Perl basiert und Funktionen aus verschiedenen OO-Sprachen wie Eiffel und Smalltalk übernimmt. Ruby hat eine rein objektorientierte Unterstützung, da es keine Funktionen zulässt. Alle Methoden müssen zu einer Klasse gehören. Ruby unterstützt nur die Einzelvererbung, obwohl die Funktionalität der Mehrfachvererbung indirekt über die Module unterstützt wird. Ein Modul bietet eine teilweise Klassendefinition.

Python

Python ist eine objektorientierte Skriptsprache, die 1990 von Guido Van Rossum entwickelt wurde. Es ist in den letzten Jahren aufgrund seiner Anwendung in der Internetdomäne sehr populär geworden. Python ermöglicht sowohl prozedurale als auch objektorientierte Entwicklung. Entwickler können Klassen schreiben und Methoden definieren sowie Funktionen schreiben (Routinen, die nicht in einer Klasse enthalten sind). Es gibt eine andere Syntax zum Aufrufen von Methoden als zum Aufrufen von Funktionen, wodurch die heterogene Natur der Python-Programmierung hervorgehoben wird. Da ein Programmierer seine eigenen Klassen definieren kann, wird die Abstraktion von Python unterstützt. Die Kapselung wird jedoch nicht vollständig unterstützt, da die Zugriffssteuerung in Python primitiv ist. Es gibt keine öffentlichen, privaten Methoden und der einzige Schutz ist das namentliche Mangeln. Wenn ein Programmierer weiß, wie die Namensverwaltung durchgeführt wird (was ein sehr einfacher und bekannter Mechanismus ist), kann er jede Klassenmethode aufrufen. Python ermöglicht Mehrfachvererbung. Das Problem von Namenskonflikten bei der Mehrfachvererbung wird behoben, indem der Programmierer die Reihenfolge der Superklassen in der Reihenfolge definiert, in der sie deklariert wurden.

Wie Richard betonte, ist Ruby eher objektorientiert als Java. Ein Unterschied, den Sie normalerweise bemerken, ist, dass Ruby keine primitiven Datentypen (int, float, double usw.) wie Java hat. Alles in Ruby ist ein Objekt. Primitive werden als Objekte dargestellt in Ruby.

Aus diesem Grund ist “1.even?” In Ruby und nicht in Java möglich, da 1 ein Objekt ist, für das Sie Methoden aufrufen können.

Sie sind beide objektorientiert, aber Ruby orientiert sich eher an Smalltalk, dem besten Beispiel für klassenbasiertes OOP, das jemals erstellt wurde. Smalltalk hat das Design vieler moderner OOP-Sprachen wie Dart, Groovy, Objective-C, PHP 5, Perl 6, Ruby und Scala direkt beeinflusst. Java leitet sich vom Simula-Modell von OOP ab.

In Ruby ist alles ein Objekt. Java hat Nicht-Objekt-Primitive.