Lenguajes generales vs Lenguajes específicos
A menudo utilizamos lenguajes de alto nivel (C#, VB.Net, Java…) para realizar consultas sobre colecciones o fuentes de datos, por ejemplo, ficheros XML. ¿Estamos haciendo “lo correcto”? Resulta muy cómodo trabajar sobre una API o conjunto de clases de manejo de este tipo de datos (XMLReader o XMLWriter por ejemplo). Cada proyecto es un mundo, y la decisión de adoptar un lenguaje u otro depende de muchos factores, no sólo de éste, por tanto, no voy a contar aquí ninguna verdad categórica ni nada por el estilo (lo siento, jeje). 
No obstante, hay una serie de criterios en lo referido a estas funciones en concreto que sí nos sirven, llegado el momento, para evaluar qué planteamiento nos conviene más.
Por ejemplo: ¿Por qué utilizar un lenguaje específico para un cierto dominio de datos (como las consultas sobre ficheros XML, por seguir con el ejemplo) en lugar de un lenguaje de propósito general? Hay dos razones fundamentales: Facilidad de uso y rendimiento.
Hablando sobre la facilidad de uso, los lenguajes de propósito general ofrecen una serie de ventajas… Tienen mayor capacidad expresiva, nos permiten expresar ideas complejas con pocas líneas de código. Esto deriva, por supuesto, en una mayor productividad del programador.
Por el contrario, los lenguajes de dominio específico te permiten trabajar directamente con dicho dominio (XML por ejemplo). En el caso de lenguajes de propósito general, el uso de ficheros XML suele realizar a través de API’s o de objetos proporcionados por el lenguaje para leer/escribir este tipo de ficheros; mientras que un lenguaje específico para realizar consultas sobre XML (como XQuery) te permiten realizar operaciones de consulta sobre estos datos de una forma mucho más potente, de modo que una simple query de una línea en este tipo de lenguajes equivale funcionalmente a decenas de líneas en un lenguaje más general.
Si hablamos sobre el rendimiento de unos y otros, hay tres grandes razones por las que podríamos afirmar que los lenguajes específicos de consulta superan a los de propósito general. La primera de ellas es que los lenguajes específicos suelen estar optimizados para realizar ese tipo específico de operaciones. Los lenguajes de propósito general deben tener un rendimiento aceptable para una gran variedad de operaciones, mientras que un lenguaje de consulta sobre XML se centra en optimizar este tipo de operaciones. Este planteamiento puede acotar su funcionalidad, pero incrementar su rendimiento.
La segunda razón es que los lenguajes de propósito general suelen realizar este tipo de operaciones a través de API´s. Esta abstracción suele implicar que estamos trabajando sobre una serie de estructuras que, realmente, desconocemos. Al fin y al cabo, la abstracción es ignorancia selectiva. Esta ignorancia supone, no obstante, un gran beneficio a la hora de simplificar el diseño. Pero, quizá, nos interesaría conocer esa implementación, para poder optimizar nuestro diseño. Por el contrario, un lenguaje de consulta “es” la abstracción, cuando ejecutamos nuestra consulta, tenemos acceso total a todas las estructuras internas de datos.
La tercera razón y, para mí, la más revolucionaria es que los lenguajes de consulta poseen menos restricciones. Un lenguaje secuencial debe hacer “lo que tú le dices que haga” en el orden que tú impones. Sin embargo, en un lenguaje de consulta, simplemente especificas "qué quieres obtener", y la forma de obtener este resultado es transparente al programador. Puede ser el resultado de una búsqueda secuencial, puede ser el resultado del acceso a una caché de datos si ya habíamos accedido previamente a dichos datos… La cuestión es que estamos dejando en manos del lenguaje la decisión de cómo realizar dicha consulta para que sea óptima. Esto libera de muchos quebraderos de cabeza al programador.
La diferencia entre ambos tipos de lenguajes se puede resumir asociándolos a los términos “declarativo” y “descriptivo”:
1. Un lenguaje de consulta es un lenguaje declarativo: Indicas qué quieres obtener como resultado, pero no especificas el modo de obtenerlo.
2. En un lenguaje secuencial, indicas qué y cómo quieres obtenerlo, es un lenguaje descriptivo.
Este matiz es un tanto sutil a la hora de expresarlo con palabras, pero implica diferencias sustanciales a la hora de programar. 