¿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?
Respuestas:
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:
Esto puede considerarse como un DSL con una sintaxis de lisp. El hecho de que
html
podrí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 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 :-)
fuente
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.
fuente
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).
fuente
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í.
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.
fuente
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.
fuente