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

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

Содержание:

ВВЕДЕНИЕ

Сегодня программирование является одной из наиболее бурно развивающихся отраслей производства программных продуктов. Еще в конце прошлого столетия общение с компьютерами реализовывалось исключительно с помощью программирования, именно поэтому программирование стали изучать фактически во всех учебных заведениях. Шло время, информационные технологии развивались, общение с компьютерами стало происходить при помощи готовых компьютерных программ. Современные прикладные пакеты программ содержат также дополнительные средства, при помощи которых пользователи могут расширять функциональные возможности имеющегося программного обеспечения. Так, например, практически в любом пакете Microsoft Office имеется среда программирования языка VBA (Visual Basic for Applications). Таким образом, под программированием понимается принципиально новый подход, который является обязательным пунктом в процессе подготовки специалистов информационных технологий [7].

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

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

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

  • операторы присваивания;
  • операторы ввода и вывода информации;
  • операторы перехода;
  • операторы выбора;
  • операторы циклов.

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

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

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

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

Цель работы – рассмотреть базовые конструкции языков программирования. Для достижения данной цели предстоит решить ряд задач:

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

При написании работы в качестве опорных источников были использованы следующие: М.А. Ревенко – «Практикум по программированию на языке TurboPascal» и Л.И. Долинер – «Основы программирования в среде PascalABC.NET».

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

1.1 Развитие языков программирования

В, настоящее время, перед Россией стоит ряд крупнейших задач в области информатизации, призванных обеспечить ее инновационное развитие. Среди них: создание цифровой экономики – важный и перспективный тренд развития России. Его реализация требует создания множества новых рабочих мест в IT-области, использования существующих и разработки новых компьютерных приложений. Не менее важной и тесно связанной с построением цифровой экономики является решение проблемы обеспечения информационной безопасности страны, предполагающей разработку и внедрения компьютеров, операционных систем, национально-ориентированных баз и хранилищ данных, банковских систем, интернет технологий, и др. российского производства. Решение этих и иных задач требует широкого привлечения в данную область молодежи, ее ориентация к обучению в ВУЗах соответствующим специальностям, требующих высокого уровня знаний математических, технических, информационных и связанных с ними дисциплин. В этой связи, представляется интересным опыт молодежного движения She++, основанного студентками Стэнфордского университета и отражающего уже проявившую себя тенденцию привлечения в сферу IT-индустрии талантливых девушек и молодых женщин. Хотя движение She++ официально оформилось сравнительно недавно – в январе 2012 года, в реальности, оно имеет достаточно глубокие исторические корни.

Можно сказать, что у его истоков находится имя графини Ады Лавлейс, в девичестве Ады Байрон (1815—1852) – дочери знаменитого английского поэта Джорджа Байрона. Побывав на лекциях профессора Кэмбриджского университета Чарльза Бэббиджа и познакомившись с ним лично, она увлеклась идеями создания счетно-аналитической машины, способной производить вычисления с точностью до двадцатого знака (проект которой признан как проект первого в мире компьютера). В своих комментариях к описанию этой машины Ада Лавлейс приводит алгоритм вычисления чисел Бернулли, в настоящее время, признанного первой в мире компьютерной программой, а сама Ада Лавлейс – первым в мировой истории программистом. Впоследствии, ее именем назван алгоритмический язык высокого уровня – язык «АДА», созданный по заказу Министерства обороны США и позволяющий программировать параллельные процессы. А день ее рождения – 10 декабря, наряду с 13(12) сентября отмечается как «День программиста» [1].

Символом же движения She++ является имя Грейс Хоппер (1906-1992). Она обучалась, а затем работала в Йельском университете, где в 1934 году получила степень доктора математических наук. В 1943 году, перейдя на работу в ВМС США, занималась программированием для компьютера MARK I, а затем UNIVAC 1. Под ее руководством и непосредственном участии, создан  первый в истории компилятор «A COMPILER», а затем компиляторы «ARITH-MATIC», «MATH-MATIC» и «FLOW-MATIC».  Грейс Хоппер являлась одним из основных консультантов, а фактически - руководителем создания языка высокого уровня COBOL  (Common Business Oriented Language), предназначенного для создания бизнес приложений. Ее заслуги в области компьютерных наук высоко оценены. В 1985 году ей присваивается звание конр-адмирала ВМФ США, с чем ее лично поздравил президент Рональд Рейган, вручая высшую награду страны за не боевую службу - медаль Defense Distinguished Service Medal. А в 1991 году уже следующий президент Джордж Буш вручил ей Национальную медаль за развитие технологий. Ее именем назван мощнейший супер-компьютер Cray XE-6 Hopper и военный ракетный фрегат USS Hopper (DUG 70), а также, премия Ассоциации вычислительной техники, присуждаемая молодым специалистам, за их достижения в области компьютерных технологий [5].

Говоря о создании первых компьютерных языков высокого уровня, нельзя не упомянуть имя Екатерины Логвиновны Ющенко (1919-2001). Являясь основоположником первой в СССР школы теоретического программирования, она стала первой женщиной в стране, защитившей диссертацию на звание доктора физико-математических наук, посвященной теоретическим вопросам  компьютерных вычислений. Многое объединяет ее с Грейс Хоппер. Как и ее заокеанская коллега, она работала на первой в Европе вычислительной машине МЭСМ, разработала один из первых языков программирования высокого уровня с косвенной адресацией, что позволило создавать программы, функционирующие независимо от места расположения ее в памяти компьютера. Как и Грейс Хоппер, выполняла работы, связанные с  задачами оборонного комплекса страны, в частности, решения задач баллистики для ракетно-космических комплексов. Ее работы опубликованы в стране и за рубежом. Они высоко оценены правительством и научной общественностью. Ей присуждены две Государственные премии УССР, премия Совета Министров СССР, академическая премия Глушкова, она награждена орденом княгини Ольги [3,4].

Выше представлены краткие биографии лишь некоторых женщин ученых, внесших существенный вклад в становление и развитие информатики [6]. Однако, цель широкого привлечения молодых и талантливых женщин к работе в области информационных технологий, впоследствии легшей в основу движения She++, впервые четко поставлена американской ученой, доктором в области компьютерных наук и вычислений Анитой Борг (1949-2003), основавшей в 1997 году Институт по делам женщин и технологий,  впоследствии переименованный в ее честь в Институт Аниты Борг  (Anita Borg Institute - ABI).  Партнерами ABI выступают такие известные фирмы, компании и организации как: Apple, IBM, Microsoft, ORACLE, PayPal, Yahoo,Western Digital, Intel, Google, Hewlett Packard и др., а различные программы ABI охватывают 23 страны мира [2].

Сегодня, многие женщины делают успешную карьеру в IT-cфере. Среди них:  Сафра Кац – генеральный директор корпорации ORACLE;  Вирджиния М. Рометти –  генеральный директор IBM;  Мариса Майер – генеральный директор Yahoo; Урсула Бернса Майер – генеральный директор компании XEROX;  Шерили Кара Сэндберг – исполнительный директор Facebook;  Катерина Фэйк – ко-основатель компании Flickr;  Наталья Касперская – генеральный директор группы компаний Info Watch;  Алиса Чумаченко – основатель компании Game Inside и другие. И хотя, в силу различных обстоятельств, их имена, как и имена Ады Лавлейс, Грэйс Хоппер, Екатерины Ющенко, Аниты Борг не так широко известны, как например, Билл Гейтс, Стив Джобс, Сергей Брин,  Марк Цукерберг, их вклад в становление и развитие информационных технологий – трудно переоценить.

Молодежное движение She++ зародилось в стенах Стенфордского университета при поддержке его профессорско-преподавателского состава, отражая интерес молодежи к области IT-индустрии, ее стремление принять активное участие в информатизации самых различных областей. С другой стороны, ведущие фирмы и институты демонстрируют интерес к такому движению и его поддержке. Так, в 2004 году компания Google учредила стипендию имени Аниты Борг размером 7000 евро для студенток, обучающимся программированию и компьютерным технологиям, которая присуждается исходя из их академической успеваемости и лидерских качеств. В разные годы, в России эту стипендию получали студентки Московского государственного университета им. Ломоносова, Новосибирского государственного университета, Московского физико-технического института, Московского государственного института электронной техники, Московского инженерно-физического института, других ВУЗов.

В октябре 2017 года Институтом Аниты Борг намечено проведение международной конференции памяти Грейс Хоппер и посвященной женщинам в сфере компьютерных наук и вычислений [2].

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

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

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

По степени абстракции от аппаратуры принято выделять следующие виды языков:

  • низкого уровня:
    • машинно-зависимые – представляют собой команды, записанные непосредственно на языке конкретного процессора. Эти команды состоят из нулей и единиц. Фактически, команды таких языков представляют собой свод правил кодирования инструкций для определенного типа ЭВМ при помощи чисел;
    • машинно-ориентированные – команды, записанные на языке близком к процессору. Основное отличие от машинно-зависимых языков заключается в том, что машинные коды в таких языках заменены буквенными обозначениями;
  • высокого уровня – машинно-независимые языки, имитирующие естественный человеческий язык. Данные языки используют некоторые слова разговорного языка, а также общепринятые математические символы. Языки высокого уровня ближе к человеку, а не к компьютеру. Они позволяют записывать команды в текстовом режиме, а также предоставляют возможность определять сложные структуры данных;
  • сверхвысокого уровня – еще один вид машинно-независимых языков программирования. Команды таких языков исполняются на абстрактных машинах, при этом доступ к памяти полностью скрыт.

Еще одним признаком классификации является парадигма программирования. С этой точки зрения все языки программирования делятся на:

  • процедурные – проблемно-ориентированные языки, облегчающие исполнение процедур. Они бывают нескольких видов:
    • структурные – один оператор позволяет записывать целые алгоритмические структуры – циклы, ветвления и т.п.;
    • операционные – используют несколько операторов для записи одной алгоритмической конструкции. Неструктурное программирование позволяет использовать в явном виде оператор безусловного перехода;
    • параллельные – языки реального времени, поддерживающие параллельные вычисления. Программа, написанная на одном из таких языков, представляет собой совокупность описаний процессов, которые могут исполняться одновременно;
  • непроцедурные – описывают саму задачу. Делятся на:
    • функциональные – программы на таких языках обычно вычисляют значение некоторой функции, задающейся в виде композиции более простых функций. Одним из ключевых элементов данного языка является наличие рекурсии;
    • логические – языки, базирующиеся на классической логике. Основным их применением является логический вывод, например, экспертные системы. С точки зрения логического подхода программа представляет собой совокупность логических высказываний и правил[3];
  • объектно-ориентированные – языки, в основе которых лежит понятие объектов и их свойств, а также отношений между этими объектами [4].

1.3 Основные понятия

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

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

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

Исполнителем алгоритма называется тот субъект или объект, для управления которым разрабатывается алгоритм. Другими словами, исполнителем алгоритма является некоторая реальная или абстрактная система (биологическая, техническая или биотехническая), которая способна выполнить действия, предписываемые алгоритмом.

Характерные черты исполнителя алгоритма (см. рисунок 1):

Рисунок 1 – Характерные черты исполнителя алгоритма

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

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

В настоящее время существует несколько форм записи алгоритмов (см. рисунок 2):

  • словесное описание;
  • построчная запись;
  • блок-схема;
  • запись на языке программирования.

Рисунок 2 – Формы представления алгоритмов

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

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

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

Приведем пример записи алгоритма вычисления НОД двух чисел в построчной записи:

  1. ВводA, B
  2. ЕслиA = B, переход к шагу 8
  3. Если A>B, переход к шагу 6
  4. B = B – A
  5. Переход к шагу 2
  6. A = A – B
  7. Переход к шагу 2
  8. НОД = А
  9. Вывод НОД
  10. Конец

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

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

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

На территории нашей страны действует единая система программной документации (ЕСПД), сформировавшаяся в 1981 г. Данная система описывает условные графические изображения, которые применяются в алгоритмах (ГОСТ 19.003-80 «Схемы алгоритмов и программ. Обозначения условные графические»), а также набор правил, которые следуют соблюдать при записи блок-схем (ГОСТ 19.002-80 «Схемы алгоритмов и программ. Правила выполнения»).

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

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

Рисунок 3 – Блок ввода/вывода

Рисунок 4 – Вычислительный блок (блок обработки данных)

Рисунок 5 – Блок принятия решения (проверки условия)

Рисунок 6 – Блок начала/конца программы

Рисунок 7 – Блок начала цикла

Рисунок 8 – Блок конца цикла

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

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

2.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.

2.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.

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

Рисунок 9 – Пример работы с операторами ввода-вывода

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

Рисунок 10 – Пример работы оператора ввода без параметров

2.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 в данной программе не исполнится никогда.

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

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

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

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

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

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

Рисунок 13 – Полное ветвление

Рисунок 14 – Неполное ветвление

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

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, программа выдаст соответствующее сообщение, в противном случае просто завершит свою работу (см. рисунок 16).

Рисунок 15 – Пример работы оператора полного ветвления

Рисунок 16 – Пример работы оператора неполного ветвления

2.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.

Рисунок 17 – Пример работы с оператором выбора

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

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

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

Рисунок 18 – Блок-схема цикла с предусловием

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

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.

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

Рисунок 19 – Пример работы цикла с предусловием

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

Рисунок 20 – Блок-схема цикла с постусловием

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

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];

Рисунок 21 - Пример работы цикла с постусловием

  • цикл с параметром – 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.

Рисунок 22 - Пример работы цикла с параметром

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

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

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

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

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

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

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

В этой научной работе авторы ставят задачу ознакомления читателя с этапами лексического анализа и демонстрации примера построения простейшего лексического анализатора для конкретного фрагмента программы на языке программирования Java.

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

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

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

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

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

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

  • ключевые слова (begin, while, do, for),
  • идентификаторы (i, j,Test),
  • константы(123,"name",1E-5),
  • знаки операций (=,++,<<),
  • разделители(,:.)

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

Таблица 1.

Пример таблицы лексем

Индекс

Символ

Категория

Тип

Комментарий

0

while

ключевое слово

while

начало цикла

1

for

ключевое слово

for

начало цикла

2

<

спец. символ

rel

операция сравнения

3

>

спец. символ

rel

операция сравнения

4

+

спец. символ

ao

операция сложения

5

-

спец. символ

ao

операция вычитания

6

=

спец. символ

as

операция присваивания

При составлении таблицы каждому элементу языка сопоставляется тип соответствующей лексемы. Некоторые базовые элементы объединены в один тип (осуществляют схожие функции и имеют одинаковый приоритет).

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

В основе лексических анализаторов лежат автоматные грамматики.

Грамматикой G называется четверка (S, VN, ST, R), где S - начальный символ грамматики, VN - множество нетерминальных символов, ST - множество терминальных символов, R - множество правил грамматики [4].

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

Автоматной называется грамматика, все правила которой имеют вид: А^аВ, а, где A, B - нетерминальные символы, а - терминальный символ [1].

Правила Л^ а называют заключительными(терминальными) правилами.

Автоматная грамматика для целочисленных констант имеет вид:

S^0S|1S|...|9S|0|1|...|9

Автоматная грамматика для идентификаторов имеет вид:

S^aA|bA|...|zA

S > 0A|1A|...|9A|0|1|...|9|aA|bA|...|zA|a|b|...|z

Построение собственного лексического анализатора для цепочки

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

В качестве анализируемого выражения возьмем цепочку следующего вида: while ((a<n) and (b<k) ){

sum=sum+a;

a=a+1;

b=b+20;

}

В качестве алфавита выступают буквы латинского алфавита, цифры, другие значащие символы (+, <, =, ;, (, ), {, }) и незначащие символы (пробел, табуляция, перевод строки)

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

Составим автоматную грамматику для идентификаторов и констант (символом 'Л' обозначен символ конца строки). При ее построении будем считать, что символом '*' обозначены все символы, не являющиеся цифрами, символом '~' - пробел, символом '0' - все кроме букв и цифр, символом 'ц' - все символы, кроме фигурных скобок. После перехода в состояние Fx, автомат сбрасывается и переходит в состояние S.

S- S

S—aA|bA|...|zA A—aA|bA|...|zA A-0A|1A|...|9A A - 0F1.4

S-0B|1B|...|9B

B-0B|1B|...|9B

B -*R

Грамматики для операций и отношений:

S - R -R A;

Грамматики для специальных символов:

S-|(F3| )F3

Грамматика для последовательностей незначащих символов:

S—#32S|...|#10S|#13SP

Грамматика для выражений, находящихся в фигурных скобках (включая их):

S-{S'

S' -uS'

S'-}S

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

Автомат завершает работу при считывании символа Л

S^Al'in, здесь fin - состояние, в котором считывается последняя лексема.

Таблица 2.

Тип 1- служебные слова

Номер

Лексема

1

while

2

and

Таблица 3.

Тип 2 - операции и отношения

Номер

Лексема

1

<

2

=

3

+

Таблица 4.

Тип 3 - специальные символы

Номер

Лексема

1

;

2

(

3

)

4

{

5

}

Таблица 5.

Тип 4 - идентификаторы

Номер

Лексема

1

a

2

n

3

b

4

k

5

sum

Таблица 6.

Тип 5 - числовые константы

Номер

Лексема

1

1

2

20

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

<1,1>,<3,2>,<3,2>,<4,1>,<2,1>,<4,2>,<3,3>,<1,2>,<3,2>,<4,3>,<2,1>,<4,4>,< 3,3>,<3,3>,<3,4>,<4,5>,<2,2>,<4,5>,<2,3>,<4,1>,<3,1>,<4,1>,<2,2>,<4,1>,<2,3>,< 5,1>,<3,1>,<4,3>,<2,2>,<4,3>,<2,3>,<5,2>,<3,1>,<3,5> - здесь у пары <i,j> число i означает номер типа, число j - номер лексемы в типе.

Создадим конечный детерминированный автомат, распознающий цепочки, являющиеся лексемами вышеприведенных типов. Конечными состояниями автомата будут являться F1j4, F2, F3, F5(здесь индекс конечного состояния означает нахождение считанной лексеме в соответствующей таблице лексем), т. е. попадание в состояние F3 означает, что считан специальный символ из таблицы 3 и т. д. Лексемы из таблиц 1 и 4(служебные слова и идентификаторы) объединены в одно финальное состояние с целью уменьшения размера автомата и упрощения программистской задачи. Заметим, что конец считывания происходит только при считывании одного лишнего символа.

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

Рисунок 23. Конечный автомат в виде графа

На представленном рисунке Err - состояние ошибки, в которое автомат попадает при неописанном символе, в Err ведут стрелки со всех состояний.

Код программы лексического анализатора

char GetNextChar();

void ReturnLiter(char c);

void AddToBuf(char c);

bool IsNumber(char c);

void IsLetter(char c);

int BufIntendKey(int &Type);

int BufOper(int &Type);

int BufSpec(int &Type);

int BufNum(int &Type);

enume State {S,S1,A,B,fin} T;

int StepNextChar (int &Type) {

char c;

State T=S;

do{

c=GetNextChar();

switch(T){

case S: if((c==' ')||(c=='\t')||(c=='\r')||(c=='\n')) break; if(c=='{') {T=S1;break;}

if(c=='A') return 0;

AddToBuf (c);

if(IsLetter(c)) {T=A; break;}

if((c=='=')||(c=='+') ||(c=='<')) return BufOper (Type); if((c==';') ||(c=='(')||(c==')')) return BufSpec (Type); if(IsNumber(c)) {T=A; break;}

return -1;

case A:if(IsNumber(c)|| IsLetter(c)) { AddToBuf (c);break;} else {ReturnLiter(c);return BufIntendKey (Type);} case B:if(IsNumber(c)){

AddToBuf (c);

break;

}

ReturnLiter(c);

return BufNum (Type);

}

} while true;

}

int LexicalAnalyzer (int &Type) {

int Type;

int N;

do{

N=StepNextChar(Type);

if(N=<0) return N;

AddToOutSeq(N,T);

} while true;

}

ЗАКЛЮЧЕНИЕ

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

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

  • машинные коды;
  • ассемблеры;
  • алгоритмические языки;
  • процедурные языки;
  • объектно-ориентированные языки.

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

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

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

Существует несколько способов записи алгоритмов:

  • словесное описание;
  • построчная запись;
  • блок-схема;
  • запись на языке программирования.

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

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

Описание данных операторов сопровождается примерами, демонстрирующими решение простых задач.

СПИСОК ЛИТЕРАТУРЫ

  1. Анисимов А.Е. Практикум по основам программирования. – Ижевск: Изд-во «УУДмуртский университет», 2014. – 95 с.
  2. Баженова И.Ю. Языки программирования. – М.: Издательский центр «Академия», 2012. – 368 с.
  3. Бузыкова Ю.С. Языки и технологии программирования / Ю.С. Бузыкова, Т.А. Жданова, М.А. Шувалова. – Хабаровск: Изд-во Тихоокеан. гос. ун-та, 2014. – 44 с.
  4. Волкова И.А. Основы объектно-ориентированного программирования. Язык программирования С++ / И.А. Волкова, А.В. Иванов, Л.Е. Карпов. – М.: Издательский отдел факультета ВМК МГУ, 2011. – 112 с.
  5. Грациановаа Т.Ю. Программирование в примерах и задачах. – М.: БИНОМ, 2015. – 354 с.
  6. Диканев Т.В. Принципы и алгоритмы прикладного программирования / Т.В. Диканев, С.Б. Вениг, И.В. Сысоев. – Саратов: Изд-во Сарат. ун-та, 2012. – 140 с.
  7. Долинер Л.И. Основы программирования в среде PascalABC.NET. – Екатеринбург: Изд-во Урал. ун-та, 2014. – 128 с.
  8. Дронова Е.Н. Основные алгоритмические модели: учебное пособие. – Барнаул: АлтГПУ, 2016. – 158 с.
  9. Зюзьков В.М. Программирование. – Томск: Эль Контент, 2013. – 186 с.
  10. Котликова В.Я. Введение в Турбо Паскаль. – Курган: Изд-во Курганского гос. ун-та, 2016. – 32 с.
  11. Лучников В.А. Программирование на языке Паскаль. – Иркутск: ИрГУПС, 2014. – 168 с.
  12. Овчинников А.А. Основы программирования на Паскаль ABC. – Волгоград: Изд-во МОУ СОШ № 95, 2012. – 27 с.