¿Cuándo se considera que un idioma es un lenguaje de programación? [cerrado]

107

¿Qué hace que un idioma sea un lenguaje de programación? He escuchado a algunas personas decir "cuando se interpreta en lugar de compilar". Eso haría de PHP (por ejemplo) un lenguaje de programación. ¿Es ese el único criterio? ¿O hay otros criterios?

Ver también:

Shog9
fuente
Es posible que desee ampliar un poco su pregunta. Siento que esto es casi una trampa de lo contrario. Es posible que otros no vean la distinción
Kent Fredric
¿Un engaño a qué otra pregunta?
Sietse
2
stackoverflow.com/questions/98268/… Hay mucha similitud. No necesariamente idéntico, pero sí mucho contexto / opinión compartida.
Kent Fredric
7
... Cuando un lenguaje rompe la API y cambia su sintaxis en cada versión menor, cuando es un contenedor de alrededor de 100 bibliotecas C defectuosas sucias y sin mantenimiento, entonces es un lenguaje de script. ;)
ivan_ivanovich_ivanoff
1
En la barra lateral "Relacionados" encontrará stackoverflow.com/questions/1514206/… al que vinculé una pila de duplicados existentes que se remontan a stackoverflow.com/questions/101055/… .
dmckee --- ex-moderador gatito

Respuestas:

52

Un lenguaje de secuencias de comandos es un lenguaje que "escribe" otras cosas para hacer cosas. El objetivo principal no es principalmente crear sus propias aplicaciones, sino conseguir que una aplicación existente actúe de la manera que desee, por ejemplo, JavaScript para navegadores, VBA para MS Office.

moffdub
fuente
Entonces, ¿qué pasa con lenguajes como Python? No es fácil saber dónde está el foco, pero se podría decir que se centra más en aplicaciones propias, aunque a menudo se le llama "lenguaje de scripting". Tal vez porque la compilación oculta en bytecode de la referencia CPython impl. no genera errores de compilación con respecto a la "seguridad de tipos"? Tal vez la respuesta de Oded tenga estos ...
n611x007
Los sistemas de códigos de bytes y tipos realmente no tienen nada que ver con esto. Según la definición anterior, si una aplicación expone una API a Python, se dice que usa Python como lenguaje de programación. Si crea una aplicación completamente en Python, esa aplicación la usa como lenguaje de programación.
error
"Scripting" no es una definición de un tipo de lenguaje. Es una característica que pueden tener los idiomas . Por lo tanto, Python es un "buen lenguaje de programación" porque facilita la escritura de código que escribe cosas. Ensamblador no es un buen lenguaje de secuencias de comandos porque dificulta la escritura. C está en algún lugar en el medio, porque aunque tiene una palabra clave (sistema) para llamar, también carga al usuario con una gran cantidad de cruft antes de que pueda llegar allí.
nomen
93

Sencillo. Cuando lo uso, es un lenguaje dinámico moderno, cuando lo usas, ¡es simplemente un lenguaje de programación!

Martin Beckett
fuente
19
Si. "No es un 'lenguaje de juguete', es un 'lenguaje de alto nivel'": P
Roberto Bonvallet
6
eso fue accidentado y fuera del tema, -1
adf88
1
Incluso con - (1 + 1) obtiene aproximadamente 2x + 1s que uno marcado. : D
anatoly techtonik
Mejor. Responder. EVAR!
iconoclasta
41

Tradicionalmente, cuando se habla de la diferencia entre scripts y programación, los scripts se interpretan y los programas se compilan. Un lenguaje se puede ejecutar de diferentes formas: interpretado o compilado (a código de bytes o código de máquina). Esto no convierte a un idioma en uno u otro.

En algunos ojos, la forma en que usa un lenguaje lo convierte en un lenguaje de scripting (por ejemplo, los desarrolladores de juegos que desarrollan principalmente en C ++ escribirán los objetos en Lua). Una vez más, las líneas están borrosas: una persona puede usar un lenguaje para una programación y otra puede usar el mismo lenguaje para un lenguaje de secuencias de comandos.

Esto es del artículo de Wikipedia sobre lenguajes de secuencias de comandos:

Un lenguaje de secuencias de comandos, un lenguaje de secuencias de comandos o un lenguaje de extensión es un lenguaje de programación que permite el control de una o más aplicaciones de software. Los "scripts" son distintos del código central de la aplicación, ya que generalmente están escritos en un idioma diferente y a menudo son creados o al menos modificados por el usuario final. Los scripts a menudo se interpretan a partir del código fuente o el código de bytes, mientras que las aplicaciones que controlan se compilan tradicionalmente en código de máquina nativo. Los lenguajes de script casi siempre están integrados en las aplicaciones que controlan.

Notará el uso de "normalmente", "a menudo", "tradicionalmente" y "casi siempre"; todos estos le indican que no existe un conjunto de atributos distintos que hagan de un lenguaje específico un "lenguaje de scripting".

Oded
fuente
1
@Amr: Bueno, se llama script
sepp2k
1
@Ram Bhat: es confuso, ya que la distinción es artificial.
Oded
11
@Andrey: Se compilan todas las implementaciones modernas de JavaScript. Y hay intérpretes para C.
Jörg W Mittag
27
Esto esta simplemente mal. Bueno, en realidad ni siquiera está mal , simplemente no tiene sentido. No existe un lenguaje compilado o interpretado. Un lenguaje no se compila, un lenguaje simplemente es . Es un montón de reglas matemáticas abstractas. La interpretación y la compilación son características de un motor de ejecución , no de un lenguaje. Cada lenguaje se puede implementar con un compilador o un intérprete. De hecho, todos los lenguajes que se han citado como "interpretados" en esta página, tienen implementaciones compiladas casi exclusivamente, por ejemplo JavaScript, PHP, Python, Ruby.
Jörg W Mittag
5
@Andrey: Chakra (IE9), TraceMonkey / JägerMonkey (Firefox), Nitro (Safari), Carakan (Opera) compilan JavaScript en código de bytes y luego parte del código de bytes se interpreta y parte se compila en código nativo. V8 (Chrome) omite el código de bytes y compila JavaScript directamente en código nativo. IronJS compila JavaScript en código de bytes CIL. Rhino compila JavaScript en código de bytes JVML. BESEN (el único motor ECMAScript 5 hasta ahora) compila JavaScript en código de bytes BESEN, y actualmente se está agregando un compilador nativo. Algunos de los anteriores también compilan expresiones regulares en código de máquina nativo.
Jörg W Mittag
31

"Un guión es lo que le das a los actores. Un programa es lo que le das a la audiencia". - Larry Wall

Realmente creo que ya no hay mucha diferencia. Los denominados lenguajes de "scripting" a menudo se compilan, muy rápidamente y en tiempo de ejecución. Y algunos de los lenguajes de "programación" también se compilan en tiempo de ejecución (piense en JIT) y la primera etapa de "compilación" es la verificación de sintaxis y la resolución de recursos.

No se obsesione con eso, realmente no es importante.

Clinton Pierce
fuente
hmmm .. No estoy colgado, pero la mayoría de los entrevistadores y profesores sí. ¡Y nunca nadie de estas personas me dio una respuesta satisfactoria!
Laz
1
Y si dieras una de las otras respuestas aquí, como entrevistador, creo que realmente no entendiste la pregunta. La distinción es realmente borrosa y no hay una respuesta clara. Si hubieras dicho "Bueno, tradicionalmente ...", tomaría eso, pero luego esperaría que discutas cosas como la compilación en tiempo de ejecución y el JIT también.
Clinton Pierce
25

Mi definición sería un lenguaje que normalmente se distribuye como fuente en lugar de como binario.

Kenny
fuente
5
¿Entonces crees que php, python, etc. son lenguajes de scripting?
Sietse
"Scripting" es una descripción común para Python y PHP.
S.Lott
22
php y python, ¡por supuesto que son lenguajes de script!
Antony Carthy
esta es mi definición desde el principio
@Antony Carthy esto está mal. Python no es un lenguaje de secuencias de comandos por lo general, pero puede ser, como cualquier otro lenguaje, que se utiliza dentro de un programa (como Word (VB), navegador (JS))
Joschua
16

Hay muchas respuestas posibles a esto.

Primero: no se trata realmente de la diferencia entre un lenguaje de programación y un lenguaje de programación, porque un lenguaje de programación es un lenguaje de programación. Es más una cuestión de qué rasgos hacen de un lenguaje de programación un lenguaje de scripting mientras que otro lenguaje de programación no es un lenguaje de scripting.

Segundo: es realmente difícil decir qué es un lenguaje XYZ, ya sea que XYZ sea "scripting", "programación funcional", "programación orientada a objetos" o lo que sea. La definición de "programación funcional" es bastante clara, pero nadie sabe qué es un "lenguaje de programación funcional".

La programación funcional o la programación orientada a objetos son estilos de programación ; puede escribir en un estilo funcional o en un estilo orientado a objetos en prácticamente cualquier idioma. Por ejemplo, el conmutador del sistema de archivos virtual de Linux y el modelo de controlador de Linux están muy orientados a objetos a pesar de estar escritos en C, mientras que gran parte del código Java o C # que ve en la web es muy procedimental y no está orientado a objetos en absoluto . OTOH, he visto código Java muy funcional.

Entonces, si la programación funcional y la programación orientada a objetos son simplemente estilos que se pueden hacer en cualquier lenguaje, ¿cómo se define un "lenguaje de programación orientado a objetos"? Se podría decir que un lenguaje de programación orientado a objetos es un lenguaje que permite la programación orientada a objetos. Pero esa no es una gran definición: todos los lenguajes permiten la programación orientada a objetos, por lo tanto, ¿ todos los lenguajes están orientados a objetos? Entonces, dices, bueno, un lenguaje está orientado a objetos, si te obliga a programar en un estilo orientado a objetos. Pero esa tampoco es una gran definición: todos los lenguajes permiten la programación funcional, por lo tanto, ¿ ningún lenguaje está orientado a objetos?

Entonces, para mí, he encontrado la siguiente definición:

Un lenguaje es un lenguaje de programación (lenguaje orientado a objetos / lenguaje funcional) si ambos

  • Facilita la creación de scripts (programación orientada a objetos / programación funcional), es decir, no solo lo permite , sino que lo hace fácil y natural y contiene características que lo ayudan , Y
  • lo alienta y lo guía hacia la creación de scripts (programación orientada a objetos / programación funcional).

Entonces, después de cinco párrafos, llegué a: "un lenguaje de scripting es un lenguaje para scripting". Qué gran definición. NO.

Obviamente, ahora necesitamos mirar la definición de "scripting".

Aquí es donde entra el tercer problema: mientras que el término "programación funcional" está bien definido y sólo el término "lenguaje de programación funcional" es problemático, desafortunadamente con el scripting, tanto el término "scripting" como el término "lenguaje de scripting "están mal definidos.

Bueno, en primer lugar, escribir es programar. Es solo un tipo especial de programación. IOW: cada script es un programa, pero no todos los programas son un script; el conjunto de todos los scripts es un subconjunto adecuado del conjunto de todos los programas.

En mi opinión personal, lo que hace que las secuencias de comandos sean secuencias de comandos y las distingue de otros tipos de programación es que ...

Los scripts manipulan en gran medida objetos que

  • no fueron creados por el script,
  • tener una vida independiente del guión y
  • vivir fuera del dominio del guión.

Además, los tipos de datos y los algoritmos utilizados generalmente no están definidos por el script sino por el entorno externo.

Piense en un script de shell: los scripts de shell suelen manipular archivos, directorios y procesos. La mayoría de los archivos, directorios y procesos de su sistema probablemente no fueron creados por el script que se está ejecutando actualmente. Y no desaparecen cuando sale el guión: su duración es completamente independiente del guión. Y tampoco son parte del guión, son parte del sistema. No comenzó su script escribiendo Filey Directoryclases, esos tipos de datos no son de su incumbencia: simplemente asume que están allí, y ni siquiera sabe (ni necesita saber) cómo funcionan. Y tampoco implementa sus propios algoritmos, por ejemplo, para el recorrido de directorio que simplemente usa en findlugar de implementar su propia búsqueda de amplitud primero.

En resumen: un script se adhiere a un sistema más grande que existe independientemente del script, manipula una pequeña parte del sistema y luego sale.

Ese sistema más grande puede ser el sistema operativo en el caso de un script de shell, el DOM del navegador en el caso de un script de navegador, un juego (por ejemplo, World of Warcraft con Lua o Second Life con Linden Scripting Language), una aplicación (por ejemplo, AutoLisp idioma para AutoCAD o macros de Excel / Word / Office), un servidor web, un paquete de robots o algo completamente diferente.

Tenga en cuenta que el aspecto de las secuencias de comandos es completamente ortogonal a todos los demás aspectos de los lenguajes de programación: un lenguaje de secuencias de comandos puede tener una tipificación fuerte o débil, una tipificación estricta o flexible, una tipificación estática o dinámica, una tipificación nominal, estructural o de pato, diablos, incluso puede estar sin tipificación . Puede ser imperativo o funcional, orientado a objetos, procedimental o funcional, estricto o vago. Sus implementaciones se pueden interpretar, compilar o mezclar.

Por ejemplo, Mondrian es un lenguaje de scripting funcional perezoso estrictamente tipado estáticamente con una implementación compilada.

Sin embargo, todo esto es discutible, porque la forma en que el término lenguaje de secuencias de comandos se usa realmente en el mundo real no tiene nada que ver con nada de lo anterior. Se usa con mayor frecuencia simplemente como un insulto, y la definición es bastante simple, incluso simplista:

  • lenguaje de programación real : mi lenguaje de programación
  • lenguaje de scripting: su lenguaje de programación

Esta parece ser la forma en que el término se usa con mayor frecuencia.

Jörg W Mittag
fuente
Parte de esta respuesta es tonta. Un lenguaje está "orientado a objetos" cuando está orientado a programar con objetos. Un lenguaje es "funcional" si tiene funciones de primera clase. Eso no significa que un idioma no pueda ser ambos. Estas son características de los lenguajes, no definiciones de tipos. Las secuencias de comandos son similares. Un lenguaje es un "buen lenguaje de secuencias de comandos" si facilita la escritura de secuencias de comandos: bits breves y simples de interacción entre el usuario y la aplicación.
nomen
16

Es como la pornografía, lo sabes cuando lo ves. La única definición posible de un lenguaje de secuencias de comandos es:

A language which is described as a scripting language.

Un poco circular, ¿no? (Por cierto, no bromeo).

Básicamente, no hay nada que haga de un lenguaje un lenguaje de scripting excepto que es llamado así, especialmente por sus creadores. El conjunto principal de lenguajes de scripting modernos es PHP, Perl, JavaScript, Python, Ruby y Lua. Tcl es el primer lenguaje de scripting moderno importante (aunque no fue el primer lenguaje de scripting, olvido lo que es, pero me sorprendió saber que era anterior a Tcl).

Describo las características de los principales lenguajes de secuencias de comandos en mi artículo :

 A Practical Solution for Scripting Language Compilers
 Paul Biggar, Edsko de Vries and David Gregg
 SAC '09: ACM Symposium on Applied Computing (2009), (March 2009)

La mayoría se escribe e interpreta dinámicamente, y la mayoría no tiene una semántica definida fuera de su implementación de referencia. Sin embargo, incluso si su implementación principal se compila o se convierte en JIT, eso no cambia la "naturaleza" del lenguaje.

La única pregunta que queda es cómo se puede saber si un nuevo idioma es un lenguaje de programación. Bueno, si se llama lenguaje de secuencias de comandos, es uno. Entonces, Factor es un lenguaje de programación (o al menos lo era cuando se escribió), pero, digamos, Java no lo es.

Paul Biggar
fuente
1
Es una muy buena explicación, pero estoy seguro de que algunas personas la votan porque ven "pornografía"
HoKy22
El enlace al papel está roto.
Quazi Irfan
5

El "lenguaje de secuencias de comandos" es uno de esos conceptos confusos que pueden significar muchas cosas. Por lo general, se refiere al hecho de que existe un proceso de un solo paso que lo lleva del código fuente a la ejecución.

Por ejemplo, en Perl lo hace: perl my_source.pl

Teniendo en cuenta los criterios anteriores, PHP es un lenguaje de programación (aunque puede tener un proceso de "compilación", por ejemplo, cuando usa Zend Encoder para "proteger" el código fuente).

PD. A menudo (pero no siempre) se interpretan lenguajes de programación. También a menudo (pero de nuevo, no siempre) los lenguajes de script se escriben dinámicamente.

Cd-MaN
fuente
Perl se compila en código de bytes antes de ejecutarse.
Brad Gilbert
2
¿Y Java? Necesita un jvm para ejecutar un programa java, pero no lo llamaría lenguaje de secuencias de comandos
Eineki
5

Todos los lenguajes de secuencias de comandos son lenguajes de programación. Entonces, estrictamente hablando, no hay diferencia.

El término no se refiere a ninguna propiedad fundamental del idioma, se refiere al uso típico del idioma. Si el uso típico es escribir programas cortos que principalmente realizan llamadas a código preexistente, y algún procesamiento simple de los resultados, (es decir, si el uso típico es escribir scripts ), entonces es un lenguaje de scripting.

Joren
fuente
4

Creo que el señor Roberto Ierusalimschy tiene una muy buena respuesta a la pregunta en 'Programación en Lua':

Sin embargo, la característica distintiva de los lenguajes interpretados no es que no estén compilados, sino que cualquier compilador es parte del tiempo de ejecución del lenguaje y que, por lo tanto, es posible (y fácil) ejecutar código generado sobre la marcha.

Rodrigo Lopez
fuente
¡Esto no responde la pregunta en absoluto!
Paul Biggar
Permítanme reafirmar que un lenguaje de secuencias de comandos es aquel en el que se incluye el compilador y es posible ejecutar código generado sobre la marcha. ¿Cómo no responde eso a la pregunta?
Rodrigo Lopez
Ese es un lenguaje interpretado. Si está tratando de decir que cualquier lenguaje interpretado es un lenguaje de secuencias de comandos, dígalo.
Paul Biggar
Bueno, todos los lenguajes se pueden utilizar para la creación de scripts, el elemento clave para mí es qué tan adecuados son. Para mí el rasgo diferencial es que, sí, se interpretan.
Rodrigo Lopez
4
Common Lisp no es lo que normalmente considero un lenguaje de scripting, pero tiene una evalfunción completa.
David Thornley
4

Una división es

  • scripting = interpretado dinámicamente
  • normal = compilado

Un lenguaje interpretado dinámicamente se interpreta en tiempo de ejecución, mientras que un lenguaje compilado se compila antes de la ejecución.

Debo agregar que, como ha señalado Jörg, la distinción interpretado / compilado no es una característica del lenguaje, sino del motor de ejecución.

También te puede interesar esta explicación del sistema de tipos , que está relacionado y se centra más en el aspecto del lenguaje, en lugar del motor de ejecución. La mayoría de los lenguajes de programación se escriben dinámicamente, mientras que los lenguajes "normales" se escriben principalmente de forma estática.

En general, la división de lenguajes tipados estáticamente y dinámicamente está mejor definida y tiene más implicaciones en la usabilidad del lenguaje.

Timo Westkämper
fuente
¿Qué pasa con Objective-C?
mouviciel
1
Es compatible con la escritura dinámica, pero yo no lo llamaría lenguaje de secuencias de comandos.
Timo Westkämper
2
Esto esta simplemente mal. Bueno, en realidad ni siquiera está mal , simplemente no tiene sentido. No existe un lenguaje compilado o interpretado. Un lenguaje no se compila, un lenguaje simplemente es . Es un montón de reglas matemáticas abstractas. La interpretación y la compilación son características de un motor de ejecución , no de un lenguaje. Cada lenguaje se puede implementar con un compilador o un intérprete. De hecho, todos los lenguajes que se han citado como "interpretados" en esta página, tienen implementaciones compiladas casi exclusivamente, por ejemplo JavaScript, PHP, Python, Ruby.
Jörg W Mittag
@ jorg-w-mittag, no dudes en editar mi respuesta para que sea más correcta. Tus puntos son válidos. Sin embargo, normalmente, si habla de un idioma, también habla del motor de ejecución predeterminado.
Timo Westkämper
3

Un lenguaje de secuencias de comandos suele ser :

  1. Tipeado dinámicamente
  2. Interpretado, con muy poco énfasis en el rendimiento, pero buena portabilidad
  3. Requiere mucho menos código repetitivo , lo que lleva a una creación de prototipos muy rápida
  4. Se utiliza para pequeñas tareas, adecuado para escribir un solo archivo para ejecutar algún "script" útil.

Si bien un lenguaje sin secuencias de comandos es ser : 1. Escrito estáticamente 2. Compilado, con énfasis en el rendimiento 3. Requiere más código repetitivo, lo que lleva a una creación de prototipos más lenta pero a una mayor legibilidad y capacidad de mantenimiento a largo plazo 4. Se utiliza para proyectos grandes, se adapta a muchos patrones de diseño

Pero es más una diferencia histórica hoy en día, en mi opinión. Javascript y Perl se escribieron con scripts pequeños y simples en mente, mientras que C ++ se escribió con aplicaciones complejas en mente; pero ambos se pueden usar de cualquier manera. Y muchos lenguajes de programación, tanto modernos como antiguos, difuminan la línea de todos modos (¡y era borrosa en primer lugar!).

Lo triste es que he conocido a algunos desarrolladores que detestan lo que perciben como "lenguajes de scripting", pensando que son más simples y no tan poderosos. Mi opinión es ese viejo cliché: use la herramienta adecuada para el trabajo.

Roble
fuente
2
No existe un lenguaje compilado o interpretado. Un lenguaje no se compila, un lenguaje simplemente es . Es un montón de reglas matemáticas abstractas. La interpretación y la compilación son características de un motor de ejecución , no de un lenguaje. Cada lenguaje se puede implementar con un compilador o un intérprete. De hecho, todos los lenguajes que se han citado como "interpretados" en esta página, tienen implementaciones compiladas casi exclusivamente, por ejemplo JavaScript, PHP, Python, Ruby.
Jörg W Mittag
@Jorg: Buen punto, estoy de acuerdo. Pero no dije que no se pueda compilar, solo dije que este tipo de lenguajes generalmente se interpretan en lugar de compilar, en el uso común.
Oak
¿Son ellos? Todas las implementaciones actuales de Python, PHP, Perl y Lua están compiladas. Con la excepción de MRI, todas las implementaciones actuales de Ruby están compiladas. (Y no son en realidad no uno, sino dos compiladores JIT para MRI.) Con la excepción de JScript, todas las implementaciones actuales de JavaScript se compilan. Tenga en cuenta que el sucesor de JScript, Chakra, está compilado. Se compilan muchas implementaciones de Scheme. ELisp está compilado.
Jörg W Mittag
3

Los lenguajes de programación se pensaron originalmente como mecanismos de control para aplicaciones escritas en un lenguaje de programación duro. Los programas compilados no se podían modificar en tiempo de ejecución, por lo que la creación de secuencias de comandos brindaba flexibilidad a las personas.

En particular, el script de shell automatizaba procesos en el kernel del sistema operativo (tradicionalmente, AppleScript en Mac); un rol que pasó cada vez más a las manos de Perl, y luego a Python últimamente. He visto a Scheme (particularmente en su implementación de Guile) usado para declarar escenas de trazado de rayos; y recientemente, Lua es muy popular como lenguaje de programación para los juegos de secuencias de comandos, hasta el punto de que lo único codificado en muchos juegos nuevos es el motor de gráficos / física, mientras que toda la lógica del juego está codificada en Lua. De la misma manera, se pensó en JavaScript para programar el comportamiento de un navegador web.

Las lenguas se emanciparon; nadie piensa ahora en el sistema operativo como una aplicación (o piensa mucho en él), y muchos lenguajes de secuencias de comandos anteriores comenzaron a utilizarse para escribir sus propias aplicaciones completas. El nombre en sí dejó de tener sentido y se extendió a muchos idiomas interpretados que se utilizan hoy en día, independientemente de si están diseñados para ser interpretados desde otro sistema o no.

Sin embargo, "lenguajes de secuencias de comandos" definitivamente no es sinónimo de "lenguajes interpretados"; por ejemplo, BASIC se interpretó durante la mayor parte de su vida (es decir, antes de que perdiera sus siglas y se convirtiera en Visual Basic), pero nadie lo considera como secuencias de comandos.

ACTUALIZACIÓN: Material de lectura como de costumbre disponible en Wikipedia .

Amadan
fuente
En realidad, la implementación BASIC original era un compilador. Solo más tarde se escribieron clones de BASIC como intérpretes, porque supuestamente los intérpretes son más fáciles de escribir que los compiladores.
Jörg W Mittag
1
@ Jörg: No del todo. Si bien se compilaron las primeras implementaciones de prueba de Dartmouth BASIC (llamadas Card BASIC), las implementaciones reales fueron intérpretes. De hecho, probablemente la nueva característica más importante de BASIC fue que era interactivo. No es necesario introducir el código fuente en tarjetas y enviarlas al compilador. El usuario podría simplemente sentarse en el teletipo, escribir el programa y luego ejecutarlo.
PauliL
Es interesante que esta respuesta introduzca la idea de un lenguaje "duro". ¿"Duro" necesita una definición en este contexto?
DA Vincent
@DavidVincent: Probablemente debería haber querido decir "más duro". No es necesaria una definición formal, la comprensión intuitiva debería ser suficiente: es mucho más difícil escribir un programa en Assembly o C que en Ruby o Python, dado que los primeros son mucho más de bajo nivel y detallados que los segundos.
Amadan
3

En primer lugar, un lenguaje de programación no es un "lenguaje de secuencias de comandos" o algo más. Puede ser un "lenguaje de secuencias de comandos" y algo más.

Segundo punto, el implementador del lenguaje le dirá si es un lenguaje de scripting.

Su pregunta debería ser "¿En qué implementaciones un lenguaje de programación se consideraría un lenguaje de scripting?", No "¿Cuál es la diferencia entre un lenguaje de scripting y un lenguaje de programación?". No hay intermedio.

Sin embargo, consideraré un lenguaje como un lenguaje de programación si se utiliza para proporcionar algún tipo de software intermedio. Por ejemplo, consideraría la mayoría de las implementaciones de JavaScript como un lenguaje de programación. Si JavaScript se ejecutara en el sistema operativo, no en el navegador, entonces no sería un lenguaje de programación. Si PHP se ejecuta dentro de Apache, es un lenguaje de programación. Si se ejecuta desde la línea de comandos, no lo es.

Marcus Adams
fuente
3

Veo un lenguaje de secuencias de comandos como cualquier cosa que no requiera un paso de 'compilación' evidente de sensación de peso. La característica principal desde el punto de vista de los programadores es: edita el código y lo ejecuta de inmediato.

Por lo tanto, consideraría JavaScript y PHP como lenguajes de scripting, mientras que ActionScript 3 / Flex no lo es realmente.

Peter Mortensen
fuente
No quiero denigrar la respuesta de Peter, pero ¿podemos agregar más que una opinión?
DA Vincent
3

Mi amigo y yo acabamos de tener este argumento: ¿Cuál es la diferencia entre un lenguaje de programación y un lenguaje de scripting?

Un argumento popular es que los lenguajes de programación se compilan y los lenguajes de scripting se interpretan. Sin embargo, creo que este argumento es completamente falso ... ¿por qué?

  1. Chakra & V8 (motores JavaScript de Microsoft y Google) compilan el código antes de la ejecución
  2. Se interpreta QBasic: ¿esto convierte a Qbasic en un lenguaje de "scripting"?

Sobre esa base, este es mi argumento para la diferencia entre un lenguaje de programación y un lenguaje de scripting:

Un lenguaje de programación se ejecuta a nivel de máquina y tiene acceso a la propia máquina (memoria, gráficos, sonido, etc.).

Un lenguaje de secuencias de comandos tiene una caja de arena y solo tiene acceso a los objetos expuestos a la caja de arena. No tiene acceso directo a la máquina subyacente.

Matthew Layton
fuente
2

En mi opinión, diría que los lenguajes interpretados dinámicamente como PHP, Ruby, etc ... siguen siendo lenguajes "normales". Yo diría que ejemplos de lenguajes de "scripting" son cosas como bash (o ksh o tcsh o lo que sea) o sqlplus. Estos lenguajes se utilizan a menudo para encadenar programas existentes en un sistema en una serie de comandos coherentes y relacionados, como:

  1. copiar A.txt a / tmp / work /
  2. ejecutar el proceso de limpieza nocturna en el servidor de la base de datos
  3. registrar los resultados y enviarlos al sysdamin

Así que diría que la diferencia (para mí, de todos modos) es más en cómo se utiliza el lenguaje. Los lenguajes como PHP, Perl, Ruby podrían usarse como "lenguajes de scripting", pero normalmente los veo usados ​​como "lenguajes normales" (excepto Perl que parece funcionar en ambos sentidos.

FrustratedWithFormsDesigner
fuente
Gracias .. Esto aclara un poco las cosas. Entonces, para recapitular, los lenguajes de scripting están diseñados para usar programas ya existentes juntos en una secuencia. PERO lenguajes como C se pueden usar para hacer lo mismo a través de API. Entonces, técnicamente hablando, todo depende del uso
Laz
No, solo está haciendo una distinción artificial (que es esto). Si puede preparar algo rápidamente con él, un lenguaje a menudo se llamará lenguaje de scripting, pero esa no es una definición estricta ni nada por el estilo. Los lenguajes comúnmente interpretados a menudo también se denominan lenguajes de secuencias de comandos.
wlangstroth
@ Voluntad: cualquier distinción sería artificial. Esta fue mi distinción obstinada. ;)
FrustratedWithFormsDesigner
sí, pero "scripting" en este caso es un uso muy coloquial y vago. Decidir que es "usar programas ya existentes juntos en una secuencia" es muy específico y no del todo correcto. Eso suena como un script de shell , tal vez, pero no Perl. Luego, para contrastar eso con las API (?) ... Simplemente no quería que el tipo se desviara demasiado.
wlangstroth
2

Seguiré adelante y migraré mi respuesta de la pregunta duplicada


El nombre "Lenguaje de secuencias de comandos" se aplica a una función muy específica: el lenguaje en el que escribe comandos para enviar a una aplicación de software existente. (como un "guión" tradicional de televisión o película)

Por ejemplo, una vez, las páginas web HTML eran aburridas. Siempre estaban estáticos. Entonces, un día, Netscape pensó: "Oye, ¿qué pasa si dejamos que el navegador lea y actúe sobre pequeños comandos en la página?" Y así, se formó Javascript.

Un comando javascript simple es el alert()comando, que instruye / ordena al navegador (una aplicación de software) que está leyendo la página web para mostrar una alerta.

Ahora, ¿está alert()relacionado, de alguna manera, con C ++ o con cualquier lenguaje de código que el navegador realmente use para mostrar la alerta? Por supuesto no. Alguien que escribe "alert ()" en una página .html no comprende cómo el navegador muestra realmente la alerta. Solo está escribiendo un comando que el navegador interpretará.

Veamos el código javascript simple

<script>
var x = 4
alert(x)
</script>

Estas son instrucciones que se envían al navegador para que el navegador las interprete por sí mismo. El lenguaje de programación por el que pasa el navegador para establecer una variable en 4 y poner eso en una alerta ... no tiene ninguna relación con javascript.

A esa última serie de comandos la llamamos "secuencia de comandos" (por eso se incluye entre <script>etiquetas). Simplemente por la definición de "guión", en el sentido tradicional: una serie de instrucciones y comandos enviados a los actores . Todo el mundo sabe que un guión (un guión de película), por ejemplo, es un guión.

El guión (guión) no es los actores, ni la cámara, ni los efectos especiales. El guión simplemente les dice qué hacer.

Ahora, ¿qué es un lenguaje de secuencias de comandos? , exactamente?

Hay muchos lenguajes de programación que son como diferentes herramientas en una caja de herramientas; algunos lenguajes fueron diseñados específicamente para ser usados ​​como escrituras.

Javasript es un ejemplo obvio; Hay muy pocas aplicaciones de Javascript que no entren en el ámbito de las secuencias de comandos.

ActionScript (el lenguaje para animaciones Flash) y sus derivados son lenguajes de scripting, en el sentido de que simplemente envían comandos al reproductor / intérprete de Flash. Claro, hay abstracciones como la programación orientada a objetos, pero todo eso es simplemente un medio para el fin: enviar comandos al reproductor flash.

Python y Ruby también se utilizan comúnmente como lenguajes de programación. Por ejemplo, una vez trabajé para una empresa que usaba Ruby para crear secuencias de comandos para enviar a un navegador que eran del tipo "vaya a este sitio, haga clic en este enlace ..." para realizar algunas pruebas básicas automatizadas. Yo no estaba un "Desarrollador de Software" de ninguna manera, en ese trabajo. Acabo de escribir scripts que envían comandos a la computadora para enviar comandos al navegador.

Debido a su naturaleza, los lenguajes de secuencias de comandos rara vez se 'compilan', es decir, se traducen a código de máquina y se leen directamente por la computadora.

Incluso las aplicaciones GUI creadas a partir de Python y Ruby son scripts que se envían a una API escrita en C ++ o C. Le dice a la aplicación C qué hacer.

Hay una línea de vaguedad, por supuesto. ¿Por qué no puede decir que Machine Language / C son lenguajes de scripting, porque son scripts que la computadora usa para interactuar con la placa base / tarjetas gráficas / chips básicos?

Hay algunas líneas que podemos dibujar para aclarar:

  1. Cuando puede escribir un lenguaje de secuencias de comandos y ejecutarlo sin "compilar", es más una especie de secuencia de comandos directa. Por ejemplo, no es necesario hacer nada con un guión para decirles a los actores qué hacer con él. Ya está allí, usado, como está. Por esta razón, excluiremos a los lenguajes compilados de ser llamados lenguajes de scripting, aunque se pueden usar con fines de scripting en algunas ocasiones.

  2. El lenguaje de secuencias de comandos implica el envío de comandos a una aplicación de software compleja ; esa es la razón por la que escribimos scripts en primer lugar, por lo que no necesita conocer las complejidades de cómo funciona el software para enviarle comandos. Por lo tanto, los lenguajes de scripting tienden a ser lenguajes que envían comandos (relativamente) simples a aplicaciones de software complejas ... en este caso, el lenguaje de máquina y el código ensamblador no son suficientes.

Justin L.
fuente
2

Puedo sugerir que los lenguajes de secuencias de comandos ha sido un término del que mucha gente se está alejando. Yo diría que hoy en día se reduce principalmente a lenguajes compilados y lenguajes dinámicos.

Quiero decir que realmente no puedes decir algo como Python, o Ruby son lenguajes de "scripting" en esta época (incluso tienes cosas como IronPython y JIT-your-favorite-language , la diferencia se ha difuminado aún más).

Para ser honesto, personalmente ya no siento que PHP sea un lenguaje de programación. No esperaría que a la gente le guste categorizar PHP de manera diferente a como dice Java en su currículum.

Robert Gould
fuente
Incluso aunque trabajo mucho en php, diría que hasta que pase de estar basado en scripts a tener un modelo de servlet / real / fcgi que despacha tareas delegadas desde el servidor, personalmente lo llamaría "un lenguaje de scripting bastante bueno, que puede dar la ilusión de una aplicación "
Kent Fredric
Estático / Dinámico, hay lenguajes dinámicos que se compilan.
Brad Gilbert
Repito: quiero decir que realmente no puedes decir algo como Python, o Ruby son lenguajes de "scripting" en esta época (incluso tienes cosas como IronPython y JitYourFavoriteLanguage, la diferencia se ha difuminado aún más).
Robert Gould
1

Los lenguajes de secuencias de comandos tienden a ejecutarse dentro de un motor de secuencias de comandos que es parte de una aplicación más grande. Por ejemplo, JavaScript se ejecuta dentro del motor de secuencias de comandos de su navegador.

Martín OConnor
fuente
Es gracioso que la respuesta aceptada tenga dos votos negativos.
Robert S.
1
Debería haber algún tipo de insignia para eso. ¿Qué tal "No puedo soportar la verdad"? No, un poco demasiado prolijo. ;-)
Joseph Ferris
3
Perl, Python, Ruby, Tcl / Tk, por nombrar solo cuatro lenguajes de scripting, no están integrados principalmente en una aplicación más grande.
Jonathan Leffler
3
Ergo: no son lenguajes de secuencias de comandos.
Milen A. Radev
3
Uh, sí, sería bueno si esto pudiera desmarcarse como correcto de alguna manera.
Mediodía Silk
1

Un lenguaje de scripting es un lenguaje que se interpreta cada vez que se ejecuta el guión, implica tener un intérprete y la mayoría son muy legibles por humanos, para ser útil un lenguaje de scripting es fácil de aprender y usar.

Cada lenguaje compilable se puede convertir en un lenguaje de escritura y viceversa, todo depende de la implementación de un intérprete o un compilador, como un ejemplo, C ++ tiene un intérprete, por lo que se puede llamar lenguaje de escritura si se usa así (no es muy práctico en general como C ++ es un lenguaje muy complejo), uno de los lenguajes de script más útiles en la actualidad es Python ...

Entonces, para responder a su pregunta, la definición está en el uso de un intérprete para ejecutar programas con guiones rápidos y fáciles, para abordar tareas simples o aplicaciones prototipo, el uso más poderoso que se puede hacer de los lenguajes de guiones es incluir la posibilidad de que cada uso extienda un aplicación compilada.

Pánico
fuente
1

Prefiero que la gente no use el término "lenguaje de secuencias de comandos", ya que creo que disminuye el esfuerzo. Tomemos un lenguaje como Perl, a menudo llamado "lenguaje de secuencias de comandos".

  • ¡Perl es un lenguaje de programación!
  • Perl está compilado como Java y C ++. ¡Se compila mucho más rápido!
  • Perl tiene objetos, espacios de nombres y cierres.
  • Perl tiene IDE y depuradores y perfiladores.
  • Perl tiene formación, apoyo y comunidad.
  • Perl no es solo web. Perl no es solo un administrador de sistemas. Perl no es solo la cinta adhesiva de Internet.

¿Por qué incluso necesitamos distinguir entre un lenguaje como Java que está compilado y Ruby que no lo es? ¿Cuál es el valor del etiquetado?

Para obtener más información sobre esto, consulte http://xoa.petdance.com/Stop_saying_script .

Andy Lester
fuente
Ninguna computadora puede ejecutar perl o ruby ​​(o cualquier forma en la que se puedan compilar) de forma nativa. Por lo tanto, perl y ruby ​​son lenguajes de script, interpretados por un analizador o VM.
anon6439
@psoul: sí. también lo es Java.
Stefano Borini
Hay varias técnicas para compilar ruby ​​en código de máquina, aunque no estoy seguro de si alguna de ellas no solo incluye el intérprete con una cadena que representa el código de ruby, pero incluso si eso fuera cierto, se puede hacer un traductor de ruby ​​a código de máquina. al código de máquina no se acercaría a la velocidad c debido a todo el envío dinámico y gc, entre otras cosas. No creo que haya procesadores ruby, pero han sido máquinas diseñadas para ajustarse más al modelo lisp y los procesadores que ejecutaban el código de bytes java.
Roman A. Taycher
1

Una diferencia importante es la escritura fuerte (versus la escritura débil ). Los lenguajes de secuencias de comandos suelen tener un tipo débil , lo que hace posible escribir programas pequeños más rápidamente. Para programas grandes, esto es una desventaja, ya que inhibe al compilador / intérprete para encontrar ciertos errores de forma autónoma, lo que dificulta la refactorización del código.

Dimitri C.
fuente
1

Los lenguajes de scripting son lenguajes de programación en los que los programas se entregan normalmente a los usuarios finales en una forma textual legible y donde hay un programa que aparentemente puede ejecutar ese programa directamente. (El programa bien puede compilar el script internamente; eso no es relevante aquí porque no es visible para el usuario).

Es relativamente común que los lenguajes de secuencias de comandos admitan una sesión interactiva en la que los usuarios pueden simplemente escribir su programa y ejecutarlo de inmediato. Esto se debe a que se trata de una extensión trivial del requisito esencial del primer párrafo; el principal requisito adicional es la adición de un mecanismo para averiguar cuándo está completa una declaración escrita para poder enviarla al motor de ejecución.

Becarios Donal
fuente
1

Para una visión ligeramente diferente de la pregunta. Un lenguaje de programación es un lenguaje de programación, pero un lenguaje de programación no es necesariamente un lenguaje de programación. Se utiliza un lenguaje de programación para controlar o programar un sistema. Ese sistema podría ser un sistema operativo donde el lenguaje de secuencias de comandos sería bash. El sistema podría ser un servidor web con PHP como lenguaje de programación. Los lenguajes de secuencias de comandos están diseñados para cubrir un nicho específico; son lenguajes de dominio específico. Los sistemas interactivos han interpretado lenguajes de scripting dando lugar a la noción de que los lenguajes de scripting se interpretan; sin embargo, esto es una consecuencia del sistema y no del lenguaje de programación en sí.

phreed
fuente
1

Un lenguaje de secuencias de comandos es un lenguaje que configura o amplía un programa existente.
Un lenguaje de secuencias de comandos es un lenguaje de programación.

Romain Hippeau
fuente
1

La definición de "lenguaje de secuencias de comandos" es bastante confusa. Lo basaría en las siguientes consideraciones:

  1. Los lenguajes de secuencias de comandos no suelen tener pasos de compilación visibles para el usuario. Normalmente, el usuario puede ejecutar programas con un sencillo comando.

  2. Los programas en lenguajes de secuencias de comandos normalmente se transmiten en formato fuente.

  3. Los lenguajes de secuencias de comandos normalmente tienen tiempos de ejecución que están presentes en una gran cantidad de sistemas, y los tiempos de ejecución se pueden instalar fácilmente en la mayoría de los sistemas.

  4. Los lenguajes de secuencias de comandos tienden a ser multiplataforma y no específicos de la máquina.

  5. Los lenguajes de secuencias de comandos facilitan la llamada a otros programas y la interfaz con el sistema operativo.

  6. Los lenguajes de secuencias de comandos suelen integrarse fácilmente en sistemas más grandes escritos en lenguajes de programación más convencionales.

  7. Los lenguajes de secuencias de comandos están normalmente diseñados para facilitar la programación y con mucha menos consideración por la velocidad de ejecución. (Si desea una ejecución rápida, el consejo habitual es codificar las partes que consumen mucho tiempo en algo como C, e incrustar el lenguaje en C o llamar a los bits C desde el lenguaje).

Algunas de las características que enumeré anteriormente son ciertas para las implementaciones, en cuyo caso me refiero a las implementaciones más comunes. Ha habido intérpretes de C, con (AFAIK) ningún paso de compilación obvio, pero eso no es cierto para la mayoría de las implementaciones de C. Ciertamente podría compilar un programa Perl en código nativo, pero no es así como se usa normalmente. Algunas otras características son de naturaleza social. Algunos de los criterios anteriores se superponen un poco. Como dije, la definición es borrosa.

David Thornley
fuente
0

Yo diría que el lenguaje de secuencias de comandos es el que manipula mucho las entidades que no define por sí mismo. Por ejemplo, JavaScript manipula objetos DOM proporcionados por el navegador, PHP opera una enorme biblioteca de funciones basadas en C, y así sucesivamente. Por supuesto que no es una definición precisa, más una forma de pensar si lo es.

Michael Pliskin
fuente
Mmm, PHP usa la biblioteca C subyacente, pero es el caso de la mayoría de los lenguajes, incluido Java (en el nivel más bajo). Y no manipula estas funciones ...
PhiLho
0

Si no se ejecuta / no se ejecuta en la CPU, es un script para mí. Si un intérprete necesita ejecutarse en la CPU debajo del programa, entonces es un script y un lenguaje de script.

¿No hay razón para hacerlo más complicado que esto?

Por supuesto, en la mayoría (99%) de los casos, está claro si un lenguaje es un lenguaje de programación. Pero considere que una máquina virtual puede emular el conjunto de instrucciones x86, por ejemplo. ¿No haría esto que el código de bytes x86 sea un lenguaje de secuencias de comandos cuando se ejecuta en una máquina virtual? ¿Qué pasaría si alguien escribiera un compilador que convirtiera el código perl en un ejecutable nativo? En este caso, ya no sabría cómo llamar al idioma en sí. Lo que importaría sería el resultado, no el idioma.

Por otra parte, no estoy al tanto de que se haya hecho algo como esto, por lo que por ahora todavía me siento cómodo llamando lenguajes interpretados de scripting.

anon6439
fuente
1
¿Está llamando a casi todos los lenguajes, excepto a los que compilan en binarios nativos para lenguajes de secuencias de comandos? Estoy seguro de que los desarrolladores de Java estarán felices de que los llamen scripters;)
truppo
1
Son. Scripters, eso es.
anon6439
0

Un guión es un programa relativamente pequeño . Un sistema es un programa relativamente grande o una colección de programas relativamente grandes.

Algunos lenguajes de programación están diseñados con características que el diseñador del lenguaje y la comunidad de programación consideran útiles al escribir programas relativamente pequeños. Estos lenguajes de programación se conocen como lenguajes de secuencias de comandos , por ejemplo, PHP.

De manera similar, otros lenguajes de programación están diseñados con características que el diseñador del lenguaje y la comunidad de programación consideran útiles al escribir programas relativamente grandes. Estos lenguajes de programación se conocen como lenguajes de sistemas. , por ejemplo, Java.

Ahora, los programas grandes y pequeños se pueden escribir en cualquier idioma. Un pequeño programa de Java es un script. Por ejemplo, un programa Java "Hello World" es un script, no un sistema. Un programa grande, o colección de programas, escrito en PHP es un sistema. Por ejemplo, Facebook, escrito en PHP, es un sistema, no un script.

Es cuestionable considerar una característica de un solo lenguaje como una "prueba de fuego" para decidir si el lenguaje es el más adecuado para scripts o programación de sistemas. Por ejemplo, los scripts pueden compilarse en código de bytes o código de máquina, o pueden ejecutarse mediante interpretación directa de árbol de sintaxis abstracta (AST).

Por lo tanto, un lenguaje es un lenguaje de secuencias de comandos si se usa normalmente para escribir secuencias de comandos . Se puede utilizar un lenguaje de secuencias de comandos para escribir sistemas, pero es probable que estas aplicaciones se consideren dudosas.

Greg Mattes
fuente