Скрипты: введение для начинающих

Что такое скрипт

Командная строка и утилиты командной строки во многих задачах оказываются значительно более удобным средством, чем самый изощренный графический интерфейс. Повторяющиеся действия, особенно если они осложнены минимальной логикой, оказываются простыми с точки зрения средств командной строки и весьма сложными и нередко требующими специфической поддержки с точки зрения GUI.

Для эффективного использования командной строки необходим т.н. «язык-клей», позволяющий связывать («склеивать») последовательности команд операционной системы и вызовов утилит в единую программу. Такой «язык-клей» часто называют скриптовым языком, а написанные на нем программы — скриптами. На скриптовые языки часто также возлагают простые задачи по преобразованию данных из выходного формата одной программы во входной формат другой.

В каждой операционной системе есть свой основной скриптовой язык, обычно называемый языком командного интерпретатора. Удобство и выразительная сила таких языков может изменяться от системы к системе в очень широких пределах. Убогий и эклектичный командный язык интерпретатора cmd характерен для платформы win32; мощный, но чрезвычайно запутанный (и тоже эклектичный) язык интерпретатора bash характерен для unix-подобных систем. В обоих случаях стандартный скриптовой язык не обеспечивает удобной среды для выполнения повседневных задач средней сложности.

В последнее время наблюдается тенденция перехода к использованию для написания скриптов специфических скриптовых языков, сочетающих удобный доступ к ресурсам операционной системы с продуманным синтаксисом и удобными встроенными структурами данных. Одним из первых таких языков был интерпретируемый язык Perl.

Следует отметить, что выше говорилось только о скриптах, автоматизирующих те рутинные операции, которые обычно выполняются пользователем в среде командного интерпретатора операционной системы. В этом случае скрипт фактически выполняет последовательность файловых операций, которые при обычном подходе пользователь мог бы вводить вручную с консоли. Тем не менее, скрипты и скриптовые языки используются не только в этом контексте.

Встраивание и расширение

Часто нам приходится иметь дело с программой, предоставляющей некоторый набор возможностей по оперированию интересующими нас объектами. Например, графический редактор предоставляет пользователю набор операций, которые можно производить над изображениями. В этом случае программу можно назвать исполнителем, а набор выполняемых исполнителем операций — интерфейсом исполнителя.

Если с точки зрения пользователя интерфейс исполнителя представлен с помощью GUI, то для выполнения каждой операции требуются некоторые ручные манипуляции и автоматизировать повторяющиеся рутинные операции практически невозможно. С другой стороны, программа может предоставлять свой интерфейс таким образом, что к нему можно получить доступ снаружи — из командного интерпретатора системы или непосредственно из скриптового языка. В этом случае автоматизация рутинных операций не является проблемой.

В простейшем случае интерфейс исполнителя может быть представлен в виде набора команд, выполняемых утилитой командной строки. В этом случае мы получаем возможность выполнять произвольные последовательности операций (команд исполнителя) как из командного интерпретатора операционной системы, так и из любого скриптового языка. Реже команды исполнителя делаются доступными непосредственно из некоторого скриптового языка, выбранного разработчиками программы. В этом случае скрипты часто оказываются более эффективными, но пользователь бывает вынужден использовать выбранный разработчиками скриптовой язык.

Таким образом, под скриптом можно понимать программу, оперирующую объектами с помощью операций, реализация которых предоставляется ей другой программой или набором программ. При этом программа, предоставляющая свои операции скрипту, выступает в роли скрипт-сервера, предоставляющего свой сервис исполняющей системе (интерпретатору) скриптового языка, выступающей в роли клиента.

Взаимодействие между скрипт-сервером и скриптовым языком с технической точки зрения может быть реализовано различными способами. Две наиболее общие стратегии организации такого взаимодействия обычно называют встраиванием (embedding) и расширением (extending). Под встраиванием понимают включение исполняющей системы скриптового языка в состав программы, предоставляющей скрипту свою функциональность. Под расширением понимают включение функциональности программы-сервера в состав исполняющей системы скриптового языка. Скриптовые языки, ориентированные на встраивание, обычно оказываются значительно более «легкими» в смысле размера и сложности их исполняющей системы. Языки, ориентированные на расширение, имеют тенденцию обрастать модулями, реализующими различную общеупотребительную функциональность, а их исполяющая система со временем становится все более сложной и массивной.

awk

Если не рассматривать различные командные интерпретаторы, встроенные в операционные системы, то одним из первых скриптовых языков был язык awk, реализованный в одноименной утилите. Очень часто популярности скриптового языка способствует наличие функциональности, изначально встроенной (расширение) в его исполняющую систему. В случае awk такой встроенной функциональностью стали операции с текстовыми табличными данными. Задачи обработки текстовой информации, представленной набором строк (записи), разделенных на поля, широко распространены и awk стал одним из самых удобных инструментов для обработки текстов.

Поскольку awk содержит средства для взаимодействия с операционной системой, его можно считать скриптовым языком общего назначения, но рудиментарность этих средств делает его использование неудобным уже в случае задач средней сложности. Сам язык awk также обладает ограниченными выразительными возможностями, что делает его непригодным для решения относительно больших задач. Понимание ограниченности языка awk привело к разработке одного из первых скриптовых языков общего назначения Perl, в котором были развиты идеи, заложенные в awk.

Lua и другие языки

Сейчас доступно несколько десятков скриптовых языков, среди котоорых наибольшей популярностью пользуются такие языки как Perl, Lua, Ruby и Python. Выбор скриптового языка в основном определяется решаемыми задачами.

Мне кажется, что для скриптового языка важнейшим требованием является простота самого языка и его исполняющей системы. Если язык будет сложным то на его изучение потребуется много времени, а при практическом использовании синтаксис будет постоянно забываться и снова придется тратить время, каждый раз обращаясь к руководству. Другим требованием является наличие удобного доступа к основным ресурсам окружения — файлам (ввод/вывод) и процессам (запуск программ и получение данных через конвейеры) и предоставлять удобные средства для работы с текстом (разбиение строки на поля, регулярные выражения).

От использования языка Perl я отказался из-за его сложности и эклектичности, а от Ruby — из-за сложности и «изощренности». Python оказался ближе всего к оптимальному решению, но и он показался мне слишком тяжеловесным и не без синтаксических странностей. В результате я остановился на языке Lua, который изначально ориентирован на встраивание в приложения. Мне кажется, что именно этот язык реализует разумный компромисс между простотой языка и полнотой его библиотеки (или все же с некоторым уклоном в простоту).

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License