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

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

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

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
-
[[Языки программирования, 26 лекция (от 07 декабря)|Предыдущая лекция]] | [[Языки программирования, 28 лекция (от 14 декабря)|Следующая лекция]]
+
== From Ebaums Inc to MurkLoar. ==
-
 
+
We at EbaumsWorld consider you as disgrace of human race.
-
<!-- ЯП 12.12.06 -->
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
 
+
Dig yourself a grave - you will need it.
-
Предварительный экзамен 19 декабря. На нём нельзя пользоваться книгами. Пересдача на пересдаче.
+
-
 
+
-
RTTI
+
-
 
+
-
Си++
+
-
 
+
-
Отличие от JD#: Во-первых, вопрос RTTI, не может ставится для любых обхектов, только для тех, которые могут иметь дин тип, то есть только для T* и T&. В JD# все объекты из Object, а он уже с RRTI, в С++ только для типов, у которых есть вирт методы, то есть только у тех, которые имеют таблицу вирт функ, которая имеет инф о типе.
+
-
 
+
-
такая реализация RTTI, это не снижает мощность для языка. RTTI нужна для безоп проеобр от базового класса к производному, чтобы вызывать методы производного, которые привязаны динамически.
+
-
 
+
-
С++: dynamic_cast<T*>(e) – динамическое преобр типа – похоже на страж типа. Проверяется тип, то возвр указатель, иначе возвр 0 (t is T в Обероне)
+
-
 
+
-
dynamic_cast<T&>(e) – если можно делается преобр, иначе исключение, потому что нулевой ссылки нет, поэтому Страуструп утверждал, что первый вариант – проверка, страж типа; а второй – утверждение. (t(T) в Обероне)
+
-
 
+
-
Для унификации синтаксиса появились static_cast<T>(e) – неконтроллируемое преобр указателя. reinterpret_cast<T>(e) – когда тип e и T никак не свзаны, например, указатель и инт.
+
-
 
+
-
С# в managed code позволяет только dynamic_cast.
+
-
 
+
-
В С++ появилась ещё одна конструкция – type_info typeid(t) – псевдофункция, возвр специальный тип type_info. Псевдофункция потому, что применима к именам типом. type_info содержит слде методы: void before(type_info&), const char * name(). У него перерыты == и !=.
+
-
 
+
-
JD# - изначально объектно ориент, и в них всё хорошо. Там можно получить полную динамическую информацию о типе. В них появился Reflection. Можно получить список всех методов, имена всех методов, типа и имена параметров, все интерфейсы, все базовые классы.
+
-
 
+
-
Есть строка «A.B.C», можно проверить что такое A, B, C.
+
-
 
+
-
Есть ядро, написанное высокопроизводительном статическом языке, например Апач написан на Си, оболочка на скриптовых языках
+
-
 
+
-
System.Reflection, там есть Assembly, которая позволяет узнать инфомацию о сборке, которая позволяет сказать getTypes, которая возвращает вписок типов. В java.lang есть классс Class, который хранит всю информацию о классе. И есть Object.getClass(), который позвояет получить класс. Механизм отражения в Джаве нужен затем, что там есть динамическая загрузка классов.
+
-
 
+
-
Множественное наследование
+
-
 
+
-
Очень спорный вопрос. Есть пуристы, которые говорят, что если в Смолтоке чего-то нет, то это не нужно. Множественное наследование реализовано C++, Eiffel, CLOS (Common Lisp Object System – максимальный язык).
+
-
 
+
-
1986 – С++ 2.0 – продакшн версия, AT&T представила язык, до этого С++ распространялся freeware. 2.0 стали использовать компании. Когда был дедлайн, С. отложил темплейты и занялся наследованием. Позже он говорил, что был Objective C, и автор его писал, что реализовать множ наследование невозможно. Механизм шаблонов был сформирован в 1991 году, но в студлии он полностью не реализован до сих пор. STL – платформа, которая состоит из исходников и компилятор. Та STL, которая была, на вижуалке не компилировалась.
+
-
 
+
-
Детали мех мноэ наследования: внешне просто, у класса может быть несколько баз. class X: public B1, public B2 ... {...}. В чём проблемы: проблема имён. Если и там и там есть одинаковые имена Name. Если функции-члены, то вызываем их так:
+
-
X* x = new X;
+
-
x->B1::Name
+
-
x->B2->Name;
+
-
 
+
-
А если:
+
-
из B наследуют C, D, из них X. Сю приводил пример:
+
-
Storable
+
-
void read();
+
-
void write();
+
-
 
+
-
Transmitter
+
-
void write
+
-
 
+
-
Receiver
+
-
void read
+
-
 
+
-
Проблема реализ множ наследования свфязана с реализ дин связывания.
+
-
 
+
-
//педедыв
+
-
 
+
-
Link
+
-
|
+
-
V
+
-
ProcessList, UserList
+
-
|
+
-
V
+
-
Process
+
-
Можно сделать Link как член класса
+
-
 
+
-
Есть класс TR, который унаследовал от Transmitter и Receiver. Как будет выглядеть его ТВМ?
+
-
 
+
-
TR * p = new TR();
+
-
p -> read(); - унасл от rec
+
-
p -> write(); - унасл от trans
+
-
 
+
-
Здесь нарушается правило С++ - если польз-прогр не использует что-то, то оно не присоединяется. Если не исп искл, то их нет, если не исп. множ насл, то польз должны платить,
+
-
 
+
-
Diamond – ромбовидное (бубновое, !!!не бриллиантовое) наследование
+
-
 
+
-
base_io
+
-
istream, ostream
+
-
iostream
+
-
 
+
-
//как говорил науч рук лектора, если делать, то по-большому
+
-
 
+
-
Двойной указатель уже не проходит. Мы даже не знаем, глде находится ТВМ. Эффективная реализация невозм. С. сделал достаточно эффективнуюб реализацию, но она кривая.
+
-
 
+
-
Это наследование С. назвал виртуальным.
+
-
 
+
-
class Base {
+
-
...
+
-
};
+
-
 
+
-
class D1:public virtual Base {..}
+
-
class D2:public virtual Base {..}
+
-
class X:public D1, public D2 {..}
+
-
 
+
-
Соотв, мы должны сообщать о ромбовидном насл уже на этапе D1, D2. Поэтому это самый спорный аспект.
+
-
 
+
-
При насл интерфейсов проблем не возникает.
+
-
 
+
-
Что такое интерфейс – ссылка на ТВМ и this.
+
-
 
+
-
Если отсут нестат члены-данные, то сложностей никаких.
+
-
 
+
-
Последняя глава и тема нашего курса:
+
-
 
+
-
Глава 5. Статическая параметризация
+
-
 
+
-
Мы можем выбирать по форме, профилю функции, поэтому можно выбирать её на этапе компиляции.
+
-
 
+
-
Можно пойти дальше и параметризовывать не только функции, но и типы.
+
-
 
+
-
Статич параметр менее мощная, чем дин. В дин можно проэмулировать стат.
+
-
 
+
-
В Дельфи нет. В шарп появилсаь с версии 2.0
+
-
 
+
-
Рассм Аду, С++, С#.
+
-
 
+
-
В С++ наиболее гибкий, поэтому наиболее трудно реализ.
+
-
 
+
-
п.1 Язык Ада.
+
-
 
+
-
Родовые модули (generic)
+
-
Могут быть:
+
-
1.пакеты
+
-
2.подпрограммы
+
-
 
+
-
Синтаксис:
+
-
Объявление родового объекта
+
-
generic
+
-
объявл стат параметров
+
-
спецификация пакета | заголовок подпрограммы
+
-
 
+
-
Вызов абстракции – instantiation – конкретизация
+
-
 
+
-
package IntStack is new Stack(...);
+
-
procedure IntSort is new Sort(...);
+
-
 
+
-
в Аде рдовые модули были введены таким хитрым образом, что они всё поддерживали – разд компиляция, ..., причём эффективо.
+
-
 
+
-
generic
+
-
size: integer;
+
-
type ElType is private;
+
-
package Stack is
+
-
procedure Push(X: ElType);
+
-
function Pop() return ElType;
+
-
function IsFull() return Boolean;
+
-
end Stack;
+
-
 
+
-
Если посм специф пакета, он выдаёт голыые процедуры, которые будут работать с типом, который объявлен в теле пакета.
+
-
 
+
-
package body Stack is
+
-
body : array [1..size] of ElType;
+
-
top : integer:=1;
+
-
end Stack;
+
-
 
+
-
package IntStack is new Stack(64, integer);
+
-
 
+
-
генерируется новая специф. пакета
+
-
 
+
-
IntStack.Push(0); - чисто объектная запись
+
-
 
+
-
Для конкретизации можно знать только спецификацию пакета – разд компиляция.
+
-
 
+
-
Как только требуется, чтобы нам нужно было выполнять нетрив операции, мы должны передавать всю информацию.
+
-
 
+
-
Надо сообщить процедуре сортировки, указать тип элемента, тип индекса, функцию сравнения – так что она должна иметь 4 родовых параметра, хотя можно было бы только один, а остальные выводить.
+
-
 
+
-
Доходим до идиотизма: родовой вариант функции MapList – у неё 8 родовых параметров.
+
-
 
+
-
{{Языки Программирования}}
+
-
{{Lection-stub}}
+

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

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