2009-11-06 28 views
10

He visto here que lo que diferencia a un lenguaje de programación de un lenguaje de scripting es el motor de scripting. Pero no entiendo cómo funciona, así que no sé la diferencia.¿Qué es un motor de scripting?

Por ejemplo, veo el código en los métodos de llamada de Java en las bibliotecas importadas, pero no parece "lo suficientemente diferente" de Python o el código de Ruby, ambos son lenguajes de scripting, ¿verdad? Supongo que esto también tiene que ver con los paradigmas de procedimiento y orientados a objetos, pero al final, no puedo ver por qué se clasifican tal como son.

EDIT: Acerca de un motor de scripts siendo un intérprete ... ¿No es Java un lenguaje interpretado? Sé que está el bytecode compilado, pero aún así, no tiene sentido para mí.

+5

Sí, las implementaciones típicas de Java (y C#) ejecutan bytecode en una máquina virtual, también conocida como intérprete, al igual que las implementaciones típicas de Python o Ruby (de hecho, puede ser el _same_ interpreter ;-). Entonces la distinción está bastante mal fundada, como habrás notado. –

+1

Java no es un lenguaje interpretado. Usted tiene un compilador llamado javac y binarios de objetos de máquina (virtuales) llamados archivos de clase. – alphazero

+1

Java no se considera un lenguaje interpretado. Usted escribe código Java, luego tiene un paso de compilación explícito, donde el código Java se convierte en bytecodes. Los códigos de bytes se interpretan en la máquina virtual Java. Por lo general, cuando las personas dicen "lenguaje interpretado" se refieren a un lenguaje en el que solo se puede ejecutar el código directamente sin un paso de compilación explícito. (El "intérprete" podría usar la compilación Just-In-Time como optimización de velocidad). Es confuso: incluso los idiomas que todos aceptan son "compilados", como C, pueden tener intérpretes. (Búsqueda de Google para "intérprete C") – steveha

Respuesta

12

No existe una línea dura entre un "lenguaje de scripting" y un "lenguaje de programación".

Propiedades de "lenguajes de script" tienden a incluir:

  • administrador de memoria recolección de basura, sin necesidad de asignar de forma explícita y objetos libres

  • capacidad de ejecutar simplemente comandos, sin un montón de código repetitivo. Java se usa generalmente como un contraejemplo de esto. En Python puedes simplemente decir print("Hello, world!"), pero en Java necesitas mucha más sintaxis (el ejemplo here son siete líneas de código).

  • Relacionado con lo anterior, generalmente en un "lenguaje de scripting" no tiene que declarar explícitamente variables, y rara vez necesita declarar tipos de variables.Algunos lenguajes de scripts (como Javascript) forzarán los tipos con abandono salvaje, y otros (como Python) están fuertemente tipados y generan excepciones en los desajustes de tipos.

  • sin necesidad de un paso explícito de compilación o enlace; simplemente escribe el código y lo ejecuta. (Un "lenguaje de programación" todavía puede ser Just-In-Time compilado internamente;. Python hace esto, por ejemplo)

Más allá de estos elementos básicos, un "lenguaje de script" puede variar de algo primitivo y trivial, como el lenguaje "por lotes" en MS-DOS, hasta un lenguaje expresivo y poderoso como Python, Ruby, etc.

+1

estuvo de acuerdo en su mayoría, excepto en el punto n. ° 1: no es realmente cierto; el único lenguaje que conozco que no es basura recolectada es C/C++. – hasen

+3

@hasanj, ¿qué quieres decir con "no es verdad"? Afirmé que cualquier lenguaje que requiera que la memoria 'malloc()' y 'free()' sea descalificada como un "lenguaje de scripting". No afirmé que los "lenguajes que no son de script" deben forzarlo a administrar la memoria. – steveha

+0

@hasanj, si lo analizas, encontrarás muchos idiomas que no son basura. Me vienen a la mente FORTRAN, Pascal y C/C++, pero hay muchos. AWK fue un gran problema para mí cuando me enteré de ello, porque ni siquiera tenía que declarar cuánto tiempo sería una lista; ¡Podrías seguir añadiéndolo cuando quisieras! Es cierto que muchos lenguajes modernos van a la recolección de basura, pero la falta de recolección de basura fue un gran problema cuando los "lenguajes de scripting" comenzaron a aparecer. Lea la "Descripción histórica" ​​aquí: http://en.wikipedia.org/wiki/Scripting_language – steveha

2

Probablemente lo más parecido a lo que estamos hablando es de un interpreter:

En informática, un intérprete significa normalmente un programa informático que ejecuta, es decir, realiza, instrucciones escrito en un lenguaje de programación . Mientras interpretación y compilación son los dos medios principales por los cuales se implementan lenguajes de programación, estos no son totalmente distinta categorías, una de las razones es que los sistemas más interpretación también realizan un trabajo de traducción, simplemente como compiladores.

Básicamente un intepreter (o motor de scripting, si lo prefiere) es el componente que es responsable de convertir una secuencia de comandos en código máquina en tiempo de ejecución (en contraposición a un compilador que genera código de máquina antes de tiempo de ejecución).

6

Básicamente, has descubierto que la distinción entre un lenguaje de scripting y un lenguaje "sin scripts" es bastante artificial. Python se puede compilar en código de byte JVM (con Jython), y creo que Ruby también puede - entonces el "motor" que ejecuta el código de Python o Ruby en cuestión será una JVM, el mismo "motor" que ejecuta el código Java (o Scala) código, etc. etc.). De forma similar con .NET e IronPython (o IronRuby), entonces el "motor" es el CLR de Microsoft, al igual que para C#, Boo, y así sucesivamente. Los lenguajes que se dice que son "secuencias de comandos" a menudo son de tipo dinámico ... pero nunca escuché el término utilizado para otros lenguajes de tipado dinámico importantes como Smalltalk, Mozart/OZ o Erlang ... ;-).

0

"Lenguaje de scripting" podría llamarse coloquialismo. El término no está bien definido, y verá algún desacuerdo sobre qué idiomas son los lenguajes de scripting. A veces es útil para transmitir una idea vaga de las propiedades de un idioma (Ver steveha's answer).

"Lenguaje de scripting" también podría referirse a un uso particular de un idioma. Por ejemplo, una pieza de software podría usar Lua como su lenguaje de scripting, el lenguaje utilizado por el usuario final para automatizar (o "guiar") tareas complejas.

0

Una distinción útil entre scripting/interpreted languages ​​y compiled languages ​​es que normalmente puede incrustar el intérprete de un lenguaje de scripting en un proyecto compilado, como un motor de juego.

3

Sé que ha aceptado una respuesta, sin embargo, existe cierta ambigüedad.

Cuando nos referimos a un motor de scripting , normalmente nos referimos a un pequeño lenguaje incrustado que se encuentra dentro de una plantilla y genera resultados de texto o documentos. Por ejemplo, Freemarker y Velocity a menudo se conocen como motores de scripting. Erb se sentaría aquí también, pero extrañamente no se conoce como un motor de scripting que a menudo.

Un lenguaje scripting generalmente necesidades ningún paso de compilación, por lo tanto, se puede ejecutar más simplemente como una, o, a partir de una secuencia de comandos shell. Esto incluye cosas como awk, perl, tcl, python, ruby, etc. Estos lenguajes suelen ser escuetos y la seguridad de tipo suele ser opcional. Windows es compatible con varios idiomas en scripting host instalaciones. Esto expone los lenguajes de scripting a varios componentes dentro de Windows.

Entonces, los lenguajes completamente compilados como Java bien pueden ejecutarse como bytecode y podrían considerarse interpretados, sin embargo, el hecho es que hay un paso de compilación explícito, no hay intérprete (con Sun JRE de todos modos) que proporcione un entorno ejecutable en tiempo de ejecución para código java.

Se incrustan otros idiomas como VBA, muchos de los idiomas anteriores se pueden incrustar. Los lenguajes incrustados también pueden ser referidos como un motor de scripting para la aplicación host.

En mi opinión, un motor de scripting interpreta instrucciones programáticas y, a su vez, da instrucciones a una aplicación de host más grande o sistema. Las instrucciones se ejecutan inmediatamente sin preocuparse por las instrucciones restantes.

Muchos Lisps no tienen distinción entre datos y código, posiblemente compilando dinámicamente en tiempo de ejecución. Los pasos de interpretación, compilación y ejecución están disponibles para que el programador Lisp sea manipulado a medida que los programadores manipulan datos en otros idiomas.

Cuestiones relacionadas