Файл: Классификация языков программирования. Критерии выбора среды и языка разработки программ (Понятие языка программирования).pdf
Добавлен: 24.04.2023
Просмотров: 210
Скачиваний: 1
В более современных C-подобных языках программирования, таких как C ++, C # и Java, кроме средств процедурного программирования, заимствованных практически без существенных изменений с языка C, также средства объектно-ориентированного программирования на основе классов. Классы в этих языках введены как естественное продолжение и развитие стандартных структур struct языка C, которые являются типами пользователя. Поэтому при объявлении класса создается новый тип данных, который можно использовать подобно встроенного типа. Однако, в отличие от встроенных типов, классы содержат как данные, так и функции. Класс позволяет инкапсулировать все функции и данные, необходимые для управления частными компонентами программы (например, окном на экране; рисунком, построенным с помощью графической программы; устройством, подключенным к компьютеру; задачей, выполняемым операционной системой).
Функциональные языки программирования. Лямбда исчисления возлагается на именуемые списки.
Например, на лямбда-образном псевдокоде приведена ранее информация о человеке может быть представлена в форме следующего списка:
(Ivanov (
(Name "Иванов")
(Age 28)
(Height 173)
))
Haskell, F # и другие LISP-образные языка базируются на лямбда-исчислении, так что именуемые списки являются естественным средством реализации структур. Чтобы расширить список, нужно просто добавить в него новые элементы. Как следствие, функциональные языки программирования имеют эффективные структуры данных высокого уровня и простые, но эффективные средства функционального и объектно-ориентированного программирования[12].
Функциональное программирование является способом создание программ, в которых основным действием является вызов функции, основным способом разбиения программы является создание нового имени функции и задачи для этого имени выражения, вычисляет значение функции, а основным правилом композиции является оператор суперпозиции функций. шире концепция функционального программирования определяет набор совместных правил и тем вместо перечня отличий от других парадигм. к важным концепций функционального программирования также относятся функции высшего порядка и функции первого класса: замыкание и рекурсия. к другим распространенных возможностей функциональных языков программирования относятся продолжение, система типизации Хиндли-Милнера, нечеткие вычисления и монады.
Скриптовые языки программирования. Современные скриптовые языки программирования, такие как JavaScript и PHP, впитали в себя наиболее полезные возможности как императивных, так и функциональных языков программирования. Базовой структурой данных скриптового языка программирования JavaScript является объект.
Любое значение, не является строкой, числом, true, false, null или undefined, является объектом. Подобно функциональным языкам программирования, объект – это ассоциативный список, который сопоставляет имена свойств объекта их значением. Имена свойств являются строками, поэтому можно говорить, что объекты отражают строки в значение. Информация о человеке, который приводилась в качестве примера ранее при описании императивных и функциональных языков программирования, на языке JavaScript может представляться объектом - ассоциативным списком:
var Ivanov = {
name: "Иванов",
age: 28
height: 173
};
Хотя JavaScript-объекты являются динамическими, то есть свойства объектов могут свободно добавляться и удаляться, они, однако, могут использоваться и для моделирования статических объектов и структур, характерных для императивных языков программирования.
Если игнорировать значения свойств, объекты также могут быть использованы для представления множеств.
Базовая структура JavaScript, представляющая собой ассоциативный список, является основой всех возможностей объектно-ориентированного программирования языка JavaScript. JavaScript использует модель прототипного наследования, которое, конечно, отличается от наследования классов в императивных объектно-ориентированных языках программирования, таких как C ++ или Java. В JavaScript, благодаря тому, что ассоциативные списки, которые представляют объекты, легко связываются друг с другом, вместо классов используются прототипы объектов. Новые объекты автоматически наследуют методы и атрибуты своего родительского объекта через цепочку прототипов. прототип объекта можно менять в любой момент, что делает JavaScript очень гибкой, динамичной языке.
В настоящее время JavaScript является наиболее широко используемой языке программирования. Почти все, кто имеет компьютер или смартфон, имеет все инструменты, необходимые для выполнения уже имеющихся программ JavaScript и создания новых. Все, что для этого нужно, - браузер и текстовый редактор.
Создание программы на JavaScript так же просто, как редактирование текстового файла и открытие его в браузере. Здесь нет сложных сред разработки, которые нужно загружать и устанавливать и не нужно изучать сложные IDE. Кроме того, язык JavaScript проста в освоении. Базовый синтаксис сразу знаком любому программисту, который уже имел дело хотя бы с одной языком семейства C. Ни одна другая речь не может похвастаться таким низким барьером вхождения, как JavaScript.
Анализ базовых структур данных. Основные различия между списочным подходом и использованием блока памяти, а также влияние этих различий на программы следующие:
• Если рассматривать компьютеры, то обращение по заданном смещению относительно некоторого адреса все еще одной из самых быстрых операций, машина может выполнять. Компилятор C даже помогает в этом, транслируя метки в смещении во время компиляции. И наоборот, для нахождения чего-то в список нужен поиск: если задана метка "age", элемент списка ей отвечает и где ее данные в памяти? Каждая система имеет свои технические приемы, чтобы сделать поиск таким быстрым, насколько это возможно, но поиск всегда будет требовать больше работы, чем простое обращение база-плюс-смещение.
• Добавление нового элемента в список гораздо проще, чем процесс добавления к зафиксированной во время компиляции структуры.
• Компилятор C может обнаружить во время компиляции, метка hieght является печатной ошибкой, потому что он может посмотреть в определение структуры и увидеть, что нет никакого элемента с таким именем. Поскольку список является свободно расширяемым, нельзя узнать, что в нем
Нет элементов hieght, пока программа не заработает и не обнаружит это, просматривая список.
• Положительной стороной списочного подхода является то, что простым добавлением имени нового элемента достигается полная расширяемость. Отрицательной стороной этого подхода является то, что, в отличие от структурного подхода, не обеспечивается контролируемость, и хотя с помощью различных хитростей можно улучшить поиск по имени, все это вдали от скорости обращения база-плюс-смещения. Многие языки, основанные на списках, имеют систему определения классов, так что появляется возможность регистрации некоторого набора элементов списка и на этой основе можно контролировать, соответствуют новые элементы уже определенным. Это, если сделать все правильно, есть хорошим компромиссом между контролируемостью и легкостью расширения.
Три последних пункта демонстрируют явное противоречие: мы хотим расширяемости, при которой можно легко добавлять элементы в структуру; мы также хотим контролируемости, при которой элементы, не принадлежащих структуре, обозначаются как ошибки. Здесь нужно находить компромиссное решение, и поэтому контролируемое расширение существующих списков в различных случаях реализуется по- разному.
Языки программирования C ++, Java, Objective-C, C # и несколько других языков с традиционными средствами объектно-ориентированного программирования имеют средства для создания нового типа, расширяет имеющийся тип и следует все элементы старого типа.[13]
При этом скорость обращений база-плюс-смещение и выявления синтаксических ошибок (контролируемость) во время компиляции остаются такими же как и для языка C, хотя использование этих как требует от программиста применения большого количества синтаксических конструкций; там, где речь C для объявления структур обходится одним ключевым словом struct и ее очень простыми правилам видимости, в языке Java, например, для создания нового типа используются конструкции implements, extends, final, instanceo class, this, interface, private, public и protected.
Если вернуться к языку C, то ее структуры обеспечивают самый быстрый способ доступа к элементов структуры, а также их контролируемость во время компиляции, за что приходится расплачиваться отсутствием расширяемости во время выполнения.
Если хочется иметь гибкий список, который может расти по мере необходимости во время выполнения, необходимо списочная структура типа связного списка list или ассоциативного списка map из библиотеки STL.
Что касается языка программирования JavaScript, то благодаря оперативной компиляции (just-in-time compiling), которая применяется в современных браузерах, большинство кода JavaScript - это откомпилированный, хорошо оптимизирован и исполняемый как машинный код, и поэтому скорость выполнения близка к программ, написанных на C или C ++. Конечно, есть еще накладные расходы, связанные с доступом к свойств объектов, с уборкой мусора и динамичным связыванием, так что, естественно, можно делать некоторые вещи быстрее; однако, разница, как правило, не стоит того, чтобы с ней бороться до тех пор, пока не оптимизирован другое. С Node.js(высокопроизводительное, управляемое событиями JavaScript среда на стороне сервера, построенное на базе высоко оптимизированного движка V8 JavaScript от Google) приложения JavaScript становятся управляемыми событиями но не блокирующими, что, как правило, нивелирует разницу в скорости выполнения кода JavaScript и программ, написанных на менее динамических языках программирования.
2.2. Выбор языка программирования
Если алгоритм можно представить независимо от деталей его организации, становится возможной парадигма обобщенного программирования. При этом программист должен определить, какие нужны алгоритмы, и параметизировать их так, чтобы они могли работать с большинством нужных типов и структур данных. Механизм, который обеспечивает обобщенное программирование, состоит из шаблонных функций и классов, параметризованных типами данных[14].
Для того, чтобы компьютер мог выполнять программу, ее нужно переложить на машинный язык. Для этого используют специальные программы-трансляторы.
Транслятор - это программа, предназначенная для перевода текста программы с одного языка программирования на другой. Процесс перекладывания называется трансляцией.
Различают два типа трансляторов - компиляторы и интерпретаторы.
Компилятор - это программа, предназначенная для перевода и последующего запоминания полностью всей программы, написанной некоторой языке программирования, в программу в машинных кодах.
Процесс такого перекладывания называется компиляцией. Компилятор создает программу в машинных кодах.. Для повторного выполнения программы компилятор уже не нужен, достаточно загрузить с диска в память компьютера скомпилирован ранее вариант и выполнить его. Существует другой способ сочетания процессов трансляции программы. Он называется интерпретацией.
Интерпретатор - это программа, которая предназначена для показательных трансляций и выполнения исходной программы. Такой процесс называется интерпретацией.
В процессе трансляции происходит проверка текста программы на соответствие правилам языка, которая использовалась для ее описания. Если в программе найдена ошибки, транслятор выводит сообщение о них на панель вывода. Интерпретатор сообщает о найденных ошибках после трансляции каждой указания программы. Это в значительной степени облегчает процесс поиска и исправление ошибок, но существенно увеличивает время трансляции. Компилятор транслирует программу намного быстрее, чем интерпретатор, но сообщает о найденных ошибках только после завершения компиляции всей программы. Найти и исправить ошибки в этом случае труднее. Поэтому интерпретаторы рассчитанные в основном, на языки, предназначенные для обучения программированию.
Большинство современных языков программирования предназначены для разработки сложных пакетов программ и рассчитаны на компиляцию.
Как правило, программы компиляторы и интерпретаторы называются так же, как и языки, для перевода из которых они предназначены.
Интегрированная среда программирования - это система программирования, сочетающая редактор для удобного ввода и редактирования программы, транслятор и отладчик ошибок[15].
Рассмотрим основные этапы обработки компилятором программы на языке Pascal.
1) Компилятор анализирует, какие внешние библиотеки нужно подключить, разбирает текст программы на составляющие элементы, проверяет синтаксические ошибки и в случае их отсутствия формирует объектный код (в Windows - файл с расширением .obj, в Linux - файл с расширением .o). Полученный на этом этапе двоичный файл (объектный код) не включает в себя объектные коды библиотек подключаются.