Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

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

Содержание:

Введение

Основные стили, или парадигмы программирования, к которым обычно относят императивное, функциональное, логическое и объектно-ориентированное программирование [1, 6], возникли более сорока лет назад вместе с первыми языками программирования и развивались сначала относительно независимо друг от друга. Каждая из парадигм отображает определенную модель вычислений, включая структуры данных и механизмы управления, и с ней связан определенный класс прикладных задач, которые удобно решать средствами данной парадигмы.

В настоящий момент большинство современных языков программирования [3, 4] обычно включают средства и приёмы программирования различных парадигм, хотя классифицируются согласно средствам своего ядра (к примеру, язык программирования Лисп – функциональный язык, хотя включает некоторые конструкции императивного стиля). Тем самым все более сложным становится выбор языка для обучения программированию в высшей школе.

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

Цель работы – обзор классификации языков программирования.

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

1.1 История развития языков программирования

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

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

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

Фортран. В 1954 году в недрах IBM группой разработчиков во главе с Дж. Бэкусом (John Backus) был создан язык программирования Fortran. Значение этого события трудно переоценить. Это стало первым шагом программирования высокого уровня. Впервые программист смог по-настоящему абстрагироваться от особенностей машинной архитектуры. Ключевой идеей, что отличала новый язык от ассемблера, была концепция подпрограмм. Кроме того, синтаксическая структура языка была достаточно сложна для машинной обработки в первую очередь потому, что пробелы как синтаксические единицы вообще не использовались. Это порождало массу ошибок. Язык Фортран использовался (и используется на сегодняшний день) для научных вычислений. Отсутствуют привычные языковые конструкции, семантическая проверка компилятором, поддержка современных способов структурирования кода и данных. Это понимали и сами разработчики. По признанию самого Бэкуса, перед ними стояла задача скорее разработки компилятора, чем языка. Понимание самостоятельного значения языков программирования пришло позже. Появление Фортрана встретили еще большей критикой, чем ассемблера. Программистов пугало снижение эффективности программ за счет использования промежуточного звена в виде компилятора. И эти опасения имели под собой основу: действительно, хороший программист, скорее всего, при решении какой-либо небольшой задачи вручную напишет код, который будет работать быстрее, чем код, полученный как результат компиляции. Через некоторое время пришло понимание того, что реализация крупных проектов невозможна без использования языков высокого уровня. Мощность вычислительных машин росла, и преимущества языков высокого уровня стали настолько очевидными, что подтолкнули разработчиков к созданию новых языков, все более современных.

Cobol. В 1960 году был создан язык программирования Cobol. Он задумывался как язык для создания коммерческих приложений, и он стал таким. На КОБОЛ написаны тысячи прикладных коммерческих систем. Отличительной особенностью языка является возможность эффективной работы с большими массивами данных, что характерно именно для коммерческих прикладных задач. Популярность Кобола столь высока, что даже сейчас, при всех его недостатках (по структуре и замыслу Кобол напоминает Фортран) появляются новые его диалекты и реализации. Так недавно появилась реализация Кобола, в сочетании с Microsoft.NET, что потребовало внесения некоторых черт объектно-ориентированного языка.

PL / 1. В 1964 году все та же корпорация IBM создала язык PL / 1, который был призвана заменить Кобол и Фортран. Этот зык имел исключительное разнообразие синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций и поддержка параллелизма. Надо отметить, что синтаксическая структура языка была крайне сложной. Пропуски уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы.

В силу таких особенностей разработка компилятора для PL / 1 была исключительно сложным делом. В связи с вышеперечисленными причинами язык так и не стал популярным вне мира IBM.

BASIC. В 1963 году в Дартмурском колледже (Dartmouth College) был создан язык программирования BASIC (Beginners 'All-Purpose Instruction Code - многоцелевой язык символических инструкций для начинающих). Язык задумывался в первую очередь как средство обучения и как первый язык программирования. Он предполагался таким, чтобы легко интерпретировался и компилировался. Надо сказать, что BASIC действительно стал языком, на котором часто учатся программировать. Было создано несколько мощных реализаций BASIC, поддерживающих самые современные концепции программирования (яркий тому пример - Microsoft Visual Basic).

Algol. В 1960 году командой во главе с Петером Науру (Peter Naur) был создан язык программирования Algol. Этот язык дал начало целому семейству Алгол-подобных языков (важнейший представитель - Pascal). В 1968 году появилась новая версия языка. Она хоть и не нашла такого широкого практического применения, как первая версия, но была весьма популярна в кругах теоретиков. Язык был достаточно интересен, поскольку обладал многими уникальным на тот момент характеристиками.

Дальнейшее развитие языков программирования.

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

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

Pascal-подобные языки. В 1970 году Николаусом Виртом был создан язык программирования Pascal. Язык замечателен тем, что это первый широко распространенный язык для структурного программирования (первым, строго говоря, был Алгол, но он не получил такого широкого распространения). Впервые оператор безусловного перехода перестал играть основополагающую роль при управлении порядком выполнения операторов. В этом языке также внедрена строгая проверка типов, что позволило выявлять многие ошибки на этапе компиляции. Отрицательной чертой языка было отсутствие в нем средств для разбивания программы на модули. Вирт осознавал это и разработал язык Modula-2 (1978), в котором идея модуля стала одной из ключевых концепций языка. В 1988 году появилась Modula-3, в которую были добавлены объектно-ориентированные черты. Логическим продолжением Pascal и Modula являются языки Oberon и Oberon-2. Они характеризуются движением в сторону объектно и компоненто- ориентированности.

С-образные языки. В 1972 году Керниганом и Ритчи был создан язык программирования C. Он создавался как язык для разработки операционной системы UNIX. C часто называют «ассемблером, что переносится», имея в виду то, что он позволяет работать с данными практически так же эффективно, как на ассемблере, предоставляя при этом структурированные конструкции управляющих и абстракции высокого уровня (структуры и массивы). Именно с этим связана его огромная популярность и поныне. И именно это является его ахиллесовой пятой. Компилятор C очень слабо контролирует типы, поэтому очень легко написать внешне совершенно правильную, но логически ошибочную программу. В 1986 году Бьярн Страуструп создал первую версию языка C ++, добавив в язык C объектно-ориентированные черты, взятые из Simula, и исправив некоторые ошибки и неудачные решения языка. C ++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая (третья) версия стандарта, которая содержит в себе некоторые весьма существенные изменения. Язык стал основой для разработки современных больших и сложных проектов. В нем есть и слабые стороны, вытекающие из требований эффективности.

В 1995 году в корпорации Sun Microsystems Кеном Арнольдом и Джеймсом Гослингом был создан язык Java. Он наследовал синтаксис C и C ++ и был избавлен от некоторых неприятных черт последнего. Отличительной особенностью языка является компиляция в код некоей абстрактной машины, для которой затем пишется эмулятор (Java Virtual Machine) для реальных систем. Кроме того, в Java нет показателей и множественного наследования, что сильно повышает надежность программирования.

В 1999-2000 годах в корпорации Microsoft был создан язык C #. Он в достаточной степени схож с Java (и задумывался как альтернатива последнему), но имеет и отличительные особенности. Он ориентирован, в основном, на разработку многокомпонентных Интернет-приложений.

Языки Ada и Ada 95. В 1983 году под эгидой Министерства Обороны США был создан язык Ada. Язык замечателен тем, что очень много ошибок может быть выявлено на этапе компиляции. Кроме того, поддерживаются многие аспекты программирования, которые часто отдаются на откуп операционной системе (параллелизм, обработка исключений). В 1995 году был принят стандарт языка Ada 95, который развивает предыдущую версию, добавляя в нее объектную ориентированность и исправляет некоторые неточности. Оба эти языка не получили широкого распространения вне военных и других крупномасштабных проектами (авиация, железнодорожные перевозки). Основной причиной является сложность освоения языка и достаточно громоздкий синтаксис (значительно более громоздкий, чем в Pascal).

Языки обработки данных. Все перечисленные языки являются языками общего назначения в том смысле, что они не ориентированы и не оптимизированы под использование каких-либо специфических структур данных или на применение в каких-либо специфических областях. Было разработано большое количество языков, ориентированных на достаточно специфические применения. В 1957 году была предпринята попытка создания языка для описания математической обработки данных. Язык была назван APL (Application Programming Language). Его отличительной особенностью было использование математических символов (что затрудняло применение на текстовых терминалах, появление графических интерфейсов сняло эту проблему) и очень мощный синтаксис, который позволял проводить множество нетривиальных операций прямо над сложными объектами, не прибегая к разбивке их на компоненты. Широкому применению помешало, как уже отмечалось, использование нестандартных символов как элементов синтаксиса.

В 1962 году появился язык Snobol (а в 1974 - его преемник Icon), предназначенный для обработки строк. Синтаксис Icon напоминает C и Pascal одновременно. Отличие заключается в наличии мощных встроенных функций работы со строками и связанная с этими функциями особая семантика. Современным аналогом Icon и Snobol является Perl - язык обработки строк и текстов, в который добавлены некоторые объектно-ориентированные возможности. Считается очень практичным языком, однако ему не хватает элегантности.

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

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

Язык JavaScript была создан в компании Netscape Communications как язык для описания сложного поведения веб-страниц. Сначала назывался LiveScript, причиной изменения названия стали маркетинговые соображения. Интерпретируется браузером при отображении веб-страницы. По синтаксису схож с Java и (отдаленно) с C / C ++. Имеет возможность использовать встроенную в браузер объектную функциональность, однако объектно-ориентированным языком не является.

Язык VBScript был создан в корпорации Microsoft во многом как альтернатива JavaScript. Имеет похожую область применения. Синтаксически схож с языком Visual Basic (и является урезанной версией последнего). Так же, как и JavaScript, выполняется браузером при отображении веб-страниц и имеет ту же степень объектно-ориентированности.

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

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

Объектно-ориентированные языки. Объектно-ориентированный подход, который пришел на смену структурному, впервые появился вовсе не в C ++, как считают некоторые. Существует целый ряд чистых объектно-ориентированных языков, без сведений о которых наш обзор был бы неполным. Первой объектно-ориентированным языком был язык Simula (1967). Этот язык был предназначен для моделирования различных объектов и процессов, и объектно-ориентированные черты появились в нем именно для описания свойств модельных объектов.

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

Существует язык с очень удачной реализацией объектно-ориентированности, не являсь надстройкой над другим языком - Eiffel (1986). Будучи чистым языком объектно-ориентированного программирования, он, кроме того, повышает надежность программы путем использования "контрольных утверждений".

Создание UML (Unified Modeling Language - унифицированного языка моделирования) началось в 1994 году. В это время Грэйди Буч (Grady Booch) и Джеймс Рамбо (James Rambaugh) начали объединять несколько методов объектно-ориентированного моделирования в фирме Rational Software. И уже в 1995 году была представлена ​​спецификация метода, названного Unified Method. Первая версия UML была принята консорциумом OMG (Object Management Group) в январе 1997 года. Утвержденная же в сентябре версия UML 1.1 была принята на вооружение основными компаниями - производителями программного обеспечения, такими, как Microsoft, IBM, Hewlett-Packard и производителями CASE-средств, которые реализовали поддержку UML в своих программных продуктах (Paradigm Plus, Microsoft Visual Modeler for Visual Basic, Delphi и др.)

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

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

Функциональные языки. Основная идея, лежащая в основе функционального программирования, - это представление программы в виде математических функций (то есть функций, значение которых определяется только их аргументами, а не контекстом выполнения). Оператор присваивания в таких языках не используется (или, как минимум, его использование не поощряется). Императивные возможности, как правило, есть, но их применение обставлено серьезными ограничениями. Существуют языки с пассивной и с активной семантикой. Отличие заключается, грубо говоря, в том, что в языках с активной семантикой вычисления производятся в том же месте, где они описаны, а в случае пассивной семантики вычисление производится только тогда, когда оно действительно необходимо. Первые языки имеют эффективную реализацию, тогда как вторые - лучшую семантику. Из языков с активной семантикой вспомним ML и два его современных диалекта - Standard ML (SML) и CAML. Последний имеет объектно-ориентированного потомка - Objective CAML (O'CaML). Среди языков с пассивной семантикой наиболее распространены два: Haskell и его более простой диалект Clean.

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

2. Обзор современных языков программирования

За первое полугодие 2019 года доля JavaScript и Java почти одинакова. С другой стороны, в рейтинг вновь вошел Erlang, что «исчез с радара» в 2017-м - в этом году более 20 разработчиков указали этот язык как основной. Среди относительно новых языков - Apex.

Если смотреть на динамику последних лет, то Kotlin, учитывая свой взрывной рост, вытеснит Java в разработке под Android. Также продолжает расти TypeScript.

JavaScript-экосистема постепенно перенимает первенство в JVM. Доля C # остается почти неизменной.

Прогнозируемо растет использование Python.

Изменения в языках программирования:

  • Увеличилась доля проектов на C ++ и C - это можно связать с последующим распространением интернета вещей.
  • Начала сокращаться доля Go проектов.
  • Начала снижаться доля Swift (статистически незначительно) - отсюда мы можем сделать вывод, что возможно, разработка на iOS сокращается в целом. Является ли это флуктуацией в рамках погрешности или долговременной тенденцией станет ясно позднее.

Доля Scala осталась примерно такой же (незначительно увеличилась).

Еще можно заметить «ренессанс» использования Groovy и Erlang - видно, что языки, на которых есть некое критическое количество проектов, могут существовать десятилетиями.

По сравнению с последними годами можно отметить рост интереса к Rust, а также понижение заинтересованности в Scala. Если посмотреть на список новых фич Java 10 и Java 11, то можно понять, что в Java вводят аналоги Scala-конструкций.

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

Как мы видим, высокий уровень предпочтения в Swift (это подтверждает гипотезу об уменьшении объема iOS разработки), далее - Go и Kotlin. Следующая ступень - тоже Scala и C #. Достаточно неожиданное появление Erlang. Еще следует отметить, что несмотря на взрывной рост, индекс предпочтения TypeScript и JavaScript не самый высокий. Это означает, что в принципе возможно появление следующей языка в экосистеме фронтенда.

Большая часть респондентов (64%) точно планирует изучить какой-то новый язык программирования следующего года. Посмотрим на рейтинг самых интересных языков для изучения в динамике за 3 года:

Python уже третий год является самым популярным для изучения, далее - JavaScript и Go. Еще мы видим резкий всплеск интереса к Dart: Google позиционирует его как язык, оптимизированную для разработки клиентов на Android и Web.

Как и в предыдущие годы, большинство респондентов (55%) собираются изучать новый язык самостоятельно, с помощью книг и документации. На онлайн-курсы ориентируются около 31%, а 7% собираются использовать офлайн-подход с локальными преподавателями.

Дополнительные языки

Здесь особых новостей нет: как и раньше, JavaScript является основным дополнительным языком. Единственное - Python как второй язык начали использовать чаще, чем Shell.

Язык

доля рынка

изменения

Основная

Дополнительная

свои проекты

индекс предпочтения

1

Java

17.82

-2.8

1497

1161

1672

0.71

2

JavaScript

17.68

1485

4396

2748

0.64

3

C #

13.97

1173

712

1367

0.80

4

PHP

11.94

-1,1

1003

831

1159

0.61

5

Python

10.88

+1.1

914

1507

1490

0.73

6

C ++

6.53

+1.6

549

761

866

0.63

7

TypeScript

2.9

0.9

245

1326

708

0.67

8

Swift

2.89

243

176

301

0.91

9

Ruby

2.87

241

193

235

0.67

10

Kotlin

2.38

+1.45

200

302

352

0.88

11

Go

1.82

153

380

443

0.90

12

C

1.56

131

472

320

0.36

13

Scala

1.55

130

152

154

0.815

13

1C

0.9

76

55

61

0.34

14

Pascal / Delphi

54

159

168

0.35

15

T-SQL

53

898

216

0.26

16

PL-SQL

42

490

73

0.19

17

Objective-C

-0.4

34

286

101

0.11

18

Groovy

27

103

45

0.11

19

Erlang

23

3

19

0.7

20

Apex

22

2

11

0.45

21

R

20

135

69

0.3

22

Perl

14

78

33

0.21

23

Clojure

10

16

34

0.7

24

Rust

8

66

116

0.75

25

ActionScript

8

1

25

0.12

Изменения доли рынка указаны только в тех случаях, когда они являются статистически значимыми (то есть с вероятностью 95% невозможно получить такую ​​разницу внутри одной гауссовой популяции).

3. Классификация языков программирования

3.1. Процедурные языки

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

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

В еще менее традиционной и необычной логической парадигме программа рассматривается как множество логических формул: аксиом (фактов и правил), описывающих свойства некоторых объектов, и теоремы, которую необходимо доказать [2]. В свою очередь, выполнение программы – это доказательство теоремы, в ходе которого строится объект с описанными свойствами.

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

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

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

Таблица 1.

Свойства парадигм программирования

Парадигма

Ключевой концепт

Программа

Выполнение программы

Результат

Императивная

Команда

Последовательность команд

Исполнение команд

Итоговое состояние памяти

Функциональная

Функция

Набор функций

Вычисление функций

Значение главной функции

Логическая

Предикат

Логические формулы

Логическое доказательство

Результат доказательства

Объектно-ориентированная

Объект

Набор классов объектов

Обмен сообщениями между объектами

Результирующее состояние объектов

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

Большинство современных языков [3] аккумулируют в себе элементы и приемы нескольких стилей, и тем не менее их можно классифицировать по основному их ядру, реализующему приёмы определенной парадигмы программирования, в частности:

  • Императивная парадигма: языки Паскаль, Си, Ада;
  • Функциональная парадигма: языки Лисп, Рефал, Плэнер, Schema, Haskel;
  • Логическая парадигма: языки Пролог и Datalog;
  • Объектно-ориентированная парадигма: Smalltalk, Eiffel.

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

Подобным образом из объединения объектно-ориентированной с другими парадигмами возникли объектно-ориентированные варианты других языков программирования, например, язык CLOS – объектно-ориентированный Лисп. В настоящее время существует целый ряд современных языков программирования, в которых объединены две парадигмы:

  • Императивная и объектно-ориентированная: C++, C#, Delphi, Java и др.;
  • Функциональная и объектно-ориентированная: CLOS, Erlang и др.;
  • Логическая и объектно-ориентированная: Object Prolog.

В целом, сравнивая разные языки и парадигмы, следует отметить существенное отличие средств и приёмов традиционной императивной парадигмы программирования от средств и приёмов нетрадиционных парадигм – функциональной и логической. Языки программирования, основанные на нетрадиционных парадигмах, отличаются ещё и методом реализации: программы на таких языках обычно интерпретируются, а не компилируются, как в императивных и императивных объектно-ориентированных языках. Еще одно важное их отличие – они ориентированы на символьную обработку данных, поскольку средства этих языков включают:

  • Древесные структуры данных, такие как списки Лиспа или термы Пролога;
  • Встроенный механизм сопоставления с образцом (Рефал, Плэнер, Пролог) и бэктрекинга (Плэнер, Пролог);
  • Функционалы, или функции высшего порядка (Лисп, Schema, Haskel);
  • Механизм частичных вычислений (Haskel).

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

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

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

Поскольку не существует языка, в полной мере содержащего возможности всех парадигм, для их изучения необходимо подобрать несколько различных языков программирования. С нашей точки зрения, для каждой из основных парадигм должен быть взят по крайней мере один язык, который охватывает базовые ее средства и является тем самым типичным ее представителем – именно это позволит изучить и освоить во всей полноте средства и приёмы данной парадигмы. На этом принципе построен существующий более 20 лет практикум по программированию кафедры алгоритмических языков факультета вычислительной математики и кибернетики МГУ им. М.В. Ломоносова. Выпускники кафедры в своей производственной деятельности быстро осваивают новые языки программирования, что подтверждает верность выбранного принципа.

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

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

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

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

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

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

операция

операнды

Примечание

MOV AX, WORDB

Записать значение, содержащееся по адресу WORDB, к регистру AX

MOV BX, WORDC

Записать значение, содержащееся по адресу WORDС, к регистру Вx

ADD AX, BX

Добавить значение регистра BX до значения регистра AX, сумму записать в регистр AX

MULL WORDD

Умножить значение регистра AX на значение, содержащееся по адресу WORDD (результат - в регистре AX)

MOV WORD, AX

Записать значение регистра AX по адресу Word

идентификатор переменной

Адрес ячейки ОП

WORDA

100

WORDB

101

WORDC

102

WORDD

103

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

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

3.3. Языки программирования высокого уровня

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

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

Основные отличия языка программирования высокого уровня от машинно-ориентированной:

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

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

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

Fortran (Фортран). Созданная в IBM под руководством Дж. Бекуса (1954-57 г.г.). По сути это первый широко применяемый язык высокого уровня, ориентированы на научно-инженерные и многочисленные задачи. Для этого языка было создано огромное количество библиотек, начиная от статистических комплексов и заканчивая пакетами управления спутниками, поэтому до сих пор Фортран продолжает активно использоваться в некоторых организациях.

Ваsic (Бейсик). Многоцелевая речь символических инструкций, разработанная в 1965 г. Созданный как учебный язык для начинающих. Согласно концепциям, заложенным в Basic, этот язык в смысле строгости и стройности является антиподом языка Pascal. В частности, в нем широко распространены различные правила умолчания, что считается плохим тоном в большинстве языков программирования подобного типа. Существует много диалектов этого языка, мало совместимых между собой.

Раsсаl (Паскаль). Созданный Н. Виртом в 1970г. специально для изучения программирования. Предъявляет жесткие требования к структуре программы, поддерживает большое количество пользовательских типов данных. Кроме того, в языке реализована концепция определения новых типов данных на основе уже имеющихся.

Перл, созданный Д.Ритчи в начале 1970-х годов для разработки операционной системы UNIX. Имеет средства для прямой работы с памятью. Был задуман как язык системного программирования для замены ассемблера, чтобы иметь возможность создавать такие же эффективные и короткие программы, но не зависеть от конкретного процессора. Он является самым популярным языком для создания системного программного обеспечения. Однако, большой набор операций и типов данных, современное оформление и высокая степень машино-независимости сделали его привлекательным языком программирования общего назначения. Несмотря на то, что он разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка стал основой для многих других языков. На нем написано множество прикладных и системных программ и ряд известных ОС (в частности, UNIX).

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

С ++. Объектно-ориентированное расширение языка С, созданное Б. Страуструпом в 1980 р. Объединяет свойства как высокоуровневых, так и низкоуровневых языков. Основан на использовании классов и объектов.

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

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

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

ActionScript. Объектно-ориентированный язык программирования, который добавляет интерактивность, обработку данных и многое другое к содержимому Flash-приложений. ActionScript выполняется виртуальной машиной (ActionScript Virtual Machine), которая является составной частью Flash Player. ActionScript компилируется в байт-код, который включается до swf-файла.

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

Ассемблеры, созданные по принципу "одна инструкция - одна строка".

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

Универсальные языки высокого уровня, с помощью которых можно решать любые прикладные задачи. Характеризуются относительной простотой, независимостью от конкретного ПК, возможностью использования мощных синтаксических конструкций (Fortran, Cobol, А1gо1, PL / 1, Basic, Pascal, C / C ++, Javа, ...).

Проблемно-ориентированные языки, предназначенные для реализации крупных проектов, повышение их надежности и скорости создания. Как правило, имеют встроенные мощные операторы, позволяющие одной строкой описать функциональность, для реализации которой на языках младших поколений потребовались бы тысячи строк кода. Ориентированы на специализированные области применения, где хороших результатов можно добиться, используя языки, оперирующие конкретными понятиями узкой предметной области (PROLOG - язык для логического программирования, SQL - язык программирования баз данных, НТМL - язык разметки для Internet, UML - язык графического моделирования).

Системы автоматизированного создания приложений, в том числе и с помощью визуальных средств разработки (RAD-сред). Характеризуются возможностью автоматического формирования результирующего текста на универсальных языках программирования (Delphi, Borland C, MS Visual Studio и т.д.).

На сегодняшний день количество языков программирования измеряется уже тысячами и продолжает расти.

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

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

Существует два способа трансляции:

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

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

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

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

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

Языках интерпретирующего типа является Basic, LISP, Perl, Prolog, Java; компилируя типа - Fortran, Pascal, С, C ++.

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

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

Сканер читает буквы исходного кода программы одна за другой и в соответствии с грамматическими правилами языка объединяет их в лексемы. Например, строка программы на языке С / C ++

len = 3.14 * r;

состоит из следующих лексем: len, =, 3.14, * r,;. При выделении лексем сканер игнорирует пробелы между ними и сдвиги строк исходной программы, поскольку эта информация для трансляции является несущественной.

Большинство сложившихся сканером лексем имеют точно определенный правилами языка содержание: ключевые слова (например, if, for, while) указывают на действия, которые задаются синтаксисом языка программирования; операции (типа "+", "*") указывают на определенные действия (арифметические, логические) или на пересылку данных; числа задают реальные числовые значения (скажем 5 или 7); знаки препинания помогают транслятора разобраться в структуре программы. Другая разновидность лексем - идентификаторы - не имеют точно определенного правилам языка содержания, например, имя программы, имена переменных или констант.

Каждая выделенная лексема дополняется специальной пометкой, что определяет тип данной лексемы. Данная конструкция называется токеном. Например,

Т Океан

П риклады лексем

В пис

Примечание

if

if

оператор

одна лексема

relation

>, <=

операции отношения

<Или <= или = или <> или> = или>

id

count, Name1

идентификатор

много лексем

num

13

числовая стала

много лексем

string

"Речь C ++"

строчная стала

много лексем

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

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

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

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

Пример синтаксического дерева разбора для выражения:

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-4UvIxD.png

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

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

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

Один из самых важных видов анализа ошибок - контроль типов. Многие языки программирования требуют явного описания типов данных. Если же программа не содержит информации о типе переменной, транслятор должен определить ее тип по контексту. Если типы данных, используемые в выражении, не совместимы, то транслированная программа не может работать правильно. Когда такие ошибки выявляются при трансляции, надежность программирования повышается.

Если типы сыновей одного отца не совпадают, то транслятор использует правило, позволяющее ему продолжить работу. Например, если один из сыновей имеет целый, а другой - настоящий тип, то такое правило может указывать, что отец должен иметь действительный тип. Однако возможны недопустимы сочетания типов, например, когда один сын имеет целый (I) тип, а второй - строчный (C). Для такой комбинации типов не существует правила разрешения, и поэтому транслятор выдает программисту сообщение об ошибке.

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

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

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

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

Microsoft Visual Studio - линейка продуктов компании Microsoft, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств. IDE MS Visual Studio .NET - это набор инструментов и средств разработки различного рода приложений (консольных, Windows, мобильных, Web-приложений) и сервисов. MS Visual Studio является мультипрограммным средой, поддерживает несколько языков программирования, в частности, С ++, С #.

Справочные сведения обо всех разработки компании Microsoft собраны в один программный продукт MSDN (Microsoft Developer Network).

В MS Visual Studio каждое отдельное приложение является решением (solution), состоящий из одного или нескольких проектов (project). Одновременно можно открыть только одно решение (с расширением. Sln), при работе над несколькими решениями одновременно нужно запускать несколько окон Visual Studio.

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

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

Запуск среды осуществляется через соответствующий пункт меню Пуск (Пуск После этого на экране появляется стартовая страница (Start Page) MS Visual Studio (рис. 1).

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-qFNOMU.png

Рис. 1. Стартовая страница MS Visual Studio 2018

Элементы графического интерфейса MS Visual Studio характерные для Windows-программ. Размер и форма окон определяется конкретной конфигурацией системы. Пользователь имеет возможность изменять размер и расположение отдельных элементов, сворачивать их с тем, чтобы увеличить место для других, необходимых в данный момент, элементов.

В главном окне Visual Studio можно выделить несколько основных элементов (рис. 2):

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

Размер этих зон и их расположение на экране пользователь может настраивать по собственному желанию.

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-kc1Pu7.png

Рис. 2. Главное окно Visual Studio 2018

Создание консольного приложения

Для создания проекта нужно выбрать соответствующий пункт меню среды Project) или нажать комбинацию клавиш Ctrl + Shift + N.4New4(File При этом появляется диалоговое окно New Project, которое позволяет создавать различные типы проектов (рис. 3).

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-F_kTB1.png

Рис. 3. Окно New Project

Чтобы создать консольного приложения, следует в разделе Project Types (Тип проекта) указать значение Win32, а в разделе Templates (Шаблон) - значение Win32 Console Application (Консольное приложение). После дальнейшего указания имени проекта, его местонахождение и нажатия кнопки Ok осуществляется активизация мастера создания и применения (Application Wizard), который позволяет задать нужные параметры применения (рис. 4).

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-nIaYLA.png

Рис. 4. Окно мастера Application Wizard

Создание проекта приводит к созданию на диске проекта указанного типа, а также создается решения по указанным названием (вместе со ссылками на проект).

Просмотреть содержимое проекта, изображенный деревом файлов, которые его образуют, можно в окне Solution Explorer (рис. 5).

https://studfiles.net/html/2706/299/html_DFLO3RiNM6.drE3/img-56WxgN.png

Рис. 5. Окно Solution Explorer

После создания пустого проекта следует добавить в него по крайней мере исходный файл (.срр), который будет содержать программный код (например, New Item).4Project

3.4. Объектно-ориентированные языки

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

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

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

Пионером данного направления явился язык Смолток (Smalltalk), первоначально предназначенный для реализаций функций машинной графики. Работа над языком началась в 1970 г. В исследовательской лаборатории XEROX (США), а закончилась в 1980 г. окончательным вариантом интерпретатора Smalltalk-80. Данный язык оригинален тем, что его синтаксис очень компактен и базируется исключительно на понятии объекта. В нем отсутствуют операторы или данные, все, что входит в Смолток, является объектами, а объекты общаются друг с другом исключительно с помощью сообщений. В настоящее время версия VisualAge for Smalltalk активно развивается компанией IBM.

К наиболее распространенным современным языкам объектно-ориентированного программирования относятся C++ и Java.

Язык C++ был разработан в начале 80-х гг. Бьярном Страуструпом в лаборатории Bell корпорации AT&T. Им была создана компактная компилирующая система, в основе которой лежал язык С, дополненный элементами языков BCPL, Simula-67 и Алгол-68. Более ранние версии языка были известны как «С с классами». В июле 1983 г. C++ был впервые использован за пределами исследовательской группы автора, однако тогда еще многие особенности языка не были придуманы. К 1990 г. была выпущена третья версия языка C++, стандартизированная американским государственным комитетом стандартов ANSI. В 1990 г. сотрудник корпорации Sun Д. Гослинг на основе расширения C++ разработал объектно-ориентированный язык Oak, основным достоинством которого было обеспечение сетевого взаимодействия различных по типу устройств. Новая интегрируемая в Internet версия языка получила название Java. С января 1995 г. Java получает распространение в Internet.

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

Синтаксис языков C++ и Java практически полностью совпадает. Принципиальным различием является то, что язык C++ компилируемый в машинный код, a Java – в платформо-независимый байт-код (каждая команда занимает один байт), этот байт-код может выполняться с помощью интерпретатора – виртуальной Java-машины (Java Virtual Machine), версии которой созданы сегодня для любых платформ. С точки зрения возможностей объектно-ориентируемых средств, Java имеет ряд преимуществ перед C++. Язык Java имеет более гибкую и мощную систему инкапсуляции информации.

Механизм наследования, реализованный в Java, обязывает к более строгому подходу к программированию, что способствует надежности и читабельности кода. Язык C++ обладает сложной неадекватной и трудной для понимания системой наследования. Возможности динамического связывания объектов одинаково хорошо представлены в обоих языках, но синтаксическая избыточность C++ и здесь принуждает к выбору языка Java. Сегодня Java по популярности занимает второе место в мире после Бейсика.

Идеи ООП проникли во многие процедурные языки. Например, в состав интегрированной системы программирования Паскаль (корпорации Borland International), начиная с версии 5.5, входит специальная библиотека ООП Turbo Vision.

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

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

К объектно-ориентированным системам визуального проектирования относятся: Visual Basic, Delphi, C++ Builder, Visual C++. Это системы программирования самого высокого уровня. VBA (Visual Basic for Application) является общей языковой платформой для приложений Microsoft Office (Excel, Word, Power Point и др.). VBA соблюдает основной синтаксис и правила программирования языков Бейсик-диалектов. VBA помогает довольно сильно расширить возможности приложений за счет написания макросов. VBA позволяет создавать объекты управления графического интерфейса пользователя, задавать и изменять свойства объектов, подключать к ним необходимый для конкретного случая программный код. С помощью VBA можно производить интеграцию между различными программными продуктами. Программы на языке VBA для приложений создаются двумя способами: в автоматическом режиме как результат построения клавишной макрокоманды или путем написания программного кода.

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

Суть функционального (аппликативного) программирования определена А.П. Ершовым как «способ составления программ, в которых единственным действием является вызов функции, единственным способом расчленения программы на части является введение имени функции, а единственным правилом композиции – оператор суперпозиции функций. Никаких ячеек памяти, ни операторов присваивания, ни циклов, ни, тем более, блок-схем, ни передачи управления».

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

Первым таким языком стал Лисп (LISP, LISt Processing - обработка списков), созданный в 1959 г. Джоном Маккарти. Этот язык ориентирован на структуру данных в форме списка и позволяет организовать эффективную обработку больших объемов текстовой информации. Существенная черта языка – единообразие программных структур и структур данных: все выражения записываются в виде списков.

3.6 Логическое программирование

Создание языка искусственного интеллекта Пролог (PROLOG, PROgramming in LOGic – программирование в терминах логики) в 1973 г. французским ученым Аланом Кольмероэ открыло новую область – логическое или реляционное программирование.

Концепция логического программирования базируется на понятии отношение. Логическая программа – это совокупность аксиом и правил, определяющих отношения между объектами и целью.

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

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

3.7. Языки сценариев (скрипты)

Язык JavaScript. JavaScript появился в 1995 году, когда язык Java был уже достаточно широко известен. К тому времени, однако, существовал прототип языка JavaScript — язык описания скриптов (сценариев) LiveScript, встроенный в браузер Netscape Navigator 2.0. Впоследствии компания Netscape отказалась от названия LiveScript и в сотрудничестве с компанией Sun Microsystems, создавшей язык программирования Java, начала разработку нового языка, получившего название JavaScript [6,7].

Несмотря на некоторое сходство в синтаксисе и методах создания объектов, языки Java и JavaScript мало похожи. Определение языка JavaScript как "облегченной версии" языка Java является неточным. Многие утверждают, что язык JavaScript – это язык описания сценариев, а не язык программирования. Однако описание сценариев и программирование тесно связаны между собой, несмотря на то, что скрипты и программы применяются для различных целей. С введением обработчиков событий HTML-документы стали более "живыми", поскольку разработчики получили возможность определять их поведение в зависимости от действий пользователя. Важен тот факт, что JavaScript-программы действительно являются выполняемым содержимым документов; они физически находятся внутри HTML-документов, в отличие от Java-апплетов, которые существуют вне документов, их активизирующих. Пример реакции системы на действия человека приведен на рис. 3.1. Курсор мыши в своем движении по экрану остановился на символе сноски. В результате обработки произошедшего события поверх основного текста документа всплыл текст сноски. Читателю не нужно использовать прокрутку документа, чтобы добраться до сноски, она сама появляется перед ним и сама исчезает, если курсор мыши сдвинуть в сторону от символа сноски.

положение курсора мыши

Рис. 6. Пример использования скриптов в документах

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

В результате, с помощью JavaScript-программ вы можете:

  • формировать HTML-документы "на лету";
  • производить проверку правильности данных HTML-формы перед передачей их на сервер;
  • предоставить пользователю возможность вводить локальные данные для управления работой JavaScript-программы, а также выборочно выполнять различные операции;
  • создавать окна сообщений и диалоговые окна для вывода предупреждающих сообщений и ввода данных;
  • создавать документы с расширенными возможностями навигации, используя фреймы и автономные окна;
  • обнаруживать Java-апплеты и подключаемые модули (plug-in) браузера и взаимодействовать с ними.

3.8. Языки, ориентированные на данные

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

Сегодняшние объектно-ориентированные технологии включают объектно-ориентированные языки программирования (например, С++ и Smalltalk), объектно-ориентированные системы баз данных, объектно-ориентированные интерфейсы пользователя (например, оконные системы Macintosh и Microsoft, настольные издательские системы Frame и Interleaf) и т.д. Объектно-ориентированная технология делает возможным использование "объектно-ориентированных концепций".

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

Сила объектно-ориентированных концепций проистекает из объединения инкапсуляции и наследования.

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

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

Первый состоит в хранении и управлении объектами, созданными программами, которые написаны на конкретных объектно-ориентированных языках, в частности, на С++ или Smalltalk Конечно, для этого можно использовать и РБД. Однако такие базы данных ничего не знают об объектах, методах и наследовании. Поэтому необходимо написать "менеджер объектов" или "объектно-ориентированный слой" для управления методами и наследованием и для трансляции объектов в кортежи отношений. Но менеджер объектов вместе с РБД и дают ООБД (конечно, с низкой производительностью).

Другой подход предоставляет доступ к объектно-ориентированным средствам пользователям традиционных языков. Этот подход, по сути, превращает такие языки, как С, FORTRAN, COBOL и т.д., в объектно-ориентированные языки. Спроектированные таким образом ООБД могут использоваться для хранения и управления объектами, созданными программами, написанными и на объектно-ориентированных языках.

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

Для модернизации языка запросов ООБД потребуется выполнение следующих операций:

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

2. Реализация процедуры синтаксического разбора запросов.

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

4. Реализация различных алгоритмов обработки запросов для вычисления сложных запросов (соединения, операции над множествами, вложенные подзапросы).

5. Реализация нескольких методов доступа (структур для сохранения и извлечения данных), таких как универсальная сортировка, индексное B+-дерево, расширяемая хэш-таблица.

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

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

8. Интеграция алгоритмов обработки запросов с механизмами контроля одновременного доступа и восстановления после сбоев.

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

Таким образом, объектно-ориентированные технологии значительно расширяют возможности использования СУБД, но продолжают оставаться актуальным направлением разработки баз данных нового поколения.

Выводы

В настоящий момент большинство современных языков программирования [3, 4] обычно включают средства и приёмы программирования различных парадигм, хотя классифицируются согласно средствам своего ядра (к примеру, язык программирования Лисп – функциональный язык, хотя включает некоторые конструкции императивного стиля). Тем самым все более сложным становится выбор языка для обучения программированию в высшей школе.

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

Список использованной литературы

1. Александреску, А. Язык программирования D / А. Александреску. — М.: Символ, 2013. — 536 c.

2. Александреску, А. Язык программирования D / А. Александреску. — СПб.: Символ-плюс, 2014. — 544 c.

3. Ашарина, И.В. Основы программирования на языках С и С++: Курс лекций для высших учебных заведений / И.В. Ашарина. — М.: Гор. линия-Телеком, 2012. — 208 c.

4. Баженова, И.Ю. Языки программирования: Учебник для студентов учреждений высш. проф. образования / И.Ю. Баженова; Под ред. В.А. Сухомлин. — М.: ИЦ Академия, 2012. — 368 c.

5. Белоусова, С.Н. Основные принципы и концепции программирования на языке VBA в Excel: Учебное пособие / С.Н. Белоусова, И.А. Бессонова. — М.: БИНОМ. ЛЗ, 2010. — 200 c.

6. Бьянкуцци, Ф. Пионеры программирования: Диалоги с создателями наиболее популярных языков программирования / Ф. Бьянкуцци, Ш. Уорден; Пер. с англ. С. Маккавеев. — СПб.: Символ-Плюс, 2011. — 608 c.

7. Бьянкуцци, Ф. Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования / Ф. Бьянкуцци, Ш. Уорден. — М.: Символ, 2011. — 608 c.

8. Бьянкуцци, Ф. Пионеры программирования. Диалоги с создателями наиболее популярных языков программирования / Ф. Бьянкуцци, Ш. Уорден. — СПб.: Символ-плюс, 2011. — 608 c.

9. Гавриков, М.М. Теоретические основы разработки и реализации языков программирования: Учебное пособие / М.М. Гавриков, А.Н. Иванченко, Д.В. Гринченков. — М.: КноРус, 2010. — 184 c.

10. Гергель, В.П. Современные языки и технологии паралелльного программирования: Учебник / В.П. Гергель. — М.: МГУ, 2012. — 408 c.

11. Гергель, В.П. Современные языки и технологии параллельного программирования: Учебник/ предисл.: В.А. Садовничий. / В.П. Гергель. — М.: Изд. МГУ, 2012. — 408 c.

12. Голицына, О.Л. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. — М.: Форум, НИЦ ИНФРА-М, 2013. — 400 c.

13. Головин, И.Г. Языки и методы программирования: Учебник для студентов учреждений высшего профессионального образования / И.Г. Головин, И.А. Волкова. — М.: ИЦ Академия, 2012. — 304 c.

14. Довек, Ж. Введение в теорию языков программирования / Ж. Довек, Ж.-Ж. Леви. — М.: ДМК, 2016. — 134 c.

15. Дорогов, В.Г. Основы программирования на языке С: Учебное пособие / В.Г. Дорогов, Е.Г. Дорогова; Под общ. ред. проф. Л.Г. Гагарина. — М.: ИД ФОРУМ, НИЦ ИНФРА-М, 2013. — 224 c.

16. Касторнова, В.А. Структуры данных и алгоритмы их обработки на языке программирования Паскаль: Учебное пособие / В.А. Касторнова. — СПб.: BHV, 2016. — 304 c.

17. Кауфман, В.Ш. Языки программирования. Концепции и принципы / В.Ш. Кауфман. — М.: ДМК, 2011. — 464 c.

18. Керниган, Б. Язык программирования C. 2-е изд. / Б. Керниган, Д.М. Ритчи. — М.: Вильямс, 2016. — 288 c.

19. Керниган, Б.У. Язык программирования С / Б.У. Керниган, Д.М. Ритчи; Пер. с англ. В.Л. Бродовой. — М.: Вильямс, 2013. — 304 c.

20. Маслов, В.В. Основы программирования на языке Perl / В.В. Маслов. — М.: Радио и связь, 2000. — 144 c.

21. Монахов, В.В. Язык программирования Java и среда NetBeans. 3-е изд., пер. и доп. + DVD / В.В. Монахов. — СПб.: BHV, 2012. — 704 c.

22. Новичков, В.С. Начала программирования на языке QBASIC. Учебное пособие / В.С. Новичков, А.Н. Пылькин. — М.: ГЛТ, 2007. — 268 c.

23. Страуструп, Б. Язык программирования C++: Специальное издание / Б. Страуструп; Пер. с англ. Н.Н. Мартынов. — М.: БИНОМ, 2012. — 1136 c.

24. Страуступ, Б. Язык программирования С++. Специальное издание / Б. Страуступ. — М.: Бином, 2015. — 1136 c.

25. Троелсен, Э. Язык программирования С# 5.0 и платформа .NET 4.5 / Э. Троелсен; Пер. с англ. Ю.Н. Артеменко. — М.: Вильямс, 2013. — 1312 c.

26. Фридман, А.Л. Основы объектно-ориентированного программирования на языке Си++ / А.Л. Фридман. — М.: Гор. линия-Телеком, 2012. — 234 c.

27. Хейлсберг, А. Язык программирования C#. Классика Computers Science / А. Хейлсберг, М. Торгерсен, С. Вилтамут. — СПб.: Питер, 2012. — 784 c.

28. Цуканова, Н.И. Теория и практика логического программирования на языке Visual Prolog 7: Учебное пособие для вузов / Н.И. Цуканова, Т.А. Дмитриева. — М.: Гор. линия-Телеком, 2013. — 232 c.

29. Цуканова, Н.И. Теория и практика логического программирования на языке Visual Prolog 7. Учебное пособие для вузов. / Н.И. Цуканова, Т.А. Дмитриева. — М.: РиС, 2013. — 232 c.

30. Шохирев, М.В. Язык программирования Perl 5: Учебное пособие / М.В. Шохирев. — М.: БИНОМ. ЛЗ, ИНТУИТ.РУ, 2013. — 279 c.

31. Шохирев, М.В. Язык программирования Perl 5 / М.В. Шохирев. — М.: Интуит, 2014. — 279 c.