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

Обзор языков программирования высокого уровня (СИСТЕМЫ ПРОГРАММИРОВАНИЯ)

Содержание:

ВВЕДЕНИЕ

Актуальность. Разработка новых языков программирования в течение последних нескольких десятилетий была основана на опыте разработчиков. Это означает, что появился код, который стало проще писать (движущая сила Ruby) и проще читать (Python), и делать определенные типы логических структур и способы решения проблем более интуитивными.

Некоторые языки были разработаны для решения конкретных проблем в программировании (например PHP и SASS), чтобы управлять определенными типами систем (SQL), или для работы в определенной среде или на определенной платформе (Java и JavaScript). Некоторые языки были разработаны специально для того, чтобы помочь новичкам научиться программировать (классическими примерами являются BASIC и Scratch).

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

Предмет исследования –приложения в языках программирования высокого уровня.

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

Задачи, направленные на достижение цели курсовой работы:

  • проанализировать системы программирования;
  • изучить возможности языка программирования;
  • изучить возможности языка программирования высокого уровня;
  • выявить особенности Паскаль, C++, Python.

Рассмотрению вопроса графических приложений в языках программирования высокого уровня посвящены работы авторов И. А. Бабушкиной, С. М. Окулова, О. Е. Масленниковой, И. В. Гавриловой, Л. Г. Гагариной, Е. В. Кокоревой и других.

ГЛАВА 1. СИСТЕМЫ ПРОГРАММИРОВАНИЯ

1.1 Понятие о языках программирования высокого уровня

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

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

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

Языки программирования – это формальные языки специально созданные для общения человека с компьютером. Каждый язык программирования, равно как и «естественный» язык (русский, английский и т.д.), имеет алфавит, словарный запас свои грамматику и синтаксис, а также семантику[7].

Алфавит – фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке.

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

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

При описании языка и его применении используют понятия языка. Понятие подразумевает некоторую синтаксическую конструкцию и определяемые ею свойства программных объектов или процесса обработки данных[4].

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

Языки программирования, имитирующие естественные языки, обладающие укрупненными командами, ориентированными на решение прикладных содержательных задач, называют языками «высокого уровня». В настоящее время насчитывается несколько сотен таких языков, а если считать и их диалекты, то это число возрастет до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, машинная программа в конечном счете записывается с помощью лишь двух символов 0 и 1. Во-вторых, каждая ЭВМ имеет ограниченный набор машинных операции, ориентированных на структуру процессора. Как правило, этот набор состоит in сравнительно небольшого числа простейших операций, типа: переслать число и ячейку; считать число из ячейки; увеличить содержимое ячейки на +1 и т.п. Команда на машинном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содержит код и адреса ячеек, с содержимым которой выполняется закодированное действие[2].

Языки программирования высокого уровня имеют следующие достоинства:

− алфавит языка значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста;

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

− конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;

− используется аппарат переменных и действия с ними;

− поддерживается широкий набор типов данных.

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

1.2 Виды языков программирования

В данном пункте рассмотрим пополняющийся список популярных языков программирования, разметок и протоколов. Ссылки на описание каждого из них [21]:

Кодировка ASCII

  • Кодировка символов является одним из основных компьютерных и Интернет аспектов. ASCII – это первая, широко использованная система кодировки символов. Она была вытеснена UTF-8, но ASCII по-прежнему является основой для подавляющего большинства символов в Интернете и на сегодняшний день. Понимание этого очень важно для программистов. Читайте подробнее здесь (англ): The Ultimate Guide to ASCII Encoding

ASP / ASP.NET

  • ASP – это аббревиатура для Active Server Pages. Это первый скриптовый серверный язык для  веб-сервера Microsoft IIS. ASP был заменен на серверный фреймворк с открытым исходным кодом – ASP.NET. Подробнее (англ): ASP Primer

AutoLISP

  • AutoLISP – это простой, легкий, интерпретируемый язык программирования, созданный специально для автоматизированного проектирования программного обеспечения. Читайте об этом (англ): AutoLISP Resources

Awk

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

BASH

  • Bash – это наиболее часто используемый интерфейс командной строки в мире Unix. Это интерфейс на основе текста по умолчанию и для Linux и для Mac OS X. Подробнее (англ): Bash Scripting Guide

Common Lisp

  • Lisp является довольно уникальным языком программирования, возможно, самым древним языком и до сих пор продолжает использоваться. Это особенно важно в области искусственного интеллекта. Подробнее (англ): Common Lisp

C

  • Если мы включим сюда две производные этого языка, то смело можно будет сказать, что ни один язык не проиносил большей пользы и большего влияния, чем С. Это особенно важно для развития операционных систем и другого программного обеспечения. Многие компиляторы и интерпретаторы для других языков написаны на языке C. Подробнее (англ): C Developer Resouces

C++

  • Первоначально он назывался “C с классами”, C++, во многих отношениях, просто более продвинутый преемник C (хотя в целом ситуация сложнее). C++ был разработан, чтобы добавить высокий уровень парадигмы программирования C, сохраняя при этом возможности аппаратной манипуляции низкого уровня. Многие из этих дополнений добавлялись в C на протяжении многих лет, и языки больше похожи на два диалекта одного и того же языка. Подробнее (англ): C++ Developer Resources

C#

  • Использовался в качестве основного языка для .NET программирования, похож на C++, является расширением языка программирования C, но с важным дополнением в виде объектно-ориентированных возможностей. Подробнее (англ): C# Resources

CSS / CSS3

  • CSS или Cascading Style Sheets, также не является языком программирования, а языком стиля страницы – это язык, предоставляющий стиль и правила компоновки документам и приложениям. Является основным используемым в Интернете языком стиля. Подробнее: CSS Resources

Emacs Lisp

  • Emacs уже давно был известен как популярный и мощный текстовый редактор. Но добавление в него Emacs Lisp, превращает его в интегрированную среду разработки для почти любого языка программирования. Подробнее (англ): Emacs Lisp Resources Page.

F#

  • F# – язык программирования общего назначения. Разработан, чтобы быть чрезвычайно эффективным. Будучи изначально только языком Microsoft, теперь является языком с открытым исходным кодом и используется на всех платформах. Подробнее (англ): F# Resources .

FORTAN

  • Fortran впервые появился в 1957 году и до сих пор используется для решения некоторых из наиболее сложных проблем современной науки и техники. Подробнее (англ):  Fortran Resources

FORTH

  • Работа над Forth началась в 1968 году, и язык обычно используется на оборудовании, не имеющем традиционную операционную систему. Он также широко используется для управления станками. Подробнее (англ): FORTH Resources

Haskell

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

HTML

  • HTML не является языком программирования. Это язык разметки – язык добавления смысловых и стилистических аннотаций содержимому. Является основным языком для веб-контента. Знание его необходимо и обязательно всем веб-дизайнерам и веб-разработчикам, а также всем (писателям, редакторам), кто производит Интернет контент. Подробнее (англ): Ultimate Guide to HTML и Composing Good and Valid HTML

IDL

  • IDL, или Interactive Data Language, это язык программирования, используемый в основном для анализа и визуализации данных. Он до сих пор широко используется в аэрокосмической промышленности и астрономии. Подробнее (англ): IDL Resources

INTERCAL

  • INTERCAL является пародийным компьютерным языком, разработанным в начале 1970-х годов. Его создали как шутку, чтобы показать как технически сложны языки и трудно читаемы. Это реальный язык, который можно скачать, и с помощью которого можно даже что-то сделать. Подразумевается, что вы должны быть хорошо с ним знакомы для этого – но, опять же, не слишком хорошо, ведь и это не понравится самому INTERCAL. Подробнее (англ): INTERCAL Introduction and Resources

Java

  • Java является языком высокого уровня и предназначен для использования на Java Virtual Machine. Имеет очень мало внешних зависимостей, и был предназначен для работы на любой физической машине. Много используется в сетевой архитектуре, а также во встраиваемых устройствах и других вычислительных приложениях. Подробнее (англ): See our detailed guide to Java.

Javascript

  • JavaScript (не имеет фактического отношения к Java) это скриптовый язык, изначально разработанный для использования в веб-браузерах. Поэтому он имеет встроенную возможность работы с Document Object Model (DOM), отображением находящегося в памяти контента веб-страниц. Является основным языком программирования для front-end веб-разработки. В основном управляется событиями, и, благодаря Node.JS, в последнее время получил признание как серверный язык. Подробнее (англ): More on Javascript и jQuery. И здесь: Bootstrap Resources

Ksh

  • Korn Shell (ksh) представляет собой интерфейс командной строки, используемый на Unix. Он был ранней оболочкой (shell), совместимый со стандартной оболочкой Bourne, но со всеми классными интерактивными функциями оболочки C. Подробнее (англ): Korn Shell Programming Resources

Linux Programming

  • Программирование Linux включает в себя все: начиная от скриптов оболочки до разработки приложений и разработки ядер. Подробнее (англ): Linux Resource

Logo

  • Logo один из самых ранних языков по обучению программированию, и до сих пор, вероятно, самый известный. Он известен своей черепахой, которую дети заставляют передвигаться компьютерными командами. Весело обучает программированию. Подробнее (англ): Logo Programming Resources

ML

  • ML первоначально разработан как язык мета-программирования: язык для создания других языков. Но со временем он стал языком общего назначения, широко использовался в образовании, математике, естественных науках и даже финансах. Подробнее (англ): ML Resource and Introduction.

MPI

  • Message Passing Interface (Интерфейс передачи сообщений) представляет собой стандартный протокол для отправки сообщений между процессами или программами. Был реализован в ряде языков программирования, включая C, C++, Java и Python. Благодаря MPI стали возможны параллельные вычисления. Подробнее (англ): See our Guide to MPI

Сетевое программирование с интернет-сокетами

  • Сетевое программирование это процесс объединения компьютеров в сеть, а также создание программных систем, которые будут работать по всей этой сети. Гнездо (сокет) представляет собой конечную точку данных для этой сети, предоставляя интерфейс (API) для взаимодействия с системой извне. Большинство сетевых сокетов – это интернет сокеты, а это значит, что они используют Интернет протокол для связи. Подробнее (англ) :More about network programming & sockets

OAuth

  • Вы, несомненно, использовали эту систему много раз, но вы могли этого даже не знать. Например, некоторые комментирующие системы позволяют войти с вашей учетной записью на Facebook или Google+. Это делается с помощью OAuth. Подробнее (англ): More on OAuth

Objective-C

  • Еще одна версия C, созданная в 1980-е годы для того, чтобы обеспечить полностью объектно-ориентированную реализацию C. Сейчас основное применение этого языка приходится на Mac OSX  и операционные системы iOS. До недавнего времени iOS приложения должны были быть написаны на Objective-C, но сейчас можно писать также на Swift. Подробнее (англ): More on Objective-C

OCaml

  • OCaml является объектно-ориентированным функциональным компьютерным языком. По ML традиции, он много используется для написания других языков программирования и фреймворков. Подробнее (англ): OCaml Introduction and Resources.

Разработка операционной системы

  • Эверестом среди работ по программированию считается разработка операционной системы. Если вы хотите доказать себе, что можете написать все, что угодно, то нет ничего лучше, чем написать свое собственное ядро операционной системы и связанные с ней инструменты.Но будьте осторожны: это путешествие по силам только храбрым и истинным программистам! Подробнее (англ): Operating System Development Resources.

Perl

  • Очень полезный инструмент практически любого программиста. В качестве интерпретируемого языка его не нужно компилировать, иногда упоминается как “швейцарский армейский нож” скриптовых языков. Подробнее (англ): Perl Resources

PROLOG

  • Пролог – язык логического программирования, разработан для обработки естественного языка. Подробнее (англ): Prolog Intro & Resources

Pure Data

  • Pure Data является уникальным визуальным языком программирования. Был создан специально для того, чтобы позволить пользователям создавать видео, аудио и графические работы. Подробнее (англ): Pure Data Resource Page.

Python

  • Python является языком программирования высокого уровня. Интерпретируемый (некомпилируемый) язык, также известный как “скриптовый язык”. В основном используется в качестве инструмента для выполнения специализированных задач программирования, таких как задачи по автоматизации и анализу данных. Имеет сильный набор инструментов для математических и научных вычислений, часто используется исследователями. Подробнее (англ):Python Resources

Ruby on Rails

  • Ruby on Rails – это фреймворк для веб-разработки для языка программирования Ruby. Он обеспечивает архитектуру MVC (Model View Controller), уровень абстракции базы данных, а также множество инструментов для ускорения процесса программирования веб-приложений. Очень популярен для быстрой разработки веб-приложений. Подробнее (англ): More about Ruby on Rails

SAS

  • SAS является специализированным языком, предназначенным для анализа статистических данных. Широко используется в правительственных, научных кругах и бизнесе. Для людей, обладающим большим количеством данных, SAS является очевидным выбором. Подробнее (англ): SAS Programming Resources.

Scala

  • Scala является относительно новым языком – более или менее новой и лучшей Java. Это отличный язык для Java-программистов, которые хотят быть более эффективными, или для людей, кто только начинают изучать программирование и хотят изучать мощный язык, который не будет ограничивать их в будущем. Подробнее (англ): Scala Resources.

Scheme

  • Scheme  – старый язык, но до сих пор используется для обучения программированию и более сложных предметов в информатике. Основан главным образом на Lisp, и частично на ALGOL. Подробнее (англ): Scheme Resource page.

Scratch

  • Язык программирования Scratch был создан специально для обучения программированию детей в возрасте от 8 до 16 лет. Scratch – легкий, и с ним изучать основы логики программирования детям можно в увлекательной игровой форме. Подробнее (англ): Scratch Resources

Simula

  • Simula – исторически важный язык, так как это был первый язык, внедривший понятия, ставшие основой для объектно-ориентированного программирования. Подробнее (англ): More on Simula’s interesting history.

SMIL

  • SMIL (Synchronized Multimedia Integration Language) инструмент для тех людей, которые хотят создавать и распространять презентации. Особенно полезен, если вы хотите создавать презентации, которые должны время от времени обновляться. Подробнее (англ): SMIL Guide

SQL

  • SQL (Structured Query Language) – язык, используемый для связи с Relational Database Management Systems (RDBMSes). SQL позволяет программисту создавать структуры данных, вставлять и редактировать данные, а также их запрашивать. Подробнее (англ): SQL Guide

Stata

  • Stata это среда разработки и язык программирования для решения серьезных статистических проблем. И хотя он создан довольно давно, но все еще широко используется. Если вы связаны со статистической работой, Stata – отличный инструмент. Подробнее (англ): Stata Programming Resources

Swift

  • Swift является новыйм языком программирования, разработанным компанией Apple, для iOS, OS X, watchOS, tvOS и Linux. Это язык будущего для разработчиков программ и приложений для устройств Apple. Подробнее (англ): Swift Resources

S-PLUS

  • S-PLUS является коммерческой версией мощного языка программирования S, разработанного для выполнения статистического анализа. Проект GNU имеет свою собственную версию S, называемую R. Все необходимые ресурсы о S с акцентом на S-PLUS: S-PLUS Programming Resources Page.

UNIX Programming

  • Широта программирования на Unix велика. Она охватывает диапазон от административных скриптов к коду на основе текста до разработки X Window. Подробнее (англ): UNIX Programming Resources

XML

  • XML  хорошо структурированный язык для разметки, предназначен, как для чтения человеком, так и машиной. Подробнее (англ):XML Guide & Validators

ГЛАВА 2. СРАВНИТЕЛЬНЫЙ АНАЛИЗ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ

2.1. Возможности Паскаль, C++, Python

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

Python ­– это интерпретируемый, объектно-ориентированный язык программирования высокого уровня с динамической типизацией, автоматическим управлением памятью и удобными высокоуровневыми структурами данных, такими как списки, кортежи и словари. Поддерживает классы, модули, обработку исключений, а также многопоточные вычисления. Достоинством языка является то, что он обладает простым и выразительным синтаксисом, поддерживает структурное, объектно-ориентированное, функциональное и аспектно-ориентированное программирование [2].

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

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

Понятие переменной в языке программирования С++ как и в языке программирования Паскаль тождественно: под переменной понимают поименованный участок памяти, в котором хранится значение определенного типа. Другими словами переменная – это именованная область памяти для хранения данных, которые могут изменяться в процессе выполнения программы. Исходя из определения, отличительными характеристиками данного понятия являются тип, идентификатор и значение. Имена и типы переменных указываются при описании и не могут изменяться в процессе выполнения программы. В Паскале тип переменной объявляется после служебного слова var, в разделе описания переменных.

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

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

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

Существуют различные классификации типов данных. Например, типы данных подразделяются на стандартные и заданные пользователем. К стандартным типам данных относятся int (целый), float (вещественный с плавающей точкой), char (символьный), string (строковый). К типам данных, заданным пользователем, относятся массивы и структуры.

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

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

В языке Паскаль тип массива задается с использованием специального слова array (англ. – массив), после чего указывается тип индекса массива и тип элементов массива. С помощью индекса можно обращаться с отдельным элементам любого массива, как к обычной переменной заданного типа: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях. Недостатком языка Паскаль является то, что переменные в массиве можно перебирать с интервалом равным 1 в прямом или обратном порядке с помощью стандартного цикла обхода (цикл for – цикл с параметром).

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

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

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

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

Кортеж используется для представления неизменяемой последовательности разнородных объектов. Его элементы записываются в круглых скобках. Так как кортеж – один из типов последовательностей, то всё, что можно применять к строкам в Python, верно и по отношению к кортежам. Можно найти длину кортежа, вывести все его элементы на экран с помощью цикла for, а также, пользуясь оператором in, проверить кортеж на вхождение какого-либо элемента. Кортежи можно сцеплять, создавать на них срезы.

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

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

При работе с кортежами, словарями и списками удобно пользоваться функцией len(s), где s последовательность. Данная функция определяет длину последовательности. Необходимо заметить, что в Паскаль и С++ такой функции нет! Чтобы в Паскале и С++ определить количество элементов в массиве, необходимо инициализировать новую переменную, присвоить ей значение 0, а затем с помощью цикла for перебрать все элементы массива, увеличивая созданную переменную с каждым элементом на 1 – стандартный цикл обхода массива.

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

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

Для логически верного использования конструкций языка важно помнить, что в Паскаль блоки выделяются с помощью служебных слов begin – end, в С++ –  с помощью фигурных скобок {}. В языке программирования Python дело обстоит гораздо иначе. Здесь большую роль играют отступы. Вложенные инструкции объединяются в блоки по величине отступов. Отступ может быть любым, главное, чтобы в пределах одного вложенного блока отступ был одинаков. Но не стоит забывать про читаемость кода! Именно эта особенность Python и повышает читаемость кода только лишь спецификацией языка.

Например, при записи условного оператора в первой строке размещается условие (логическое выражение), а в блоке с отступом – практически любое действие. Если условие истинно, то выполняется код в блоке после команды if, а если ложно, этот код игнорируется.

Нередко в программе требуется проверять более двух возможных ситуаций. Для этого в Python предусмотрен синтаксис if – elif – else. Python выполняет только один блок в этой цепочке. Все условия проверяются по порядку до тех пор, пока одно из них не окажется истинным. Далее выполняется код, следующий за этим условием, а все остальные проверки Python пропускает. Для языков С++ и Паскаль реализация подобных ситуаций в коде требует использование вложенных конструкций, что усложняет читабельность кода и требует усиления внимания программиста к выполнению правил их использования («else относится к ближайшему if»).

Использование в Python конструкции if – elif – else похоже на использование операторов выбора сase оf и switch() в Паскале и С++ соответственно.

Циклы while с предусловием и постусловием в данных языках программирования особого отличия не имеют.

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

В С++ дело обстоит немного иначе. Сначала инициализируется параметр цикла, после чего ставится точка с запятой. Затем задается конечное значение счетчика цикла. Снова ставим точку с запятой. Задаем шаг цикла. Шаг цикла – это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.

Чтобы в Python использовать цикл for необходимо сначала написать служебное слово for, потом имя переменной, в которой предполагается сохранять значения элементов, потом in, затем имя перебираемой последовательности, двоеточие и, наконец, тело цикла. Вот и всё.

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


2.2 Язык логического программирования PROLOG


Язык логического программирования PROLOG (далее – ПРОЛОГ) большинству программистов представляется чем-то запутанным и малопригодным для практического применения. В то же время, Интернет основан на символьной информации, поэтому практически все современные программисты сталкиваются с необходимостью обрабатывать символьные структуры данных, а ведь для этого и предназначен язык логического программирования ПРОЛОГ. Этот язык – идеальный для работы с символьными структурами, текстовыми файлами и для построения интеллектуальных программ.

После многолетней работы с ПРОЛОГом, столкнулся с новомодным Haskell, о котором все авторы гордо говорят – «высокий порог вхождения». По-моему, «высота» этого порога образовалась в результате запутанного синтаксиса и нагромождения встроенных процедур. Еще один источник этой «высоты» — высокомерие авторов многочисленных руководств, которые написаны так, будто читатель никогда программ не писал.

Сразу захотелось назад, к «родному» ПРОЛОГу – простому и понятному. Думаю, если объяснить без нагромождений, типа декларативной семантики, время вхождения в логическое программирование для «обычного» программиста не превысит 30 минут.

Попробую описать его с точки зрения процедурного программирования.

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

Представим себе язык программирования, в котором все операции сводятся к вызову процедур. При этом каждая процедура существует в нескольких вариантах и программа сама выбирает себе правильный, точнее говоря, пригодный для каждого конкретного варианта исходных данных вариант реализации (тело) процедуры. Как определяется пригодность – каждый вызов процедуры, во время исполнения программы, по результатам исполнения процедуры, получает логическое значение – TRUE или FALSE. Совокупность процедур с одинаковым именем и арностью называется предикатом.

Каждый предикат в языке ПРОЛОГ идентифицируется двумя параметрами –именем и арностью – количеством параметров. Например, предикат инвертирования списков идентифицируется, как nrev/2, а предикат соединения списков как append/3. Никакого объявления параметров или переменных не требуется, но можно ограничить параметры паттерном в заголовке процедуры. Например, в одном варианте предиката первый параметр может быть указан как [] – пустой список, в другом – как [A,B,C] – список из трех элементов, а в третьем как [H|T] – произвольный непустой список.

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

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

Алгоритм интерпретации программы (выполнения цели) в системе ПРОЛОГ.

Вход: цель p(A1,A2,…,An)

1. Найти в памяти процедуру по имени p с арностью n.

2. Унифицировать входные параметры цели с заголовком найденной процедуры.

3. Если унификация параметров прошла, выполнить первую цель из тела найденной процедуры.

4. Если унификация не прошла, найти следующий вариант процедуры P/n.

5. Если следующий вариант процедуры P/n не найден, закончить работу с результатом FAIL.

6. Если первая цель выполнилась, перейти к выполнению следующей цели.

7. Если следующая цель не выполнилась, вернуться к предыдущей цели и выполнить следующий вариант ее реализации.

8. Если текущий вариант реализации процедуры P/n не выполнился, перейти к следующему варианту.

9. Если все цели из тела процедуры выполнены, закончить работу с результатом TRUE.

В связи с такой структурой вычислений каждый вызов процедуры называется целью, которая может быть достигнута или нет. Всякое вычисление в ПРОЛОГе имеет логическое значение. Вычисление еще называют поиском вывода (доказательства), а язык ПРОЛОГ – языком логического программирования.

Наверное, синтаксически ПРОЛОГ – самый простой среди языков программирования. Основной синтаксической процедурой является предикат – выражение, аналогичное вызову процедуры — имя и список аргументов –

P(x1, …xn). Имена пишем с малой буквы, а переменные – с большой.

Если опустить детали, синтаксис ПРОЛОГа можно описать следующим образом:

<ПРОЛОГ-предложение> ::= <правило> | <факт> | <запрос>

<правило> ::= <заголовок> ‘:-’<тело>

<факт> ::= <заголовок> ‘.’

<запрос> ::= <тело>‘.’

<тело> ::= <цель> /’,’<цель>/’.’

<заголовок>::= <предикат>

<цель>::= <предикат> |<выражение>

<предикат>::= <имя>/ ‘(‘<терм> /’,’<терм>/ ‘)’/

<терм>::= <атом> |<предикат>|<список>

<атом>::= <переменная> |<число> |<строка>|<имя>

<список>::= <список с заголовком>| <простой список>

<список с заголовком >::= ‘[‘ <терм >/’,’<терм>/’|’ < терм>’]’

< простой список>::= ‘[‘ <терм >/’,’<терм>/’]’|‘['’]’

<выражение>::= <терм> /<оператор><терм>/

<оператор>::= ‘is’ | '=' | ‘==' | ’\=' | ’>=' | ’=<’ | ‘=\=' |

Как видно из синтаксиса, в ПРОЛОГе нет зарезервированных имен за исключением предиката “is”, хотя и применяются различные встроенные предикаты для удобства и связи с внешней средой.

Пример – семейные отношения.

Определим правила для отношений – супруг, ребенок, мать, дочь, брат, потомок. Семейные отношения задаются бинарными и унарными предикатами – правилами (предикаты с переменными) и фактами (предикаты с константами). Правила легко понять, поскольку семейные отношения всем понятны. Например, первое правило гласит: X является матерью Y, если Y есть ребенок X и X женского пола.

mother(X,Y):-child(X,Y),female(X).

daughter(X,Y):-child(Y,X),female(X).

grandchild(X,Y):-child(X,Z),child(Z,Y).

descendant(X,Y):-child(X,Y).

descendant(X,Y):-grandchild(X,Z).

Факты описывают родственников конкретной семьи.

marrow(john, meri). female(meri).

child(john, jack). child(meri, jack). child(john, kate).

marrow(jack,joan). marrow(kate, dick).

child(jack,henry). child(kat,josh).

male(john). female(mery).

male(henry). female(joan).

male(josh). male(dick).

Один набор правил (программа) может применяться к различным наборам фактов (данные).

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

Запросы могут быть двух видов – проверочный и поисковый.

Примеры поисковых запросов:

Чья дочь Kat? – daughter(X,kat).

Чей внук Henry? — grandchild(X,henry)

Примеры проверочных запросов:

Dick – ребенок Meri? – child(mery,dick).

Главные понятия ПРОЛОГа: списки, рекурсия, унификация, бэктрекинг. Списки – основная структура данных, применяемая в этом языке. Списки являются основой для организации всех сложных вычислений. Одно из основных свойств списка – отсутствие ограничений на элементы и размер списка. Вложенность списков также ничем не ограничивается. Список в языке трактуется как структура из двух элементов – «головы» и «хвоста». Это разделение является основой вычислений над списками, поэтому наиболее часто применяемый паттерн списка имеет вид [H|T].

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

Вторая базовая структурная единица языка – предикат имеет вид — p(A1,A2,..). Предикаты удобны для группирования данных в одну смысловую единицу. В отличие от списка, количество аргументов предиката фиксировано. Имя предиката пишется с малой буквы, как и все константы в языке.

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

Примеры списковых паттернов:

[H|T] – не пустой список;

[ ] – пустой список;

[A1,A2,A3] – список из трех произвольных элементов;

[A,A,A|T] – список, в котором первые три элемента совпадают;

[x,10|T] – список, в котором на первом месте стоит символьная константа “x”, а на втором – числовая константа 10.

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

Рекурсивность списков обеспечивает возможность простой формулировки алгоритма операций над списками.

Пример: Вычисление длины списка.

length([H|T],N):-length(T,N1), N is N1+1.

length([],0).

Пример: Инвертирование списка.

nrev([H|T],L) :- nrev(T,L1), append(L1,[H],L).

nrev([],[]).

В ПРОЛОГе нет функций, поэтому нельзя вставить, например, длину списка length(L) в качестве аргумента, как это делается во всех процедурных языках.

В то же время, ПРОЛОГ можно рассматривать как вполне императивный язык, в котором все операции, за исключением бэтрекинга, прописываются явно.

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

Унификация – это подстановка параметров в паттерн и применяется не только для селекции входных параметров, но и для автоматического выделения нужных элементов списка и манипулирования ими – добавления и удаления головного элемента списка.

Пример: соединение списков.

append([H|T], L, [H|L2]):-append(T, L, L2).

append([], L, L).

Правильнее было бы записать второй аргумент в виде [H1|T1], поскольку второй аргумент должен быть списком, но это усложнит предикат, поскольку второй аргумент может быть и пустым списком.

Переменные в ПРОЛОГе – логические, т.е. повторная унификация внутри одной процедуры невозможна. Нельзя написать L = [a,b,c], а потом — L=[12]. Логичность переменных приводит к усложнению унификации, поскольку все унификации в теле одной процедуры не могут быть пересмотрены в процессе вычисления, а значит, они не могут противоречить друг другу.

Унификация логических переменных приводит к неожиданным эффектам, которые имеют вполне императивное объяснение.

Пример: варианты использования предиката соединения списков.

Соединение:

append([a,b,c],[d,e,f],L).

L = [a,b,c,d,e,f] =>

yes.

Проверка связи списков:

append([a,b,c],[1,2,3],[a,b,c,1,2,3]).

yes.

Разложение списка:

append(L1,L2,[a,b,c]).

L1=[a,b,c]

L2=[] ->;

L1=[a,b]

L2=[c] ->;

L1=[a]

L2=[b,c] ->;

L1=[]

L2=[a,b,c] ->;

no.

Здесь символ “;” означает запрос другого варианта решения путем запуска бэктрекинга.

Вычитание списков:

append([a,b], L, [a,b,c,d]).

L=[c,d].

В ПРОЛОГе принято различать вычисления с бэктрекингом (недетерминированные) и без него (детерминированные).

Пример недетерминированного предиката: Решение числовой головоломки.

/*

D O N A L D

+

G E R A L D

— R O B E R T */

sum(L1,L2,L3):-

sum1(L1,L2,L3,L1,L2,L3,0,[0,1,2,3,4,5,6,7,8,9]).

sum1(L1,L2,L3,L11,L12,L13,Ii,Lv):-

dl(L11,L111,E1),

dl(L12,L121,E2),

dl(L13,L131,E3),

val(E1,Lv,Lv1),val(E2,Lv1,Lv2),val(E3,Lv2,Lv3),

sd(E1,E2,E3,Ii,Io),

sum1(L1,L2,L3,L111,L121,L131,Io,Lv3).

sum1(L1,L2,L3,[],_,_,0,_):-!..

dl([H|T],[H|T1],E):- dl(T,T1,E).

dl([H],[],H).

val(E,L,L):-nonvar(E).

val(E,L1,L2):-del(E,L1,L2).

sd(A,B,C,Ii,Io):-

C1 is A+B+Ii,

C is C1 mod 10,

Io is C1 // 10

del(E,[E|T],T).

del(E,[H|T],[H|T1]):-del(E,T,T1).

s:-

A1=[D, O, N, A, L, D],

A2=[G, E, R, A, L, D],

A3=[R, O, B, E, R, T],

sum(A1,A2,A3),

write(A1),nl,

write(A2),nl,

write(A3),nl.

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

Предикат sum1/8 использует первые три аргумента для записи результата, аргументы под номером 4,5,6 – в качестве рабочих переменных, седьмой аргумент – начальное значение разряда переноса, восьмой аргумент – список допустимых значений цифр.

Предикат dl/3 выполняет выбор и удаление последнего элемента из списка переменных.

Предикат val/3 выбирает допустимое значение из списка оставшихся вариантов, при этом выбранный вариант цифры, удаляется из списка допустимых вариантов.

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

Предикат sd/5 проверяет вариант заданной тройки цифр одного столбца:

A+B+Ii = C+Io*10

Если sd/5 не выполняется, возникает бэктрекинг — последний из вызовов предиката val/3 присваивает новое значение переменной E3. Если ни одно из значений E3 не подошло, бэктрекинг продолжается на шаг назад — для E2 выбирается новое значение, затем – если не подойдет ни один вариант E3 E2, для E1.

Предикат sum1/8 выполняется рекурсивно до исчерпания входного списка переменных.

Предикат s/0 – пример вызова предиката sum/3 для решения одного варианта головоломки.

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

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

Для этого надо делать такие операции как лексический и синтаксический анализ.

ЗАКЛЮЧЕНИЕ

Высокоуровневые языки программирования, в плане создания ПО, стали всё по большей части удаляться от машинных кодов и реализовывать различные, помимо процедурного, парадигм программирования. К ним относят также и реализацию объектно-ориентированных принципов. C++, Java, Python, JavaScript, Ruby… – спектр языков данного типа наиболее популярен и востребован сегодня. Они предоставляют больше возможностей для реализации разнообразного ПО и нельзя однозначно определить «специализацию» каждого из них.

В последнее время набирает популярность и иной вид программирования - функциональное (дальнейшее развитие уровня языка). Здесь уже другой вид абстракции для вычислений – функции, которые берут в качестве аргументов набор функций и возвращают другую. Роль переменных играют те же функции (привычные нам переменные – просто константные выражения, аналогичные final перед объявлением типа в Java). Собственно функция замкнута в своей области видимости, результат её работы зависит только от переданных аргументов. Отсюда вытекают два замечательных свойства:

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

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

Однако и порог вхождения выше, чем для ООП: для эффективного кода необходимо строить программу, описывая в виде функций алгоритм выполнения. Но также для чистого функционального стиля неплохо бы знать азы логики и теории категорий. Наиболее популярные – Haskell, Scala, F#. Но не бойтесь, в Java (как и в других современных языках третьего поколения) появились элементы функционального программирования и их возможно комбинировать вместе с ООП.

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

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Доусон М. Программируем на Pyton. – СПб.: Питер, 2017. – 416
  2. Мэтиз Э. Изучаем Python. Программирование игр, визуализация данных, веб-приложения. – Спб.: Питер, 2017. – 496 c.
  3. Химич А.В. Сравнительный анализ языков программирования: Паскаль, C++, Python // Молодежный научный форум: электр. сб. ст. по мат. XI междунар. студ. науч.-практ. конф. № 10(11). URL: https://nauchforum.ru/archive/MNF_interdisciplinarity/10(11).pdf (дата обращения: 21.08.2019) Базовые средства программирования/ В.Н. Шакин. - М.: Форум: НИЦ ИНФРА-М, 2015. - 304 с.
  4. Введение в специальность программиста: Учебник / В.А. Гвоздева. - 2-e изд., испр. и доп. - М.: ИД ФОРУМ: НИЦ Инфра-М, 2013. - 208 с.
  5. Голицына О.Л. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. - 3-e изд., перераб. и доп. - М.: Форум: ИНФРА-М, 2015. - 400 с
  6. Ездаков, А. Л. Функциональное и логическое программирование: учебное пособие / А.Л.Ездаков. - 2-е изд. - М. : БИНОМ. Лаборатория знаний, 2011. - 119 с.
  7. Информатика, автоматизированные информационные технологии и системы: Учебник / В.А. Гвоздева. - М.: ИД ФОРУМ: НИЦ ИНФРА-М, 2015. - 544 с.
  8. Каймин В.А.Информатика: Учебник/ Каймин В. А., 6-е изд. - М.: НИЦ ИНФРА-М, 2015. - 285 с
  9. Культин Н. Б. Основы программирования в Delphi XE. — СПб.: БХВ-Петербург, 2011. — 405 с.
  10. Культин, Н. Б. Основы программирования в Delphi 7 / Н.Б. Культин. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2011. — 640 с.
  11. Масленникова, О. Е. Основы искусственного интеллекта: учеб. пособие / О. Е. Масленникова, И. В. Гаврилова. - 2-е изд., стер. - М.: ФЛИНТА, 2013. - 282 c.
  12. Машнин Т. С. Современные Java-технологии на практике. — СПб.: БХВ-Петербург, 2010. — 560 с.
  13. Монахов В. В. Язык программирования Java и среда NetBeans. — 3-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2011. — 703 с.
  14. Окулов, С. М. Основы программирования / С. М. Окулов. - 5-е изд., испр. - М.: БИНОМ. Лаборатория знаний, 2011. - 440 с.
  15. Осипов Д. Л. Базы данных и Delphi. Теория и практика. — СПб.: БХВ-Петербург, 2011. — 746 с.
  16. Основы алгоритмизации и программирования: Учебное пособие / В.Д. Колдаев; Под ред. Л.Г. Гагариной. - М.: ИД ФОРУМ: ИНФРА-М, 2015. - 416 с.
  17. Программирование на языке Object Pascal: Учеб. пос. / Т.И.Немцова и др; Под ред. Л.Г.Гагариной. - М.: ИД ФОРУМ: НИЦ ИНФРА-М, 2013. - 496 с.
  18. Программирование на языке высокого уровня. Учебное пособие / Т.И. Немцова; Под ред. Л.Г. Гагариной. - М.: ФОРУМ: ИНФРА-М, 2015. - 496 с.
  19. Программирование на языке Си/А.В.Кузин, Е.В.Чумакова - М.: Форум, НИЦ ИНФРА-М, 2015. - 144 с.
  20. Технология разработки программного обеспечения: Учеб. пос. / Л.Г.Гагарина, Е.В.Кокорева, Б.Д.Виснадул; Под ред. проф. Л.Г.Гагариной - М.: ИД ФОРУМ: НИЦ Инфра-М, 2013. - 400 с.
  21. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. - 3-e изд., перераб. и доп. - М.: Форум: ИНФРА-М, 2015. - 400 с.