Скриптовые языки

В последнее время в связи развитием - интернет-технологий, широким использованием высокопроизводительных компьютеров и рядом других факторов получили распространение так называемые скриптовые языки. Эти языки первоначально ориентировались на использование в качестве внутренних управляющих языков во всякого рода сложных системах.

Многие из них, однако, вышли за пределы сферы своего изначального применения и используются ныне в совсем иных областях. Характерными особенностями данных языков являются, во-первых, их интерпретируемость (компиляция либо невозможна, либо нежелательна1), во-вторых, простота синтаксиса, а в-третьих, легкая расширяемость. Таким образом, они идеально подходят для использования в часто изменяемых программах, очень небольших программах или в случаях, когда для выполнения операторов языка затрачивается время, несопоставимое со временем их разбора. Было создано достаточно большое количество таких языков, перечислим лишь основные и наиболее часто используемые.

JavaScript

Язык был создан в компании Netscape

- Communications в качестве языка для

описания сложного поведения веб-страниц. Интерпретируется браузером во время отображения веб-страницы. По синтаксису схож с Java и отдаленно с C/C+ + . Имеет возможность использовать встроенную в браузер объектную функциональность, однако подлинно объектно-ориентированным языком не является.

VBScript

Язык был создан в корпорации Micro-

- soft во многом в качестве альтернативы

JavaScript. Имеет схожую область применения. Синтаксически схож с языком Visual Basic и является его усеченной версией. Так же, как

1 О компиляции и интерпретации рассказывается в следующем разделе.

и JacaScript, исполняется браузером при отображении веб-страниц и имеет ту же степень объектной ориентированности.

Язык создавался в помощь системному администратору ОС Unix для обра--

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

Python

Интерпретируемый объектно-ориентированный язык программирования.-

По структуре и области применения близок к Perl, однако более строг и логичен. Имеются реализации для большинства существующих платформ.

Объектно-ориентированный под- Объектно-

ход, пришедший на смену структурному, ориентированные языки впервые появился в языке СИМУЛА (Sim-

ula, 1967). Этот язык был предназначен для моделирования различных объектов и процессов, и объектно-ориентированные черты появились в нем именно для описания свойств модельных объектов.

Популярность объектно-ориентированному программированию (ООП) принес язык Smalltalk, созданный в 1972 г. Язык предназначался для проектирования сложных графических интерфейсов и был первым по-настоящему объектно-ориентированным языком. В нем классы и объекты — единственные конструкции программирования. Большим недостатком Smalltalk являются большие требования к памяти и низкая производительность полученных программ.

Существует язык с очень хорошей реализацией объектно-ори- ентированности, не являющийся надстройкой ни над каким другим языком. Это язык Eiffel (1986). В настоящее время существует реализация Eiffel для Microsoft.NET.

Большинство компьютерных архи- Языки параллельного

тектур и языков программирования ори- программирования

ентированы на последовательное выпол-

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

Язык Occam был создан в 1982 г. и предназначен для программирования транспьютеров — многопроцессорных систем распределенной обработки данных. Он описывает взаимодействие параллельных процессов в виде каналов — способов передачи информации от одного процесса к другому.

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

Неимперативные языки Все языки> ° которых шла речь ранее, - имеют одно общее свойство: они реализуют императивную парадигму. Это означает, что программы на них в конечном итоге представляют собой пошаговое описание решения той или иной задачи. Можно попытаться описывать лишь постановку проблемы, а решать задачу поручить компилятору. Существует два основных подхода, развивающие эту идею: функциональное и логическое программирование.

Функциональные языки Основная идея, лежащая в основе функ-

- ционального программирования, —

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

В конце 1950-х гг. появился язык ЛИСП (LISP — List Information Symbol Processing, язык для обработки списков) для работы со строками символов. Это особое предназначение ЛИСПа открыло для программистов новую область деятельности, известную ныне как «искусственный интеллект». В настоящее время ЛИСП успешно применяется в экспертных системах, системах аналитических вычислений и т.п.

Обширность области возможных приложений ЛИСПа вызвала появление множества различных диалектов ЛИСПа. Это легко объяснимо: применение ЛИСПа для понимания естественного языка требует определенного набора базисных функций, отличных, например, от используемого в задачах медицинской диагностики. Потомки ЛИСП — Planner (1967), Scheme (1975), Common Lisp (1984). Последний был принят в университетах США, а также многими разработчиками систем искусственного интеллекта в качестве основного диалекта языка ЛИСП. Многие его черты были унаследованы современными языками функционального программирования.

Кроме перечисленных, можно упомянуть ML и два его современных диалекта — Standard ML (SML) и CaML. Последний имеет объектно-ориентированного потомка — Objective CaML (O’CaML), а также Haskell и его более простой диалект Clean.

Согласно логическому подходу к про- Языки логического

граммированию, программа представ- программирования

ляет собой совокупность правил, или

логических высказываний. Кроме того, в программе допустимы логические причинно-следственные связи. Таким образом, языки логического программирования базируются на классической логике и применимы для систем логического вывода, в частности, для так называемых экспертных систем. На языках логического программирования естественно формализуется логика поведения, и они применимы для описаний правил принятия решений, например, в системах, ориентированных на поддержку бизнеса.

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

Программы на языках логического программирования выражены как формулы математической логики, а компилятор пытается получить следствия из них. Родоначальником большинства языков логического программирования является язык ПРОЛОГ (Prolog, 1971). У него есть ряд потомков — Parlog (1983, ориентирован на параллельные вычисления), Delta Prolog и др.

ПРОЛОГ — это язык, предназначенный для поиска решений. Это декларативный язык, т.е. формальная постановка задачи может быть использована для ее решения. ПРОЛОГ определяет логические отношения в задаче как отличные от пошагового решения этой задачи.

Центральной частью ПРОЛОГа являются средства логического вывода, которые решают запросы, используя заданное множество фактов и правил, к которым обращаются как к утверждениям. ПРОЛОГ также не имеет деления переменных на типы и может динамически добавлять правила и факты к средствам вывода.

Для удобства восприятия приведем таблицу с характеристиками основных языков программирования (табл. 2.1).

Таблица 2.1. Характеристика основных языков программирования

Язык

Основное использование

Описание

Ada

В оборонной промышленности

Высокого уровня

АССЕМБЛЕР

Для работ, требующих детального контроля за аппаратным обеспечением, быстрого исполнения и программ малого размера

Быстрый и эффективный, но требующий определенных усилий и навыков

БЕЙСИК

В образовании, бизнесе, дома

Прост в изучении

С

В системном, универсальном программировании

Быстрый и эффективный, широко используется как универсальный язык

C++

В объектно-ориентированном программировании

Основан на языке С

КОБОЛ

В программировании в бизнесе

Жестко ориентирован на коммерческие задачи, легко научиться, но очень много операторов

ФОРТРАН

Для научной работы и вычислений

Основан на математических формулах

ЛИСП

Для искусственного интеллекта

Язык символов с репутацией трудно изучаемого

МОДУЛА-2

В системном программировании, программировании в режиме реального времени и универсальном программировании

Высоко структурирован, разработан взамен ПАСКАЛя

Окончание табл. 2.1

Язык

Основное использование

Описание

ОБЕРОН

В универсальном программировании

Небольшой, компактный язык, соединяющий многие черты ПАСКАЛЯ и МОДУЛЫ-2

ПАСКАЛЬ

Универсальный язык

Высоко структурирован

ПРОЛОГ

Для искусственного интеллекта

Символьно-логическая система программирования, в начале предназначенная для решения теорем, но сейчас использующаяся чаще для решения задач, связанных с искусственным интеллектом

Существует множество классифика- Классификация языков ций языков программирования по раз- программирования

личным критериям. Самое простое деле- ние — на языки высокого и низкого уровня.

Язык низкого уровня — это язык программирования, предназначенный для определенного типа компьютера и отражающий его внутренний машинный код; языки низкого уровня часто называют машинно-ориентированными языками. Их сложно конвертировать для использования на компьютерах с разными центральными процессорами, а также довольно сложно изучать, поскольку для этого требуется хорошо знать внутренние принципы работы компьютера.

Язык высокого уровня — это язык программирования, предназначенный для удовлетворения требований программиста; он не зависит от внутренних машинных кодов компьютера любого типа. Языки высокого уровня используют для решения проблем, и поэтому их часто называют проблемно-ориентированными языками. Каждая команда языка высокого уровня эквивалентна нескольким командам в машинных кодах, поэтому программы, написанные на языках высокого уровня, более компактны, чем аналогичные программы в машинных кодах.

Другая классификация делит языки на вычислительные и языки символьной обработки. К первому типу относят ФОРТРАН, ПАСКАЛЬ, АЛГОЛ, БЕЙСИК, С, ко второму — ЛИСП, ПРОЛОГ, СНОБОЛидр.

Классификация языков программирования по типам задач приведена в табл. 2.2.

Таблица 2.2. Классификация языков программирования по типам задач

Тип задачи

Языки программирования

Задачи искусственного интеллекта

ЛИСП, ПРОЛОГ, Common Lisp, РЕФАЛ, Planner, QLisp

Параллельные вычисления

Fun, Apl, ML, SML, Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН

Задачи вычислительной математики и физики

Occam, Actus, параллельный КОБОЛ, ОВС-АЛГОЛ, ОВС-ФОРТРАН

Разработка интерфейса, программ-оболочек, систем

Forth, С, C++, АССЕМБЛЕР, МАКРОАССЕМБЛЕР, СИМУЛА-67, OAK, Smalltalk, Java, РПГ

Задачи вычислительного характера

АЛГОЛ, ФОРТРАН, КОБОЛ, Ada, PL/1, БЕЙСИК, ПАСКАЛЬ

Оформление документов, обработка больших текстовых файлов, организация виртуальных трехмерных интерфейсов в Интернете, разработка БД

HTML, Perl, SQL, Informix 4GL, Natural, DDL, DSDL, SEQUEL

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

В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий. В эту большую группу входят, например, ПАСКАЛЬ, С, АДА, ПЛ/1, ФОРТРАН и БЕЙСИК.

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

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

Более подробно о парадигмах рассказывается в гл. 6.

и циклов в классических функциональных языках нет. Представителями этой группы являются ЛИСП, ML и Haskell.

В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается ПРОЛОГ. Построение логической программы вообще не требует алгоритмического мышления, программа описывает статические отношения объектов, а динамика находится в механизме перебора и скрыта от программиста.

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

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >