Lenguaje de escritura
La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la
versión revisada el 12 de noviembre de 2021; las comprobaciones requieren
7 ediciones .
Lenguaje de secuencias de comandos ( lenguaje de secuencias de comandos, lenguaje de secuencias de comandos ; lenguaje de secuencias de comandos en inglés ) - un lenguaje de secuencias de comandos de alto nivel ( script en inglés ) - breves descripciones de las acciones realizadas por el sistema. La diferencia entre programas y scripts es bastante borrosa. Un script es un programa que trata con componentes de software listos para usar [1] , que, una vez cargados, no dependen de la presencia/ausencia continua de una conexión a la Red en su trabajo .
Según John Oosterhout , autor del lenguaje Tcl , los lenguajes de alto nivel se pueden dividir en lenguajes de programación de sistemas y lenguajes de secuencias de comandos . A estos últimos también los llamó lenguajes adhesivos o lenguajes de integración de sistemas . Los scripts generalmente se interpretan en lugar de compilarse [2] , aunque los lenguajes de scripting están obteniendo compiladores JIT uno por uno [3] [4] [5] .
En un sentido más estricto, un lenguaje de secuencias de comandos puede entenderse como un lenguaje especializado para ampliar las capacidades de un shell de comandos o editor de texto y herramientas de administración del sistema operativo [6] .
Clasificación
Los lenguajes de programación en general y los lenguajes de scripting en particular se pueden clasificar de muchas maneras diferentes.
En términos de velocidad, los lenguajes de secuencias de comandos se pueden dividir en lenguajes de análisis dinámico ( sh , COMMAND.COM ) y lenguajes precompilados ( Perl ). Los lenguajes de análisis dinámico leen las instrucciones de un archivo de programa en los bloques mínimos requeridos y ejecutan esos bloques sin leer más código. Los lenguajes precompilados traducen todo el programa a bytecode y luego lo ejecutan. Algunos lenguajes de secuencias de comandos tienen la capacidad de compilar un programa sobre la marcha en código de máquina (la llamada compilación JIT ).
Por aplicación, los idiomas se pueden dividir aproximadamente en tres tipos [7] :
- comando-escenario;
- escenarios aplicados;
- escenarios universales.
Lenguajes de secuencias de comandos
Apareció allá por los años 60 para gestionar tareas en sistemas operativos. De los lenguajes de aquella época, el JCL para OS/360 es el más conocido . Esta clase incluye lenguajes por lotes ( eng. lenguaje por lotes ) y lenguajes de shell de comando , como sh , csh para Unix . Estos lenguajes son los más utilizados en el procesamiento por lotes [7] .
Por ejemplo, el lenguaje AppleScript del sistema operativo MacOS tiene un Editor de secuencias de comandos que le permite registrar acciones a medida que las realiza el usuario en el sistema en un archivo de secuencia de comandos (archivo de texto) y formatearlo como un programa ejecutable. Este enfoque permite que un usuario que no sea programador componga scripts simples [8] .
Idiomas integrados (secuencias de comandos aplicadas)
Los lenguajes de secuencias de comandos de este tipo comenzaron a aparecer en la década de 1980, cuando se hizo posible la comunicación interactiva con el sistema operativo en las computadoras personales industriales. En una arquitectura cliente-servidor, dichos lenguajes funcionaban en el lado del cliente del software [7] .
Lenguajes de propósito general
Este tipo de lenguaje de scripting es el más conocido (especialmente cuando se aplica a la programación web ). Lenguajes de este tipo han ido surgiendo desde la década de 1990 [7] .
Cabe señalar que muchos de los lenguajes de esta categoría tienen usos más amplios que los lenguajes de secuencias de comandos, como JavaScript, que en algunos casos puede ejecutarse en el servidor.
Crítica
El creador de Java, James Gosling , relegó los lenguajes de programación dinámicos (mencionando a PHP y Ruby) al papel de lenguajes de secuencias de comandos que generan páginas web, pero no son adecuados para su uso en un nicho más amplio de aplicaciones debido a la escalabilidad y el rendimiento. problemas [9] . Los partidarios de los lenguajes dinámicos no dejaron críticas sin respuesta en todos los aspectos, en particular sobre sus esfuerzos por presentar los lenguajes dinámicos modernos como simplemente "escritos" [10] .
Complementos y scripts
Para escribir extensiones personalizadas, tanto los scripts (en la terminología de algunos programas " macros ") como los complementos (módulos independientes escritos en lenguajes compilados ; en algunos programas pueden llamarse "utilidades", "exportadores", "controladores") pueden ser usado.
El lenguaje de script es útil en los siguientes casos:
- Si desea garantizar la programabilidad sin riesgo de desestabilizar el sistema. Dado que, a diferencia de los complementos , los scripts se interpretan en lugar de compilarse, un script mal escrito mostrará un mensaje de diagnóstico en lugar de provocar un bloqueo del sistema . Los contraejemplos pueden ser, por ejemplo, JVM y CLR , y si el primero se desarrolló por motivos de portabilidad del código (la seguridad es un efecto secundario), entonces el segundo es precisamente por motivos de seguridad.
- Si el código expresivo es importante.
- Primero, cuanto más complejo es el sistema, más código tienes que escribir " porque es necesario ". Un script puede mover parte de este código repetitivo (inicialización, destrucción, sincronización entre subprocesos, etc.) al entorno de ejecución del script.
- En segundo lugar, un lenguaje de secuencias de comandos puede tener un concepto de programación completamente diferente al del programa principal; por ejemplo, un juego puede ser una aplicación monolítica de un solo subproceso, mientras que las secuencias de comandos que controlan los personajes se ejecutan en paralelo o como rutinas . Este enfoque es bueno desde el punto de vista de la escalabilidad del sistema (los scripts no dependen de la implementación de procedimientos, se escriben mucho más rápido y son más fáciles de depurar), pero no muy bueno desde el punto de vista de la calidad del código, ya que inevitablemente conduce a su duplicación.
- Un enfoque mucho más racional es crear archivos de recursos (como opción, archivos xml , estructuras, bases de datos ) que describan el comportamiento "esencialmente" (en un estilo declarativo ), como se hace con otras propiedades de los objetos del juego (texturas, modelos, efectos, sonidos).
- En tercer lugar, el lenguaje de secuencias de comandos tiene su propio conjunto de comandos específicos de dominio, y una línea de secuencia de comandos puede hacer lo mismo que varias docenas de líneas en un lenguaje tradicional. Sin embargo, vale la pena señalar que la mayor expresividad del código en los lenguajes de script es consecuencia de sus limitaciones y/o novedad y comparar C (década de 1970) y PHP (década de 1990) y/o Fortran (década de 1950) y Python (década de 1990) inadecuado.
- Las secuencias de comandos son conocidas por su bajo umbral de entrada; incluso un programador poco calificado puede escribir en un lenguaje de secuencias de comandos. Esto es a la vez un más y un menos. Por un lado, esto te permite contratar mano de obra barata (liberando a los especialistas del trabajo rutinario y aumentando la velocidad de desarrollo de manera extensiva ), y por otro lado, reduce críticamente la productividad y la confiabilidad (debido al enfoque de la enseñanza de dichos idiomas en resolver problemas específicos, y no en comprender la esencia de los productos producidos).
- El problema de un alto umbral de entrada ocurre principalmente en lenguajes con sintaxis redundante ( C++ , C# ) y solo puede resolverse completamente abandonándolos en favor de otros más exitosos (lo que, por supuesto, está lejos de ser siempre posible). En este caso, los guiones actúan como paliativo . En realidad, surgieron cuando la escalabilidad de los lenguajes tipo C se volvió insuficiente para el trabajo diario y el umbral para que los recién llegados ingresaran a la industria aumentó drásticamente.
- El problema de una gran cantidad de rutinas es, en términos generales, irresoluble, pero en la mayoría de los casos se puede solucionar con medios adicionales más confiables, por ejemplo, la generación automática de código .
- Si se requiere multiplataforma . Por ejemplo, JavaScript : lo ejecutan los navegadores en una variedad de sistemas operativos.
- El problema con la multiplataforma se deriva directamente del estándar del idioma: el estándar C, por ejemplo, especifica "tamaño de (corto) <= tamaño de (int) <= tamaño de (largo)", pero no especifica qué profundidad de bits deberían tener (las bibliotecas de aplicaciones resuelven este problema, por ejemplo, glib ). Los lenguajes modernos sin secuencias de comandos ( Java , C# , Haskell ) están completamente desprovistos de este problema precisamente debido a una buena estandarización.
- Los lenguajes de secuencias de comandos se utilizan para escribir programas que no requieren optimización y velocidad de ejecución. Debido a su simplicidad, a menudo se escriben en ellos pequeños programas de una sola vez ("problema").
- Muchos lenguajes de secuencias de comandos de propósito general son lo suficientemente lentos como para que a menudo se usen solo en combinación con bibliotecas de terceros (por ejemplo, NumPy en combinación con Python).
- Este no es un muy buen ejemplo, ya que NumPy se basa en la antigua biblioteca Fortran MATHLAB , cuyo código, aunque probado en el tiempo, inevitablemente comienza a "pudrirse": fue escrito para computadoras extremadamente primitivas de un solo subproceso con otros cuellos de botella (y aunque esto se compensa con la optimización de los compiladores y la paralelización a nivel del sistema operativo, el rendimiento se degradará gradualmente).
- Un ejemplo más correcto: Lua es un lenguaje de secuencias de comandos incrustable clásico de propósito general que requiere una implementación mínima de C para ejecutarse (dondequiera que haya C, Lua puede funcionar).
- Los lenguajes de secuencias de comandos también son buenos para la visualización de datos: crear gráficos y presentaciones complejos, así como programas simples (por ejemplo, Python se usa en los shells gráficos de Gnome y Cinnamon para crear applets y pequeñas utilidades de configuración).
Los complementos también tienen beneficios importantes.
- Los programas listos para usar traducidos a código de máquina se ejecutan mucho más rápido que los scripts que se interpretan dinámicamente desde el código fuente cada vez que se ejecutan. La mayoría de los programas son portátiles a nivel de código fuente y pueden ser ejecutados por el intérprete de lenguaje apropiado, como scripts. El uso de bytecode ( Java , C# , LLVM ) le permite almacenar, transferir y ejecutar programas de una manera más eficiente que los scripts.
- La compilación JIT también le permite optimizar el código general para una plataforma específica (en el futuro, para una familia de procesadores específica y hardware disponible).
- Acceso completo a cualquier recurso de hardware o sistema operativo (en el lenguaje de secuencias de comandos, debe haber una API especial escrita en el lenguaje compilado para esto). Los complementos que funcionan con hardware se denominan tradicionalmente controladores .
- Si se espera un gran intercambio de datos entre el programa principal y la extensión personalizada, es más fácil que el complemento lo proporcione.
- Los lenguajes de programación compilados se caracterizan por el uso de un fuerte sistema de tipos estáticos, que le permite detectar errores de manera eficiente y optimizar mejor su código. Es más probable que el uso de escritura dinámica en scripts modernos se deba a características de implementación técnica y razones históricas. Además, los lenguajes tipificados estáticamente tienen el potencial de crecimiento, es decir, la transición de la tipificación monomórfica tradicional a la tipificación polimórfica . Las extensiones de monomorfismo en lenguajes modernos tipo C ( sobrecarga , polimorfismo ad-hoc ) y polimorfismo de subtipo , así como polimorfismo paramétrico y clases de tipos en lenguajes experimentales (por ejemplo, Haskell) no están disponibles para lenguajes de scripting (tipado estático en tiempo de ejecución conducirá a una pérdida significativa de rendimiento).
Notas
- ↑ Susie R. Lenguajes de secuencias de comandos: Python. "Mundo PC", 9, 2001 . Consultado el 9 de octubre de 2012. Archivado desde el original el 17 de enero de 2013. (indefinido)
- ↑ Ousterhout, 1998 .
- ↑ LuaJIT . Consultado el 9 de octubre de 2012. Archivado desde el original el 2 de octubre de 2012. (indefinido)
- ↑ PyPy . Consultado el 9 de octubre de 2012. Archivado desde el original el 12 de mayo de 2008. (indefinido)
- ↑ Joab Jackson (IDG News Service), Facebook lanza un compilador PHP justo a tiempo . Consultado el 9 de octubre de 2012. Archivado desde el original el 11 de junio de 2012. (indefinido)
- ↑ Yu. A. Denisov, Programación para las humanidades, 12. Conferencia: Presentación de gramáticas
- ↑ 1 2 3 4 5 6 7 Bogatyrev, 2001 .
- ↑ Trofimov, Trofimova, 1997 .
- ↑ James Gosling: "Java no está bajo ninguna amenaza seria de PHP, Ruby o C#" . Consultado el 9 de octubre de 2012. Archivado desde el original el 24 de octubre de 2012. (indefinido)
- ↑ Ryan Tomayko, Gosling no recibió el memo . Consultado el 9 de octubre de 2012. Archivado desde el original el 18 de enero de 2012. (indefinido)
Literatura
Enlaces
diccionarios y enciclopedias |
|
---|
En catálogos bibliográficos |
|
---|