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

Обзор языков программирования высокого уровня (Операторы перехода)

Содержание:

ВВЕДЕНИЕ

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

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

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

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

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

Для достижения поставленной цели сформулированы следующие задачи:

  1. изучить теоретические основы развития языков программирования;
  2. дать классификацию языков программирования;
  3. охарактеризовать возможности современных языков высокого уровня;
  4. рассмотреть перспективы развития языков высокого уровня.

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

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

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

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

История развития языков программирования высокого уровня довольно обширна и весьма разнообразна, ее начало принято относить к середине прошлого века – моменту создания первого языка программирования высокого уровня «Фортран» [5, с. 32]. Именно с появлением языков программирования высокого уровня компьютеры начали реализовывать весь свой потенциал. Языки программирования высокого уровня помогли сделать программы более понятными и читаемыми, позволили обрабатывать очень длинные запросы, ввод программного кода стал интуитивнее для пользователя.

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

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

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

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

Языки создаются и эволюционируют постоянно. Их влияние нельзя недооценивать на обработку современных научно-технических расчетов, на моделирование сложных процессов и систем в различных прикладных областях экономической деятельности человечества. [5, с. 41].

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

Прежде всего, языки программирования нужно классифицировать по уровням. Разные авторы разбивают языки либо на три уровня (машинные, машинно-ориентированные и машинно-независимые языки), либо на два уровня (языки программирования низкого уровня, языки программирования высокого уровня). [13]

В случае деления языков программирования на три уровня, низшим уровнем будет являться машинный код – набор команд, выполняемых конкретным процессором и разработанных специально для него. Обычно является последовательностью шестнадцатеричных символов. Вывод строки «Hello, World!» для процессора архитектуры x86 выглядит так: BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21.

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

Высшим же уровнем будут считаться машинно-независимые языки. Они разработаны для удобства восприятия, быстроты понимания и работы с ними. Характерная черта этих языков программирования – абстракция, то есть введение смысловых конструкций, кратко описывающих данные и операции над ними, описания которых в машинно-ориентированных языках очень длинны и сложны для понимания. Также они были призваны обеспечить платформенную независимость сути алгоритмов. С их появлением зависимость от платформы перекладывается на трансляторы, «переводящие» текст, написанный на языке высокого уровня, в элементарные машинные команды. Примерами языков программирования высокого уровня являются C++, C#, PHP, Perl, Java и многие другие [16].

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

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

Подавляющее большинство авторов называет языками программирования первого поколения машинные коды, то есть языки низкого уровня, языками второго поколения – языки ассемблера, уже рассмотренные нами, и, соответственно, языками третьего поколения – языки высокого уровня. Эта классификация по эволюционному признаку вполне логична: понятно, что языки низкого уровня появлялись на заре программирования, а языки среднего и высокого уровней разрабатывались и улучшались в связи с растущими возможностями компьютерных технологий. А вот с классификацией языков четвёртого и пятого поколений ситуация не так проста. К языкам программирования четвёртого поколения чаще всего относят языки объектно-ориентированные, декларативные (непроцедурные) и визуальные. Но эти языки с уверенностью можно отнести и к языкам третьего поколения. Также очень часто сюда относят языки запросов, например, SQL, который, по своей сути, вовсе не является языком программирования. Вообще, часто можно прочитать о том, что языки программирования четвёртого поколения – это языки, встроенные в определённую программную оболочку и используемые для узкоспециализированных задач, например, для создания баз данных и управления ими (встроенные языки систем управления базами данных) [14].

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

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

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

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

Непроцедурные языки можно запросто назвать противоположностью языкам процедурным. Декларативное программирование – парадигма программирования, в которой описывается, что необходимо сделать компьютеру. Хорошим примером служит язык разметки HTML, возьмём тег <img>: необходимо просто заключить в него ссылку на изображение, а каким образом оно отобразится на странице – это задача компьютера.

В функциональном программировании процесс вычисления можно описать как вычисление значений функций в математическом понимании. На практике, отличие математической функции от понятия «функция» в императивном программировании заключается в том, что императивные функции могут опираться не только на аргументы, но и на состояние внешних по отношению к функции переменных, таким образом, получая в разных местах программы разные выходные данные. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим один и тот же результат – выходные данные зависят только от входных. Это позволяет средам функционального программирования кэшировать результаты выполнения функций и вызывать их в нужный момент. Примерами можно привести LISP – первый функциональный язык, Haskell и другие.

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

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

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

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

2.1. Возможности современных языков программирования

Одним из ярких представителей языков нового времени является язык Elm. Ключевая особенность этого языка - отладчик реального времени: можно изменять код в реальном времени и наблюдать, как меняется тот или иной параметр. Все действия записываются, перематываются и переигрываются.

Elm - функциональный язык программирования для создания GUI – Graphical User Interface , использующий синтаксис в стиле функционального языка программирования «Haskell». Родственные связи этих языков показаны на схеме (рис. 1).

Рис. 1 - Связи языка Elm

Этот функциональный язык удобен и прост – программный код в несколько строк обеспечивает пользователю возможность рисования мышью любой фигуры в клиентской программе или в окне браузера. Интересна вычислительная модель реактивного функционального программирования – Functional Reactive Programming (FRP), положенная в основу данного языка. Данная парадигма ориентирована на работу с динамическими потоками данных и позволяет создавать приложения с высокой степенью интерактивности. Концепция FRP впервые была предложена Коналом Эллиоттом (Conal Elliott) при разработке функционального предметно-ориентированного языка для программирования анимации [11].

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

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

Если рассмотреть генеалогические связи этого языка (рис. 2), то можно выделить конкретные преимущества данного языка программирования высокого уровня.

Рис. 2 – Структурные связи Swift

Swift сочетает в себе понятность именованных параметров и мощь динамической объектной модели Objective-C, а также открывает доступ к уже существующим интерфейсам прикладного программирования для различных операционных систем [17].

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

Кроме того, скорость реализации некоторых алгоритмов на Swift в 3,9 раза выше, чем на Python, и лаконичней, ввиду того, что в языке максимально искоренен такой недостаток как многословность, присущая Objective-C [9].

Если рассмотреть программные продукты ведущих корпораций – разработчиков современного программного обеспечения, то интересен для исследования обучаемыми язык программирования высокого уровня «Go» от корпорации Google (рис.3).

Рис. 3–Связи языка Go

Go –компилируемый, многопоточный язык программирования. Первоначальная разработка Go началась в сентябре 2007 года, а его непосредственным проектированием занимались авторы, стоявшие у истоков создания языка C и операционной системы UNIX: Роберт Гризмер, Роб Пайк и Кен Томпсон [12].

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

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

Как показывает анализ родственных связей, язык программирования высокого уровня «Go» опирается на мощный фундамент языков С и С++, а также поддержку компании Google, одной из самых крупных ИT-компаний на сегодняшний день.

Веб-программирование – тот раздел программирования, к которому студенты испытывают огромный интерес, поэтому стоит обратить внимание на современные языки программирования высокого уровня Dart и TypeScript, как альтернативу уже широко известному языку программирования JavaScript.

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

Во-первых, этот язык структурированный, и в то же время ориентирован на разработку веб-программ.

Во-вторых, он приемник уже существующих языков JavaScript, Go – которые популярны среди разработчиков программного кода, и переход к Dart и обучение ему, естественно, упрощается. Как и в JavaScript, в Dart используется синтаксис похожий на язык C. Но различие в том, что JavaScript основывается на прототипах, тогда как объекты в Dart определяются при помощи классов и интерфейсов(как в C++ или Java). Также Dart позволяет дополнительно задать переменные со статическими типами.

Рис. 4 – Генеалогические связи языка Dart

Как показывает короткий промежуток существования этого языка, он становится столь же привычным, динамичным и гибким языком, как и JavaScript, а написанные на нем коды – быстрее и легче в выполнении. Кроме того, созданные на этом языке программы – высокопроизводительны и успешно работают на вычислительных устройствах широкого класса: от смартфонов до серверов. Очень важен для любого языка программирования высокого уровня стандарт, и 4 июля 2014Ассоциацией стандартизации информационных и коммуникационных технологий была одобрена первая редакция стандарта языка [15].

Кроме компании Google, компания Microsoft представила свой аналог JavaScript – TypeScript (рис. 5).

Рис. 5 - Связи языка TypeScript

TypeScript – язык программирования, как уже было отмечено выше, может позиционироваться как средство разработки веб-приложений, расширяющее возможности JavaScript. Разработчиком языка TypeScript является Андерс Хейлсберг, создавший ранее Tur-boPascal, Delphi и C#.

Язык работает в любом браузере, поддерживается в таких популярных средах визуального программирования, как Microsoft Visual Studio, и совместим с некоторыми JavaScript-библиотеками, среди которых jQuery. Язык TypeScript является обратно совместимым с JavaScript (может легко компилироваться в этот язык) [10].

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

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

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

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

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

Прикладная наука развивается в эпоху межсетевых отношений и больших хранилищ данных [6, c.101]. Современные студенты, пользователи (и, возможно, будущие разработчики) интернет-сервисов и веб-технологий, баз данных и баз знаний, банков данных, должны уметь выбирать правильные и эффективные инструменты решения прикладных задач, мыслить категориями современных языков программирования.

2.2. Потенциальное направление развития языков программирования на сближение с моделями естественного языка

Если проследить всю историю развития парадигм программирования, то можно заметить постепенное увеличение описательных возможностей языков, позволяющих не просто задавать последовательность выполнения команд для ЭВМ, но моделировать таким образом реальность. Языки машинных команд в этом смысле являются отправной точкой, поскольку они не содержат никакой семантики, кроме устройства ЭВМ, для которой они предназначены. Язык ассемблера, по сути, является более удобным способом написания машинных команд. Однако это удобство заключается в добавлении некоторой семантики на уровне операций, использовании осмысленных имен вместо кодов. На следующем этапе – этапе процедурного и модульного программирования – семантика заключается в представлениях алгоритмической декомпозиции и структурного анализа. То есть, мир представляется в виде набора операций, процессов, действий, которые преобразуют некоторые входные информационные потоки в выходные. В явном виде моделирование мира с данной точки зрения представлено в методологии SADT [4, c.103]. Однако после появления ООП от этого подхода отказались в связи с преимуществами последнего [1, c.283].

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

Данная модель в концептуальном смысле имеет претензию на соответствие структуре естественного языка и способу человеческого мышления. Классы в данном случае соответствуют понятиям языка, а объекты конкретным проявлениям этих понятий в реальном мире. Например, Буч приводит методику объектно- ориентированного анализа, при которой понятия, взятые непосредственно из словаря пользователя, преобразуются в классы и объекты (микропроцесс анализа и проектирования [1, c.307-337]).

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

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

С позиции Витгенштейна [8] язык нельзя свести к формальной логике, с четкими и однозначными правилами вывода, поскольку язык является продуктом «языковых игр». Значение каждого понятия, каждой языковой конструкции образуется спонтанно в ходе человеческой деятельности, и поэтому он имеет нечеткий характер. Так, например, рассматривая понятие «игра», философ обнаруживает, что невозможно выделить какие- либо общие признаки, характерные для всех игр. То, что верно для настольных игр, где присутствуют правила и соревновательный момент, оказывается неприменимо к детским играм в песочнице. Существует множество видов деятельности называемых играми, между которыми имеются «семейные сходства», однако полное определение понятия «игра» едва ли возможно. «Безусловно, можно начертить несколько таких прямоугольников с четкими контурами, которые соответствовали бы одному нечеткому. Но если в оригинале нет резких границ при переходе одного цвета в другой, то разве не становится невыполнимой задача передать расплывчатое изображение четким?» [8]. То есть, пытаться описать содержание понятий формальным образом подобно попытке описать расплывчатую область четким прямоугольником. Можно сделать это с разной степенью полноты или адекватности, но в любом случае, конечный результат будет неверным.

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

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

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

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

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

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

3.1 Операторы присваивания

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

В языке Паскаль оператор присваивания обозначается двумя символами «:=», между которыми не ставится пробел. В левой части данного оператора должна стоять переменная, а в правой части – выражение, значение которого будет присвоено переменной.

Очень часто в Паскале можно увидеть конструкцию вида p:=p+1. Данная запись не содержит ошибки. Внутри компьютера данный оператор выполняется следующим образом: сначала берется исходное значение переменной, к которому прибавляется единица. После этих действий результат вычислений помещается в переменную p. Таким образом в языке Паскаль реализуется инкремент переменной.

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

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

(1)

Таблица 1 – Бинарные арифметические операции над типом integer

Операция

Обозначение

Пример

Сложение

+

p + 2

Вычитание

-

p– 2

Умножение

*

p * 2

Деление нацело

div

p div 2

Остаток от деления

mod

p mod 2

Исходный код программы:

Program Op_prisv;

var

a,b,c:real;

begin

a:=3;

b:=4;

c:=sqrt(a*a+b*b);

end.

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

В результате выполнения данного кода программа вычислит значение гипотенузы треугольника со сторонамиa, b, и занесет это значение в переменную c.

3.2 Операторы ввода-вывода

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

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

Для ввода с клавиатуры в языке Паскаль существует два оператора: Readи Readln. Для вывода на экран – Writeи Writeln. Дополнение «ln» произошло от английского слова «line» - строка, линия. Операторы, заканчивающиеся на «ln» в результате своих действий переводят курсор на новую строку. Так, например, при работе оператора Write курсор останется на следующей позиции после последнего выведенного символа. А в случае оператора Read очередные данные будут считываться из той же строки, где стоит курсор.

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

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

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

Program Op_vvod_vyvod;

uses crt;

var

a,b,c:real;

begin

write('Катет a = ');

readln(a);

write('Катет b = ');

readln(b);

c:=sqrt(a*a+b*b);

writeln('Гипотенуза = ',c:3:2);

writeln('Для завершения нажмите любую клавишу...');

readln();

end.

В данной программе используются операторы ввода исходных данных – катетов прямоугольного треугольника. Для вывода результата на экран используется форматированный вывод. Результаты работы программы приведены на рисунке 6.

Рис. 6 – Пример работы с операторами ввода-вывода

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

Рис. 7. Пример работы оператора ввода без параметров

3.3 Операторы перехода

В языке Паскаль существует два вида операторов перехода – условный и безусловный.

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

Рассмотрим пример программы с использованием оператора безусловного перехода:

ProgramOp_goto;

usescrt;

labelm1;

var

a: integer;

begin

a:=5;

goto m1;

a:=a*10;

m1: writeln('a = ', a);

end.

Рассмотрим последовательность действий данной программы. В первую очередь переменной а присваивается значение 5. Затем в программе встречается оператор безусловного перехода, который посылает компьютеру сигналу о том, что следующий оператор, подлежащий исполнению, помечен меткой m1. Следовательно, дальнейшие действия программы – вывод результата на экран, а не умножение значения переменной на 10. Важно отметить, что оператор a:=a*10 в данной программе не исполнится никогда.

Результат исполнения данного кода приведен на рисунке 8.

Рис. 8. Пример работы с оператором безусловного перехода

Другой вид оператора перехода – условный переход. Данный оператор служит для выбора одной из двух альтернативных ветвей алгоритма в зависимости от значения некоторого условия [20].

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

  • логическое сложение – or;
  • логическое умножение – and;
  • отрицание – not;
  • исключающее «ИЛИ» - xor.

В языке Паскаль существуют условные операторы с одной и двумя ветвями. Если в условном операторе прописаны две ветви, такой оператор называется полным (см. рисунок 9), в противном случае – неполным (см. рисунок 10) [10].

Рис. 9. Полное ветвление

Рис. 10. Неполное ветвление

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

Program Op_perehod;

uses crt;

var

a,b,c: integer;

begin

write('Введите стороны треугольника: ');

read(a,b,c);

if (a>=(b+c)) or (b>=(a+c)) or (c>=(a+b))

then writeln ('Такого треугольника не существует!')

else

begin

if (a<b) and (a<c) then writeln ('Минимальнаясторонаа = ',a)

else if (b<a) and (b<c) then writeln ('Минимальнаясторона b = ',b)

else writeln ('Минимальная сторона с = ',c);

if ((a+b+c)>50) then writeln('Периметрбольше 50');

end;

end.

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

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

Рис. 11. Пример работы оператора полного ветвления

Рис. 12. Пример работы оператора неполного ветвления

3.4 Операторы выбора

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

  • использовать вложенные условия;
  • использовать оператор выбора.

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

Case<ключ>of

C_1: <операторы_1>;

C_2: <операторы_2>;

C_N: <операторы_N>;

else<операторы 0>

end;

В данной записи ключом называется выражение порядкового типа, в зависимости от значения которого и принимается решение. Значениями C_1, C_2, …, C_N обозначены константы - возможные варианты значения ключа, которые необходимо рассмотреть при вычислениях. Данным значениям соответствуют блоки операторов, которые исполняются, если значение ключа совпадает со значением C. Если же значение ключа не совпало ни с одной из указанных констант, выполнится блок <операторы_0>. Важно отметить, что этот блок может отсутствовать [15].

В качестве примера использования оператора выбора рассмотрим задачу определения времени года по введенному месяцу[13]:

Program Op_vybor;

uses crt;

var

m: integer;

begin

write('Введите номер месяца: ');

readln(m);

case m of

1,2,12: writeln('Время года - зима');

3,4,5: writeln('Время года - весна');

6,7,8: writeln('Время года - лето');

9,10,11: writeln('Время года - осень');

elsewriteln('Такого месяца не существует!');

end;

end.

В данной программе реализован оператор выбора, который в качестве констант использует сразу несколько значений, операторы для которых идентичны. Данный подход является очень удобным и позволяет сократить число ветвей программы с 13 до 5. Результат выполнения приведенного кода представлен на рисунке 17.

Рис. 13. Пример работы с оператором выбора

3.5 Операторы цикла

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

  • цикл с предусловием – while. Состоит из условия цикла и его тела (см. рисунок 14). Пока условие цикла будет иметь значение «истина», тело цикла будет исполняться.

Рис. 14. Блок-схема цикла с предусловием

Как видно из блок-схемы, если условие цикла с самого начала имеет значение «Ложь», то тело цикла ни разу не будет исполнено. Если в процессе исполнения цикла условие всегда принимает значение «Истина», то цикл начинает исполняться бесконечно – происходит зацикливание. Это означает, что в алгоритме допущена ошибка. Пример использования цикла с предусловием:

Program Op_pred;

uses crt;

var

N, p: integer;

begin

write('Введитецелоечисло N = ');

readln(N);

writeln('Степени числа 2, не превосходящие ', N);

p:= 2;

while p <= N do

begin

write(p,' ');

p:= p * 2;

end;

writeln();

end.

Данная программа запрашивает у пользователя целое число, а затем выводит все степени двойки, которые не превосходят заданное число. Результат работы программы представлен на рисунке 15 [1];

Рис. 15. Пример работы цикла с предусловием

  • цикл с постусловием – repeat-until. В данном случае сначала выполняется тело цикла, после чего проверяется выражение, записанное в блоке until (см. рисунок 16).

Рис. 16. Блок-схема цикла с постусловием

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

ProgramOp_post;

usescrt;

varm, N, sum: integer;

begin

write('N = ');

read(N);

m:=0;

sum:=0;

repeat

m:=m+1;

sum:=sum+m;

until m=N;

writeln ('Сумма первых ',N,' чисел равна ', sum);

end.

В данной программе определяется сумма первых N натуральных чисел. N задается пользователем с клавиатуры [12];

Рис. 17. Пример работы цикла с постусловием

  • цикл с параметром – for. Данный цикл выполняется заданное количество раз. Существует две формы записи данного цикла в зависимости от того, каким образом должна изменяться переменная цикла. Если она должна увеличиваться, используется запись:

for<переменная_цикла>:= <начальное_значение>to<конечное_значение>do<операторы>.

Если же переменная цикла должна уменьшаться, используется другая запись:

for<переменная_цикла>:= <начальное_значение>downto<конечное_значение>do<операторы> [14].

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

Program Op_param;

uses crt;

var i, n, sum, a: integer;

begin

write('N = ');

readln(n);

write('Введите ',n,' элементов массива: ');

sum:=0;

for i:=1 to n do

begin

read(a);

sum:=sum+a;

end;

writeln('Сумма введенных элементов = ', sum);

end.

В данной программе у пользователя запрашивается размерность массива, а затем и сам массив. В результате выполнения программы считается сумма введенных элементов. Результат выполнения приведенного кода представлен на рисунке 22.

Рис. 18. Пример работы цикла с параметром

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

ЗАКЛЮЧЕНИЕ

За прошедшие десятилетия языки программирования изменились не только количественно, но и качественно. Поэтому понятие более высокий и более низкий уровень языка программирования следует рассматривать во временном разрезе. С конца 60-х до середины 80-х годов практически во всех учебных заведения преподавали один из языков низкого уровня, например один из вариантов языка ассемблера, а потом – один из языков высокого уровня, например Fortran, COBOL, ALGOL и так далее.

С развитием объектно-ориентированных языков акценты сменились на языки высокого уровня и объектно-ориентированные языки. Причем, если ранее почти повсеместно из языков высокого уровня использовали Fortran, а затем Pascal, Basic, C. Среди объектно-ориентированных языков наиболее популярными, с точки зрения применения, необходимо назвать Visual C++ Builder, Delphi, Visual Basic, Visual Basic for Application.

В настоящее время в группе объектно-ориентированных языков стала выделяться некоторая подгруппа языков, которые имеют более широкие возможности. К таким языкам можно отнести PHP, Python, пакет Visual Studio и др. Эти языки имеют своими прародителями один или несколько объектно-ориентированных языков. В них учтены недостатки предшествующих языков и добавлены новые оригинальные свойства. Так серьезно расширены библиотеки подпрограмм и функций, расширены (а иногда и добавлены) понятия «объект» и «класс», добавлены новые визуальные инструменты для создания программных продуктов, которые предполагают новую технологию их написания.

Если в языках программирования высокого уровня программирование начиналось с организации вычислений, а потом программист тем или иным способом пытался предъявить на экран результаты вычислений и очень часто в неудобном виде, то в объектно-ориентированных языках программирование начинается с интерфейса (представления на экране результатов вычислений), а уже потом – программирование самих вычислений. В свое время такой подход к программированию был революционным, и потребовалось много времени и сил на его освоение. И в случае языков высокого уровня, и в случае объектно-ориентированных языков, после создания программных продуктов необходимо было выпускать сопроводительную документацию. Отмеченная подгруппа объектно-ориентированных языков предоставляет программисту новую процедуру программирования – рисование. Вместо размещения компонентов на форме теперь программист «рисует объект» и под каждый элемент рисунка прописывается программный код. В распоряжении у программиста вся рабочая область окна, в которой допускается размещение рисунков, текста и традиционных компонентов. Размер текста и рисунка ограничивается только размерами рабочего окна.

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Буч Г. Объектно-ориентированный анализ и проектирование [Текст] / Г. Буч. – 2-е изд. – М.: Вильямс, 2016. – 720 с.
  2. Выготский, Л.С. Мышление и речь. Изд. 5, испр. [Текст] / Л.С. Выготский. –М.: Лабиринт, 2015. – 352 с.
  3. Грязнов А.Ф. Язык и деятельность. Критический анализ витгентшейнианства [Текст] / A.Ф. Грязнов – Изд. 2-е, доп. М.: Книжный дом «ЛИБРОКОМ», 2014. – 152 с.
  4. Марка Д., Клемент, М. Методология структурного анализа и проектирования SADT – М.: Мета Технология, 2013. – 284 с.
  5. Свердлов С. З. Языки программирования и методы трансляции [Текст] / С.З. Свердлов / - СПб.: Питер: 2015. – 207с.
  6. Исаева Г. Н. Об индуктивном подходе к приобретению знаний в экспертных системах управления персоналом[Текст] / Г.Н. Исаева // Вопросы региональной экономики – 2010. Т.5. – С.100-105.
  7. Бобровский С. История развития программного обеспечения [Электронный ресурс] / С. Бобровский. – Режим доступа: http://www.computer-museum.ru/histsoft/oophist.htm
  8. Витгенштейн, Л. Философские исследования [Электронный ресурс] / Л. Витгенштейн – Режим доступа: http://filosof.historic.ru/books/item/f00/s00/z0000273/index.shtml
  9. Зачем язык программирования Swift нужен Apple и вам: [Электронный ресурс] // Lookatme.URL: http://www.lookatme.ru/mag/ live/inspiration-lists/204771-swift
  10. Компания Microsoft представила TypeScript, новую открытую альтернативу JavaScript: [Электронный ресурс] // OpenNet.URL: http:// www.opennet.ru/opennews/art.shtml?num=34981
  11. Новости свободного ПО: [Электронный ресурс] // Компьютерные вести.URL: http://www.kv.by/content/325304-novostisvobo dnogo-po
  12. Цилюрик О Сравнительное обозрение языков программирования[Электронный ресурс] // Редакция 2.31. 2014 год. – 78с.
  13. Классификация языков программирования [Электронный ресурс]. URL http://bourabai.ru/alg/classification.htm
  14. Пять поколений языков программирования [Электронный ресурс]. URL: http://life-prog.ru/view_zam2.php?id=194&cat=5&page=11
  15. Сайт о языке программирования Dart – руководства, инструкции, новости, статьи и многое другое: [Электронный ресурс] // dartdot.ru.URL: http://dartdot.ru/
  16. Эволюция языков программирования [Электронный ресурс]. URL: http://www.urtt.ru/bib/dataindex/oaip/lection/_html/lect_05.htm
  17. Язык программирования Swift. Русская версия: [Электронный ресурс] // Хабрахабр.URL: http://habrahabr.ru/post/225841/
  18. Языки программирования и их классификация [Электронный ресурс]. URL: http://www.maksakov-sa.ru/ProgrProd/YazProgr/index.html
  19. Язык программирования. Эволюция языков программирования [Электронный ресурс]. URL: http://wiki.mvtom.ru/index.php/Язык_программирования