Программисты предпочитают избавиться от излишне сложных и устаревших методик и стремятся использовать подходы, позволяющие упростить и ускорить разработку. Как следствие, многие из них все чаще отдают предпочтение динамическим языкам программирования, таким как JavaScript, Perl, Python и Ruby.
Эксперты по программному обеспечению так и не пришли к единому определению динамического языка, однако, по существу, такой язык позволяет создавать программы, способные менять свой код и логические структуры во время исполнения, добавляя при этом различные типы, имена модулей, классы и функции. Зачастую эти языки являются интерпретируемыми и, как правило, проверяют типы во время исполнения.
Динамические языки становятся альтернативой более широко применяемым статическим языкам, таким как C++ и Java. Программы, написанные на статических языках, содержат неизменный код и логические структуры, которые остаются таковыми до тех пор, пока программист их не модифицирует. Статические языки по большей части являются компилируемыми. Обычно они предполагают проверку типов на этапе компиляции, прежде чем программа начнет выполняться.
Опрос, проведенный консалтинговой компанией Tiobe Software, составившей индекс популярности языков программирования, показал, что самыми популярными остаются языки Си, C++ и Java. Однако тот же самый опрос свидетельствует о том, что уровень использования динамических языков быстро растет.
Разработчики все чаще отдают предпочтение подходам, которые предусматривают использование динамических языков. Среди этих подходов AJAX (Asynchronous JavaScript and XML), LAMP (Linux; Web-сервер Apache; СУБД MySQL, а также Perl, PHP или Python) и Ruby on Rails. К тому же крупные компании, в том числе Microsoft и Sun Microsystems, поддерживают динамические языки в своих платформах разработки.
Автор языка Python Гвидо ван Россум, в настоящее время работающий в компании Google с исследованиями, связанными с разработкой, подчеркивает, что динамические языки обладают большей гибкостью, чем статические, и позволяют разработчикам писать более функционально насыщенный код, причем быстрее и проще. Кроме того, подчеркнул старший аналитик исследовательской компании Blackfriars Communications Карл Хоув, давно занимающийся вопросами развития ядра ОС Unix, многие динамические языки являются свободно распространяемыми, что дает им дополнительное преимущество в глазах разработчиков.
Как заметил Ден Уоллек, профессор университета Райса, сейчас разработчики могут выбрать из широкого круга динамических и статических языков программирования тот, который наилучшим образом соответствует их требованиям.
Динамические языки
Типизация— главный, но не единственный фактор, определяющий, является ли язык динамическим.
Типизация
В программировании система типов языка определяет классификацию схожих значений и выражений, способов работы с ними и их взаимодействие друг с другом. Как правило, она предполагает описание структур данных, которые поддерживает язык.
Статические языки в большинстве своем (но не всегда) поддерживают строгую и статическую систему типов. Динамические языки, как правило (но тоже не всегда), слабо и динамически типизированы. К примеру, некоторые динамические языки, такие как Lisp, строго типизированы; некоторые статические языки, такие как Си и C++, слабо типизированы.
Программы, написанные на статически типизированных языках, явно декларируют (но не обязательно определяют) переменные перед их использованием. Многим программистам нравится структура, которая требует декларации переменных.
В программах, созданных на динамически типизированных языках, переменные должны быть определены (но не явно декларированы) перед их использованием. Это избавляет от необходимости писать слишком длинный код — многим программистам нравится возможность использовать переменную тогда, когда она требуется, без обязательной ее предварительной декларации.
Языки программирования, в которых переменным приписаны конкретные типы данных, считаются строго типизированными. В слабо типизированных языках переменные не связаны с конкретным типом данных, что опять-таки допускает большую гибкость, но снижает уровень структурированности программ.
Достоинства и недостатки статических и динамических языков
Строгая типизация предусматривает существование правил, определяющих, что именно может программа делать с различными элементами во время компиляции при выявлении и корректировке ошибок, связанных с типами.
Слабая типизация допускает некоторые заранее оговоренные исключения из правил определения типов или использует механизм нарушения типа — обычно для тех случаев, когда конкретное отклонение от правила не приведет к ошибкам в программе. Слабая типизация предусматривает исправление ошибок, связанных с типами, которые не приведут к появлению исключений во время выполнения программы.
Это позволяет избежать дополнительных расходов на коррекцию во время компиляции тех «ошибок», которые не вызовут проблем в конкретной программе. Однако, как заметил Дейбел, в случае строгой типизации удается обнаружить ошибки быстрее — еще во время компиляции, что намного эффективнее.
Автор платформы Ruby on Rails Дэвид Хайнмейер Хенссон, один из руководителей компании 37signals, занимающейся разработкой Web-приложений, заметил, что применение в процессе разработки всех правил статической типизации может привести к неоправданным задержкам при выполнении проектов и получении их результатов.
Хоув тоже считает, что динамические языки позволяют разработчикам быстрее добиваться результатов.
Код в этих случаях получается более компактным, поскольку, например, в нем отсутствуют обязательные декларации типов переменных. Это позволяет разработчикам эффективно декларировать команды с помощью кода небольшого объема (а не детального, сугубо специфического программирования), что значительно ускоряет процесс создания приложения.
Дейбел отметил, что объем кода приложения, написанного на Python, будет на 10-20% меньше, чем если бы оно было написано на Java или C++.
По словам Хенссона, возможность писать код быстро и эффективно избавляет программистов от детальной и повторяющейся работы и позволяет им сосредоточится на более творческих задачах.
На это Хеттон возражает, что программы, написанные на многих динамических языках, трудно протестировать в такой мере, чтобы можно было рискнуть воспользоваться ими для создания критически важных для бизнеса приложений.
Кроме того, как исторически сложилось, программы, написанные на динамических языках, работают медленнее, чем программы, для которых использованы статические языки, что объясняется дополнительной нагрузкой, возникающей из-за добавочных проверок во время исполнения.
«Дополнительная информация, собираемая во время исполнения и необходимая для проверки в динамических языках, может привести к значительному увеличению объема используемой памяти», — подчеркнул ван Россум.
Также следует учесть, заметил Джейсон Макконнелл, менеджер по продуктам подразделения разработчиков корпорации Microsoft, что возрастает нагрузка на центральный процессор, которому приходится анализировать больше инструкций для выполнения всех необходимых проверок во время исполнения программы.
Однако все эти проблемы теряют свою остроту с появлением все более быстрых процессоров и модулей памяти большей емкости.
Большая гибкость
Поскольку в приложениях, написанных на динамических языках, не требуется явно декларировать переменные и некоторые другие структурные элементы до их использованию, программы могут «на лету» определять типы переменных, имена модулей, классы и функции, тем самым позволяя программистам действовать более гибко.
Однако это также означает, что динамические языки не очень хорошо подходят для таких применений, как системное программирование, которое требует статических типов и интерфейсов.
При использовании динамических языков разработчики могут не определять тип переменной, интерфейс или абстрактный класс, в то время как в статических языках это не допускается и часто считается плохим стилем программирования. В некоторых программах, однако, все это может стать необходимым, поскольку такое решение может оказаться эффективным и не вызывать проблем, связанных с разработкой.Динамические языки
Динамические языки, по словам Хоува, вещь далеко не новая. К примеру, APL и Lisp были разработаны еще в конце 50-х годов. С того времени появилось множество других языков, в том числе ABAP, Groovy, SAS и Tcl; часть из них, как показывает таблица, становятся очень популярными.
JavaScript и ECMAScript
В 1995 году компания Netscape Communications создала строго типизированный язык скриптов JavaScript, слабо связанный с языком Java, тоже поддерживающим строгую типизацию. Его можно встраивать в HTML-код Web-страницы, что позволяет добавлять динамический контент, который может реагировать на движение мыши и другие действия пользователя.
ECMAScript, одобренный ISO и европейской организацией по стандартизации ECMA, представляет собой кроссплаторменный язык скриптов общего назначения. Он создан для того, чтобы объединить основные базовые элементы JavaScript, и сравним с Jscript корпорации Microsoft.
PHP
В 1995 году программист Расмус Лердорф предложил PHP, самый популярный из динамических языков, согласно данным опроса Tiobe.
PHP (первоначально это название расшифровывалось как personal home page, «персональная домашняя страница») представляет собой свободно распространяемый серверный кроссплатформенный объектно-ориентированный язык скриптов, предназначенный для создания динамических Web-страниц. Пользователи добавляют код PHP в HTML-код страницы.
Расширение PHP Data Objects определяет простые и согласованные интерфейсы для доступа к различным реляционным базам данных.
Компания Zend Technologies, выпускающая продукты и сервисы PHP, сотрудничает с корпорацией Microsoft, благодаря чему этот язык поддерживается в операционной системе Windows.
Perl
В 1987 году Ларри Уолл представил Practical Extraction and Reporting Language (www.perl.org).
Perl — это базирующийся на Unix, свободно распространяемый интерпретируемый серверный язык программирования, предназначенный для написания Web-скриптов. Первоначально созданый для обработки текстов и манипулирования ими, сейчас он активно используется в Web-формах. Разработчики применяют Perl для решения самых разных задач, таких как разработка Web-приложений и графического пользовательского интерфейса, и для сетевого программирования.
Perl поддерживает процедурный, объектно-ориентированный и функциональный подходы программирования, а также автоматическое управление памятью.
Python
Ван Россум создал Python (www.python.org) в 1990 году. Это свободно распространяемый интерпретируемый объектно-ориентированный язык с динамической типизацией, похожий на Perl. Язык Python, который ван Россум назвал в честь популярного телевизионного шоу «Летающий цирк Монти Питона» (Monte Python’s Flying Circus), удобен для восприятия и известен своим ясным и простым синтаксисом.
Это легко переносимый язык; многие операционные системы, в том числе Mac OS, Unix и Windows, могут интерпретировать его операторы.
Python поддерживает структурное программирование и имеет возможности, которые используются в функциональном и аспектно-ориентированном программировании. С помощью различных расширений Python поддерживает и другие подходы программирования.
Разработчики, в том числе и специалисты Google, используют гибкий Python для создания различных видов приложений.
Ruby
Специалист в области информационных систем Юкихиро Матсумото публично представил Ruby в 1995 году.
Ruby похож на Perl и Smalltalk. Это свободно распространяемый интерпретируемый полностью объектно-ориентированный язык. Он известен своей ясностью, точностью, согласованностью, структурированностью и расширяемостью. Ruby легко переносится на различные операционные системы — Linux, Mac OS, Unix и Windows.
Ruby можно использовать в экстремальном программировании, поскольку он позволяет разработчикам писать отдельные компоненты приложений на других языках, которые в большей степени отвечают целям проекта.
Ruby поддерживает динамическую типизацию и объектно-ориентированное, процедурное и функциональное программирование.
Расширенная поддержка
Создано несколько набирающих популярность платформ разработки, которые используют динамические языки. Ряд крупных технологических компаний добавили поддержку динамических языков в свои среды разработки. По их расчетам, это должно пробудить в программистах интерес к таким подходам.
LAMP. Платформа LAMP (www.lampware.org) создана для разработки приложений, требующих гибкого подхода, в первую очередь для Web. Последние два года она приобретает все большую популярность, поскольку, как заметил ван Россум, простые Web-приложения действительно нужным многим. С недавнего времени компании начали использовать LAMP для разработки более сложных программ.
AJAX. Набор технологий AJAX, предложенных главным образом в 90-х годах, позволяет создавать Web-приложения, которые работают лучше традиционных Web-программ и, кроме того, внешне и по своему функционированию больше похожи на программное обеспечение для настольных систем.
Seaside. Платформа Seaside (www.seaside.st), выпущенная в 2004 году, представляет собой AJAX-подобную оболочку для создания Web-приложений с помощью динамического языка Smalltalk.
Ruby on Rails. Язык Ruby составляет основу платформы Ruby on Rails, популярность которой растет, поскольку она является свободно распространяемой и удобна в использовании. Платформа Rails использует интегрированные пакеты программирования и готовый код, называемый конвенциями (convention). Хенссон создавал ее так, чтобы она была полной и не требовала никакой предварительной конфигурации. Сторонники Rails считают, что данная платформа лучше подходит для создания инфраструктур, которые передают информацию из базы данных в Web-приложение. Подобные решения используются в электронной коммерции, онлайновых сообществах и для извлечения данных.
Eclipse Foundation. Некоммерческая организация Eclipse Foundation, занимающаяся развитием свободно распространяемой, написанной на Java платформы разработки Eclipse, добавляет к ней PHP-интегрированную среду разработки.
Microsoft. Корпорация Microsoft поддерживает динамические языки, такие как Iron Python, JScript и PHP и предусматривает их использование, например, в среде исполнения CLR (common language runtime) в платформе .NET. Эта среда управляет выполнением программ, написанных на любом из поддерживаемых языков.
В то же время Microsoft предлагает на своем портале совместной разработки CodePlex компилятор Phalanger. Этот компилятор позволяет скриптам на PHP без каких-либо изменений работать в .NET.
Sun. «Из трех компонентов платформы Java — виртуальной машины, прикладных программных интерфейсов и языка — можно заменить именно язык», — подчеркнул Тим Брей, директор Sun Microsystems по Web-технологиям. Он отметил, что Sun намерена реализовать в Java поддержку различных языков, в том числе и динамических.
В настоящее время компания поддерживает JavaScript на своих платформах Java и через интегрированную среду разработки NetBeans. Недавно, по словам Брея, Sun пригласила на работу специалистов для создания Java-реализации Ruby, получившей название JRuby.
Брей, как и многие другие аналитики отрасли и программисты, считает, что динамические языки будут развиваться и дальше, и при этом их популярность и поддержка будут расти. С его мнением, однако, не согласен Хеттон, который утверждает, что динамические языки — это всего лишь современная модная тенденция в сфере разработки программного обеспечения. Брей признает, что многим динамическим языкам не хватает инструментальных средств или производительности, необходимых для создания масштабного программного обеспечения. Однако он считает, что некоторые из черт, дающих им гибкость, постепенно проникают в корпоративные языки, такие как Java, и наделяют их новыми возможностями.
Хоув заключил: «Все эти языки — в конечном итоге — всего лишь средства. Они помогают определенной группе людей выполнять свою работу. Языки — это инструменты для программистов. Меняются задачи — программисты начинают использовать новые языки».
Linda Dailey Paulson, Developers Shift to Dynamic Programming Languages. IEEE Computer, February, 2007. IEEE Computer Society, 2007. All rights reserved. Reprinted with permission.