1611678431-0e68e83522cb9d960ac896aa5d90854d (826635), страница 3
Текст из файла (страница 3)
Вместе с темследует отметить, что программа Xперегружена утверждениями и часть ееаннотаций очевидна и легко восстановима из текста программы. Это говорит отом, что не обязательно включать в текст программы все известные вамутверждения о программе; нужно вставлять достаточно утверждений, чтобыпрограмма стала понимаемой, однако не так много, чтобы она затерялась в них.Следующий пример показывает, что иногда при описании свойств программудобно использовать дополнительные ("внепрограммные") переменные.Рассмотрим следующую старинную задачу о переправе на другой берег волка,козы и капусты. На левом берегу реки находятся лодочник с лодкой, волк, козаи капуста.
Их нужно переправить на правый берег. Лодка, помимо лодочника,вмещает лишь одного из троих (волка, козу или капусту). При этом нельзяоставлять наедине волка с козой, а также козу с капустой. Правильностьследующего решения этой задачи очевидна из аннотаций, использующих дведополнительные переменные ЛевыйБерег и ПравыйБерег:module ПЕРЕПРАВА;begin(*{ЛевыйБерег=(лодочник, волк, коза, капуста), ПравыйБерег=()}*)writeln('Перевезти козу.');(*{ЛевыйБерег=(волк, капуста), ПравыйБерег=(лодочник, коза)}*)writeln('Переправиться без груза.');(*{ЛевыйБерег=(лодочник, волк, капуста), ПравыйБерег=(коза)}*)writeln('Перевезти волка.');(*{ЛевыйБерег=(капуста), ПравыйБерег=(лодочник, волк, коза)}*)writeln('Перевезти козу.');(*{ЛевыйБерег=(лодочник, коза, капуста), ПравыйБерег=(волк)}*)writeln('Перевезти капусту.');(*{ЛевыйБерег=(коза), ПравыйБерег=(лодочник, волк, капуста)}*)writeln('Переправиться без груза.');(*{ЛевыйБерег=(лодочник, коза), ПравыйБерег=(волк, капуста)}*)writeln('Перевезти козу.')(*{ЛевыйБерег=(), ПравыйБерег=(лодочник, волк, коза, капуста)}*)end ПЕРЕПРАВА.9.
Иерархия языковых конструкций. Лексемы и понятия. БНФ и синтаксическиедиаграммыЛекции: фото 5Удобным представляется взгляд на язык программирования как на иерархию конструкций,позволяющую в удобной для человека нотации оперировать с простыми и составными данными идействиями. Не все языки высокого уровня обладают каждым из приведенных средств, а некоторыеязыки (например, Алгол 68) разрешают операторам находиться в выражениях. Тем не менее, всеэлементы• функции• выражения• операциииерархии типичны для языков высокого уровня и знакомы любому пользователю независимоот того, какой конкретный язык программирования высокого уровня он применяет в своей работе.Верхний уровень иерархии образует сама программа — основная единица для трансляции ивыполнения.Ниже идут подпрограммы (процедуры, блоки и т.
п.), являющиеся единицами трансляции, ноне обязательно выполнения. Подпрограммы образуются из операторов и могут иметь своисобственные (локальные) данные. В свою очередь выражения являются частью операторов и строятсяиз данных и операций.Операции в языке играют роль вычислительных машинных операций, т.
е. тех операций ЭВМ,которые отрабатываются ее вычислителем, а операторы — управляющих операций, т. е. тех, которые вЭВМ отрабатываются исполнителем. Поэтому обычно собственно операторы, в отличие от операций,не вырабатывают новых значений (языки программирования, в которых это не так, называютсяязыками выражении). Важным свойством языков высокого уровня является их способностьобразования составных действий: выражений, структурных операторов и подпрограмм.Выражения, операторы и подпрограммы в языке программирования служат той основой, накоторой операции и данные исполняющей машины объединяются в программы и совокупностипрограмм.
Это — способы задания сложных действий, складывающихся из ряда уже заданныхдействий как встроенных в исполняющую машину, так и определенных в ней программистом спомощью других действий.Хотя использование конструкций в разных языках программирования имеет свою спецификус точки зрения синтаксиса и семантики, тем не менее, в любом языке имеется определеннаясогласованность синтаксических и семантических правил построения элементов иерархии из техконструкций, которые занимают более низкие уровни.программыподпрограммыоператорывыраженияданныеоперациифункцииЛексемы – для записи данных, операций, функций.Понятия – для записи программ (более сложных конструкций).Лексема(информатика)—последовательностьдопустимыхсимволовязыкапрограммирования, имеющая смысл для транслятора.Описание языка тоже должно быть записано на некотором языке, который выступает в этомслучае в роли метаязыка.
Для описания синтаксиса используются формальные нотации.Форма Бэкуса–Наура (БНФ)< > — служат для выделения нетерминалов — понятий языка.| — “или”. Разделяет альтернативные правые части правил.::= — “есть по определению”.Нотация Расширенного Бекуса-Наура Формализма (РБНФ), используемая в данном описанииязыка Zonnon, характеризуется следующими свойствами:Альтернативы разделяются символом |.Скобки [ и ] обозначают факультативность выражения в скобках.Скобки { и } обозначают повторение содержимого (возможно 0 раз).Скобки ( и ) используются для формирования групп элементов.Нетерминальные символы начинаются с прописной буквы (например, Statement).Терминальные символы либо начинаются со строчной буквы (например, letter), либозаписывается целиком строчными буквами (например, begin), или представляются ввиде строк (например, ":=").Комментарии начинаются с символа // и продолжаются до конца строки.1.1.1 Описание РБНФ с помощью РБНФВ качестве примера можно определить синтаксис РБНФ с помощью самого РБНФSyntax = {Production}.Production = NonTerminalSymbol "=" Expression ".".Expression = Term {"|" Term}.Term = Factor {Factor}.Factor = terminalSymbol | NonTerminalSymbol |"(" Expression ")" | "[" Expression "]" | "{" Expression "}" .1.1.2 Описание РБНФКонструкции РБНФ описаны ниже:1.1.2.1.
ПоследовательностьA = BC.A состоит из B, за которым следует CПримеры:Sentence = Subject Predicate.FileName = Name '.' Extension.Name = FirstName Surname.1. 1.2.2. ПовторениеA = {B}.A состоит из нуля или более символов B.Примеры:File = {Record}.Bill = {Item Price}.1.1.2.3. ВыборA = B | C.A состоит из B или C.Примеры:Fork = Resource | Data.Meal = Breakfast | Lunch | Dinner.1.1.2.4. ФакультативностьA = [B].A состоит из B или пусто.Пример:SelectedDrink = [ Tea | Coffee | Chocolate ]. // Возможно отсутствие!1.1.2..5. Кавычки и полужирный шрифтТекст в кавычках и текст, выделенный полужирным шрифтом, изображает сам себя.Примеры:ImportDeclaration = import Import {"," Import}.OwnSymbol = "me" | self.Синтаксическая диаграмма - графическое представление синтаксиса языка программирования.Синтаксические диаграммы соответствуют расширенной форме Бэкуса-Наура и используются приописании языка программирования.СПИСОК= "A"| ["," СПИСОК].Рис.
1.4. Синтаксическая диаграмма понятия СПИСОКПример:10. Понятие типа и системы типов языка высокого уровня. Простые, составные,первичные, стандартные, библиотечные и конструируемые типы, отношения между типами.Статическая и динамическая типизация, строгая типизацияЛекции: фото 10Высокоуровневый язык программирования — язык программирования, разработанный длябыстроты и удобства использования программистом. Основная черта высокоуровневых языков — этоабстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных иоперации над ними, описания которых на машинном коде (или другом низкоуровневом языкепрограммирования) очень длинны и сложны для понимания.Система типов ЯВУ: Набор первичных (предопределённых типов); Набор конструкторов типов (правила конструирования новых типов); Правила согласования (эквивалентности и совместимости типов).Первичные типыСтандартные (целые, вещественные, логический, литерный);Библиотечные (задаются модулями, классами).Динами́ ческая типиза́ ция — (переменная не имеет типа, тип имеют значения; в моментвремени переменная имеет тип своего значения) приём, широко используемый в языкахпрограммирования и языках спецификации, при котором переменная связывается с типом в моментприсваивания значения, а не в момент объявления переменной.
Таким образом, в различных участкахпрограммы одна и та же переменная может принимать значения разных типов. Примеры языков, гдеесть динамическая типизация — Smalltalk, Python, Objective-C, C#, Ruby, PHP, Perl, JavaScript, Lisp, xBase.+ Минимум дополнительных строк: переменные надо либо просто объявить безуказания типа (JavaScript), либо вообще объявлять не нужно (Бейсик) или необязательно (PHP). Соответственно, упрощается написание простых программ. Повышается гибкость языка. Например, только динамический язык может иметьфункцию eval(), вычисляющую значение произвольного выражения. Ускоряет работу компилятора — а значит, производственный цикл «написатьпроверить». Автоматически даёт языку элементы метапрограммирования и интроспекции.− Статическая типизация позволяет уже при компиляции заметить простые ошибки «понедосмотру».
Для динамической типизации требуется как минимум выполнить данныйучасток кода. Особенно коварны в динамическом языке программирования опечатки: разработчикможет несколько раз просмотреть неработающий код и ничего не увидеть, поканаконец не найдёт набранный с ошибкой идентификатор. В объектно-ориентированных языках не действует либо действует с ограничениямиавтодополнение: трудно или невозможно понять, к какому типу относится переменная,и вывести набор её полей и методов. Для написания сложного кода нужна особая культура программирования: венгерскаянотация, юнит-тестирование и т. д. Интерфейсная часть модуля (описания типов, заголовки процедур и т. д. — то, чтосоответствует interface-секции в Паскале и h-файлу в Си) в статическом языке сама посебе является существенной частью документации — а изредка вообще позволяетобойтись без документирования. Низкая скорость, связанная с динамической проверкой типа.
К тому же большинствоязыков с динамической типизацией интерпретируемые, а не компилируемые.Стати́ ческая типиза́ ция — (тип не меняется) приём, широко используемый в языкахпрограммирования, при котором переменная, параметр подпрограммы, возвращаемое значениефункции связывается с типом в момент объявления и тип не может быть изменён позже (переменнаяили параметр будут принимать, а функция — возвращать значения только этого типа). Примерыстатически типизированных языков — Ада, Си++, Паскаль.Строгая типизация — один из вариантов политики работы с типами данных, котораяиспользуется в языках программирования.Строгая типизация подразумевает выполнение следующих обязательных условий:1. Любой объект данных (переменная, константа, выражение) в языке всегда имеетстрого определённый тип, который фиксируется на момент компиляции программы(статическая типизация) или определяется во время выполнения (динамическаятипизация).2.
Допускается присваивание переменной только значения, имеющего строго тот же типданных, что и переменная, те же ограничения действуют в отношении передачипараметров и возврата результатов функций.3. Каждая операция требует параметров строго определённых типов.4. Неявное преобразование типов не допускается (то есть транслятор воспринимаетлюбую попытку использовать значение не того типа, который был описан дляпеременной, параметра, функции или операции, как синтаксическую ошибку).Строгая типизация подразумевает:1. Каждый программный объект имеет только один тип.2.