Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Воронежский государственный архитектурно-строительный университет»
Учебное пособие для иностранных слушателей
подготовительного отделения
(включая подготовку на уровень магистратуры)
Воронеж 2016
УДК 004.9 (07)
ББК 32,81 я 73
К647
Рецензенты:
кафедра информационных систем
Воронежского государственного университета;
Т.Н. Князева, д. т. н., профессор Воронежского
государственного медицинского университета
им. Н.Н. Бурденко
К647 |
Кононов, А.Д. Информатика: учеб. пособие для иностранных слушателей подготовительного отделения (включая подготовку на уровень магистратуры) / А.Д. Кононов, А.А. Кононов; Воронежский ГАСУ. – Воронеж, 2016. – 53 с.
|
Учебное пособие содержит тексты, вопросы и упражнения для регенерации знаний по основам алгоритмического языка Паскаль, полученных на предыдущих этапах образовательного процесса. Предлагаются задания для практической реализации на компьютере.
Предназначено для иностранных слушателей подготовительного отделения (включая подготовку на уровень магистратуры).
Ил. 3. Табл. 1. Библиогр.: 6 назв.
УДК 004.9 (07)
ББК 32,81 я 73
Печатается по решению учебно-методического совета
Воронежского ГАСУ
ISBN 978-5-89040-604-0 © Кононов А.Д., Кононов А.А., 2016
© Воронежский ГАСУ, 2016
Учебное пособие предназначено для обучения элементам информатики, а также ставит целью дальнейшее совершенствование владения русским языком на предметной основе дисциплины «Информатика», готовит обучающихся к восприятию специальных предметов, формирует и развивает навыки и умения в области профессионально-ориентированной речевой деятельности.
Рассматриваются некоторые концептуальные аспекты дисциплины «Информатика», включающие анализ этапов развития программирования и его современное состояние, парадигмы программирования, формальные языки, языки высокого уровня, метаязыки.
Пособие содержит раздел, посвященный (в кратком изложении) регенерации знаний по алгоритмическому языку Паскаль, полученных на предыдущих этапах образовательного процесса, тексты, контрольные вопросы, упражнения и темы для обсуждения, рефератов, задания для практической реализации на компьютере, а также краткий русско-английский терминологический словарь по изучаемой дисциплине и сведения по диагностике ошибок программирования для наиболее распространенных версий Турбо Паскаль.
Предназначается для иностранных слушателей подготовительного отделения (включая подготовку на уровень магистратуры).
Основоположником программирования можно считать английского математика Чарльза Бэббиджа (1791 – 1871 гг.). Ему принадлежит идея создания такой механической машины для вычислений, у которой порядок её действий мог быть записан предварительно, а затем эти действия выполнялись бы на машине автоматически. Рядом с Ч. Бэббиджем у истоков программирования стояла Ада Лавлейс, дочь английского поэта Ч. Г. Байрона. Она стала ближайшей помощницей Бэббиджа, разработала ряд приёмов управления последовательностью вычислений, описала важную конструкцию любого языка программирования – цикл. Её считают первым в истории программистом.
Начальным шагом в развитии современных языков программирования стало создание в конце 1940-х годов Джоном Моучли, сотрудником Пенсильванского университета (США), системы кодирования машинных команд с помощью специальных символов. Продолжателем работ Моучли стала сотрудница его группы – Грейс Мюррей Хоппер, которая создала первый в мире компилятор, который позволил пользователям программировать задачи на языке, близком к обычному английскому (компилятор FLOW- MATIC).
В середине 50-х годов XX века программирование на машинных языках вытесняется программированием на языках высокого уровня (ЯВУ). Первым из наиболее распространенных в 1957г. стал ФОРТРАН (от FORmula TRANslator – переводчик формул). Разработан группой программистов фирмы IBM (Internet Business Machines). Он стал основным языком для научных и технических расчетов, несколько раз усовершенствовался и используется до сих пор.
В результате международного сотрудничества в области программирования в конце 50-х годов появился язык АЛГОЛ-60 (ALGOritmic Language – алгоритмический язык, версия 1960 г.). Язык очень мощный и выразительный, предназначенный для записи алгоритмов, которые строятся в виде последовательности процедур, применяемых для решения поставленных задач. Язык оказался сложным и был воспринят специалистами-практиками далеко не однозначно; тем не менее, он оказал значительное влияние на развитие других языков и теорию программирования в целом.
Некоторое упрощение языка АЛГОЛ при сохранении идеи структуризации разработки алгоритмов нашло наивысшее отражение при создании швейцарским ученым Никлаусом Виртом в начале 1970-х годов языка Паскаль. Язык разрабатывался как учебный, и, действительно, сейчас он является фактически основным языком обучения программированию в школах и вузах. Однако качества этого языка оказались в совокупности столь высоки, что им охотно пользуются и профессиональные программисты.
В середине 1960-х годов появился язык Бейсик (BASIC-Beginner’s All-Purpose Symbol Instruction Code) – универсальный символический код для начинающих. Это специализированный язык программирования, состоящий из простых слов английского языка. Универсальный язык Бейсик имеет множество версий. Он был распространен как встроенный язык для появившихся персональных компьютеров, имевших поначалу весьма ограниченные возможности.
Язык Си (первая версия – в 1972 г.) популярен в среде разработчиков систем программного обеспечения (в том числе операционных систем), так как сочетает в себе черты как языка высокого уровня, так и машинно-ориентированного языка, допуская программиста ко всем машинным ресурсам (в отличие от Бейсика и Паскаля).
Отметим ещё языки LISP (LISt Processing – обработка списков) и Пролог (Prolog – PROgramming in LOGic) как языки программирования для создания систем искусственного интеллекта.
В настоящее время количество алгоритмических языков (АЯ) высокого уровня существенно больше трёх тысяч, хотя в практической деятельности используется не более двух десятков. АЯ ориентированы на разные классы задач, в той или иной степени привязаны к конкретным архитектурам компьютеров и часто воплощают личные вкусы и идеи создателей.
Попытки создания единого универсального языка программирования, например PL/1 (Programming Language One, 1967 г.), АЛГОЛ-68 (1968 г.), ADA (в честь Ады Лавлейс, 1979 г. – прямой наследник Паскаля) и др., не увенчались успехом. Стремление к универсальности языка приводило к неоправданной сложности конструкций программы и неэффективности получаемых исполняемых кодов.
Языки программирования сохраняют своё предназначение для решения задач определенных типов. Выбор языка определяется удобствами для программистов, их предпочтениями в силу опыта и образования, а также пригодностью для данного компьютера и данной задачи. А многоплановость задач, решаемых с помощью компьютера (расчетные, экономические, графические, инженерные, научные, экспертные и т.д.), и приводит к многообразию языков программирования.
Тем не менее, каждый из них можно отнести к одной из трех парадигм. В науковедении парадигмой называется набор теорий, гипотез, взглядов и подходов, относящихся к одному течению, в основе которого лежит общий принцип. В программировании известны три парадигмы: процедурная, функциональная и логическая.
Большинство языков программирования, используемых при создании системного и прикладного программного обеспечения (ПО), таких как Фортран, Бейсик, Паскаль, Ада, Си, Модула, Форт, относятся к процедурной парадигме. Сущность процедурного программирования состоит в детальном описании шагов, действий, которые должен выполнить компьютер для решения задачи. Основные понятия здесь – оператор и данные. При процедурном подходе операторы объединяются в процедуры.
Принципиально иные направления в программировании относятся к непроцедурным парадигмам. К ним можно отнести объектно-ориентированное и декларативное программирование. Из языков объектного программирования, имеющих популярность, можно назвать Cи ++, среды типа Delphi и Visual Basic.
При использовании декларативного языка программист задаёт исходные информационные структуры, взаимосвязи между ними и то, какими свойствами должен обладать результат. При этом процедуру его получения («алгоритм») программист не описывает. В этих языках отсутствует понятие «оператор» (команда). Декларативные языки можно подразделить на два семейства: логические (типичный представитель – Пролог) и функциональные (Лисп).
Непроцедурные языки имеют большое будущее. Общая классификация языков программирования в соответствии с парадигмами программирования приведена на рис.1.
1. Как зарождалось программирование в докомпьютерную эпоху?
2. Какова роль Дж. Моучли и Г. Хоппер в появлении первых языков программирования высокого уровня?
3. Охарактеризуйте назначение и особенности языков Фортран, Алгол, Си, Паскаль.
4. Почему количество языков программирования так велико?
Рис. 1. Классификация языков программирования
5. В чем проблемы создания универсальных языков (на примере PL/1 и Алгол–68)?
6. Какие языки используются для разработки систем искусственного интеллекта?
7. Какие языки эффективны для обучения программированию?
8. Что называется парадигмой программирования?
9. Приведите примеры языков программирования, относящихся к различным парадигмам.
Языки программирования – это формальные языки, специально созданные для общения человека с компьютером.
Языками высокого уровня (ЯВУ) называют языки программирования, универсальные по отношению к архитектуре компьютеров и использующие обозначения, близкие к принятым в математике и других областях деятельности человека. Программы на ЯВУ содержат служебные слова естественного (английского) языка, состоят из легко читаемых и воспринимаемых команд, что отличает их от языков низкого уровня (машинных и машинно-ориентированных).
Машинно-ориентированные языки содержат примитивные команды, соответствующие особенностям архитектуры данного компьютера и записываемые машинными кодами, обычно в шестнадцатеричной форме. Обычно команда на машинном языке описывает простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содержит код операции и адреса ячеек памяти, с содержимым которых выполняется закодированное действие.
Написание программ на машинно-ориентированных языках требует больших временных затрат и высокой квалификации программистов, но созданные ими программы занимают меньше места в памяти и работают быстрее. С помощью этих языков удобнее разрабатывать программы регулярного применения и высокой оперативности, такие как системные утилиты, антивирусные программы, драйверы (программы для управления устройствами компьютера), программы в оборонной отрасли, блокировки аварийных ситуаций и другие.
Языки программирования высокого уровня имеют следующие достоинства:
– алфавит языка значительно шире машинного, что обеспечивает выразительность, наглядность и понятность текста программы;
– набор операций, допустимых для использования, не зависит от набора машинных команд, а выбирается из соображений удобства записи алгоритмов решения задач определенного класса;
– конструкции команд (операторов) отражают привычные для нас приемы обработки данных;
– для универсализации программ используется аппарат переменных и действий;
– поддерживается широкий набор типов данных.
ЯВУ являются машинно-независимыми и требуют использования соответствующих программ – переводчиков (трансляторов) для перевода программы на язык того компьютера, на котором она будет исполняться.
Каждый язык программирования, как и любой «естественный» язык (русский, английский и т. д.), имеет алфавит, словарный запас, грамматику и синтаксис, а также семантику.
Алфавит – фиксированный для данного языка набор основных символов, применяемых для составления текста программы на этом языке.
Синтаксис – система правил, определяющих допустимые конструкции языка из символов алфавита.
Семантика – система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
Понятие подразумевает некоторую синтаксическую конструкцию и определяемые ею свойства программных объектов или процесса обработки данных.
Взаимодействие синтаксических и семантических правил определяют те или иные понятия языка, например операторы, идентификаторы, переменные, функции, процедуры, модули и т.д.
Для строгого и точного описания синтаксиса языка программирования используются специальные метаязыки (языки для описания других языков). Наиболее распространенными метаязыками являются металингвистические формулы Бэкуса – Наура (БНФ) и синтаксические диаграммы Вирта.
Язык БНФ (язык нормальных форм) представляет собой способ записи конструкций языка программирования с помощью формул, похожих на математические. Для каждого понятия языка существует единственная метаформула (нормальная форма ). Она состоит из левой и правой частей. В левой части указывается определяемое понятие, а в правой – задается множество допустимых конструкций языка, которые объединяются в это понятие. В формуле используют специальные метасимволы в виде угловых скобок, которые обозначают определенное понятие (в левой части формулы) и ранее определенное понятие (в её правой части). Левая и правая части формулы разделяются метасимволом « : : », имеющим смысл «по определению есть». Знак « | » следует читать «или».
Например, две метаформулы
< переменные >: : = А | В
< выражение > : : =< переменная > | < переменная > + < переменная > |
< переменная > – < переменная >
означают, что < переменная > – это одна из букв, А или В, а <выражение> – любая из следующих десяти записей: А; В; А+А; А+В; В+А; В+В; А-В; А-А; В-А; В-В.
Правая часть метаформулы может содержать правило построения допустимых последовательностей. Допускаются рекурсивные определения терминов и понятий, то есть когда в правой части формулы участвует понятие, определяемое левой частью. Например, пусть необходимо ввести понятие < двоичный код >, под которым понимается любая непустая последовательность цифр 0 и 1. Тогда простое рекурсивное определение с помощью метаформул выглядит так:
< двоичная цифра >: : = 0 | 1
< двоичный код > : : = < двоичная цифра >|< двоичная цифра ><двоичный код>.
Данное определение позволяет узнать, является ли некая конструкция определяемым понятием.
Так, отталкиваясь от данной метаформулы двоичного кода, конструкция 001101 является двоичным кодом, поскольку, применяя последовательно рекурсию, мы имеем следующие 5 шагов рекурсии:
0 – двоичная цифра, а 01101 – двоичный код, поскольку
0 – двоичная цифра, а 1101 – двоичный код, поскольку
1 – двоичная цифра, а 101 – двоичный код, поскольку
1 – двоичная цифра, а 01 – двоичный код, поскольку
0 – двоичная цифра, а 1 – также двоичная цифра,
теперь рекурсия завершена.
Если взять конструкцию 1021, то она не является двоичным кодом, поскольку
1 – двоичная цифра, а 021 – не двоичный код, поскольку
0 – двоичная цифра, а 21 – не двоичный код, поскольку
2 – не двоичная цифра.
Для задания синтаксических конструкций произвольной длины можно использовать фигурные скобки как метасимволы. Они означают, что конструкция может повторяться нуль и более раз. В частности, термин <двоичный код > можно определить иначе
<двоичный код > : : < двоичная цифра >{ < двоичная цифра >}.
Для полноты множества синтаксических конструкций необходимо определить конструкцию < пусто > :
< пусто > : : = .
Синтаксические диаграммы позволяют графически отобразить значения метапеременных метаязыка. Диаграмма состоит из основных символов или понятий языка.
Каждая диаграмма имеет входящую и выходящие стрелки, означающие начало и конец синтаксической конструкции и отражающие процесс ее чтения и анализа. Из каждого элемента выходит одна или несколько стрелок, указывающих на те элементы, которые могут следовать непосредственно за данным элементом.
Для сравнения с метаформулами приведем несколько примеров.
Синтаксическая диаграмма
эквивалентна метаформуле < переменная > : : = A | B .
Еще примеры:
< двоичная цифра > :: = и < двоичный код > : : =