¿Por qué no hay un lenguaje orientado a servicios?

11

Editar:

Para evitar la confusión adicional: estoy no hablando de servicios web y tal. Estoy hablando de estructurar aplicaciones internamente, no se trata de cómo se comunican las computadoras. Se trata de lenguajes de programación, compiladores y cómo se extiende el paradigma de programación imperativo.

Original:

En el campo de la programación imperativa, vimos dos paradigmas en los últimos 20 años (o más): orientado a objetos (OO) y orientado a servicios (SO) aka. basado en componentes (CB).

Ambos paradigmas extienden el paradigma de programación imperativa al introducir su propia noción de módulos. OO los llama objetos (y clases) y les permite encapsular datos (campos) y procedimientos (métodos) juntos. SO, por el contrario, separa los datos (registros, beans, ...) del código (componentes, servicios).

Sin embargo, solo OO tiene lenguajes de programación que soportan de forma nativa su paradigma: Smalltalk, C ++, Java y todos los demás compatibles con JVM, C # y todos los demás .NET compatibles, Python, etc.

SO no tiene tal idioma nativo. Solo llega a existir sobre lenguajes de procedimiento o lenguajes OO: COM / DCOM (binario, C, C ++), CORBA, EJB, Spring, Guice (todo Java), ...

Estos marcos SO claramente sufren de la falta de soporte de sus conceptos en el idioma nativo.

  • Comienzan a usar clases OO para representar servicios y registros. Esto conduce a diseños en los que existe una clara distinción entre las clases que solo tienen métodos (servicios) y las que solo tienen campos (registros). La herencia entre servicios o registros se simula luego mediante la herencia de clases. Técnicamente, no se mantiene de manera tan estricta, pero en general se recomienda a los programadores que hagan clases para desempeñar solo uno de los dos roles.
  • Utilizan lenguajes externos adicionales para representar las partes que faltan: IDL, configuraciones XML, anotaciones en código Java o incluso DSL incrustado como en Guice. Esto es especialmente necesario, pero no limitado a, ya que la composición de los servicios no es parte del código de servicio en sí. En OO, los objetos crean otros objetos, por lo que no hay necesidad de tales instalaciones, pero sí lo hay porque los servicios no crean instancias ni configuran otros servicios.
  • Establecen un efecto de plataforma interna sobre OO (principios de EJB, CORBA) donde el programador tiene que escribir todo el código que se necesita para "conducir" SO. Las clases representan solo una parte de la naturaleza de un servicio y muchas clases tienen que escribirse para formar un servicio juntos. Toda esa placa de caldera es necesaria porque no hay un compilador SO que lo haga por el programador. Esto es como algunas personas lo hicieron en C para OO cuando no había C ++. Simplemente pasa el registro que contiene los datos del objeto como primer parámetro al procedimiento que es el método. En un lenguaje OO, este parámetro es implícito y el compilador produce todo el código que necesitamos para funciones virtuales, etc. Para SO, esto claramente falta.
  • Especialmente los marcos más nuevos utilizan ampliamente AOP o introspección para agregar las partes faltantes a un lenguaje OO. Esto no brinda la expresividad del lenguaje necesaria, pero evita el código de la plataforma de calderas descrito en el punto anterior.
  • Algunos marcos utilizan la generación de código para producir el código de la placa de la caldera. Los archivos de configuración en XML o las anotaciones en código OO son la fuente de información para esto.

No todos los fenómenos que mencioné anteriormente se pueden atribuir a SO, pero espero que muestre claramente que existe la necesidad de un lenguaje SO. Dado que este paradigma es tan popular: ¿por qué no hay uno? O tal vez hay algunos académicos, pero al menos la industria no usa uno.

Wolfgang
fuente
1
La arquitectura basada en componentes puede ser un requisito para SOA, pero SOA no es necesaria para la basada en componentes. Los sistemas OO que no difieren de los servicios de las estructuras de datos también pueden estar basados ​​en componentes.
Danny Varod
1
@Danny: No hago la diferencia entre CB y SOA. Si lees las definiciones de cada una de ellas, son básicamente idénticas. CB es como pre-2000 y SOA i post-2000 porque CB fue considerado "muerto" en algún momento y ya nadie quería usar la palabra. No limito SOA a servicios web o similares, sino que me refiero al paradigma de programación.
Wolfgang
Es posible que no difiera entre los dos, pero son diferentes. Lea más sobre CB y sus usos.
Danny Varod
Intenté durante mucho tiempo encontrar una diferencia entre CB y SO. No encontré ninguna característica de ninguno de los dos que el otro tampoco reclamaría.
Wolfgang
La arquitectura basada en componentes se puede ver como desconectar dependencias entre clases usando interfaces, permitiendo así la inyección de dependencias. La arquitectura basada en el servicio requiere eso, pero también proporciona otros requisitos, ya que admite el servicio y los clientes de forma remota.
Danny Varod

Respuestas:

8

Porque <5% del código en realidad está definiendo un servicio, y yo diría que una cantidad de tiempo sustancialmente menor. Una vez que se define la interfaz, se realiza en gran medida. El resto del tiempo se gasta en OO (o alternativas) haciendo que las cosas funcionen .

En pocas palabras, no es una gran victoria hacer un lenguaje especializado para esa pequeña porción del problema. En todo caso, tener dos idiomas (uno para el servicio y otro para la implementación / consumo) es solo pedir una mayor complejidad de integración.

[editar para la aclaración de los OP de que es el diseño interno de la aplicación, no el límite de la aplicación]

El objetivo principal de tener un diseño de servicio de este tipo es tener puntos de contacto delgados entre los servicios. Mi razón original aún se mantiene (imo) y agrego a esa respuesta el hecho de que relativamente pocos problemas se adaptan bien a una estructura de aplicación interna basada en el servicio. Entonces, no solo está abordando una pequeña porción del problema, sino un menor porcentaje de problemas en general.

Telastyn
fuente
Ese es un punto interesante. Pero también podría aplicarlo a OO: la mayoría de las veces es una programación imperativa y solo el 5% es OO. OO también es una forma de pegar fragmentos de código imperativo juntos, mientras que es el código imperativo que hace que las cosas funcionen. Aún así, nos beneficiamos en gran medida de tener idiomas especializados para ello. Mi punto fue que los programas SO están escritos en lenguajes OO porque parecen ser similares, pero eso lleva a los problemas que se dan en la pregunta.
Wolfgang
@Wolfgang, en mi experiencia, la cantidad de código imperativo no es tan buena.
Telastyn
@Wolfgang, si ese es el caso, no está utilizando la OOP adecuada, solo el código de procedimiento con un recubrimiento OO
TheCatWhisperer
5

Los lenguajes funcionales están muy orientados al servicio en su núcleo. En lugar de crear objetos y llamar funciones a ellos, crea funciones y les pasa mensajes. Erlang es un excelente ejemplo de esta técnica porque incluso más allá de los aspectos funcionales del lenguaje, tiene comunicación entre procesos e incluso entre máquinas integrada en su marco central que le permite enviar mensajes a un proceso remoto como si fuera un proceso local. .

Otros lenguajes como Scala, Clojure y F # también proporcionan una semántica "orientada al servicio". El problema no es que no existan, es que la población general les tiene miedo y, por lo tanto, no son tan populares.

Michael Brown
fuente
3
También Erlang tiene OTP, que realmente se basa en la idea de los servicios y los hace confiables. Construir un servidor que se recupere después de una falla es fácil en OTP. (Se necesitan como 10 minutos de trabajo)
Zachary K
3

La orientación del servicio fue / es una respuesta arquitectónica a los problemas de integración. Idealmente, la integración es una solución integral que se adapta a cualquier idioma, producto, dispositivo o recurso existente en una imagen más amplia.

No hay necesidad de un nuevo lenguaje, ya que el problema es tener demasiados idiomas , lo que causa un alto costo de interoperabilidad.

Sin embargo, se introdujo un tipo de lenguaje, el lenguaje de definición del servicio web. WSDL es metalenguaje de SOA (y hay otro abandonado para REST llamado WADL)

Matthew Flynn
fuente
2
No son los lenguajes los que crean los problemas de interoperabilidad. Es la estructura de las aplicaciones. Algunos idiomas son más adecuados para crear aplicaciones que interoperen, pero la interoperación es una función de la aplicación, no del idioma.
2

Daré la vuelta a la pregunta y preguntaré "¿cómo sería un lenguaje SO?"

¿Cómo se escribirían esos contratos entre módulos?
¿Cómo se ejecutaría la mecánica fundamental de la operación?

Los servicios orientados son una propiedad de la aplicación, no necesariamente el lenguaje utilizado. El servicio es una construcción que se basa en una función. La función es una construcción que se basa en la mecánica de un lenguaje de programación para traducir la operación en instrucciones ejecutables de la máquina.

BPEL es un posible ejemplo de un lenguaje SO, pero tiene un nivel muy alto y se basa en módulos disponibles para su uso. Esos módulos a su vez están escritos en idiomas que no son BPEL para que el trabajo pueda realizarse (también conocido como traducido al lenguaje de máquina).

Gran Q y me dio un buen momento de reflexión.


fuente
1
El mayor problema es deshacerse de las referencias a objetos. Creo que Guice se ve a veces como debería ser. Pero tienen que luchar demasiado con el hecho de que Java siempre necesita una referencia a una instancia del servicio. Para un servicio, en realidad solo necesita el tipo, no la instancia. Esos singletons son solo hacks.
Wolfgang
1

Ofreceré una respuesta a mi propia pregunta para ver cuántas personas están de acuerdo y en desacuerdo.

Algunas posibilidades:

  • Parece difícil construir un lenguaje SO. Principalmente debido a la separación de la implementación de los servicios y su composición. Hay un par de soluciones académicas de las que he oído hablar en la universidad (sin referencia, lo siento), pero no parece que lleguen a la industria. Pero cuento esto como una excusa, no una razón real. Los lenguajes y compiladores OO también son bastante difíciles de implementar, sin embargo, hay soluciones en el mercado desde hace mucho tiempo.

  • Los programadores usan lenguajes OO para SO porque no entienden OO y lo usan de manera incorrecta. Digo mal porque hay dos conceptos fundamentales en OO que contradicen SO:

    1. La funcionalidad va a la clase donde se encuentran los datos en los que trabajan. El código y los datos se juntan en el mismo módulo. No es estilo OO tener clases separadas que funcionen con los datos de otras clases. Ese es el enfoque de Herramientas y materiales (WAM) de Züllighofen que coincide con el paradigma SO.

    2. Los objetos crean otros objetos y forman redes de objetos. Pueden crear jerarquías o cualquier relación compleja. Los servicios siempre forman redes planas que se componen desde el exterior. Los servicios generalmente tienen solo una instancia (Singleton), mientras que los objetos se instancian con la frecuencia que existe la entidad que representan. Los registros en SO no están conectados en redes.

  • Algunas características de OO se parecen a SO, o se pueden usar para facilitar lo que se necesita para SO, por lo que resulta útil usar un lenguaje OO.

    1. El principio de inversión de dependencia en OO es similar a la forma en que los servicios se componen externamente.

    2. Los objetos Singleton son como servicios, las fábricas de objetos son como localizadores de servicios.

    3. OO también tiene interfaces que son similares a las interfaces de servicio.

    4. La herencia de clases puede ser similar (¿igual?) Que la herencia de servicios y registros.

  • OO y SO son útiles para diferentes tipos de problemas. Por lo tanto, en todas las aplicaciones es tentador usar cualquier paradigma aquí o allá. Tener un idioma separado dificultaría el cambio entre los dos dentro del mismo programa.

  • SO no es solo un paradigma de programación sino también un comportamiento de programa: los servicios web, los componentes del sistema operativo, etc. son SO pero no necesitan estar escritos en un lenguaje SO necesariamente. Este tipo de "componentes binarios" es muy natural y exitoso. Pero es una cosa diferente: es cómo los programas se comunican entre sí, no cómo se comunica internamente el programa. Supongo que la gente lo mezcla a menudo.

Wolfgang
fuente