Форум: "Основная";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
ВнизЗачем USES разбиты на два блока? Найти похожие ветки
← →
Darlock (2002-10-09 18:10) [0]Не подскажет ли кто зачем USES разнесены на два блока interface и implementation
← →
Best Before 2024 (2002-10-09 18:13) [1]Затем же зачем и программа разделена на эти секции
← →
andrey_pst (2002-10-09 18:13) [2]interface - описание
implementation - реализация
Книги по Pascal почитайте.
← →
still (2002-10-09 18:16) [3]например, если требуется организовать циклическую ссылку (ну бывает такая неоходимость). Например, unit a должен видеть unit b и наоборот
то в interface у unita a прописываем uses b, а в implementation у unit b - uses a иначе компилятор ругается
Мне вот чего непонятно -
допустим, есть unit a
unit b interface uses a
unit c interface uses b
Но то, что у а в интерфейсе, в unit c не видно! вот это почему так сделано - непонятно.
← →
Darlock (2002-10-09 18:24) [4]2Best Before & 2andrey_pst
Ответы супер... т.е. когда я пишу в interface uses unit1. - это я его описываю, а когда в implementation - это я его реализовую... Ничего странного не находите? :)
2Still Про цекличность я знал, но считал что это не правельный стиль программирования...
← →
still (2002-10-09 18:27) [5]вообще говоря, конечно неправильный
← →
Best Before 2024 (2002-10-09 18:28) [6]в interface uses те модули, которые нужны для объявления переменных в этой секции в implementation - те, которые нужны для реализации, но их нет в interface
← →
Darlock (2002-10-09 18:33) [7]2Best Before 2024
interface = intf
implementation = impl
На самом деле если я uses модуль в intf - то я могу пользовать его состав как в intf своего модуля так и в impl. Но если я его uses в impl, то могу пользовать только в impl своего модуля. Зачем тогда (кроме реализации цикличности) мне что-то uses в impl, если я могу жто uses только intf?
Я надеюсь не сильно замутил... :)
← →
Best Before 2024 (2002-10-09 18:34) [8]From Help:
Object Pascal Language Guide
Multiple and indirect unit references
...To compile a client module, the compiler needs to locate all units that the client depends on, directly or indirectly. Unless the source code for these units has changed, however, the compiler needs only their .dcu (Windows) or .dcu/.dpu (Linux) files, not their source (.pas) files.
When changes are made in the interface section of a unit, other units that depend on it must be recompiled. But when changes are made only in the implementation or other sections of a unit, dependent units don’t have to be recompiled. The compiler tracks these dependencies automatically and recompiles units only when necessary.
← →
still (2002-10-09 18:37) [9]
> Best Before 2024 (09.10.02 18:34)
ну ок, с этим ясно. а вот с моим вопросом тоже может просветишь?
> допустим, есть unit a
> unit b interface uses a
> unit c interface uses b
>
> Но то, что у а в интерфейсе, в unit c не видно!
← →
Best Before 2024 (2002-10-09 18:41) [10]Что мне, весь Help прислать
From Help:
Object Pascal Language Guide
Multiple and indirect unit references
The order in which units appear in the uses clause determines the order of their initialization (see The initialization section
)and affects the way identifiers are located by the compiler. If two units declare a variable, constant, type, procedure, or function with the same name, the compiler uses the one from the unit listed last in the uses clause. (To access the identifier from the other unit, you would have to add a qualifier: UnitName.Identifier.)
A uses clause need include only units used directly by the program or unit in which the clause appears. That is, if unit A references constants, types, variables, procedures, or functions that are declared in unit B, then A must use B explicitly. If B in turn references identifiers from unit C, then A is indirectly dependent on C; in this case, C needn’t be included in a uses clause in A, but the compiler must still be able to find both B and C in order to process A.
The example below illustrates indirect dependency.
program Prog;
uses Unit2;
const a = b;
...
unit Unit2;
interface
uses Unit1;
const b = c;
...
unit Unit1;
interface
const c = 1;
...
In this example, Prog depends directly on Unit2, which depends directly on Unit1. Hence Prog is indirectly dependent on Unit1. Because Unit1 does not appear in Prog’s uses clause, identifiers declared in Unit1 are not available to Prog.
← →
Darlock (2002-10-09 18:46) [11]"From Help:
Object Pascal Language Guide
Multiple and indirect unit references
...To compile a client module, the compiler needs to locate all units that the client depends on, directly or indirectly. Unless the source code for these units has changed, however, the compiler needs only their .dcu (Windows) or .dcu/.dpu (Linux) files, not their source (.pas) files.
When changes are made in the interface section of a unit, other units that depend on it must be recompiled. But when changes are made only in the implementation or other sections of a unit, dependent units don’t have to be recompiled. The compiler tracks these dependencies automatically and recompiles units only when necessary."
Помоему это немного не то про что я спрашивал. Я спрашивал про секции USES, а не про различие между interface и implimentation.
← →
still (2002-10-09 18:48) [12]да это понятно все, что
> Because Unit1 does not appear in Prog’s uses clause, identifiers
> declared in Unit1 are not available to Prog
вопрос, почему так сделано-то криво?
← →
Best Before 2024 (2002-10-09 18:52) [13]А что бы было в обратном случае?! Доступно все!!! По всему дереву
этих uses!
Мне кажется, правильно - сто нужно - то и юзаешь
← →
Darlock (2002-10-09 18:55) [14]Best Before 2024
Судя по твоему здоровому ответу, который меня не на копейку не приблизил к ответу, я непонятно спросил...
Меня интересовал вопрос:
"Зачем (кроме возможности реализации цикличности) нужен USES в секции implementation? Ведь вместо того что бы USES модуль в implementation я могу USES модуль в interface и ничего ИМХО не изменится"
← →
Darlock (2002-10-10 11:49) [15]Неуж-то никто не скажет?
Обидно..
:)
← →
KSergey (2002-10-10 13:25) [16]Darlock (09.10.02 18:55)
По-моему, ни для чего дрегого это и не надобно. Но возможно я не улавливаю какие-то тонкости.
> still © (09.10.02 18:48)
uses - совсем не #include в Си.
Если все обойти по дереву - тогда одни и теже модули будут подключаться по кругу много раз... Этак и зацикловка случиться может ;)
← →
still (2002-10-10 13:34) [17]
> KSergey © (10.10.02 13:25)
да вот и плохо, что не #include
to Darlock
я так понял из
> Best Before 2024 (09.10.02 18:34)
это чтобы юниты лишний раз не перекомпилировать
← →
Darlock (2002-10-10 14:12) [18]Дык вот и я подумал, может чего не улавливаю...
:)
← →
Digitman (2002-10-10 14:27) [19]>Darlock
Паскаль-компилятор в отличие от некоторых иных компиляторов (например, C) построен по однопроходной схеме. При такой схеме разрешение циклических модульных ссылок становится невозможным, если ссылки находятся в одних и тех же разделах взаимоссылающихся модулей, и связано это с порядком обработки компилятором разделов модуля : сначала идентификатор д.б. определен в разделе interface, и только после этого на него можно сослаться из другого, зависимого модуля. Иными словами - сначала компилятор обрабатывает интерфейсные разделы (и в первую очередь - секцию USES) всех модулей проекта (фиксируя определенные там идентификаторы и их типы, на которые далее возможны потенциальные ссылки), и уж затем - разделы реализаций модулей.
Встретив в разделе implementation секцию uses, компилятор ищет среди уже обработанных интерфейсных разделов нужный модуль и, в случае необнаружения, пытается произвести обработку. Когда та же самая ситуация возникает при обработке uses в interface, может возникнуть бесконечный цикл. Компилятор отслеживает такие ситуации и выдает отказ с соответствующей диагностикой.
← →
still (2002-10-10 14:35) [20]
> Digitman © (10.10.02 14:27)
мне лично больше нравится концепция с h-файлами в C
← →
Darlock (2002-10-10 14:45) [21]2still
Если я правильно понял Best Before 2024, то надпись касалась секций вообще, а не ЮЗЕС в этих секциях....
← →
still (2002-10-10 14:50) [22]2Darlock
ну и uses в частности
← →
Digitman (2002-10-10 15:10) [23]>still
А причем здесь нравится / не нравится ?
Речь идет об особенностях/ограничениях конкретного компилятора работающего "в один проход".
← →
Darlock (2002-10-10 15:13) [24]Т.е. единственное что я понял что это сделано ТОЛЬКО для удобств компилятора в первую очередь и для реализации цикличности во вторую.. Я прав!?
← →
Digitman (2002-10-10 15:59) [25]>Darlock
Не для удобств)
Такое ограничение (или особенность - как угодно) дает однопроходному pas-компилятору преимущество перед многими 2-хпроходными компиляторами (скажем, теми же C-компиляторами) в производительности (как минимум ! и это ощутимо !)
← →
Дремучий (2002-10-10 17:17) [26]я так понимаю, это еще и связано с без/условнымы переходами -
компилятор компилит блоки кода которые описаны в импл. ближе друг к дружке, т.е. вызываться они будут более быстрее, а те которые в интерф. (общее) дальше - ибо на всех всеравно не угодишь. Это чисто субъктивное мнение, аргументировать не буду.
:)
← →
still (2002-10-10 17:23) [27]
> Digitman © (10.10.02 15:59)
короче, "другое достоинство этого недостатка состоит в том, что ..." :)
← →
Digitman (2002-10-10 17:41) [28]>still
как это не смешно, но - это так)))
← →
Elbor (2002-10-11 03:22) [29]"- Это детерминизм, - сказал я. Название пришло экспромтом. - Совсем просто, хотя и для избранных. Прежде всего: форма вытекает из содержания. Поэтому ... Далее: наука неизменна, следовательно, все изменяемое - ненаучно. И, наконец, все вытекает из законов природы. Вы не можете знать заранее, каковы эти законы, но, будьте уверены, они есть. Так что никто не должен спрашивать: "Почему так, а не иначе?". Вместо этого каждый обязан изучать, как это действует."
Роберт Шекли. "Координаты чудес". :)))
← →
Darlock (2002-10-11 15:54) [30]Так вроде бы я и не ставил задачей узнать почему сделано так, а не иначе. Я хотел узнать зачем так сделанно чтобы понять
>"..как это действует."
и правильно этим пользоваться..
:))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c