¿Cuál es la diferencia entre un lenguaje de script y un lenguaje de programación normal?

20

¿Cuál es la diferencia entre el lenguaje de programación y un lenguaje de script? Por ejemplo, considere C versus Perl.

¿Es la única diferencia que los lenguajes de secuencias de comandos requieren solo el intérprete y no requieren compilación y vinculación?

SS Hegde
fuente
44
Me temo que esto no es un tema aquí; lo que quieres saber es puramente una cuestión de implementación del lenguaje. También parece atraer respuestas superficiales / de opinión (no es su culpa per se), que siempre es una bandera roja.
Raphael
El hardware es un "intérprete" para los lenguajes compilados. La única diferencia, entonces, es cuántos intérpretes estás pasando. Si la máquina es equivalente a Turing y está utilizando un idioma que es equivalente a Turing, podría escribir un intérprete compilado Aen el idioma, luego escribir un intérprete Ben el idioma que el intérprete Apueda ejecutar, luego un intérprete Cen el idioma que ese intérprete Bpueda ejecutar , etc. Esencialmente, todo es una cuestión de indirección, que tiene menos que ver con la base teórica de la computación y más que ver con preocupaciones prácticas de ingeniería.
Patrick87
Salarios (antes de DevOps)
Phil Lello

Respuestas:

21

Creo que la diferencia tiene mucho más que ver con el uso previsto del lenguaje.

Por ejemplo, Python se interpreta y no requiere compilación y vinculación, como Prolog. Clasificaría ambos como languges de programación.

Los idiomas de programación están destinados a escribir software. Están diseñados para gestionar grandes proyectos. Probablemente puedan llamar a programas, leer archivos, etc., pero podrían no ser tan buenos como un lenguaje de script.

Los lenguajes de secuencias de comandos no están diseñados para el desarrollo de software a gran escala. Su sintaxis, características, biblioteca, etc. se centran más en lograr rápidamente pequeñas tareas. Esto significa que a veces son más "hackish" que los idiomas de programación, y es posible que no tengan las mismas características agradables. Están diseñados para realizar tareas comunes, como iterar a través de un montón de archivos o realizar tareas de administrador de sistemas, para que sean automatizadas.

Por ejemplo, Bash no hace bien la aritmética, lo que probablemente haría que escribir software a gran escala sea una pesadilla.

Como una especie de punto de referencia: nunca escribiría un reproductor de música en perl, aunque probablemente podría hacerlo. Del mismo modo, nunca trataría de usar C ++ para cambiar el nombre de todos los archivos en una carpeta determinada.

Esta línea se está volviendo más y más borrosa. JavaScript, por definición, un lenguaje de "secuencias de comandos", se utiliza cada vez más para desarrollar "aplicaciones web" que están más en el ámbito del software. Del mismo modo, Python inicialmente se ajusta a muchos de los rasgos de un lenguaje de scripting, pero está viendo más y más software desarrollado utilizando Python como plataforma principal.

jmite
fuente
1
+1 para el ejemplo de la vida real: ¡no puedo imaginar que me obliguen a usar C ++ para realizar tareas de cambio de nombre de lote!
Casey Kuball
3
No establece diferencias conceptuales, solo opiniones populares sobre los casos de uso respectivos.
Raphael
3
¿También "no escribiría" la red social más grande del mundo en lenguaje de script (FB en PHP), uno de los primeros servicios de blogs que promovió la tendencia completa (LJ en Perl), un sistema de control de versiones que permite que miles de desarrolladores trabajen juntos (Mercurial) en Python)? Lo sentimos, pero este "scripting es para tareas pequeñas" es simplemente una basura popular.
Oleg V. Volkov
1
@Raphael Creo que las diferencias conceptuales son borrosas en el mejor de los casos. La principal diferencia está en el uso popular, IMO. La mayoría de estos lenguajes serán completos y seguirán un modelo similar de cómputo. Nunca me he encontrado con una distinción o definición formal, pero siéntase libre de editar mi respuesta si tiene una.
jmite
3
@Raphael Eso es parte del punto: no hay diferencias conceptuales. Lo que puede hacer en tiempo de compilación vs tiempo de ejecución es principalmente una cuestión de interpretación o compilación, y esa es una propiedad de la implementación, no del lenguaje (aunque el diseño del lenguaje puede dificultar un modelo de implementación particular).
Gilles 'SO- deja de ser malvado'
6

El artículo clásico sobre lenguajes de scripting es John K. Ousterhout's Scripting: Programación de nivel superior para el siglo XXI , publicado en Computer 31 (3), 1998. Hizo una distinción entre los lenguajes de scripting, por un lado, y los lenguajes de programación de sistemas en el otro.

Ousterhout caracterizó que los lenguajes de programación del sistema evolucionaron para reemplazar los lenguajes de máquina para la programación. Ocultan detalles tediosos como la asignación de registros y las secuencias de llamadas de subrutina, proporcionan construcciones simples para escribir bucles y otros modismos comunes de control de flujo, y aplican una disciplina de tipeo. Por lo general, los implementa un compilador (anticipado). Estos lenguajes están destinados a escribir software desde cero. Ejemplos son C, C ++ y Java.

En contraste, los lenguajes de secuencias de comandos, según Ousterhout, parten de la premisa de que ya existen programas útiles, generalmente escritos en lenguajes de programación del sistema. Los lenguajes de script, como Perl, Python, Tcl, Visual Basic y los shells de Unix, proporcionan herramientas para combinar estos programas existentes en nuevos programas. Ousterhout caracterizó los lenguajes de scripting como "sin tipo" (incluido lo que muchos llaman tipeo dinámico) y como enfatizando el desarrollo rápido; generalmente son implementados por intérpretes.

Ahora, uno debe tener cuidado de no asumir que el modelo conceptual de un solo autor es autoritario. Aunque a los informáticos nos gusta fingir que somos matemáticos que damos definiciones precisas a todos los términos, en la práctica la mayoría de la terminología informática se construye socialmente con significados difusos y heterogéneos; Existe un consenso general en un nivel muy alto sobre la mayoría de los términos, pero los detalles a menudo dependen de quién está escribiendo. Por lo tanto, tome su artículo, mi respuesta y todas las demás respuestas aquí con un gran montón de sal.

Yo personalmente discutiría la existencia de un lenguaje de programación "normal", como lo expresas en tu pregunta. Sin embargo, creo que el concepto que intenta transmitir corresponde aproximadamente a los lenguajes de programación del sistema de Ousterhout.

ibídem
fuente
2

Todos los lenguajes de script también son lenguajes de programación. Lo contrario no es cierto. Los idiomas que "requieren solo el intérprete" son idiomas interpretados (a diferencia de un lenguaje compilado ; tenga en cuenta que algunos idiomas, como Java, se dividen en ambas categorías).

Un lenguaje que se clasifica como lenguaje de secuencias de comandos implica que es útil como lenguaje de "pegamento". Los scripts no tienden a ser programas con todas las funciones, sino que llenan los espacios entre otras piezas de software.

Los scripts generalmente se usan para conectar varios programas, para realizar tareas domésticas de manera rápida / fácil, o incluso en un entorno integrado donde el rendimiento y las preocupaciones de seguridad se han resumido en un lenguaje de nivel inferior. El énfasis en los lenguajes de scripting tiende a reducir el tiempo de desarrollo, de ahí que la mayoría se interprete a un nivel muy alto.

Casey Kuball
fuente
No establece diferencias conceptuales, solo opiniones populares sobre los casos de uso respectivos.
Raphael
1

El conjunto de 'lenguajes de script' es un subconjunto del conjunto de 'lenguajes de programación'. La diferencia entre C y Perl es la diferencia entre el lenguaje de programación del sistema y el lenguaje de aplicación y entre el lenguaje interpretado y el lenguaje compilado.

Los lenguajes de programación del sistema son de bajo nivel y están orientados a la administración de memoria, IO predecible, etc. Los lenguajes de aplicación están orientados a la resolución rápida de problemas de alto nivel, como "configuración de lectura desde archivo, socket abierto y solicitudes de proceso según la configuración".

Por lo tanto, los lenguajes de aplicación tienden a ser de un nivel mucho más alto que los lenguajes de sistema, es decir, proporcionan una gran cantidad de abstracción incorporada y facilidades auxiliares, y a menudo agregan algún tipo de administración automática de memoria.

Los programas en lenguajes compilados se procesan en algún código completamente antes de la ejecución del programa. Los lenguajes de secuencias de comandos se traducen dinámicamente en el proceso de ejecución y, a menudo, incluyen facilidades para la generación dinámica de código e incluyen archivos con código fuente.

Por lo tanto, todos los lenguajes de secuencias de comandos son lenguajes de aplicación, pero lo contrario no es cierto. Los lenguajes del sistema son siempre lenguajes compilados, ya que los lenguajes de secuencias de comandos generalmente incluyen características que no son pragmáticas de implementar en términos del lenguaje en sí. Sin embargo, tenga en cuenta que la diferencia de scripting (interpretada) / compilada tiene más que ver con la implementación: para algunos idiomas pueden existir ambos tipos de implementaciones, como para Haskell.

permeakra
fuente
Creo que es una falacia dibujar esta dicotomía interpretada / compilada. Tampoco creo que sea una relación de subconjunto, aunque ciertamente los conjuntos tienen alguna intersección no vacía. Del mismo modo, los niveles alto y bajo no saben describir con precisión la distinción. Prolog es de muy alto nivel, pero no es un lenguaje de script como lo es bash o java script.
jmite
1

Otros han cubierto atributos que tienden a estar asociados con lenguajes de secuencias de comandos y con lenguajes que no son secuencias de comandos. Eso es útil para tener una idea de lo que las personas quieren decir cuando usan el término "lenguaje de secuencias de comandos", pero creo que es más importante entender que simplemente no hay un límite bien definido: dos personas conocedoras podrían estar en desacuerdo sobre si un lenguaje en particular X es un Lenguaje de escritura. Sin embargo, el término "lenguaje de secuencias de comandos" tiene utilidad porque hay un amplio acuerdo sobre los idiomas que están muy adentro o muy lejos del límite.

Compare "auto familiar" versus "auto deportivo" o "revista" versus "periódico". Me atrevo a decir que sería difícil encontrar una regla 100% confiable para diferenciar cada auto familiar de cada auto deportivo que sea generalizable (lo que significa que básicamente no equivale a enumerar todos los autos existentes en cada categoría) y al menos potencialmente objetivo ( lo que significa que sería aceptable para todos). Pero estos términos siguen siendo útiles en la práctica, porque aunque hay algunos casos que son difíciles de decidir, muchos automóviles están claramente en una categoría y no en la otra.

j_random_hacker
fuente
0

Una diferencia que aún no he mencionado es que, cuando se usa según lo previsto, el tiempo de ejecución de la mayoría de los scripts estará dominado por operaciones "macroscópicas", y el rendimiento de las operaciones microscópicas no tendrá un efecto significativo en el tiempo de ejecución general. Por ejemplo, si un programa de animación de trazado de rayos puede incluir un lenguaje de secuencias de comandos con una declaración de "imagen de renderizado", un guión para producir 240 cuadros de animación podría pasar cuatro horas en la declaración de "imagen de renderizado", y un total de cuatro segundos haciendo todo lo demas. Incluso si uno acelerara todo fuera del motor de renderizado en un factor de un millón, eso tendría menos efecto en el rendimiento general que acelerar el motor de renderizado en un 0.1%.

Super gato
fuente