Главная » Просмотр файлов » лекции (2003) (Глазкова)

лекции (2003) (Глазкова) (1160821), страница 14

Файл №1160821 лекции (2003) (Глазкова) (лекции (2003) (Глазкова)) 14 страницалекции (2003) (Глазкова) (1160821) страница 142019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 14)

То же самое можно сделать практически для любого объекта.

Поскольку любой объект в языке Java происходит от ТД Object, а в ТД Object есть операция ToString( ).

Когда компилятор видит контекст строкового представления объекта (например, О+ S, где О - объект, S - строка), то компилятор неявно вставляет О. ToString().

И это строковое представление есть для любого объекта языка Java.

То же самое можно сказать и про язык C#, у которого есть базовый тип object, есть метод toString(). И, если компилятор видит , что некоторый объект употребляется в контексте, который требует строкового представления, он сам неявно вызывает метод toString().

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

Например, про класс String компилятор знает, что к нему применима операция +; везде, где необходим контекст строки, компилятор может вставлять вызов toString() и т.д.

Язык С++ отличается от выше перечисленных языков тем, что он содержит наиболее мощные средства развития.

Только в языке С++ такой базисный ТД как строка может быть представлен как элемент стандартной библиотеки.

Средства развития настолько мощны, что легко можно добавлять новые типы данных.

Ни один из более современных ЯП такими мощными средствами развития не обладает. Именно поэтому базис этих языков несколько раздут по сравнению с базисом языка С++.

Средства развития языка С++:

  • понятие шаблона;

  • перекрытие стандартных знаков операций;

  • допущение неявных преобразований.

Почему же современные ЯП не так мощны, как С++?

Во-первых, язык С++ - самый сложный из рассматриваемых (после языка Ада).

Во-вторых, перекрытие операций, использование шаблонов и т.д. в неумелых руках может привести либо к неэффективности, либо к ненадежности.

Лекция 11

Глава 3. Управление последовательностью действий

(Операторный базис).

Операция – нечто, предназначенное для вычисления какого-то значения, или некоторая функция, встроенная в язык, либо определенная пользователем.

Оператор – некоторое действие, которое, как правило, влечет за собой какой-то побочный эффект. Понятия оператор и операция тесно связаны.

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

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

Классический пример.

Язык Си: v = e; - операция, главным результатом которой является изменение состояния, т.е. вычисляется выражение e и присваивается левой части. Значение этой операции – это есть значение правой части операции присваивания.

Операции v+=e; v++;

- примеры операций, обладающих побочным эффектом.

В языке Си выражения могут иметь побочный эффект (хотя не все: например, a + b; - в общем случае побочного эффекта не имеет). В тоже время операторы в языке Си значения иметь не могут.

В языке Алгол60: любой оператор имел некоторое значение.

Например: - оператор присваивания – имеет значение своей правой части,

  • оператор цикла имеет значение последнего выполненного в теле этого цикла оператора и т.д.

Составной оператор также имеет значение самого последнего оператора. Соответственно, разница между оператором и операцией стирается.

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

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

С чем это связанно? Возьмем первый язык программирования – Фортран. Фортран был нужен для того, чтобы на удобном для пользователя (а именно – математическом языке) записать программу в виде блок-схем. В Фортране главными операторами были: оператор присваивания, операторы ввода/вывода READ и PRINT и ещё, конечно, операторы перехода (4 оператора перехода, один из них условный). Различные языки программирования после Фортрана каким-то образом модифицировали базис. Скажем, в языке Алгол-60 тоже существовало несколько вариантов оператора перехода, и в тоже время несколько операторов цикла, в то время как в Фортране был один оператор цикла. Все языки в этом смысле «извращались» по-своему.

В 1968г. появилась знаменитая статья Дейкстры – «О вредности оператора GOTO» В этой статье впервые в истории программирования утверждалось следующее: для того, чтобы сделать программирование более эффективным, необходимо не добавлять в языке программирования новые конструкции, а, наоборот, исключить употребление определенного рода конструкций.

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

Далее начинаем уточнять:

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

Далее возникают конструкции ветвления:

Программировать надо именно в терминах таких конструкций.

Вполне достаточно следующих конструкций:

  • Базисные операторы (оператор присваивания :=, оператор ввода / вывода, пустой оператор)

  • Конструкции, которые управляют комбинацией базисных операций и других блоков (конструкция последовательности, ветвления и цикла)

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

- операции последовательности (т.е. последовательное выполнение двух блоков).

-оператора цикла типа while.

Естественно, что не нужно писать в терминах только этих двух конструкций.

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

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

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

В некоторых языках остался только оператор GOTO <метка>, при этом область применения оператора GOTO в тех языках, в которых он остался, определяется исключительно одним блоком. Например, в языке Си: есть оператор перехода, но он ограничивается только телом функции, где он появился, выйти за пределы функции нельзя. Для выхода за пределы функции служит оператор – long jump (оператор нелокального перехода).

Интересно, что многие современные ЯП, по определению, не содержат оператора перехода.

Языки Модула-2 (1970), Оберон, Java не содержит оператора перехода. В Java, слово GOTO является ключевым зарезервированным словом (чтобы не возникло желание употребить это слово).

В языках C++, Delphi, С#, Ada – оператор GOTO остался, но область его применения существенно сократилась.

Рассмотрим, какие основные структурные конструкции предлагались:

  • условный оператор

  • оператор многовариантного выбора

  • циклы

В 1974г. Д. Кнут опубликовал статью «Структурное программирование с оператором GOTO », в которой Кнут заострил внимание, что структурное программирование не есть просто какое-то ограничение возможностей программирования, а некая методология. Существует важный класс алгоритмов, которые нельзя запрограммировать с помощью традиционных циклов (циклов языка Паскаль).

Очень много алгоритмов обработки данных имеют следующую форму:

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

Рассмотрим основные виды операторов управления последовательностью действий:

- ветвление

- циклы

-переходы (оператор перехода всего один, однако разновидностей, которые заменяют оператор перехода, достаточно много).

Ветвление

Пример из Алгол60: if B then S1 else S2, где S1, S2 – некоторые операторы или укороченный вариант if B then S.

Здесь появляется фундаментальная проблема: if B1 then if B2 then S1 else S2 (т.е. вложенность операторов)

Какой оператор во что вложен? Если B1=true, B2=false выполняется ли S2?

Какой из этих операторов укороченный? Возможна двоякая интерпретация:

1)

if B1 then

if B2 then

S1

else

S2

2)

if B1 then

if B2 then

S1

else

S2

Вопрос: к какому if относится else S2? Выход из этой ситуации: else относится к ближайшему if (т.е. интерпретация 1))

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

И язык Алгол60 и языки, построенные на его основе (Паскаль и Си) – это все языки в которых нет явных ограничителей операций. Отсюда и возникают подобного рода проблемы неоднозначности. Первым вопросом, который стоит перед любым человеком, который проектирует язык программирования на традиционной базе – это вопрос выбирать ли явный ограничитель или нет. Языки Модула-2, Оберон, Ада – языки с явными ограничителями.

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

В Модула-2, Обероне завершающее ключевое слово - end:

if B1 then

S1

else

S2

end

while B

S1

end

Чем удобен подход «терминатора»?

Характеристики

Тип файла
Документ
Размер
825 Kb
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее