Файл: Обзор и анализ характеристик языков программирования (подробно).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 06.04.2023

Просмотров: 82

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Универсальные скриптовые языки (Perl, Python) называют склеивающими языками, потому что они создавались для «склеивания» существующих программ в интересах создания единой системы. С ростом Всемирной паутины скриптовые языки получили новый толчок в направлении генерации динамического информационного наполнения сети. Их используют как языки расширения, для настраивания или расширения функциональных возможностей «скриптовых» утилит. В конце 90-х язык Perl был адаптирован для создания веб-скриптов серверной стороны, на которой веб-сервер выполняет программу (на машине сервера) для генерации страницы [10, С. 26]. Конкурентами PHP являются JSP (Серверные Страницы Java) и VBScript (на платформе Microsoft). Для создания скриптов на клиентском компьютере все основные браузеры реализуют язык JavaScript. В качестве языка скриптов можно рассматривать и расширяемый язык стилей для преобразований XSLT. XSLT - это часть растущего семейства утилит для расширенного языка разметки XML.

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

Язык Perl в настоящее время является мощным языком программирования. Изначально, он был комбинацией SH и AWK. Первой программой, написанной на Perl, была утилита для обработки текстовых файлов в среде UNIX. С появлением Всемирной паутины Perl применяется для задания сценариев CGI (интерфейса общего шлюза - Common Gateway Interface). Perl применяется и как язык общего назначения для различных приложений, таких как вычислительная биология и искусственный интеллект. Его называют скриптовым языком, но на самом деле Perl больше похож на императивный язык, так как перед выполнением его программы всегда компилируются (в код на промежуточном языке). Его конструкции рассчитаны на применение в самых различных областях вычислительных задач и имеют ряд особенностей [20, С. 43]. Для переменных в Perl характерны статическая типизация и неявное объявление.

Существуют три категории, обозначаемые первым символом имени переменных. Все имена скалярных переменных начинаются со знака доллара ($), хеш-имена начинаются со знака процента (%), имена массивов начинаются со знака (@). Это соглашение делает имена переменных в программах более читабельными, чем в любом другом языке. Perl имеет большое количество неявных переменных, некоторые используются для хранения параметров Perl. Неявные (скрытые) переменные используются по умолчанию для встроенных функций, имеют имена ($! и @_). Массивы в Perl имеют две особенности: динамическую длину (может увеличиваться и уменьшаться во время исполнения программы) и разреженные массивы (могут быть промежутки между элементами). Perl включает ассоциативные массивы (хеши), их элементы записываются в память и извлекаются с помощью функций хеширования [8, С. 149].


Система Perl применяет хеш-функции и при необходимости увеличивает размер структуры. Ассоциативные массивы называют массивами с адресацией по содержанию. Скалярный тип Perl поддерживает как строки, так и числа хранящиеся в формате с плавающей точкой двойной точности. В зависимости от контекста числа могут преобразовываться в строки, и наоборот. Если строка не может быть конвертирована в число и применяется в числовом контексте, используется ноль, а сообщение об ошибке не формируется. Это соглашение может приводить к ошибкам, которые не обнаруживаются системой периода выполнения. Индексация массивов тоже не проверяется, потому что не задается диапазон индексов [13, С. 70]. Ссылки на несуществующие элементы возвращают значение undef, которое интерпретируется как ноль в числовом контексте. Следовательно, ошибки в доступе к элементам массива не обнаруживаются.

Язык JavaScript первоначально был разработан Бренданом Эйкхом (Brendan Eich) в корпорации Netscape. Сначала он назывался Mocha. Затем его переименовали в LiveScript. В конце 1995 года после добавления новых функций и возможностей LiveScript получил окончательное название JavaScript. После появления первых графических браузеров стали необходимыми вычисления, связанные с документами HTML, которые сами по себе были целиком статичны. Были приняты два решения. Вычисления на стороне сервера обеспечивались интерфейсом общего шлюза CGI, который позволил документам HTML запрашивать исполнения программ на сервере, возвращая результаты в браузер в виде HTML-документов [9, С. 130]. Интерпретатор JavaScript чаще всего встраивается в веб-браузеры. Код JavaScript встраивается в HTML-документы и интерпретируется браузером при отображении документов. Язык JavaScript используется в основном для проверки данных в формах ввода и создания динамических HTML-документов. Java полностью поддерживает объектно-ориентированное программирование, а JavaScript не поддерживает ни наследование, ни динамическое связывание при вызове методов [13, С. 59].

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

Создателем языка PHP (Converse и Park, 2000) является Расмус Лердорф (1994 г). Первой публично распространяемой версией PHP стал пакет под названием Personal Home Page Tools. PHP обеспечивает простой доступ к HTML-формам данных и предоставляет разработчику мощные средства для работы с различными базами данных [10, С. 215]. Сегодня язык PHP разрабатывается, распространяется и поддерживается как продукт с открытым исходным кодом. Процессоры PHP располагаются на большинстве веб-серверов. PHP является скриптовым языком серверной стороны, встраиваемым в HTML предназначенным для веб-приложений. Код интерпретируется на веб-сервере, когда HTML-документ запрашивается браузером. В результате генерируется код HTML, который заменяет код PHP в документе HTML. Таким образом, веб-браузер не видит кода PHP.


Относительно новым объектно-ориентированным и интерпретируемым языком скриптов является Python (Лутц и Ашер, 2004).  Это система с открытым исходным кодом и доступом для наиболее популярных платформ [22, С. 170]. Вместо массивов Python включает в себя три вида структур данных: списки, неизменяемые списки (кортежи), хеши
(словари). Предлагается обширный набор методов для списков: добавление, вставка, сортировка, удаление, набор методов для словарей (ключи, значения, копирование). Кроме того, Python поддерживает списки в стиле языка Haskell, считается объектно-ориентированным языком и включает в себя возможности сопоставления с шаблоном, присущие языку Perl. Для удаления ненужных объектов применяется сборка мусора. Одной из особенностей Python является то, что он может быть легко расширен любым пользователем [11, С. 290]. Модули, поддерживающие расширения, могут быть написаны на любом компилируемом языке. Расширения могут добавлять функции, переменные, типы объектов и реализоваться в виде дополнений к интерпретатору языка Python. Поддержка CGI программирования и обработки форм обеспечивается CGI-модулем. Имеются модули с поддержкой куки, механизмы сетевого взаимодействия и доступа к базе данных. Python включает в себя поддержку параллелизма на основе потоков, а также поддержку сетевого программирования с использованием сокетов [14, С. 287].

Язык Ruby был разработан Юкихиро Мацумото в начале 90-х годов и реализован в 1996 году. С тех пор он непрерывно развивается. Ruby — это полностью объектно-ориентированный язык. Каждый элемент данных рассматривается как объект, и все операции осуществляются через вызовы методов. Операции в Ruby считаются синтаксическим механизмом, указывающим метод, требуемый для определенной операции. Все операции являются методами и могут переопределяться. Все классы, предопределенные и определяемые пользователем, могут иметь подклассы. Классы и объекты являются динамическими, методы к ним могут добавляться динамически. Это значит, что классы и объекты могут иметь разные наборы методов в разные моменты периода выполнения и могут вести себя по-разному [19, С. 88]. В определение класса могут быть включены коллекции методов, данных и констант. Синтаксис Ruby похож на синтаксис языков Eiffel и Ada. Здесь используется динамическая типизация. Область видимости переменной указывается ее именем. Если имя переменной начинается с буквы, то она имеет локальную область. Если имя начинается с @ - экземплярная переменная, если имя начинается с $ - глобальная переменная. Пользователь может расширить или изменить Ruby.


Язык Lua в переводе с португальского означает «луна». Он был разработан в начале 90-х Роберто Иерусалимски, Вальдемаром Келес и Луисом де Фигейреду в Католическом университете Рио-де-Жанейро (Бразилия). На его разработку повлияли языки Scheme, Icon и Python, но конструкция Lua более мощная и гибкая. Проектирование языка было ориентировано на обеспечение самых необходимых и простых способов расширения языка для различных областей применения. Lua называют мультипарадигменным языком, он обеспечивает процедурное и функциональное программирование, содержит небольшой набор базовых механизмов, которые могут быть расширены для решения определенных задач [7, С. 69].

Ключевой особенностью языка является расширяемая семантика. Lua не содержит понятия класса и объекта в явном виде, но механизмы объектно-ориентированного программирования с поддержкой прототипов легко реализуются с использованием мета-таблиц. Функции языка Lua являются величинами первого класса, ими можно манипулировать как переменными: передавать и получать как аргументы. Lua поддерживает замыкания - это особый вид функции, которая определена в теле другой функции и создается каждый раз во время ее выполнения. При выполнении внешней функции происходит создание нового экземпляра внутренней функции, с новыми ссылками на переменные внешней функции. В случае замыкания ссылки на переменные внешней функции действительны внутри вложенной функции, пока работает вложенная функция, даже если внешняя функция закончила работу и переменные вышли из области видимости. Замыкание связывает код функции с ее лексическим окружением. Лексические переменные замыкания отличаются от глобальных тем, что они не занимают глобальное пространство имен. От переменных в объектах они отличаются тем, что привязаны к функциям, а не объектам [15, С. 306].

Lua это язык с динамическим определением типов данных, переменная может содержать значения любого типа. Все значения хранятся в переменных, используются в качестве аргументов при вызове функций и возвращаться в виде выполненного результата. В Lua существует восемь основных типов данных: 1) nil (неопределенный); 2) boolean (логический); 3) number (числовой); 4) string (строковый); 5) function (функция); 6) userdata (пользовательские данные); 7) thread (поток); 8) table (таблица) [6, С. 144].

Nil — это тип с пустым значением, главное свойство которого — отличаться от всех остальных значений и обозначать отсутствие пригодного значения. К типу boolean относятся значения false и true. Значения nil и false считаются ложными, любое другое значение считается истинным. Тип number определяет вещественные числа (double), но внутреннее представление чисел можно изменить при сборке интерпретатора. Тип string обозначает массивы символов. Строки Lua могут содержать любые 8-битовые символы, включая ноль ('\0'). Строки неизменяемы. Таблицы считаются самым важным типом данных в Lua и являются фундаментом для строительства пользовательских типов данных (массивы, списки, множества) и представляют собой набор пар - (ключ, значение). Ключом может выступать значение любого типа, кроме nil [16, С. 205]. Ссылки на элементы таблицы осуществляются в форме ссылок на традиционные и ассоциативные массивы или записи. Поскольку функции относятся к первому классу, они могут храниться в таблицах, и такие таблицы могут служить пространствами имен. 


Lua удобно использовать как расширение скриптового языка для других языков. Текст транслируется в промежуточный код, а затем интерпретируется. Он легко может быть встроен в другие системы из-за небольшого размера его интерпретатора (около 150К байт) [10, С. 61].

По результатам исследования второй части курсовой работы, можно сделать следующие выводы.

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

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

3. Несмотря на то, что Perl и Python поддерживают объектно-ориентированное программирование, ни один из них не является чисто объектно-ориентированным языком. Каждый из них имеет примитивные типы для каждой поддерживаемой функции. В Ruby присутствует ряд особенностей языка Perl, в том числе скрытые (неявные) переменные.

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

5. Отчасти благодаря быстрым изменениям последние скриптовые языки интегрировали в себя новейшие концепции в проектировании языков. Ruby, например, имеет универсальную объектную модель (подобно Smalltalk), настоящие итераторы (как в Clu), сечения массивов (как в Fortran 90), структурированную обработку исключений, множественное присваивание и рефлексию.

Заключение

Целью данной курсовой работы была попытка дать представление обо всем многообразии существующих языков программирования. Среди программистов есть мнение о всеобщей применимости, какого то определенного языка (C, C++, Pascal). Данная ситуация возникает по причине недостаток информации, привычки, инертности мышления. Настоящий профессионал должен постоянно стремиться повышать квалификацию. А для этого нужно не бояться учиться и экспериментировать. Представленный обзор языков программирования помогает понять, что споры или дискуссии о преимуществах одного языка над другим бессмысленны. В данной курсовой работе, мной были рассмотрены императивные и декларативные языки программирования, которые используются для научных вычислений, обучения программированию начинающих программистов, решения экономических задач, создания эффективных и компактных программ.