RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> > Совершенно верно. А теперь рассмотрим случай, когда есть глубокая иерархия классов и есть объект одного из глубинных классов. Для простоты рассмотрим вызов метода этого объекта, который не перекрыт нигде в иерархии (т.е. на всех уровнях используется метод корневого класса). Каакой код мы имеем в этом случае? Находится адрес таблицы методов класса нашего объекта и из неё по индексу call-ом вызывается соответствующая подпрограмма (реализующая этот метод). А у ней своего кода нет, она толко то и делает, что находит таблицу методов своего родительского класса и точно таким же образом вызывает подпрограмму оттуда. Та подпрограмма, в свою очередь, проделывает в точности всё то же самое для вызова метода своего родителя и т.д. - аж до корня. Там выполняется что-то реальное, после чего начинается возврат ret-ами в то место, откуда всё и началось. > > Так и образуется этот безумный проход по таблицам методов всех промежуточных классов. > > Это бяка реализации компилятора. В таком раскладе таблица методов верхнего класса должна просто содержать указатель на метод корневого класса. И все. Никаких промежуточных хождений быть не должно. > > > Но там это всецело контролируется программистом и происходит только по необходимости. А тут определяется исключительно компилятором и превращается в совершенно бессмысленный и дико неэффективный код. > > Борланд сроду компиляторы писать не умел. > > > Да, конечно, с языком как с абстракцией это никак не связано. Просто реализовать возможности объектно-ориентированного подхода по-другому невозможно. > > Неправда ваша ;) > > > >> Я лично к фортану равнодушен, но знавал людей, писавших на нём компиляторы и не видевших в этом ничего особенного. > > Я вот как-то не уверен, что они писали компайлеры на Фортран IV. > > > Слишком уж легко сделать ошибку и употребить где-то в выражении адрес переменной вместо её значения (или наоборот). А компилятор (в силу особенностей языка) пережуёт это в код и ни слова поперёк не скажет. > > Брр. Это как? Любой компилятор выругается на несоответствие типов. > > > Или вот работа с библиотеками (особенно чужими) - это же просто кошмар какой-то. Строго говоря, библиотек и нет вовсе - компилятор после препроцессора имеет дело просто с монолитным потоком текста. В результате то, что в одном файле (подключённом через include) было определено с помощью define, может быть запросто угроблено в каком-то из последующих файлов - и программист об этом подозревать не будет. > > Компилятор скажет, что у тебя имеет место Macro redefinition и укажет в каком файле и месте. > > > Или случай, когда в двух используемых библиотеках имеются одноимённые функции - тоже кровь попортить может. > > Линкер тебе сообщит, что имеются одноименные функции (укажет имена) в двух либах (укажет либы) и чего-то некругло. > > > В общем, заниматься написанием надёжных программ на подобном языке я бы не стал - здоровье дороже. > > Поскольку все приведенные аргументы ложны, то истинность суждения под вопросом ;)
_, _, _,
/ \ (_ / ~ )
\ / , ) / /
~ ~ ~~~
Programmed by
Dmitri Maximovich
,
Dmitry I. Platonoff
,
Eugen Kuleshov
.
25.09.99 (c) 1999,
RU/2
. All rights reserved.
Rewritten by
Dmitry Ban
. All rights ignored.