Lenguaje de programación vs Lenguaje de marcado vs Lenguaje de secuencias de comandos

38

Hasta ahora no sé las diferencias CLAVE entre estos tres. Cuando alguien me pregunta sobre esto, solo les digo que C # es un lenguaje de programación, HTML y XML son lenguajes de marcado, y JavaScript y VBScript son lenguajes de secuencias de comandos. ¿Pero cuáles son las diferencias clave que los distinguen entre sí?

rcadaoas
fuente
¡No olvides consultar idiomas!
Kyle Delaney

Respuestas:

38

Permítanme intentar encontrar una línea divisoria entre estos tres tipos de lenguaje. Por supuesto, habrá numerosas excepciones y contraejemplos, ya que esta es solo mi opinión.

  • Se utiliza un lenguaje de marcado para controlar la presentación de datos, como "representar estos nombres de usuario como una lista de viñetas o como una tabla".

  • Se utiliza un lenguaje de secuencias de comandos para mediar entre programas y generar datos. Esto es especialmente cierto para los lenguajes de scripting de shell como bash, pero si reflexiona al respecto, también Python o Perl surgieron de la necesidad de realizar tareas en UNIX sin escribir un programa en C. El programa que controla la mayor parte del tiempo en esos idiomas es el intérprete del lenguaje en sí , que realiza tareas generales para usted. Otros programas típicos con los que interactúa son servidores de bases de datos o servidores web.

    Volviendo a la metáfora de la lista de usuarios, en un lenguaje de script le pide a la base de datos "darme todos los nombres de usuario", luego le pregunta al servidor web "envíe esta lista de usuarios a este solicitante".

  • Un lenguaje de programación se utiliza para transformar datos . Lo hace creando instrucciones de CPU que reescriben los datos de entrada en la salida; con suerte, la salida deseada . Ejemplos de transformación de datos es calcular una suma de una cantidad de sumandos, o resolver un sistema de ecuaciones diferenciales a partir de un conjunto de condiciones, o escribir y leer desde una estructura similar a un árbol de manera consistente dada una secuencia de consultas posiblemente simultáneas .

    Volviendo a la metáfora de la lista de usuarios, en un lenguaje de programación, usted escribe cómo recorrer una tabla de registros, extraer de cada registro el campo "nombre" y devolverlos al solicitante.

Tenga en cuenta que los lenguajes de secuencias de comandos son un subconjunto de lenguajes de programación, es decir, un lenguaje puede ser tanto "secuencias de comandos" como "programación": Python se usa regularmente para "mediar entre programas" y también para "transformar datos". Hay otros lenguajes como Java que rara vez se usan para "mediar entre programas", no porque esto sea imposible sino porque no están diseñados para facilitarlo. La característica clave de un lenguaje de script es que puede orquestar otros programas, al igual que un script le da la señal a un actor para comenzar su parte.

logc
fuente
77
Los lenguajes de script son formalmente una subclase de lenguajes de programación. (También he visto que lenguajes como C y Java se interpretan completamente, con un REPL; la barrera tiene fugas en ambos sentidos ...)
Donal Fellows
1
@DonalFellows: tienes razón. Respondí con eso en mente, pero no he usado explícitamente la expresión "uno es un subconjunto del otro". Además, no he dado a entender que una categoría se interpreta y la otra no, porque sabía que es una distinción débil.
logc
1
@DonalFellows: he editado mi respuesta para mencionar explícitamente que uno es un subconjunto del otro.
logc
1
Apoyo esta respuesta por ser el único (hasta ahora) que afirma que los lenguajes de marcado son lenguajes que describen la estructura de los datos.
Idan Arye
3
@ JörgWMittag: Sabía que habría excepciones, es por eso que comencé con "habrá numerosas excepciones" :) De lo contrario, ¿en qué parte de mi respuesta implica que no se compila un lenguaje de secuencias de comandos ? Traté de concentrarme en el propósito de los idiomas precisamente para evitar esa trampa ...
logc
11

Un lenguaje de marcado es un lenguaje que se utiliza para representar datos estructurados. Por ejemplo, HTML permite especificar que una parte del documento es un título o alguna otra parte es una lista, en comparación con un documento de texto plano.

Los lenguajes de marcado no se consideran lenguajes de programación¹.

La diferencia con los lenguajes de programación no siempre es obvia. Por ejemplo, XSLT es un lenguaje completo de Turing², pero se basa en XML, que es un lenguaje de marcado.

Wikipedia misma hace esfuerzos importantes para evitar calificar XSLT como lenguaje de programación o lenguaje de marcado. Solo dice que es un lenguaje declarativo y que utiliza "técnicas de optimización que se encuentran en lenguajes de programación funcionales y lenguajes de consulta de bases de datos".

Un lenguaje de script es un lenguaje de programación que se interpreta, en lugar de compilarse, lo que significa que los lenguajes de script representan un subconjunto de todos los lenguajes de programación.

No siempre es obvio si un lenguaje de programación es un lenguaje de secuencias de comandos, como tampoco es obvio si un lenguaje se compila o interpreta. Por ejemplo, PHP puede compilarse a bytecode intermedio³ y luego convertirse en código de máquina por el compilador JIT, mientras se sigue considerando como lenguaje de script⁴.

Ver también: Splitting Meta-Hairs por Steven Lott.


¹ "XML no es un lenguaje de programación". Ver XML en 10 puntos .

² “XSLT es un lenguaje completo de Turing” Ver XSLT en Wikipedia

³ “HHVM compila Hack y PHP en un bytecode intermedio. Este código de bytes se traduce dinámicamente en código de máquina x64 en tiempo de ejecución mediante un compilador JIT (Just-In-Time) ”. Ver HHVM .

lenguajes de script en la lista de los lenguajes de programación por tipo en la Wikipedia.

Arseni Mourzenko
fuente
16
Los idiomas nunca se compilan ni se interpretan. Los idiomas simplemente son . La compilación y la interpretación son rasgos del compilador o intérprete (¡duh!) Utilizados para implementar el lenguaje. Los términos "lenguaje compilado" o "lenguaje interpretado" ni siquiera tienen sentido, pertenecen a diferentes niveles de abstracción. Si Englisch fuera un lenguaje escrito, "lenguaje compilado" sería un TypeError! Cada lenguaje puede ser implementado por un intérprete, cada lenguaje puede ser implementado por un compilador.
Jörg W Mittag
@ JörgWMittag "Todo lenguaje puede ser implementado por un intérprete, cada idioma puede ser implementado por un compilador" - ¿100% cierto?
spartacus
@ Espartaco, lo llamo un "no" vacilante. Creo que cualquier lenguaje que pueda compilarse también podría interpretarse (solo ejecute la instrucción en lugar de guardarlo), pero he oído que la homoiconicidad restringe severamente la posibilidad de compilación
Izkata
@Izkata No diría que la homoiconicidad en sí misma cambia la posibilidad de compilación, sino que la metaprogramación que permite significa que mucha compilación debe diferirse al tiempo de ejecución, si es que lo hace.
Mark Hurd
1
La parte del "lenguaje de secuencias de comandos" es puramente errónea como ya señaló "Jörg W Mittag". Y encima no hay explicación del "lenguaje de programación".
David Raab
2

Para producir cualquier tipo de taxonomía, primero debe hacerse algunas preguntas:

  • ¿Los objetos que voy a poner en cualquier relación se definen correctamente?
  • Si es así, ¿existen realmente?
  • ¿Me estoy limitando solo a un tipo específico de relaciones entre objetos, o hay un requisito establecido para que el sistema use solo relaciones legítimas?

Típicamente, cuando uno escucha una pregunta como la que usted hizo, la respuesta esperada hace varias suposiciones. Por ejemplo, es natural suponer que, dado que todos estos son idiomas, deben formar una jerarquía bajo un concepto más general del lenguaje, o que dividen el espacio de todos los idiomas, o que son subconjuntos entre sí.

Lenguajes de programación

Desafortunadamente, nada de lo anterior parece ser cierto. Quizás solo los lenguajes de programación tienen una definición con la que la mayoría está de acuerdo. Los lenguajes de programación son lenguajes que codifican programas. Codificar significa que una palabra en el lenguaje puede interpretarse como un programa (una secuencia de acciones). Los lenguajes de programación de computadoras son un subconjunto de estos. Ejemplos de lenguajes de programación que no son de computadora: una lista de compras, interpretada como instrucciones para un comprador en un supermercado, ADN interpretado mediante la transcripción de péptidos, un registro musical analógico que sirve como programa para una grabadora.

Por lo tanto, los lenguajes de programación de computadoras son los que programan las computadoras.

Lenguajes de script

No están bien definidos. Está abierto a la interpretación de lo que significa este término. Históricamente, parecería que los lenguajes de programación que no tenían un compilador para producir código de máquina se habían llamado de esta manera. Según los estándares actuales, esto colocaría a todos los lenguajes de programación populares sin ensambladores en esta categoría. Incluso los llamados lenguajes de bajo nivel como C requieren un tiempo de ejecución con procedimientos preexistentes, por lo tanto, los archivos binarios obtenidos al compilar un programa en C no son completamente códigos de máquina, sino que también llaman al tiempo de ejecución de vez en cuando.

Lenguajes de marcado

No están bien definidos. Cada vez que se usa el término, la intención parece ser describir un lenguaje de programación con un léxico muy limitado, utilizado principalmente para generar imágenes visuales o de audio. Puede ser difícil ver XML como algo programado, pero si observa el marcado Man o TexInfo, verá que los caracteres "especiales" son en realidad instrucciones del intérprete.

También es posible dar una interpretación de "programación" para lenguaje XML, algo que podría ser así:

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

En pocas palabras: esta división a partir de hoy no parece muy significativa, solo puede darle una cierta intuición sobre el tipo de lenguaje al que se enfrenta, pero no le proporcionará una definición rigurosa.

wvxvw
fuente
1

Los tres conceptos se superponen un poco, por lo que puede obtener argumentos interminables si XSLT es un lenguaje de programación o si Python es un lenguaje de secuencias de comandos o no.

Un lenguaje de marcado es un lenguaje que representa datos estructurados en un formato de texto , HTML es el más conocido, pero existen numerosos formatos para diversos fines, como SVG para gráficos, WSDL para describir interfaces de servicios web, resx para archivos de recursos. neto y así sucesivamente. Una regla general es que un lenguaje de marcado no describe un proceso o algoritmo (como lo hace un lenguaje de programación) sino que son datos puros. Pero también es una visión CS fundamental que no esNo hay diferencia fundamental entre el código y los datos. Algunos lenguajes de marcado como XSLT tienen bucles y condicionales como un lenguaje de programación "real", y algunos lenguajes de programación como Prolog son datos casi puros sin ningún proceso especificado en el código. Y Lisp difumina la línea tanto que trata su propio código como un formato de datos estructurado.

En cuanto a la distinción entre lenguaje de programación y lenguaje de script , esta es una distinción histórica que es casi obsoleta hoy en día. En los viejos tiempos habíamos compilado programas independientes escritos en say C, y luego teníamos lenguajes de scripting como say shell scripts o Word Basic, que fueron interpretados y diseñados para manipular otros programas y herramientas. Hoy en día, la línea está bastante borrosa con mucho terreno intermedio, ya que tenemos varios niveles de compilación e interpretación (compilación de código de bytes, compilación JIT, etc.) y varias API independientes del lenguaje. Entonces la distinción no es tan útil.

JacquesB
fuente
0

Se utiliza un lenguaje de marcado para describir datos en lugar de lógica. Un uso típico de ellos es describir el formato del documento, HTML está diseñado para esto, por ejemplo. Pero a veces también se usan como formatos de datos generales, XML es un lenguaje de marcado que a menudo se usa solo para describir datos.

La diferencia entre los lenguajes de programación y scripting es muy difusa, ambos tienden a ser completos, ya que puede resolver cualquier problema computable con ellos. Hay algunos 'consejos' generales que puede buscar para ver si un lenguaje es un lenguaje de programación o no.

  • Los lenguajes de secuencias de comandos a menudo se interpretan en lugar de compilarse, o al menos brindan la opción de ser interpretados.
  • Los lenguajes de secuencias de comandos a menudo se crean para que sean rápidos de trabajar y no rápidos de ejecutar.
  • Los lenguajes de script tienden a venir con bibliotecas estándar muy extensas. Muchos lenguajes de programación también lo hacen, pero es más opcional para ellos.

Pero al final, si un lenguaje es lenguaje de programación o lenguaje de programación, es más una cuestión de convención que un criterio estricto. Incluso las sugerencias anteriores son solo tendencias, encontrará lenguajes de programación que cumplen con todos los criterios para un lenguaje de secuencias de comandos y aún se consideran lenguajes de programación.

Pierre Andersson
fuente
44
Los idiomas nunca se compilan ni se interpretan. Los idiomas simplemente son . La compilación y la interpretación son rasgos del compilador o intérprete (¡duh!) Utilizados para implementar el lenguaje. Los términos "lenguaje compilado" o "lenguaje interpretado" ni siquiera tienen sentido, pertenecen a diferentes niveles de abstracción. Si Englisch fuera un lenguaje escrito, "lenguaje compilado" sería un TypeError! Cada lenguaje puede ser implementado por un intérprete, cada lenguaje puede ser implementado por un compilador. Incluso es posible generar automáticamente un compilador a partir de un intérprete y viceversa.
Jörg W Mittag
@ JörgWMittag es cierto que ningún lenguaje se compila o interpreta inherentemente. Pero a menudo hay convenciones sobre cómo se ejecuta típicamente, que es principalmente a lo que me refiero aquí.
Pierre Andersson