В вычислительной технике скрипт — это относительно короткий и простой набор инструкций, которые обычно автоматизируют ручной процесс. Процесс написания скрипта называется скриптингом . Скриптовый язык или скриптовый язык описывает язык программирования , который используется для скриптинга. [1]
Первоначально скриптинг ограничивался автоматизацией оболочки операционной системы , а языки были относительно простыми. Сегодня скриптинг более распространен, и некоторые языки включают современные функции, которые позволяют использовать их для разработки приложений, а также для скриптинга.
Язык сценариев может быть языком общего назначения или языком, специфичным для определенной среды. При встраивании в приложение его можно назвать языком расширения .
Язык сценариев иногда называют языком программирования очень высокого уровня , если он работает на высоком уровне абстракции, или языком управления , особенно для языков управления заданиями на мэйнфреймах.
Термин язык сценариев иногда используется в более широком смысле, для обозначения динамических языков программирования высокого уровня в целом. Некоторые из них являются строго интерпретируемыми языками , в то время как другие используют форму компиляции. В этом контексте термин сценарий относится к небольшой программе на таком языке; как правило, содержащейся в одном файле и не превышающей несколько тысяч строк кода.
Область применения скриптовых языков варьируется от малых до больших, от узкоспециализированных языков до языков программирования общего назначения . Язык может начаться как небольшой и узкоспециализированный язык, а затем развиться в переносимый и общецелевой язык; и наоборот, общецелевой язык может позже развить специальные диалекты, узкоспециализированные для определенной области.
Сценарий — это субъективная характеристика, которая обычно включает в себя следующие атрибуты.
Скрипт обычно не компилируется – по крайней мере, в его обычном значении. Обычно они интерпретируются непосредственно из исходного кода или из байт-кода или запускаются как нативные после компиляции just-in-time . [4]
Скрипт, как правило, относительно короткий и простой. Поскольку нет ограничений по размеру или сложности, скрипт субъективен. Несколько строк кода без ветвления, вероятно, считаются скриптом. Кодовая база из нескольких файлов, которая выполняет сложный пользовательский или аппаратный интерфейс или сложные алгоритмы или многопрограммирование , вероятно, не считается скриптом.
Скрипт обычно автоматизирует задачу, которую в противном случае человек выполнил бы вручную.
Язык, который в первую очередь предназначен для написания скриптов, как правило, имеет ограниченные возможности по сравнению с языком общего назначения. Скриптовый язык может не иметь функциональности для написания сложных приложений.
Обычно выполнение скрипта начинается с первой строки кода, тогда как приложение обычно запускается в особой точке кода, называемой точкой входа .
Например, Java не является скриптоподобным, поскольку приложение начинается с названной функции main
, которая не обязательно должна быть в верхней части кода. Следующий код начинается с main
, затем вызывает , printHelloWorld
которая печатает "Hello World".
public class HelloWorld { public static void printHelloWorld () { System.out.println ( " Hello World" ) ; } public static void main ( String [] args ) { printHelloWorld ( ) ; } }
Напротив, следующий код Python выводит «Hello World» без main
функции или другого синтаксиса, такого как определение класса, требуемого Java.
печать ( "Привет, мир" )
Скрипты часто создаются или изменяются тем, кто их выполняет, [5] , но они также часто распространяются, например, когда большие части игр написаны на скриптовом языке, в частности, игра T-rex для Google Chrome .
Ранние мэйнфреймы (в 1950-х годах) были неинтерактивными, вместо этого использовалась пакетная обработка . Язык управления заданиями (JCL) компании IBM является архетипом языков, используемых для управления пакетной обработкой. [6]
Первые интерактивные оболочки были разработаны в 1960-х годах для обеспечения удаленного управления первыми системами с разделением времени , и они использовали скрипты оболочки , которые управляли запуском компьютерных программ внутри компьютерной программы, оболочки. Кэлвину Мурсу в его языке TRAC обычно приписывают изобретение подстановки команд , возможности встраивать команды в скрипты, которые при интерпретации вставляют строку символов в скрипт. [7] Multics называет эти активные функции . [8] Луи Пузен написал ранний процессор для командных скриптов под названием RUNCOM для CTSS около 1964 года. Стюарт Мадник из MIT написал язык сценариев для CP/CMS IBM в 1966 году. Первоначально он назвал этот процессор COMMAND, позже переименованный в EXEC . [9] Multics включал ответвление CTSS RUNCOM, также называемое RUNCOM. [10] EXEC в конечном итоге был заменен на EXEC 2 и REXX .
Такие языки, как Tcl и Lua, были специально разработаны как языки сценариев общего назначения, которые можно было бы встроить в любое приложение. Другие языки, такие как Visual Basic for Applications (VBA), обеспечивали сильную интеграцию с автоматизированными средствами базовой системы. Встраивание таких языков сценариев общего назначения вместо разработки нового языка для каждого приложения также имело очевидные преимущества, избавляя разработчика приложения от необходимости кодировать переводчик языка с нуля и позволяя пользователю применять полученные навыки в другом месте.
Некоторое программное обеспечение включает несколько различных языков сценариев. Современные веб-браузеры обычно предоставляют язык для написания расширений для самого браузера и несколько стандартных встроенных языков для управления браузером, включая JavaScript (диалект ECMAScript ) или XUL .
Скриптовые языки можно разделить на несколько различных типов, которые во многом совпадают.
Скриптинг часто противопоставляется системному программированию , как в дихотомии Оустерхаута или « программирование в большом и программирование в малом ». С этой точки зрения скриптинг — это связующий код , соединяющий программные компоненты , а язык, специализированный для этой цели, — это связующий язык . Конвейеры и скриптинг оболочки являются архетипическими примерами связующих языков, и Perl изначально был разработан для выполнения этой же роли. Веб-разработку можно считать использованием связующих языков, взаимодействующих между базой данных и веб-сервером . Но если существенный объем логики написан в скрипте, его лучше охарактеризовать как просто еще один программный компонент, а не «клей».
Связующие языки особенно полезны для написания и поддержки:
Примеры языка склеивания:
Макроязыки , открытые для компонентов операционной системы или приложения, могут служить связующими языками. К ним относятся Visual Basic for Applications , WordBasic , LotusScript , CorelScript, Hummingbird Basic, QuickScript, Rexx, SaxBasic и WinWrap Basic. Другие инструменты, такие как AWK, также могут считаться связующими языками, как и любой язык, реализованный движком Windows Script Host (VBScript, JScript и VBA по умолчанию в Windows и сторонние движки, включая реализации Rexx, Perl, Tcl, Python, XSLT, Ruby, Modern Pascal, Delphi и C). Большинство приложений могут получать доступ к компонентам операционной системы и использовать их через объектные модели или свои собственные функции.
Другие устройства, такие как программируемые калькуляторы, также могут иметь языки-склеиватели; операционные системы КПК, такие как Windows CE, могут иметь доступные собственные или сторонние макросы, которые склеивают приложения, в дополнение к реализациям распространенных языков-склеивателей, включая Windows NT , DOS и некоторые оболочки Unix , Rexx, Modern Pascal, PHP и Perl. В зависимости от версии ОС доступны WSH и скриптовые движки по умолчанию (VBScript и JScript).
Программируемые калькуляторы могут быть запрограммированы на связующих языках тремя способами. Например, Texas Instruments TI-92 по умолчанию может быть запрограммирован с помощью языка командных скриптов. Включение языка скриптов и связующего языка Lua в серию калькуляторов TI-NSpire можно рассматривать как преемника этого. Основные встроенные языки программирования высокого уровня большинства графических калькуляторов (чаще всего варианты Basic, иногда производные Lisp и реже производные C) во многих случаях могут склеивать функции калькулятора, такие как графики, списки, матрицы и т. д. Доступны сторонние реализации более полной версии Basic, которые могут быть ближе к вариантам, перечисленным в качестве связующих языков в этой статье, а также упоминаются попытки реализовать Perl, Rexx или различные оболочки операционной системы на графических калькуляторах TI и HP. Кросс-компиляторы C на базе ПК для некоторых машин TI и HP, используемые с инструментами, которые преобразуют между C и Perl, Rexx, AWK и скриптами оболочки в Perl, Modern Pascal, VBScript в Perl и обратно, позволяют писать программы на связующем языке для последующей реализации (в виде скомпилированной программы) на калькуляторе. [ необходима ссылка ]
Ряд текстовых редакторов поддерживают макросы, написанные либо с использованием макроязыка, встроенного в редактор, например, The SemWare Editor (TSE), vi improved (VIM), либо с использованием внешней реализации, например, XEDIT , или и того, и другого, например, KEDIT . Иногда текстовые редакторы и макросы редактирования используются под капотом для предоставления других приложений, например, FILELIST и RDRLIST в CMS .
Основной класс языков сценариев вырос из автоматизации управления заданиями , которая относится к запуску и управлению поведением системных программ [15] (в этом смысле можно думать об оболочках как о потомках JCL от IBM, или Job Control Language , который использовался именно для этой цели). Многие из интерпретаторов этих языков дублируют интерпретаторы командной строки, такие как оболочка Unix или MS-DOS COMMAND.COM
. Другие, такие как AppleScript, предлагают использование команд, похожих на английские, для создания скриптов.
С появлением графических пользовательских интерфейсов появился специализированный вид языка сценариев для управления компьютером. Эти языки взаимодействуют с теми же графическими окнами, меню, кнопками и т. д., что и пользователь-человек. Они делают это, имитируя действия пользователя. Эти языки обычно используются для автоматизации действий пользователя. Такие языки также называются « макросами », когда управление осуществляется посредством имитированных нажатий клавиш или щелчков мыши, а также нажатия или прикосновения к сенсорному экрану.
Эти языки в принципе могут использоваться для управления любым приложением GUI; но на практике их использование ограничено, поскольку для их использования требуется поддержка со стороны приложения и операционной системы . Из этого ограничения есть несколько исключений. Некоторые языки сценариев GUI основаны на распознавании графических объектов из пикселей экрана дисплея . Эти языки сценариев GUI не зависят от поддержки со стороны операционной системы или приложения.
Если графический интерфейс пользователя предоставляет соответствующие интерфейсы, как в IBM Workplace Shell , для написания сценариев графического интерфейса пользователя можно использовать универсальный язык сценариев, например OREXX .
Языки, специфичные для приложений, можно разделить на множество различных категорий, то есть автономные языки приложений (исполняемые) или внутренние языки, специфичные для приложений (postscript, xml, gscript, как некоторые из широко распространенных скриптов, соответственно реализованных Adobe, MS и Google), среди прочего, включают идиоматический язык сценариев, адаптированный к потребностям пользователя приложения. Аналогично, многие системы компьютерных игр используют собственный язык сценариев для выражения запрограммированных действий неигровых персонажей и игровой среды. Языки такого рода предназначены для одного приложения; и, хотя они могут внешне напоминать определенный язык общего назначения (например, QuakeC , созданный по образцу C), у них есть собственные функции, которые их отличают. Emacs Lisp , хотя и является полностью сформированным и функциональным диалектом Lisp , содержит много специальных функций, которые делают его наиболее полезным для расширения функций редактирования Emacs. Свойственный для приложения язык сценариев можно рассматривать как язык программирования, специфичный для определенной области, специализированный для одного приложения.
Ряд языков были разработаны с целью замены прикладных скриптовых языков, чтобы быть встраиваемыми в прикладные программы. Программист приложений (работающий на C или другом системном языке) включает «зацепки», где скриптовый язык может управлять приложением. Эти языки могут быть технически эквивалентны прикладному расширенному языку, но когда приложение встраивает «общий» язык, пользователь получает преимущество в виде возможности переносить навыки из приложения в приложение. Более общая альтернатива — просто предоставить библиотеку (часто библиотеку C), которую язык общего назначения может использовать для управления приложением, не изменяя язык для конкретной области.
JavaScript начинался как язык для написания скриптов в веб-браузерах и в первую очередь до сих пор является им ; однако стандартизация языка как ECMAScript сделала его популярным как встраиваемый язык общего назначения. В частности, реализация Mozilla SpiderMonkey встроена в несколько сред, таких как Yahoo! Widget Engine . Другие приложения, встраивающие реализации ECMAScript, включают продукты Adobe Adobe Flash ( ActionScript ) и Adobe Acrobat (для написания скриптов в файлах PDF ).
Tcl был создан как язык расширения, но стал чаще использоваться как язык общего назначения в ролях, схожих с Python , Perl и Ruby . С другой стороны, Rexx изначально был создан как язык управления заданиями, но широко используется как язык расширения, а также как язык общего назначения. Perl является языком общего назначения, но имел диалект Oraperl (1990), состоящий из двоичного файла Perl 4 с скомпилированным Oracle Call Interface . Однако с тех пор он был заменен библиотекой (модулем Perl), DBD::Oracle. [16] [17]
Другие сложные и ориентированные на задачи приложения могут включать и раскрывать встроенный язык программирования, чтобы предоставить своим пользователям больше контроля и предоставить им больше функциональности, чем может быть доступно через пользовательский интерфейс, независимо от того, насколько он сложен. Например, инструменты разработки Autodesk Maya 3D встраивают встроенный язык Maya или Blender , который использует Python для выполнения этой роли.
Некоторые другие типы приложений, которым требуется более быстрое добавление функций или циклы настройки и запуска (например, игровые движки ), также используют встроенный язык. Во время разработки это позволяет им быстрее прототипировать функции и настраивать их более свободно, без необходимости для пользователя иметь глубокие знания о внутренней работе приложения или перестраивать его после каждой настройки (что может занять значительное количество времени). Языки сценариев, используемые для этой цели, варьируются от более распространенных и известных Lua и Python до менее известных, таких как AngelScript и Squirrel .