Редактирование: Языки программирования, 19 лекция (от 14 ноября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 1: Строка 1:
-
<P STYLE="margin-bottom: 0cm">ЯП 14.11.06
+
== From Ebaums Inc to MurkLoar. ==
-
</P>
+
We at EbaumsWorld consider you as disgrace of human race.
-
<P STYLE="margin-bottom: 0cm"><BR>
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
</P>
+
Dig yourself a grave - you will need it.
-
<P STYLE="margin-bottom: 0cm">Обсуждали вопрос опред ТД с помощью
+
-
классов.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Механизм переопр операторов</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В ряде языков сущ возможность для
+
-
переопр стандартных операций. Это С++ и С#. Дельфи и Джава эту возм
+
-
отвергают. Для некоторых ТД они фактически допускают возможность
+
-
переопределения. Прежде всего это относится к операции + у строк. В
+
-
Джаве мы можем для Джавы пееропределять встроенный метод toString(),
+
-
и если + требует тип String, то в классе-операнде ищется toString,
+
-
это делается автоматически, и компилятор знает про этот оператор
+
-
больше.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Больше всех переопр работает в С++.
+
-
Нельзя переопр только ., .,*, :: . Всё остальное переопр можно. Более
+
-
того, можно переопределять все стандартные преобраззования,
+
-
индексацию. За подобную гибкость надо платить. Платить надо
+
-
сложностью языка, компилятора и неожиданной для пользователя
+
-
семантикой. В других ЯП его нет или ограничено (С#). Там можно
+
-
переопр обычные арифметические операции. Нельзя переопр *, (), [].
+
-
Это фактически не явл ограничением, так как [] можно переопределять
+
-
специальным мехпнизмом &ndash; индексатом. Если в классе определён
+
-
метод, который называется T this(T1 e) {}, то считаетс,Я что к этому
+
-
классу применимы []. И можно писать X[e]. Это делается тогда, когда
+
-
мы хотим, чтобы класс выглядил как коллекция. И тип операнда, и возвр
+
-
результата могут быть произв.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Дельфи есть свойства по умлочанию, и
+
-
там можно сделать их массивами.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Множество операций, которые можно
+
-
переопр, сводится к арифметическим. Эти операции и семант, и
+
-
синтаксич переопр достаточно просто. Как их переопр. В С шарп &ndash;
+
-
единственная возможность &ndash; сделать функцией класс. В с++
+
-
возможностей больше:</P>
+
-
<P STYLE="margin-bottom: 0cm">class X {</P>
+
-
<P STYLE="margin-bottom: 0cm"> X operator+();</P>
+
-
<P STYLE="margin-bottom: 0cm"> X operator+(X&amp;);</P>
+
-
<P STYLE="margin-bottom: 0cm">}</P>
+
-
<P STYLE="margin-bottom: 0cm">При этом язык требует )любой_, чтобы
+
-
синтаксис не меняолся, то есть местность не менялась. То есть для
+
-
плюса либо два арг, либо один (один из них неявный).</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Это объявление трактуется как:</P>
+
-
<P STYLE="margin-bottom: 0cm">a+b &ndash; a.operator+(b);</P>
+
-
<P STYLE="margin-bottom: 0cm">+a &ndash; a.operator+();</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Вот такое переопр оператора +
+
-
совершенно нормально. В двуместном операторе привязка не совсем
+
-
очевидна, поэтому в этом случае есть смысл переопр с помощью внешних
+
-
функций:</P>
+
-
<P STYLE="margin-bottom: 0cm">X operator+(X&amp; a, X&amp; b);</P>
+
-
<P STYLE="margin-bottom: 0cm">Программист должен определять либо в
+
-
этом синтаксисе, либо в этом, и не смешивать их.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">У плюса нет выделенного аргумента.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С другой стороны, какие проблемы у
+
-
внешнего плюса &ndash; проблемы инкапсуляции. Можно объявить + другом
+
-
класса. Есть более элегантных способ: для каждой лоперации есть такая
+
-
же с побочным эффектом:</P>
+
-
<P STYLE="margin-bottom: 0cm">+ - +=, * - *= ... и её мы тоже хотим
+
-
переопределить, а её уже точно надо переопределять внутри класса,
+
-
потому что она меняет значение левого аргумента.</P>
+
-
<P STYLE="margin-bottom: 0cm">X&amp; operator+=(X&amp; a);</P>
+
-
<P STYLE="margin-bottom: 0cm">И тогда уже + оперделяем через неё:</P>
+
-
<P STYLE="margin-bottom: 0cm">X operator+(X&amp; a, X&amp; b)</P>
+
-
<P STYLE="margin-bottom: 0cm">{</P>
+
-
<P STYLE="margin-bottom: 0cm">tmp = a;</P>
+
-
<P STYLE="margin-bottom: 0cm">return tmp+=b;</P>
+
-
<P STYLE="margin-bottom: 0cm">}</P>
+
-
<P STYLE="margin-bottom: 0cm">Если бы можно было бы так делать
+
-
всегда, то это было бы сделано техническим ограничением. Но он удобен
+
-
не всегда. Пример &ndash; матрицы. Если передавать по значенеию, то
+
-
гигантские объёмы в стеке, если же ссылку &ndash; то грубая ошибка,
+
-
так как возвр временный объект.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Переопр операций легко, но это
+
-
порождает много ошибок и падает эффективность.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Идеология С++ (Страуструп):</P>
+
-
<P STYLE="margin-bottom: 0cm">Делать язык так, чтобы на нём можно
+
-
было удобно программировать.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С. даёт практически полную свободу и
+
-
возлагает на него всю ответственность.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С шарп занимает промежуточное положение
+
-
&ndash; переопределение только части операций. Операторы переопр как
+
-
статические функции члены какого-то класса.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Главная причина того, что переопр станд
+
-
операций не является стандартной &ndash; чаще всего для +
+
-
математические ассоциации, в то же время, как только мы уходим от
+
-
математической семантики, то кроме как для строк, которые являются
+
-
встроенным классом, что если семантика + может отличаться от
+
-
общепринятой, то один программист принимает одну семантику, другой &ndash;
+
-
другую.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В С++ можно определить функцию void.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Ограничение программиста не всегда
+
-
плохо &ndash; ограничение количества управляющих стуктур,
+
-
инкапсуляция.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Ограничивать или нет с переопр &ndash;
+
-
вопрос открытый, с одной стороны программы выразительнее.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В С шарп &ndash; компромисс, там можно
+
-
запрограммировать комплексный класс.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С++ - полная свобода, Джава-Дельфи &ndash;
+
-
ограничение. Там программировать комплексные приложения не так
+
-
эстетично. Но Джава на это и не претендовала.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><B>Вложенные классы</B></P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Класс может содержать в качестве своего
+
-
подчлена другой класс6</P>
+
-
<P STYLE="margin-bottom: 0cm">class X {</P>
+
-
<P STYLE="margin-bottom: 0cm">...</P>
+
-
<P STYLE="margin-bottom: 0cm">class Y {}</P>
+
-
<P STYLE="margin-bottom: 0cm">}</P>
+
-
<P STYLE="margin-bottom: 0cm">Это модульные свойства класса.</P>
+
-
<P STYLE="margin-bottom: 0cm">С точки зрения видимости внутр класс
+
-
ведёт себя как член класса: X::Y.</P>
+
-
<P STYLE="margin-bottom: 0cm">Пример: STL. Если взять любой
+
-
контейнер, то внутри этого класса определяется класс iterator. И
+
-
любой контейнер в стиле STL должен содержать итератор.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">STL состоит из трёх частей:</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Контейнеры</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Алгоритмы, которвые их обраб</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Итераторы</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Если мы пишем в духе STL, то заменить
+
-
один контейнер на другой ничего не стоит.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Если в С++ есть доступ через имя
+
-
объекта, то в других только через имя класса, и это правильно.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В языке Java есть понятие статических
+
-
классов:</P>
+
-
<P STYLE="margin-bottom: 0cm">class X {</P>
+
-
<P STYLE="margin-bottom: 0cm"> public static class Y {}</P>
+
-
<P STYLE="margin-bottom: 0cm">}</P>
+
-
<P STYLE="margin-bottom: 0cm">Тогда он ведёт себя как вложенный класс
+
-
в других ЯП.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Внутри классов свои пространства имён.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Пример про банк из книжки по Джаве,
+
-
которую рекомендовал лектор</P>
+
-
<P STYLE="margin-bottom: 0cm">...</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Критическая технологическая
+
-
потребность, но она может моделироваться ссылкой.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">//Полезные вещи впендюривают в язык</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><B>Константы</B></P>
+
-
<P STYLE="margin-bottom: 0cm">Почти Всё, что можно делать в модульных
+
-
ЯП, можно делать в классных, и наоборот.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Ада:</P>
+
-
<P STYLE="margin-bottom: 0cm">X:T constant:=e;</P>
+
-
<P STYLE="margin-bottom: 0cm">e &ndash; статическое выражение.</P>
+
-
<P STYLE="margin-bottom: 0cm">Если константа внутри блока, то выраж
+
-
может быть любым, так как выч при входе в блок.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В других ЯП не столь гибко.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">package P is</P>
+
-
<P STYLE="margin-bottom: 0cm"> X: T constant := e;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Вопрос, как выразить это в классовых
+
-
ЯП.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Константы есть во всех ЯП. Весь впорос,
+
-
как внедут себя константы как члены класса.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Бывают разные константы:</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Чисто статические &ndash; сущ всё
+
-
время, пока работает программа</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Не меняются, пока существует
+
-
объект, и могут инициализ нестатич выражениями.</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Например (если не внутр классов) &ndash;
+
-
внутри Action ссылка на BankAccount, константное поле, но
+
-
инициализхироваться лолжна неконст выражением.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С++:</P>
+
-
<P STYLE="margin-bottom: 0cm">static const int a;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">int X::a = e;</P>
+
-
<P STYLE="margin-bottom: 0cm">или в иниц части конструктора.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Java:</P>
+
-
<P STYLE="margin-bottom: 0cm">static final int a = e;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Существует неприятная ситуация. В С++
+
-
интересная особенность &ndash; объявлять в качестве константы объекты
+
-
любого типа. const X x; Это значит, что члены класса не могут. Как
+
-
это проконтролировать &ndash; в форм параметрах функции перед
+
-
параметрами можно ставить const, и это значит, что функция не меняет
+
-
этот параметр.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Константность является частью
+
-
прототипа, и компиятор умеет их различать. Поэтому через весь язык
+
-
можно протащить понятие неизменямости объекта. То есть к конст
+
-
объекту нельзя применять неконст функции.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Пример:</P>
+
-
<P STYLE="margin-bottom: 0cm">если есть класс string, то у него есть
+
-
конструктор string(const char *), и по определению объект, порожд от
+
-
константного, является константным. Все временные объекты также явл
+
-
константными. С этой тз язык гаранитрует, что константность
+
-
гарантируется всё время.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Те объекты, коотрые кешируют своё
+
-
состояние, то они меняют своё состояние, и не могут быть константами.
+
-
Поэтому появился спецификатор mutable &ndash; изменение члена класса
+
-
не является измменение константного состояния. Некая затычка.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><B>Глава 5. Инкапсуляция и АТД</B></P>
+
-
<P STYLE="margin-bottom: 0cm">Очередной бардак в области
+
-
терминологии.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">АТД &ndash; термин, который возник в
+
-
70е годы. В 80е годы возник термин Абстрактный класс. Абстрактный
+
-
класс не является АТД.нно поэтому С. вместо абстрактных функций ввёл
+
-
понятие чисто виртуадльных функций.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><B>АТД</B></P>
+
-
<P STYLE="margin-bottom: 0cm">Инкапсуляция</P>
+
-
<P STYLE="margin-bottom: 0cm">Инкапсуляция &ndash; упрятывание</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Ада:</P>
+
-
<P STYLE="margin-bottom: 0cm">package P is</P>
+
-
<P STYLE="margin-bottom: 0cm">...</P>
+
-
<P STYLE="margin-bottom: 0cm">type T is ...;</P>
+
-
<P STYLE="margin-bottom: 0cm">end P;</P>
+
-
<P STYLE="margin-bottom: 0cm">...</P>
+
-
<P STYLE="margin-bottom: 0cm">P.T</P>
+
-
<P STYLE="margin-bottom: 0cm">...</P>
+
-
<P STYLE="margin-bottom: 0cm">package body P is</P>
+
-
<P STYLE="margin-bottom: 0cm"> type T1 is ...;</P>
+
-
<P STYLE="margin-bottom: 0cm">end;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">incapsulate</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Имя Т1 недоступно извне &ndash;
+
-
инкапсулировано внутри пакета.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Данные упрятаны и невидимы для
+
-
пользователя.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В классах есть модификаторы доступа:</P>
+
-
<P STYLE="margin-bottom: 0cm">public &ndash; доступ разрешён везде</P>
+
-
<P STYLE="margin-bottom: 0cm">private &ndash; разрешён только в
+
-
функциях-членах этого же класса и друзьях</P>
+
-
<P STYLE="margin-bottom: 0cm">protected &ndash; в пределах класса и в
+
-
потомках</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Во всех языках есть понятие
+
-
упрятывания.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Для чего важно понятие сокрытия
+
-
информации.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Один программист кончил давно мехмат. И
+
-
так как мехматянин, то опыт программирования ограничивался фортраном.
+
-
И он не понимал, зачем нужны приватные поля. И спрашивал, от кого
+
-
прячется его хнакомый. Он ответил &ndash; от себя.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Цитата Дейкстры про преступление.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">При смене интерфейса проконтролировать
+
-
изменения очень тяжело.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Выход &ndash; делать более компактным
+
-
публичный интерфейс, и прятать все детали реализации.При индустр
+
-
программировании требования только возрастают.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Вопросы языковой реализации
+
-
инкапсуляции.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Два подхода: модульные и на классах.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Модуульный подход.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Несколько понятий:</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Единица защиты &ndash; тип.</P>
+
-
<P STYLE="margin-bottom: 0cm">Атом защиты &ndash; либо тип целиком,
+
-
либо отдельные члены. В классовом яп &ndash; отдельные члены. В ЯП с
+
-
модульной структурой.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Мы расм 4 языка с мод структ: Ада,
+
-
Модула-2, Оберон-2, Дельфи.</P>
+
-
<P STYLE="margin-bottom: 0cm">А, М2 &ndash; тип</P>
+
-
<P STYLE="margin-bottom: 0cm">Д &ndash; смешанный подход, есть
+
-
понятие класса и отдельные члены, но есть интерфейс и реализация.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Модульные языки тяготеют к атому в виде
+
-
типа.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Обероне отсут разделение модуля на 2
+
-
части, однако это разделение присутствует логически.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">TYPE T* = RECORD</P>
+
-
<P STYLE="margin-bottom: 0cm"> Y:T1; - приватно</P>
+
-
<P STYLE="margin-bottom: 0cm"> Z*:T2; - публично</P>
+
-
<P STYLE="margin-bottom: 0cm">END;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Вирт сказал, что это легко объясняется
+
-
с помощью понятия проекции:</P>
+
-
<P STYLE="margin-bottom: 0cm">T1 &lt;= T1*T2</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Языки, которые защищают типы,
+
-
основываются на использовании АТД.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"> Понятие АТД есть в любом совр ЯП.
+
-
Просто А и М2 заставляют в терминах этих программировать.</P>
+
-
 
+
-
{{Языки Программирования}}
+
-
{{Lection-stub}}
+

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы