Сценарный язык
Сценарный язык (язык сценариев, жарг. скриптовый язык; англ. scripting language) — высокоуровневый язык сценариев (англ. script) — кратких описаний действий, выполняемых системой. Разница между программами и сценариями довольно размыта. Сценарий — это программа, имеющая дело с готовыми программными компонентами[1].
Согласно Джону Устерхауту, автору языка Tcl, высокоуровневые языки можно разделить на языки системного программирования (англ. system programming languages) и сценарные языки (англ. scripting languages). Последние он также назвал склеивающими языками (англ. glue languages) или языками системной интеграции (англ. system integration languages). Сценарии обычно интерпретируются, а не компилируются[2], хотя сценарные языки программирования один за другим обзаводятся JIT-компиляторами[3][4][5].
В более узком смысле под скриптовым языком может пониматься специализированный язык для расширения возможностей командной оболочки или текстового редактора и средств администрирования операционных систем[6].
Содержание
1 Классификация
1.1 Командно-сценарные языки
1.2 Встроенные (прикладные сценарные) языки
1.3 Языки общего назначения
2 Критика
3 Плагины и скрипты
4 Примечания
5 Литература
6 Ссылки
Классификация |
Языки программирования вообще и сценарные языки в частности могут быть классифицированы множеством различных способов.
В плане быстродействия скриптовые языки можно разделить на языки динамического разбора (sh, COMMAND.COM) и предварительно компилируемые (Perl). Языки динамического разбора считывают инструкции из файла программы минимально требующимися блоками, и исполняют эти блоки, не читая дальнейший код. Предкомпилируемые языки транслируют всю программу в байт-код и затем исполняют его. Некоторые скриптовые языки имеют возможность компиляции программы «на лету» в машинный код (т. н. JIT-компиляция).
По применению языки можно грубо разделить на три типа[7]:
- командно-сценарные;
- прикладные сценарные;
- универсальные сценарные.
Командно-сценарные языки |
Появились ещё в 1960-х годах для управления заданиями в операционных системах. Из языков того времени наиболее известен JCL для OS/360. В этот класс входят языки пакетной обработки (англ. batch language) и языки командных оболочек, например sh, csh для Unix. Эти языки чаще всего используются в пакетном режиме обработки[7].
- AutoHotkey
- JCL
sh
- bash
- csh
- ksh
- Pilot[7]
- REXX
- AppleScript
COMMAND.COM и cmd.exe
- VBScript
- PowerShell
- AutoIt
Например, язык AppleScript операционной системы MacOS имеет редактор Script Editor, который позволяет записывать действия по мере их выполнения пользователем в системе в файл сценария (текстовый файл) и оформлять в виде исполняемой программы. Такой подход позволяет составлять простейшие сценарии непрограммирующим пользователем[8].
Встроенные (прикладные сценарные) языки |
Сценарные языки этого типа начали появляться в 1980-е годы, когда на промышленных персональных компьютерах стало возможным интерактивное общение с ОС. В клиент-серверной архитектуре такие языки работали в клиентской части программного обеспечения[7].
- AutoLISP
ECMAScript и его диалекты (JScript, JavaScript, ActionScript)[7]
- Emacs Lisp
- ERM
- Game Maker Language
- LotusScript[7]
- Lua
MQL4 script- UnrealScript
- VBA
- Встроенный язык программирования 1С:Предприятие
Языки общего назначения |
Этот тип сценарных языков наиболее известен (особенно в применении к веб-программированию). Языки этого типа стали возникать с 1990-х годов[7].
Tcl (Tool command language)- Lua
- Perl
- PHP
- Python
- REBOL
- Ruby
- JavaScript
Следует заметить, что многие языки этой категории имеют более широкое применение, чем в качестве просто языков сценариев, например JavaScript, который в некоторых случаях может выполнятся на сервере.
Критика |
Создатель Java Джеймс Гослинг отвёл динамическим языкам программирования (упомянув PHP и Ruby) роль сценарных языков, генерирующих веб-страницы, но непригодных для применения в более широкой нише приложений из-за проблем с масштабируемостью и производительностью[9]. Приверженцы динамических языков не оставили критику без ответа по всем пунктам, в частности о его старании представить современные динамические языки всего лишь «сценарными»[10].
Плагины и скрипты |
Для написания пользовательских расширений могут использоваться как скрипты (в терминологии некоторых программ «макросы»), так и плагины (независимые модули, написанные на компилируемых языках; в некоторых программах они могут называться «утилитами», «экспортёрами», «драйверами»).
Скриптовый язык удобен в следующих случаях:
- Если нужно обеспечить программируемость без риска дестабилизировать систему. Так как, в отличие от плагинов, скрипты интерпретируются, а не компилируются, неправильно написанный скрипт выведет диагностическое сообщение, а не приведёт к системному краху;
- Если важен выразительный код. Во-первых, чем сложнее система, тем больше кода приходится писать «потому, что это нужно». Во-вторых, в скриптовом языке может быть совсем другая концепция программирования, чем в основной программе — например, игра может быть монолитным однопоточным приложением, в то время как управляющие персонажами скрипты выполняются параллельно или как сопрограммы. В-третьих, скриптовый язык имеет собственный проблемно-ориентированный набор команд, и одна строка скрипта может делать то же, что несколько десятков строк на традиционном языке.
- Скрипты известны низким порогом вхождения. На скриптовом языке может писать даже низкоквалифицированный программист.
- Если требуется кроссплатформенность. Например, JavaScript — его исполняют браузеры под самыми разными ОС.
- Скриптовые языки не применяются для написания программ, требующих оптимальности и быстроты исполнения. Но из-за простоты на них часто пишутся небольшие одноразовые («проблемные») программы. Многие скриптовые языки общего назначения работают достаточно медленно, поэтому их часто используют только в сочетании со сторонними библиотеками (например, NumPy в сочетании с Python).
У плагинов также есть важные преимущества.
- Готовые программы, оттранслированные в машинный код, выполняются значительно быстрее скриптов, которые интерпретируются из исходного кода динамически при каждом исполнении. Большинство программ переносимы на уровне исходного кода и могут быть выполнены интерпретатором соответствующего языка подобно скриптам. Использование же байт-кода (Java, C#, llvm) позволяет хранить, переносить и исполнять программы более эффективным образом, нежели скрипты.
- Полный доступ к любому аппаратному обеспечению или ресурсу ОС (в скриптовом языке для этого должен существовать специальный API, написанный на компилируемом языке). Плагины, работающие с аппаратным обеспечением, традиционно называют драйверами.
- Если предполагается интенсивный обмен данными между основной программой и пользовательским расширением, для плагина его обеспечить проще.
- Если языки программирования созданы в разное время и для разных целей, их сравнение по выразительной силе некорректно. Совершенно естественно, что, например, алголоподобные языки (создавались в 60-х и 70-х) будут менее выразительны, чем современные скриптовые языки общего назначения. В сравнении же с "ровесниками" скрипты выглядят уже гораздо менее выгодно.
- Для компилируемых языков программирования характерно использование сильной статической системы типов, которая позволяет эффективно отлавливать ошибки. Использование же в современных скриптах динамической типизации обусловлено скорее техническими особенностями реализации.
Примечания |
↑ Сузи Р. Сценарные языки: Python. «Мир ПК», 9, 2001
↑ Ousterhout, 1998.
↑ LuaJIT
↑ PyPy
↑ Joab Jackson (IDG News Service), Facebook releases a PHP just-in-time compiler
↑ Денисов Ю. А., Программирование для гуманитариев, 12. Лекция: Представление грамматик, интуит.ру
↑ 1234567 Богатырев, 2001.
↑ Трофимов, Трофимова, 1997.
↑ James Gosling: «Java Is Under No Serious Threat From PHP, Ruby or C#»
↑ Ryan Tomayko, Gosling Didn’t Get The Memo
Литература |
- Богатырев Р. Природа и эволюция сценарных языков (рус.) // Мир ПК. — 2001. — № 11.
- Ousterhout J. Scripting: Higher-Level Programming for the 21st Century (англ.) // IEEE Computer. — 1998. — Vol. 31, no. 3. — P. 23-30.
- Георгиев В.О., Еникеев А.И. Сценарный подход в создании диалоговых систем // Программные продукты и системы. — 1991. — № 3.
- Трофимов М. И., Трофимова М. П. В поисках компьютерного эсперанто // Открытые системы. — 1997. — № 3.
Ссылки |
- Lynn Greiner, Q&A: The state of the scripting universe: Scripting languages are becoming more popular, www.computerworld.com, 2008