RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Может я не прав, но..


Список сообщений | Написать новое | Ответить на сообщение | Домой Поиск:
Предыдущее сообщение | Следующее сообщение
From : LightElf
To : Юрий Пронякин
Subj : Может я не прав, но..

> Совершенно верно. А теперь рассмотрим случай, когда есть глубокая иерархия классов и есть объект одного из глубинных классов. Для простоты рассмотрим вызов метода этого объекта, который не перекрыт нигде в иерархии (т.е. на всех уровнях используется метод корневого класса). Каакой код мы имеем в этом случае? Находится адрес таблицы методов класса нашего объекта и из неё по индексу call-ом вызывается соответствующая подпрограмма (реализующая этот метод). А у ней своего кода нет, она толко то и делает, что находит таблицу методов своего родительского класса и точно таким же образом вызывает подпрограмму оттуда. Та подпрограмма, в свою очередь, проделывает в точности всё то же самое для вызова метода своего родителя и т.д. - аж до корня. Там выполняется что-то реальное, после чего начинается возврат ret-ами в то место, откуда всё и началось.
> Так и образуется этот безумный проход по таблицам методов всех промежуточных классов.

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

> Но там это всецело контролируется программистом и происходит только по необходимости. А тут определяется исключительно компилятором и превращается в совершенно бессмысленный и дико неэффективный код.

Борланд сроду компиляторы писать не умел.

> Да, конечно, с языком как с абстракцией это никак не связано. Просто реализовать возможности объектно-ориентированного подхода по-другому невозможно.

Неправда ваша ;)

> >> Я лично к фортану равнодушен, но знавал людей, писавших на нём компиляторы и не видевших в этом ничего особенного.

Я вот как-то не уверен, что они писали компайлеры на Фортран IV.

> Слишком уж легко сделать ошибку и употребить где-то в выражении адрес переменной вместо её значения (или наоборот). А компилятор (в силу особенностей языка) пережуёт это в код и ни слова поперёк не скажет.

Брр. Это как? Любой компилятор выругается на несоответствие типов.

> Или вот работа с библиотеками (особенно чужими) - это же просто кошмар какой-то. Строго говоря, библиотек и нет вовсе - компилятор после препроцессора имеет дело просто с монолитным потоком текста. В результате то, что в одном файле (подключённом через include) было определено с помощью define, может быть запросто угроблено в каком-то из последующих файлов - и программист об этом подозревать не будет.

Компилятор скажет, что у тебя имеет место Macro redefinition и укажет в каком файле и месте.

> Или случай, когда в двух используемых библиотеках имеются одноимённые функции - тоже кровь попортить может.

Линкер тебе сообщит, что имеются одноименные функции (укажет имена) в двух либах (укажет либы) и чего-то некругло.

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

Поскольку все приведенные аргументы ложны, то истинность суждения под вопросом ;)

Sat 14 Jul 2007 15:18 Mozilla/5.0 (OS/2; U; Warp 4.5; en-US; rv:1.8.1.4) Gecko/200




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.