Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек5_ВФ_ЯП.doc
Скачиваний:
53
Добавлен:
24.11.2019
Размер:
276.99 Кб
Скачать

Вступление в специальность. Лекция №5. Классификация языков программирования. 2

Лекция №5. Классификация языков программирования.

План.

  1. Понятие языка программирования.

  2. Критерии классификации языков программирования (ЯП)

  3. Классификация ЯП по разным критериям.

  4. Диаграмма развития некоторых языков программирования.

1) Понятие языка программирования

Языком программирования можно назвать некоторую знаковую систему, предназначенную для записи компьютерных программ.

Любой язык программирования имеет свой:

  • набор служебных слов (лексику),

  • правила их использования в структуре программы (синтаксис) и

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

  1. Критерии классификации языков программирования (яп)

Язык программирования можно классифицировать:

    1. по базовой модели вычисления, которая реализуется в программе,

    2. по используемой парадигме программирования,

    3. по типу используемого транслятора,

    4. по уровню абстракции,

    5. по способу выполнения процессов.

Опишем использованные здесь термины.

Модель вычисления — это множество допустимых операций, используемых для вычисления.

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

Важно отметить, что парадигма программирования не определяется однозначно языком программирования — многие современные языки программирования являются мультипарадигменными, то есть допускают использование различных парадигм.

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

3)Классификация яп по разным критериям

Проклассифицируем языки программирования по разным критериям

а) по базовой модели вычисления, которая реализуется в программе, ЯП делятся на языки выполняющие вычисления по:

  1. модели Тьюринга,

  2. Лямбда-исчислению,

  3. комбинаторной логике и т.д.

Машина Тьюринга

(для ознакомления)

Машина Тьюринга — это бесконечная магнитная лента (вспомните года, когда работал Тьюринг — магнитная лента тогда была очень прогрессивным устройством). Лента разбита на логические ячейки — последовательные отрезки ленты, на которые можно записать тот или иной сигнал (к примеру — ASCII символы).

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

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

Программа на машине Тьюринга задаётся в виде таблицы переходов: если символ А — то сдвиг влево, если Б — сдвиг вправо, если С — записать в ячейку D и сдвинуться влево, если E — то остановить работу (и так далее, пока символы не кончатся).

Одно из главных определений, задаваемых машиной Тьюринга — это контекст исполнения:

Контекст выполнения программы — совокупность всех данных, определяющих её поведение.

Как видно по примеру машины Тьюринга, ЯП манипулируют не данными, а процессом преобразования данных. Но сами правила для обработки данных как-то надо определять и представлять.

На данный момент найдено два способа задания правил для обработки — это

  1. императивная и

  2. декларативная

формы записи правил.

b) по используемой парадигме программирования ЯП делятся на несколько групп, обобщённая схема иерархии которых приведена на рисунке ниже.

Машинно-зависимые ЯП (Ассемблер, псевдокод)

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

Императивная программа очень похожа на точные приказы, выражаемые повелительным наклонением в естественных языках, то есть это последовательность команд, которые обязательно должен выполнить компьютер.

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

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

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

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

Объектно-ориентированное программирование – это парадигма, в основе которой лежит понятие объекта — некоторого процесса, явления или субъекта, которое объединяет в себе данные об объекте, его свойства и выполняемые объектом действия.

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

ООП, в основном, есть, по сути, императивное программирование, дополненное принципом инкапсуляции данных и методов в объект (принцип модульности) и наследованием (принципом повторного использования разработанного функционала).

Так на языке Си, который не является объектно-ориентированным, можно писать объектно-ориентированным образом, а на Ruby, в основу которого в значительной степени положена объектно-ориентированная парадигма, можно писать согласно стилю функционального программирования.

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

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

Whitespace (англ. пробел) — эзотерический язык программирования, созданный Э. Брэди и К. Моррисом. Он был выпущен в свет 1 апреля 2003 года.

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

Интересным следствием этого факта является то, что текст программы на языке Whitespace можно «скрыть» внутри исходных кодов другой программы.

Программа состоит из последовательности пробелов (двоичный 0) и табуляций (1), команды разделяются символом перевода строки.

Остальные символы игнорируются интерпретатором и могут быть использованы в качестве комментариев.

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

Необходимо грамотно выбирать средства для решения каждой конкретной проблемы!

с) По типу используемого транслятора ЯП делятся на интерпретируемые и компилируемые.

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

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

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

Разделение на компилируемые и интерпретируемые языки является условным.

Так, для любого традиционно компилируемого языка, как, например, Паскаль, можно написать интерпретатор.

Для любого интерпретируемого языка можно создать компилятор — например, язык Лисп, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений. Создаваемый во время исполнения программы код может так же динамически компилироваться во время исполнения.

Преимущества компилятора и интерпретатора

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

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

Однако интерпретируемые программы выполняются заметно медленнее, чем компилируемые, кроме того, они не могут выполняться без программы-интерпретатора.

Среды проектирования

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

Часто такие среды называют визуальными средами программирования.

Визуальное программирование — способ создания программы для ЭВМ путём манипулирования графическими объектами вместо написания её текста (Delphi, VisualBasic).

Компилятор или интерпретатор языка программирования выступает как составная часть среды проектирования. Сама программа наряду с конструкциями, предусмотренными стандартом, как правило, использует библиотечные функции и классы, предоставляемые средой проектирования. Так, интегрированная среда разработки VisualStudio.NET содержит библиотеку классов MFC (Microsoft Foundation Classes), значительно упрощающую процесс разработки приложений, использующих оконный интерфейс.

Интегрированная среда проектирования VisualStudio.NET позволяет создавать и компилировать приложения на языках C++, C#, Visual Basic и VisualJ.

Для разработки приложений на языке С++ предназначается также среда CBuilder.

Для проектирования приложений на языке Object Pascal используется интегрированная среда проектирования Delphi.

Наиболее удобной средой разработки программ на языке Java является интегрированная среда проектирования JBuilder.

d) По уровню абстракции ЯП делятся на низкоуровневые и высокоуровневые.

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

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

Это недостатки программирования на языках низкого уровня. Преимуществом является возможность «выжать» из компьютера все что можно, и прежде всего — максимум быстродействия.

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

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

Традиционной считается последовательная модель программирования.

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

Последовательная модель универсальна. Ее основными чертами являются применение стандартных языков программирования (для решения вычислительных задач это, обычно, Fortran и С/С++), хорошая переносимость программ, но невысокая производительность.

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

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

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

Ada, универсальный язык программирования, включающий в себя средства для создания параллельных программ. Официальный язык программирования министерства обороны США. Существует множество компиляторов для самых разных платформ, например, Ada-95

Java ООП, императивный, кросплатформенный,

1995 год

НОРМА - декларативный язык предназначен для записи численных методов решения задач математической физики разностными методами.

Разработчик: Российская академия наук, 90-х годах (http://parallel.ru/tech/norma/ )

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

Оккам —процедурный язык параллельного программирования высокого уровня, разработанный в начале 80-х годов группой учёных из Оксфорда под руководством Дэвида Мэя. Синтаксически похож на Паскаль или Си.

Modula-3 - универсальный язык программирования, дальнейшее развитие языков Pascal и Modula-2. Включает в себя возможности разработки многопоточных приложений.

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

Он включает в себя большинство концепций популярных парадигм программирования, в том числе логического, функционального, императивного, объектно-ориентированного, программирования с ограничениями, распределённого и параллельного программирования. 1991 г. Автор(ы): Gert Smolka, Бельгия

Диаграмма развития некоторых языков программирования