Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 73
Текст из файла (страница 73)
Почему цели указателей большинства языков ограничиваются обьектамн одного типа? 26. Что такое ссылки в языке С++ и как они обычно используются? Почему в языке С++ в качестве формальных параметров лучше использовать ссылки, а не указатели? Назовите преимушества ссылок в языке !ача по сравнению с указателями в других языках. 27. 28. 29. Опишите ленивый и энергичный подходы к освобождению памяти, занятой мусором.
Чем различаются ссылки в языках С++ и 1ача? Почему арифметические операции над ссылками в языке Зача не имеют смысла? 30. 31. Назовите аргументы "за' и "против*' представления булевских значений одним би- том памяти. Почему десятичное значение неэкономно использует область памяти? В языке СОВО1. используется несколько различных методов хранения десятичных чисел в памяти.
Объясните формат н цели каждого из них. Сравните методы надгробий, а также ключей и замков, используемых для предот- вращения возникновения висячих указателей. В качестве критериев при сравнении используйте належность и стоимость их реализации. Разработайте набор простых тестовых программ для определения правил совмес- тимости типов доступного вам компилятора языка Рааса! или С. Напишите отчет о полученных вами данных. Какие недостатки имеются у неявного разыменования указателей, но только в оп- ределенных контекстах? Рассмотрите, например, неявное разыменование указателя на запись языка Ада при использовании его для обрашения к полю записи.
Обоснуйте сушествование оператора - > в языках С н С++. 3. 8. 9. 272 Гдово 5. Типы данных Определите, какая из альтернатив реализации, описанных в разделе 5.10.4, исполь- зована в лоступиом вам компиляторе языка Рааса!. Объединения языков С и С++ отделены от записей этих языков, а в языках Рааса! и Ада эти типы ланных объединены. В чем заключаются достоинства и недостатки обоих проектных решений? 10. Определите, реализована ли в доступном вам компиляторе языка Рааса! процедура с(1врове. 11.
Определите, реализована ли в доступном вам компиляторе языка С функция аггее. !2. Предположим, что существует язык с определяемыми пользователем перечисли- 13. Многомерные массивы могут записываться в память по строкам, как в языке 14. В языке Вцпоцййз Ех(евдо А!.ОО!. матрицы заносятся в память как одномерные 17. Если вы имеете доступ к компилятору, в котором пользователь может указывать, 18. Проанализируйте и запишите результат сравнения функций та11ос и бгее языка 19. Проанализируйте и запишите результат сравнения использования указателей языка 15. 1б.
мыми типами и возможностью перегрузки перечисляемых величин; т.е. язык. в ко- тором один литерал может включаться в лва различных перечислимых типа: куре со1огв = (гес(, Ь1це, дгееп); аоос( = (Ларру, апдгу, Ь1це); Использование константы Ь1ие не может подвергаться проверке типов. Предло- жите метод, позволяющий проверку типов, но не запрещающий подобную перегрузку. Разов), или по столбцам, как в языке гОКТВА1Ч. Напишите функшао лоступа лля обоих методов дяя трехмерного массива. массивы указателей на строки матриц„причем последние интерпретируются как одномерные массивы значений. В чем заключаются достоинства и недостатки та- кой схемы? Напишите программу, выполняющую умножение матриц, на некотором языке, в котором существует проверка выхода индекса за пределы допустимого лиапазона, для котс!зой с помощью вашего компилятора можно получить версию вашей программы ел машинном языке или языке ассемблера.
Определите число команл. необходимых для проверки выхода индекса за пределы допустимого лиапазона, и сравните его с числом команд а процессе умножения матриц. На языке Рааса! напишите программу, содержащую следующие обьявления: чаг А, В: аггау ! 1 ..
10 ! ой впседег; С: аггау (1..10) оЕ дпведег; 0 : аггау [1..10) о1 ьпседег( Включите в программу команды, определяющие для каждого из массивов совмес- тимые с ним массивы. желательна ли проверка выхода индекса за пределы допустимого диапазона, на- пишите программу с многократным доступом к матрице и измерьте время выпол- нения программы с этой проверкой и без нее. С с операторами пеи и с(е1еге языка С++. В качестве основного критерия срав- нения используйте безопасность. С++ и ссылок в языке )ача при обращении к динамическим переменным.
В качест- ве основных критериев сравнения используйте безопасность и удобство. 20. Напишите краткое исследование потерь и приобретений, произошедших вследствие отказа разработчиков языка 3ача включить в язык указатели из языка С++. 21. Назовите аргументы "за" и "против" неявною освобождения кучи в языке Зача по сравнению с явным освобожлением динамической памяти, требуемым в языке С+в. ги Глава 5.
Типы данных фрндрвк (фриц) Л. Бауэр (Глеб(сй (Ег((з) (,. Вацег) Фрнц Бзузр нз Мюнхене вместе с Клаусом Сзмельсоном (К!аиз Загпецоп) в первой полоенне т950-х годов рвзработзлн злгеб- рзнческнй язык, который мог реелнзовывэться непосредст- венно аппвратным обеспеченн- ом Однако свой нэнболее знвчн- тельный вклад в разработку языков прогрзммнровення Фриц Бауэр сделал. руководя комэн- дой рэзрэботчнков языке д!.001. Выражения и операторы присваивания К- ак можно понять из названия, основное внимание в этой главе уделяется выражениям и операторам присваивания.
Вначале рассматриваются семантические правила, определяющие порядок вычисления операторов в выражениях. Затем описываются потенциальные проблемы, связанные с порядком вычисления операндов в выражениях и возникающие, когда выражения имеют побочные эффекты. Далее следует обсуждение встроенных и определяемых пользователем перегруженных операторов, а также их воздействие на выражения в программах. Затем рассматриваются и оцениваются смешанные выражения.
Далее дается определение и оценка расширяющих и сужаюших преобразований типов (как явных, так и неявных). После этого рассматриваются выражения отношений и булевские выражения, в том числе идея сокращенного вычисления. В заключение рассматривается оператор присваивания, начиная с простейших форм и заканчивая всеми его разновидностями, в том числе присваиваниями в качестве выражений и смешанными присваиваниями. Материал данной главы ограничен традиционными нефункциональнымн и нелогическими языками программирования, использующими в арифметических и логических выражениях инфиксную запись. Функциональные и логические языки программирования подробно описаны и оценены в главах 14 и 15, соответственно.
Еше одним моментом, не затронутым в ланной главе. являются рассмотренные в главе 5 выражения, сопоставляюшие символьные строки с образцом. 6.1. Введение Выражения являются основными средствами вычислений в языке программирования. Для программиста важно понимать и синтаксис, и семантику выражений. Методы описания синтаксиса уже приводились в главе 3, поэтому в ланиой главе основное внимание обращается на семантику выражений — т.е. на их смысл, опрелеляемый тем. как именно они вычисляются. Для того чтобы понять, как вычисляются выражения, необходимо ознакомиться с порядком вычисления операторов и операндов.
Порядок вычисления операторов в выражении определяется правилами ассоциативности и приоритетами. Порядок вычисления операнлов в выражениях часто не упоминается разработчиками языка, хотя он и может влиять на значение выражений. В этом случае возникает ситуация, позволяющая прграммисту получать в различных реализациях языка различные результаты. Кроме т," с семантикой выражений связаны несоответствие типов, приведение типов и сокраь.е-. ное вычисление. Сущность императивных языков программирования заключается в господств) к роли операторов присваивания. Цель оператора присваивания — изменить значенпе —.- ременной. Таким образом, неотьемлемой частью всех императивных языков являе-..
концепция переменных, значения которых изменяются во время выполнения програч ." (Неимперативные языки программирования иногла содержат такие переменные осе, типа, как параметры функций в функциональных языках программирования.) Выполнение оператора присваивания можно просто свести к копированию знач;- из одной ячейки памяти в другую. Однако в большинстве случаев операторы присвз, .-.. ния содержат выражения, в которые входят операторы, вызывающие копирование зн ний в процессор, гле над ними выполняются некоторые операции, а результаты коп; -. ются обратно в память. 216 Глава 6. Выражвния и операторы прмсваиво а Простой оператор присваивания задает выражение, подлежащее вычислению, и целевую ячейку памяти, в которую будет помещен результат вычисления этого выражения.
Как мы увидим в данной главе, эта основная форма имеет множество вариаций. 6.2. Арифметические выражения Автоматическое вычисление арифметических выражений, подобных математическим выражениям, было одной из основных задач первых высокоуровневых языков программирования. Большинство свойств арифметических выражений в языках программирования произошли от условностей, принятых в математике. В языках программирования арифметические выражения состоят из операторов, операндов, круглых скобок и вызовов функций. Оператор может быть унарным (влагу), что означает наличие у него одного операнда, бинарным (Ыпагу), имеющим два операнда, и тернарным (гегпагу).
у которого есть три операнда. Примером языков, содержащих тернарные операторы, являются языки С, С++ и )ата, рассматриваемые в разделе 6.2.1.4. В большинстве императивных языков программирования бинарные операторы являются инфиксными, т.е, они появляются между операндами. Одним из исключениЯ является язык Рег1, в котором есть префиксные операторы, т.е. предшествующие своим операнлам. Цель арифметических выражений — указать арифметическое вычисление. Реализация такого вычисления лолжна выполнять два действия, 'выбирать операнды (обычно из памяти) и выполнять над ними арифметические действия. В следующих разделах мы разберем подробности обшей структуры арифметических выражений в императивных языках программирования. Ниже перечислены основные вопросы разработки, характерные лля арифметических выражений, причем все они рассматриваются в этом разделе. ° Каковы правила приоритетов операторов в языке? ° Каковы правила ассоциативности операторов в языке? ° Каков порядок вычисления операндов? ° Имеются ли у вычислений операндов побочные эффекты? ° Допускает ли язык перегрузку операторов, определяемую пользователем".