Warum gibt es keine serviceorientierte Sprache?

11

Bearbeiten:

Um weitere Verwirrung zu vermeiden: Ich spreche nicht über Webdienste und dergleichen. Ich spreche über die interne Strukturierung von Anwendungen, es geht nicht darum, wie Computer kommunizieren. Es geht um Programmiersprachen, Compiler und wie das imperative Programmierparadigma erweitert wird.

Original:

Im Bereich der imperativen Programmierung haben wir in den letzten 20 Jahren (oder länger) zwei Paradigmen gesehen: objektorientiert (OO) und serviceorientiert (SO) aka. komponentenbasiert (CB).

Beide Paradigmen erweitern das imperative Programmierparadigma, indem sie ihren eigenen Begriff von Modulen einführen. OO nennt sie Objekte (und Klassen) und lässt sie sowohl Daten (Felder) als auch Prozeduren (Methoden) zusammenkapseln. Im Gegensatz dazu trennt SO Daten (Datensätze, Beans, ...) vom Code (Komponenten, Dienste).

Allerdings hat nur OO Programmiersprachen, die sein Paradigma nativ unterstützen: Smalltalk, C ++, Java und alle anderen JVM-kompatiblen, C # und alle anderen .NET-kompatiblen, Python usw.

SO hat keine solche Muttersprache. Es entsteht nur zusätzlich zu prozeduralen Sprachen oder OO-Sprachen: COM / DCOM (binär, C, C ++), CORBA, EJB, Spring, Guice (alle Java), ...

Diese SO-Frameworks leiden eindeutig unter der fehlenden Unterstützung ihrer Konzepte in der Muttersprache.

  • Sie verwenden OO-Klassen, um Dienste und Datensätze darzustellen. Dies führt zu Entwürfen, bei denen klar zwischen Klassen unterschieden wird, die nur Methoden (Dienste) haben, und solchen, die nur Felder haben (Datensätze). Die Vererbung zwischen Diensten oder Datensätzen wird dann durch Vererbung von Klassen simuliert. Technisch gesehen wird es nicht so streng gehalten, aber im Allgemeinen wird Programmierern empfohlen, Klassen so zu gestalten, dass sie nur eine der beiden Rollen spielen.
  • Sie verwenden zusätzliche externe Sprachen, um die fehlenden Teile darzustellen: IDLs, XML-Konfigurationen, Anmerkungen in Java-Code oder sogar eingebettetes DSL wie in Guice. Dies ist insbesondere erforderlich, aber nicht beschränkt auf, da die Zusammensetzung der Dienste nicht Teil des Dienstcodes selbst ist. In OO erstellen Objekte andere Objekte, sodass solche Einrichtungen nicht erforderlich sind, für SO jedoch, weil Dienste andere Dienste nicht instanziieren oder konfigurieren.
  • Sie erzeugen einen plattforminternen Effekt zusätzlich zu OO (frühes EJB, CORBA), bei dem der Programmierer den gesamten Code schreiben muss, der zum "Fahren" von SO erforderlich ist. Klassen stellen nur einen Teil der Natur eines Dienstes dar und viele Klassen müssen geschrieben werden, um zusammen einen Dienst zu bilden. All diese Kesselplatte ist notwendig, weil es keinen SO-Compiler gibt, der dies für den Programmierer tun würde. Dies ist genau so, wie es einige Leute in C für OO getan haben, als es kein C ++ gab. Sie übergeben einfach den Datensatz, der die Daten des Objekts als ersten Parameter enthält, an die Prozedur, die die Methode ist. In einer OO-Sprache ist dieser Parameter implizit und der Compiler erzeugt den gesamten Code, den wir für virtuelle Funktionen usw. benötigen. Für SO fehlt dies eindeutig.
  • Insbesondere die neueren Frameworks verwenden häufig AOP oder Introspection, um die fehlenden Teile zu einer OO-Sprache hinzuzufügen. Dies bringt nicht die erforderliche Ausdruckskraft der Sprache, vermeidet jedoch den im vorherigen Punkt beschriebenen Code der Kesselplattform.
  • Einige Frameworks verwenden die Codegenerierung, um den Kesselplattencode zu erzeugen. Konfigurationsdateien in XML oder Anmerkungen in OO-Code sind hierfür die Informationsquelle.

Nicht alle der oben genannten Phänomene können auf SO zurückgeführt werden, aber ich hoffe, es zeigt deutlich, dass eine SO-Sprache erforderlich ist. Da dieses Paradigma so beliebt ist: Warum gibt es keines? Oder vielleicht gibt es einige akademische, aber zumindest die Industrie verwendet keine.

Wolfgang
quelle
1
Komponentenbasierte Architektur kann eine Anforderung für SOA sein, SOA ist für komponentenbasierte Architektur jedoch nicht erforderlich. OO-Systeme, die Dienste nicht von Datenstrukturen unterscheiden, können auch komponentenbasiert sein.
Danny Varod
1
@Danny: Ich mache keinen Unterschied zwischen CB und SOA. Wenn Sie die Definitionen von jedem von ihnen lesen, sind sie im Grunde identisch. CB ist wie vor 2000 und SOA nach 2000, weil CB irgendwann als "tot" galt und niemand mehr das Wort verwenden wollte. Ich beschränke SOA nicht auf Webdienste oder ähnliches, sondern beziehe mich auf das Programmierparadigma.
Wolfgang
Sie können nicht zwischen den beiden verschieben, aber sie sind unterschiedlich. Lesen Sie mehr über CB und seine Verwendung.
Danny Varod
Ich habe lange versucht, einen Unterschied zwischen CB und SO zu finden. Ich habe keine Funktion von einer gefunden, die die andere nicht auch beanspruchen würde.
Wolfgang
Eine komponentenbasierte Architektur kann als Trennen von Abhängigkeiten zwischen Klassen mithilfe von Schnittstellen angesehen werden, wodurch die Abhängigkeitsinjektion ermöglicht wird. Die service-basierte Architektur erfordert dies, bietet jedoch auch andere Anforderungen, da sie die Remote-Bereitstellung von Services und Clients unterstützt.
Danny Varod

Antworten:

8

Weil <5% des Codes tatsächlich einen Dienst definieren und ich eine wesentlich kürzere Zeitspanne argumentieren würde. Sobald die Schnittstelle definiert ist, ist sie weitgehend fertig. Der Rest der Zeit wird in OO (oder Alternativen) verbracht, damit die Dinge funktionieren .

Einfach ausgedrückt ist es kein großer Gewinn, eine spezielle Sprache für diesen kleinen Teil des Problems zu erstellen. Wenn Sie zwei Sprachen haben (eine für den Service und eine für die Implementierung / den Verbrauch), müssen Sie lediglich die Komplexität der Integration erhöhen.

[Bearbeiten Sie für die OP-Klarstellung, dass es sich um das interne Anwendungslayout handelt, nicht um die Anwendungsgrenze]:

Das Hauptziel eines solchen Dienstlayouts besteht darin, dünne Berührungspunkte zwischen den Diensten zu haben. Mein ursprünglicher Grund gilt immer noch (imo) und fügt dieser Antwort die Tatsache hinzu, dass relativ wenige Probleme gut zu einer internen Anwendungsstruktur passen, die auf Diensten basiert. Sie sprechen also nicht nur einen kleinen Teil des Problems an, sondern insgesamt auch einen geringeren Prozentsatz der Probleme.

Telastyn
quelle
Das ist ein interessanter Punkt. Sie können es aber auch auf OO anwenden: Meistens ist es eine zwingende Programmierung, und nur 5% sind OO. OO ist auch eine Möglichkeit, imperative Code-Schnipsel zusammenzukleben, während es der imperative Code ist, der die Dinge zum Laufen bringt. Dennoch profitieren wir weitgehend von speziellen Sprachen. Mein Punkt war, dass SO-Programme in OO-Sprachen geschrieben sind, weil sie ähnlich zu sein scheinen, aber das führt zu den in der Frage angegebenen Problemen.
Wolfgang
@ Wolfgang meiner Erfahrung nach ist die Menge an imperativem Code nicht so groß.
Telastyn
@ Wolfgang Wenn das der Fall ist, verwenden Sie nicht die richtige OOP, sondern nur den Verfahrenscode mit einer OO-Beschichtung
TheCatWhisperer
5

Funktionssprachen sind im Kern sehr serviceorientiert. Anstatt Objekte zu erstellen und Funktionen aufzurufen, erstellen Sie Funktionen und übergeben Nachrichten an sie. Erlang ist ein Paradebeispiel für diese Technik, da über die funktionalen Aspekte der Sprache hinaus eine prozess- und sogar maschinenübergreifende Kommunikation in das Kernframework integriert ist, mit der Sie Nachrichten an einen Remote-Prozess senden können, als wäre es ein lokaler Prozess .

Andere Sprachen wie Scala, Clojure und F # bieten ebenfalls eine "serviceorientierte" Semantik. Das Problem ist nicht, dass sie nicht existieren, sondern dass die allgemeine Bevölkerung Angst vor ihnen hat und sie daher nicht so beliebt sind.

Michael Brown
quelle
3
Erlang hat auch OTP, das wirklich auf der Idee von Diensten basiert und diese zuverlässig macht. Das Erstellen eines Servers, der nach einem Fehler wiederhergestellt wird, ist in OTP einfach. (Es dauert ungefähr 10 Minuten Arbeit)
Zachary K
3

Serviceorientierung war / ist eine architektonische Antwort auf Integrationsprobleme. Die Integration ist idealerweise eine umfassende Lösung, die jede vorhandene Sprache, jedes Produkt, jedes Gerät und jede Ressource in ein größeres Bild einfügt.

Es ist keine neue Sprache erforderlich, da das eigentliche Problem darin besteht, bereits zu viele Sprachen zu haben , was zu hohen Interoperabilitätskosten führt.

Es wurde jedoch eine Art von Sprache eingeführt, die Webdienst-Definitionssprache. WSDL ist die Metasprache von SOA (und es gibt eine andere verlassene Sprache für REST mit dem Namen WADL).

Matthew Flynn
quelle
2
Es sind nicht die Sprachen, die die Interoperabilitätsprobleme verursachen. Es ist die Struktur der Anwendungen. Einige Sprachen eignen sich besser zum Erstellen von Apps, die zusammenarbeiten. Die Zusammenarbeit ist jedoch eine Funktion der App und nicht der Sprache.
2

Ich werde die Frage umdrehen und fragen: "Wie würde eine SO-Sprache aussehen?"

Wie würden diese Verträge zwischen Modulen geschrieben?
Wie würde die grundlegende Funktionsmechanik ausgeführt werden?

Serviceorientiert ist eine Eigenschaft der Anwendung, nicht unbedingt die verwendete Sprache. Der Dienst ist ein Konstrukt, das auf einer Funktion beruht. Die Funktion ist ein Konstrukt, das sich auf die Mechanik einer Programmiersprache stützt, um Operationen in maschinenausführbare Anweisungen zu übersetzen.

BPEL ist ein mögliches Beispiel für eine SO-Sprache, aber es ist ein sehr hohes Niveau und setzt voraus, dass Module verfügbar sind, damit es verwendet werden kann. Diese Module sind wiederum in Nicht-BPEL-Sprachen geschrieben, damit Arbeiten ausgeführt werden können (auch bekannt als in Maschinensprache übersetzt).

Tolles Q und gab mir einen guten Moment zum Nachdenken.


quelle
1
Das größte Problem ist das Entfernen von Objektreferenzen. Ich denke, Guice sieht manchmal so aus, wie es sein sollte. Aber sie müssen zu viel damit kämpfen, dass Java immer einen Verweis auf eine Nichteinhaltung des Dienstes benötigt. Für einen Dienst benötigen Sie tatsächlich nur den Typ, keine Instanz. Diese Singletons sind nur Hacks.
Wolfgang
1

Ich werde eine Antwort auf meine eigene Frage geben, um zu sehen, wie viele Menschen zustimmen und nicht zustimmen.

Einige Möglichkeiten:

  • Es scheint schwierig zu sein, eine SO-Sprache zu konstruieren. Vor allem wegen der Trennung der Implementierung von Diensten und ihrer Zusammensetzung. Es gibt ein paar akademische Lösungen, von denen ich an der Universität gehört habe (keine Referenz, sorry), aber es scheint nicht in die Branche zu kommen. Aber ich zähle dies als Entschuldigung, nicht als wirklichen Grund. OO-Sprachen und Compiler sind ebenfalls ziemlich schwierig zu implementieren, aber es gibt seit langem Lösungen auf dem Markt.

  • Programmierer verwenden OO-Sprachen für SO, weil sie OO nicht verstehen und es falsch verwenden. Ich sage falsch, weil es in OO zwei grundlegende Konzepte gibt, die SO widersprechen:

    1. Die Funktionalität geht an die Klasse, in der sich die Daten befinden, an denen sie arbeiten. Code und Daten werden im selben Modul miteinander gekoppelt. Es ist kein OO-Stil, separate Klassen zu haben, die mit den Daten anderer Klassen arbeiten. Das ist Züllighofens Tools-and-Materials-Ansatz (WAM), der dem SO-Paradigma entspricht.

    2. Objekte erstellen andere Objekte und bilden Netzwerke von Objekten. Sie können Hierarchien oder andere komplexe Beziehungen erstellen. Dienste bilden immer flache Netzwerke, die von außen zusammengesetzt sind. Dienste haben normalerweise nur eine Instanz (Singleton), während Objekte so oft instanziiert werden, wie die von ihnen dargestellte Entität existiert. Datensätze in SO sind nicht in Netzwerken verbunden.

  • Einige Funktionen von OO ähneln SO oder können verwendet werden, um die für SO erforderlichen Funktionen zu vereinfachen. Daher ist es praktisch, eine OO-Sprache zu verwenden.

    1. Das Prinzip der Abhängigkeitsinversion in OO ähnelt der Art und Weise, wie Dienste extern zusammengesetzt werden.

    2. Singleton-Objekte sind wie Services, Objektfabriken sind wie Service Locators.

    3. OO hat auch Schnittstellen, die den Dienstschnittstellen ähnlich sind.

    4. Die Vererbung von Klassen kann ähnlich (gleich?) Wie die Vererbung von Diensten und Datensätzen sein.

  • OO und SO sind nützlich für verschiedene Arten von Problemen. Daher ist es in jeder Anwendung verlockend, hier oder da entweder ein Paradigma zu verwenden. Eine separate Sprache würde den Wechsel zwischen beiden innerhalb desselben Programms behindern.

  • SO ist nicht nur ein Programmierparadigma, sondern auch ein Programmverhalten: Webdienste, Betriebssystemkomponenten usw. sind SO, müssen jedoch nicht unbedingt in einer SO-Sprache geschrieben werden. Diese Art von "binären Komponenten" ist sehr natürlich und erfolgreich. Aber es ist eine andere Sache: Es ist, wie Programme miteinander kommunizieren, nicht wie das Programm intern kommuniziert. Ich denke, die Leute verwechseln das oft genug.

Wolfgang
quelle