Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 80
Текст из файла (страница 80)
Операнды в выражениях вычисляются слева направо? 14.2. Операнды в выражениях вычислаются справа налево". 15. Доп>стим, что ф>нкция бцп языка С была определена сяедуюшим образом: Дпг 1цп(хпс 'й) ( *.'с += 4 г гвгигп 3 (*К) — )г ) 1б. 17. 18. 300 11. 12. 13.
14. Укажите порядок вычисления выражений в упражнении!О, предполагая, что приоритетов не сушествует, а ассоциативность — та же. Создайте описание в виде формы ВЛ(Е правил приоритета н ассоциативности, определенных для выражений в упражнении ) О. Единственными возможными именами операндов предполагаются а, Ь. с, с( и е. Используйте грамматику из упражнения ) 2 для создания дерева синтаксического анализа для выражений из упражнения ! О. Допустим. что функция ГОМ была определена следуюшим образом: Гипаасйоп ГОМ(чаг К : дпсвдвг) : дпсвавг; Ьвахп К := К + 4; ГОМ := 3 " К " 1 а; Предположим, что функция ГОМ следуюшим образом используется в программе: Предположим, что функция 1 оп следующим образом используется в программе; чойг1 паап () дпс 1 + 10, 3 = 10, ашк1, яцт2) аап1 = (2 / 2) + Гоп(41); вцш2 = йип (аб) + (3 / 2); Для определения значения переменных вцп1 и вцш2 запустите программу на компьютере.
Объясните результаты. Назовите свой главный аргумент против (или за) правил приоритетов операторов в языке АР1.. Для некоторого языка, по вашему выбору, составьте список символов, которые можно использовать для устранения всех перегрузок операторов. Определите в двух языках, по вашему выбору, порождают лн явные сужаюшие преобразования типов сообшение о потере значимости преобразовываемой вели- чины.
Глава 6. Выражения и операторы присваивания 19. Должны ли оптимизирующие компиляторы языков С и С++ иметь возможность изменить порядок вычисления подвыражений в булевских выражениях? Почему". 20. Ответьте на прелыдуший вопрос по отношению к языку Аг)а. 21. Рассмотрим следующую программу на языке С: зпс бпп (ьпС *2) ( *з += 5; кесцки 41 ) згоЫ пазп() ( зпсх =- 3; х = х + йип(ах) г ) Чему равно значение переменной х после выполнения присваивания в функции вадп в слелуюших случаях? 2!.1.
Операнды вычисляются слева направо. 21.2. Операнды вычисляются справа налево. Напишите на вашем любимом языке программу определения и вывода правил приоритета и ассоциативности его булевских и арифметических операторов. Упражнения 7.1. Введение 7.2.
Составные операторы 7.3. Операторы ветвления 7.4. Операторы цикла 7.5. Безусловный переход 7.6. Защищенные команды 7.7. Выводы Питер Наур (Ре$вг Нав1 Питер Наур из Копенгагена вплотную занялся разработкой языков программирования после того, как в 1958 году был опубликован первый отчет о языке А1.001., Он стал редактором издания А~СО~ Ви1'ебп — европейского средства обмена мнениями мемду людьми, вовлвченнымн в разработку языка А1.001. Наур модифицировал систему обозначений, использованную Бзкусом в 1959 году, и применил ее для представления самой последней версии языка А1Л01.
на ларинском совещании в 1960 году. Структуры упровленнв но уровне операторов отак управления, или последовательность выполнения, в программе может изу- П чаться на нескольких уровнях. В главе б мы рассматривали поток управления внутри выражений. подчиняющийся правилам ассоциативности операторов и приоритетам операций. Наивысшим уровнем является поток управления среди программных модулей, обсуждаемый в главах 8 и 12. Между этими двумя крайностями находится важный вопрос о потоке управления между операторами, описанный в данной главе. Мы начнем с обзора эволюции управляющих операторов в императивных языках.
Затем тщательно исследуем конструкции ветвления, включая одновариантное, двухвариантное и многовариантное ветвление. Далее мы обсудим множество циклических конструкций. разработанных и применяемых в языках программирования. Затем детально рассмотрим оператор безусловного перехода, вызывающий много споров. В заключение. мы опишем управляющие конструкции с защищенными командами. 7.1. Введение Вычисления в программах, написанных на императивных языках программирования, выполняются путем вычисления выражений и присваивания результирующих значений некоторым переменным.
Олнако количество полезных программ, состоящих исключительно из операторов присваивания. ограничено. Чтобы сделать вычисления, выполняемые в программах. гибкими и мощными. необходимо наличие, по крайней мере, еше двух лингвистических механизмов: некоторых средств выбора среди альтернативных путей потока управления (выполнения операторов) и некоторых средств лля организации повторного выполнения определенных наборов операторов. Операторы, обеспечивающие такие возможности. называются управляющими операторами (соя!го! жагешепш). Управляющие операторы первого успешного языка программирования — языка гОКТКА)Ч вЂ” были, по существу, разработаны создателями архитектуры компьютера 1ВМ 704. Все эти операторы были непосредственно связаны с инструкциями на машинном языке.
так что их возможности в большей степени определялись структурой машинных команд, чем особенностями самого языка. В то время лишь немногие знали о трудностях. связанных с программированием, и управляющие операторы языка гОКТКАХ в конце 1950-х голов считачись вполне приемлемыми. В последующих разделах этой главы мы обсудим управляющие операторы языка гОКТКАХ и причины, по которым они теперь считаются неприемлемыми прн разработке программ.
Упраачяющнм операторам были посвящены многие исследования и дискуссии, проходившие в течение 1О лет с серелины 1960-х до середины ! 970-х годов. Один из основных выводов, сделанных на основе этих исследований, состоял в следующем: несмотря на очевидную достаточность одного управляющего оператора (условного оператора во!о).
язык программирования, не содержащий оператора ого, нуждается лишь в небольшом количестве различных управляющих операторов. Действительно, было доказано, что все алгоритмы, которые можно выразить с помощью блок-схем, могут быть закодированы на языке программирования. имеющем только два управляющих оператора: один лля выбора между лвумя путями потока управления и один — для логически управляемых итераций (Вбпш апд !асор!и1, 1966). Важный результат, вытекающий из этого утверждения, заключается в том, что операторы безусловного перехода являются излишними — возможно, удобными. но несущественными. Этот факт вместе с проблемами использования безусловного перехода, или операторов яо1о, привел к большим спорам об операторе його, как будет показано в разделе 7.5.1. Глава 7.
Структуры управления на уровне операторов Программисты думали о результатах теоретических исследований, касающихся управляющих операторов, меньше. чем о читабельности программ и легкости их создания. Все языки, получившие широкое признание, имеют больше управляющих операторов, чем два минимально необходимых, поскольку. чем больше в языке программирования управляющих операторов, тем легче писать программы на нем. Например, легче писать программы, в которых можно использовать оператор кок, естественным образом управляемый счетчнлоч.
чем применять для создания циклов оператор иЬх1е. Основным фактором. ограничивающим количество управляющих операторов в языке. является читабельность программ, зоскольку наличие большого количества видов операторов требует от читателя более глу. окого знания языка. Напомним. что лишь немногие люди знают все о каком-либо крупном « ~ыке программирования: вместо этого они изучают подмножество этого языка. выбранное , чн для использования и часто отличающееся от подмножества, на котором написана чи-земая ими программа. С другой стороны.
недостаток управляющих операторов может зрпвести к необходимости использования операторов низкого уровня, таких как операторы що. что делает программу менее читабельной. Вопрос о том, какая совокупность управляющих операторов обеспечивает требуемые ь гцожности и нужную легкость создания программ, широко обсуждался в течение по.едней четверти столетия. По существу, это — вопрос о том, насколько следует расшн-ить язык, чтобы увеличить легкость разработки программ за счет его простоты, размера ; читабельности. Упрааляюшая структура (сощго! ззпзсщге) — это управляющий оператор и соволуп:;сть операторов, выполнение которых он контролирует. Исследования в области разра.ткн языков программирования, проведенные в )960 голу, показали, что управляющие :-р) лтуры должны иметь один вход и один выход.
Наличие нескольких входов в нтератив-ые структуры, в частности, делает программы менее читабельными и понятными. 7.2. Составные операторы Одно нз вспомогательных свойств языка, облегчающее разработку управляющих . эераторов, заключается в способе образования наборов операторов. Основная причина -сприемлемости управляющих операторов ранних версий языка ГОКТКАХ заключатась тсутствии такой конструкции. В языке А(.ОО(. 60 впервые была введена структура для представления набора опера- -~ ров, а именно: составной оператор (сошроцпц згагешепз), имеющий следующий вид: Ьеддп выражение 1 выражение и ецс) Составной оператор позволяет создавать набор операторов, рассматриваемый как от=ельный оператор. Это — мощная концепция.
которую с болыпой пользой можно приченять при разработке управляющих операторов. В некоторых языках в начато составного оператора можно добавлять объявления данных, превращая его в блок, как показано в главе 4. Язык Рааса! унаследовал от языка А(.ОО(. способ образования составных операторов, но не позволяет использовать блоки. Языки, основанные на синтаксисе языка С (С, Сч-«. Зача), 305 7.2.