¿Cuándo se considera que una API es un DSL incorporado?


10

¿Cuál es la diferencia entre una API y un lenguaje específico de dominio (DSL) incorporado?

¿Es solo sintaxis?

Considere una API como OpenGL. ¿Cómo es eso diferente de un DSL de gráficos?

En otras palabras, si una API es suficientemente compleja, ¿se puede considerar un DSL incorporado?


1
El objetivo de un DSL es simplificar las cosas. ¿No debería preguntarse si una API suficientemente simple podría considerarse un DSL?
Doval

Supongo que lo que quiero saber / entender es cómo se diferencian las API y las DSL. Puse complejo allí porque me imagino que cuando uno está constantemente haciendo llamadas a una API, entonces es más bien específico del dominio, o al menos así es como lo pensé originalmente.
Phyllostachys

1
La pregunta es ¿cuál es la diferencia entre una API y un DSL incorporado ?
proskor

Respuestas:


8

La distinción es difícil de hacer y depende del lenguaje utilizado. También es subjetivo.

En clojure, puede definir API que se parecen a un DSL. Por ejemplo, el hipo le permite generar html:

(html [:span {:class "foo"} "bar"])

Esto puede considerarse como un DSL con una sintaxis de lisp. El hecho de que htmlpodría ser una macro le da la misma cantidad de poder que si estuviera escribiendo una biblioteca html con plantillas de expresiones s (vea sxml )

En python, la misma API puede verse así:

html(["span", {"class" : "foo"}, "bar"])

HTML es una función. Su argumento se evaluará primero y luego se realizará la llamada a la función. El hecho de que la sintaxis de Python sea más específica y la semántica de Python sea más estricta significa que esta expresión es más difícil de interpretar como un DSL independiente del lenguaje.

Una representación de lenguaje clásico es un árbol como la estructura de datos y una función eval llamada recursivamente en sus nodos. Los lenguajes LISP hacen que esta estructura de árbol sea muy evidente, por lo que cualquier llamada de función anidada no se puede distinguir de una función de lenguaje incorporada. Es por eso que la comunidad LISP habla sobre DSL para casi todo.

Creo que la programación se trata de proporcionar abstracciones útiles. Me parece que mirar todo lo que construyes (una biblioteca o incluso la interfaz de usuario de tu aplicación) como elementos del lenguaje que ayudan a las personas a resolver un problema complejo es una forma efectiva de diseñar la mayoría de las cosas. Con esta perspectiva, afirmo que todas las bibliotecas son DSL, pero algunas de ellas están mal diseñadas :-)


4

Las API y DSL son conceptos bastante diferentes y solo hay algunas áreas donde se podría decir que se superponen.

Todos los DSL son lenguajes de computadora . Pueden ser interpretados, compilados, marcados, lenguajes de consulta (por ejemplo, SQL) o (como JSON o algunos usos de XML) lenguajes de datos que pueden usarse en mensajes pasados ​​por una API, pero deben ser idiomas . El término describe la naturaleza , no el propósito.

Las API son interfaces que permiten que un componente de software sea utilizado por otros componentes. El término describe el propósito , no la naturaleza. Una API puede ser un conjunto de métodos de objeto, por ejemplo, que no es un DSL. Una API web podría usar un DSL (o, si es tranquilo, podría argumentar que es un DSL) pero un lenguaje compartido y específico de dominio no es parte de la definición. Un controlador de software para un dispositivo podría estar escrito en C, la API distribuida como una biblioteca compilada, el protocolo completamente binario y cualquier lenguaje que pueda usar la biblioteca podría usarse para hacer un cliente. Nada en esa API podría llamarse DSL (una lista de nombres simbólicos para las funciones de la API no lo corta).

Estoy un poco confundido sobre por qué solo puedes ver similitudes, dadas las definiciones.


Como señaló un comentarista, solo debo haber considerado DSL incrustados. Considere algo como Forth donde uno construye un diccionario de palabras. Lo he leído al construir un DSL a medida que uno se acerca a tener una aplicación completa de características, pero se parece mucho a una API.
Phyllostachys

2
Lo que realmente no afecta mi respuesta. Si es un lenguaje, con su propia sintaxis, etc., es un DSL. Una interfaz compleja que carece de esas características de lenguaje no es una DSL. Probablemente debería actualizar su pregunta y consideraré actualizar mi respuesta.
itsbruce

2
Un sublenguaje sigue siendo un idioma. No es necesario tener su sintaxis "propia", puede "tomarla prestada" del idioma del host.
proskor

Entonces, ¿no son todos los proyectos su propio DSL cuando están a punto de finalizar (es decir, los lenguajes de programación generales son eventualmente DSL)? Un continuo de clases de general a dominio específico.
Phyllostachys

4

En general, no. Un DSL se hace deliberadamente no general con el fin de hacer que algunas operaciones sean más convenientes. Cosas como HTML o Logo eran originalmente lenguajes específicos de dominio.

En general, no puede incrustar un DSL en otro idioma incluso con la API más potente; lo que programe en esa API seguirá siendo una serie de expresiones en el idioma del host y no será tan conveniente como lo sería usar un lenguaje de propósito especial.

Las excepciones son los lenguajes que brindan oportunidades excepcionales para deformar la sintaxis a través de una biblioteca (sobrecarga de operadores como C ++, inventar nuevos operadores como Scala o incluso predeclar una sintaxis de lectura completamente diferente como Perl con filtros de origen). Cuando utiliza dicho lenguaje y aprovecha al máximo la flexibilidad que ofrecen, el resultado puede parecerse a un lenguaje nuevo y de propósito especial (pero la semántica a menudo será sutilmente diferente de lo que cabría esperar si el lenguaje fuera realmente inventado desde cero para servir a sus fines).


Entonces, tal vez uno podría hacer algo que analice una cadena (DSL) que actúe como un contenedor simple para una API grande. Supongo que la separación del DSL de lo que analiza el DSL es la diferenciación.
Phyllostachys

3
Sí, eso se llama el patrón de diseño "Intérprete", y se considera una buena práctica: escribir el código del intérprete una vez y, a partir de ese momento, puede expresar el contenido específico de su dominio mucho más fácilmente.
Kilian Foth

"inventar nuevos operadores como Groovy" Quizás te referías a Scala; en Groovy, el conjunto de operadores es fijo pero puede sobrecargarse como en C ++.
Vorg van Geir

@VorgvanGeir Lo siento, arreglado.
Kilian Foth

2

Aquí, de DslBoundary por Martin Fowler

Según el artículo, entiendo que básicamente las DSL y las API integradas no son tan diferentes. Pero sin embargo, hay una pequeña diferencia aquí.

  1. API enfatiza en proporcionar una nueva instalación.
  2. DSL no solo le proporciona una nueva instalación, sino que también le proporciona una nueva sintaxis y la nueva forma de codificación.

Pero si hablamos de DSL externo , será otra historia. El DSL externo es como un pequeño lenguaje de programación, pero seguro, no es un lenguaje de propósito general, lo que significa que no puede resolver todos los problemas, sino un problema específico.


1

Creo que cada API es un DSL incorporado, pero lo contrario no es cierto: no todos los DSL integrados son una API. Solo cuando el lenguaje se usa como un medio para integrar componentes, se puede llamar API.

¿Por qué una API puede considerarse un DSL incrustado? En primer lugar, forma un lenguaje: tiene elementos primitivos (tipos y operaciones) que se pueden combinar (por medio del lenguaje anfitrión) para formar abstracciones y resolver problemas complejos. Por ejemplo, la API de OpenGL se puede usar para representar escenas 3D en tiempo real. La API de colecciones se puede usar para crear algoritmos que operan en conjuntos de objetos, etc. Segundo, obviamente es específico del dominio; por ejemplo, el dominio de la API de colecciones maneja conjuntos de objetos, y el dominio de la API de OpenGL es la representación 3D. Por lo tanto, una API es un lenguaje específico de dominio.

Pero no todos los DSL son una API. Por ejemplo, algunos DSL no deben ser implementados por un componente designado. Todos los sistemas definen algunas abstracciones, y las abstracciones que se ocupan de un dominio específico pueden considerarse un DSL, pero eso no implica que las implementaciones de estas abstracciones sean "intercambiables", en otras palabras, no tienen que formar una API . Podrían, pero eso no siempre es necesario. Sin embargo, en los casos en que la implementación está "componente" (perdón por la falta de un término mejor), el DSL se convierte en una API.


¿Es esta simplemente su opinión o puede respaldarla de alguna manera?
mosquito

@gnat Extendí mi respuesta para explicar más mi punto.
proskor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.