Нет, просвяти!Цитата:
Сообщение от icebear
Вид для печати
Нет, просвяти!Цитата:
Сообщение от icebear
Думаю ясно видно что цитата моя, значит я и ответил, причем тут йокоона? =)Цитата:
Сообщение от icebear
Ну я не обидчивый! Даже могу признать свои промахи и минусы - стараюсь развиваться во всех отношениях 8)
Асм/неасм - что под руку попалось, то и получили :) Лишь показал механизм открытия/закрытия либлы.Цитата:
Сообщение от elf/2
Я не пц кодер, что значит не является адресом загрузки?Цитата:
в винде тоже можно:
1. в рантайме загрузить библиотеку по имени и получить в какой-то регистровой паре ее handle (он не является адресом загрузки, ну и что?)
У шайтан! Такого видимо нигде нет, если акцентировал внимание на ИНВАЛИДЕ_ДЕРЖАК_ЗНАЧЕНИЕ. АОС вернет сразу номер ошибки.Цитата:
2. если вернули INVALID_HANDLE_VALUE то есть какие-то проблемы, какие именно можно узнать дернув еще одну системную функцию
Также практически, согласен.Цитата:
3. дальше получаем указатель на функцию передав ее имя или порядковый номер (после этого они нам не нужны)
Ага, тоже самое.Цитата:
4. зовем ее по этому указателю напрямую
На пц есть плюс - если не выгрузил лохопрограммер, то вында ввыгрузит ее сама, я прав?Цитата:
5. когда библиотека больше не нужна, выгружаем ее
Не могу представить, тк на амиге все релоцируемо, зачем статика?Цитата:
6. если библиотека собрана без base relocation то грузиться она будет по фиксированным адресам и накладных расходов при загрузке не будет...
Не совсем понял, что ты имеешь тут ввиду.Цитата:
подозреваю что read-only сегменты (код) могут шариться между процессами, хотя утверждать этого не буду
не об этом речь.Цитата:
возможно при компиляции кода получиться больше чем в предложенном примере, но если есть желание то можно и на асме написать...
Анализируя все вышесказанное - утверждаю - пц круче! :v2_finge: Но амми ближе и разумней. =)
допустим что ты прав и Windows/Linux реализация динамических библиотек жрет больше ресурсов и работает медленне (хотя как правильно заметил icebear это никто не замерял).Цитата:
Сообщение от acidrain
могу предположить что это результат того что:
1. реализация на Амми менее гибкая
2. на Амми все написано на асме и оптимизировалось ручками
как я понимаю пока никто ничего не мутит. ты сказал что на амми есть уникальная реализация разделяемых библиотек, которой нигде больше нет. более того она идеально подходить для переноса на спекки. народ здесь присутсвующий это серьезно заинтересовало, захотелось (по крайней мере мне) узнать об этом побольше... все ссылки которые здесь пролетали достаточного света не пролилиЦитата:
Сообщение от acidrain
и тут не обижаться надо и PC ругать, а объяснить в конструктивном русле что есть что на амми/PC/MacOS/etc.
Я фигею, дорогая редакция... 4 страницы (в общей сложности) наездов... Куда катится мир...
ЗЫ. Судя по вмешательству в дискуссию свежих людей, делаю вывод, что умопомешательства у меня нет. А то вчера уж грешным делом подумал, что мои ответы в теме были лишь в моем сознании, поскольку они не брались в расчет совершенно.
handle - это некий уникальный идентификатор библиотеки (32 битное число)Цитата:
Сообщение от acidrain
это экономит одну-две комманды и наверное больше ничего. если вариантов ошибок много, то все равно придется делать отдельную функцию для их обработки/показа пользователюЦитата:
Сообщение от acidrain
да, когда процесс завершиться и если никто ее больше не используетЦитата:
Сообщение от acidrain
если несколько процессов загрузили одну и туже библиотеку, то неизменяемые сегменты (например сегмент кода) будет присутсвовать в памяти один раз. хотя на 100% не уверенЦитата:
Сообщение от acidrain
ну зачем ты так? я подозреваю что у любой платформы есть чему поучитьсяЦитата:
Сообщение от acidrain
А всё очень просто: lib - это статическая библиотека, она так же релоцируемая, но вот она "впечатывается" в конечной код программы при линковке (с правкой всех вызовов ессно). От этого растёт размер программы. Ну а dll - ты сам знаешь. Причём dll в винде загружается один раз, по первому требованию. Есть возможность загрузить dll напрямую самому (как показал elf/2), либо (как бы это сказать по-русски правильнее, прошу прощение, но русская терминология в этом случае мне почти незнакома) скомпилировать вызов какой-либо функции из нужной библиотеки, так что при исполнении этого вызова винда сама подгрузит библиотеку. Последний метод - это все окна на винде, ибо user32 и gdi32 с запуска системы висят в памяти. На Амиге это вряд ли сделано по-другому.Цитата:
Сообщение от acidrain
Ладно, отвлеклись. Не хотел ни кого обидеть.
В моем варианте - программа запрашивает нужную либлу, основная ее ищет на винте(диске и чем угодно), грузит, возращает точку входа. далее главенствует прога - пользует либлу (несколько, если надо).
В варианте Витамина как это все будет выглядеть?
не ответил на вопрос. имхо =)Цитата:
Сообщение от elf/2
1 - нетЦитата:
Сообщение от elf/2
2 - нет, Си и только Си
я так не говорил! не приписывайте!Цитата:
Сообщение от elf/2
Си знаешь? Читай реализацию (пример либлы). Есть вопросы - многие с удовольствием подскажут.Цитата:
Сообщение от elf/2
Шаоса так и не заметили? Он вам предложил реальное дело! Вы наплевали, давай на меня давить! Вы че, ребзя?! Давайте делать а не писдоболить!
Вообще на амиге одна либла на всех она не дублируется в памяти.Цитата:
Сообщение от elf/2
тоже могу сказать и в твой адрес! =)Цитата:
Сообщение от Vitamin
Либ отсутствует. Если только в Си или в т.сказать HLL...Цитата:
Сообщение от icebear
Нифиганепонял. Причём здесь язык программирования как таковой? Это возможности самой ОС, если она не поддерживает работу с динамическими библиотеками, то хоть на бейсике пиши. А так, всё что ты написал про библиотеки на Амиге подходит и под винду. Основная идея dll не таскать один и тот же код по памяти двести раз и в случае смены кода не рекомпилировать каждую программу, использующую данную библиотеку.Цитата:
Сообщение от acidrain
Это был бы т.н. singleton pattern. А что же вы делаете с данными в этом случае? Тоже одни на всех вызывающих? Как же потоки работают?Цитата:
Сообщение от acidrain
Зачем таскать по памяти? Нипонял я! Зачем один и тот же код в разных прогав хранить на винте и в памяти, если можно только один раз на винте!Цитата:
Сообщение от icebear
ХЛЛ тут при том, что куски своих либл (функций) линкует с прогой, даже если они (либы) там вапще не нуны. При чем тут ось?
Данные разные для каждого потока, по другому не могу представить, управляется сигналами/семафорами. Как говорит один мой друг - в винде почти тоже самое, но топорнее =)
Дак о чём тебе и твердят. На амиге так же сделано, как и на винде (ну или наоборот, на винде как на амиге).Цитата:
Сообщение от acidrain
Я не знаю что такое ХЛЛ, но нового ты ничего не сказал.Цитата:
Сообщение от acidrain
При том, что в винде задача загрузки/выгрузки библиотек возложена на неё и она смотрит и следит за тем, кто юзает библиотеку, кто её реально использует, а кто уже отвалился.Цитата:
Сообщение от acidrain
Ну тогда чем тебя возмутило сообщение от elf/2? Он тебе тоже сказал, другими словами.Цитата:
Сообщение от acidrain
А до этого ты утверждал, что:Цитата:
Сообщение от icebear
"Причём здесь язык программирования как таковой? Это возможности самой ОС, ..."
Т.е. она следит за длл или либ? Запутал ты меня.
ехес тоже следит.
Хорошо, то что предложил автор - это либ или длл? либ на какой стадии линкуется с прогойй - когда ее только компилируешь или когда ее запускает конечный юзер?
Дык заинтересованых нет? Может заинтересуетесь?Цитата:
Сообщение от Shaos
Ой ли - так прям и полная? Вы же сами говорите - либы совершенствуются и, следовательно, увеличиваются в размерах - и становится невозможно угадать кол-во свободной памяти!Цитата:
Сообщение от Vitamin
Одно дело пц, с 4 гигами виртуалки и 32битной адресацией, а другое дело - спектрум...
То есть, вы намеренно решили затормозить загрузку программы для end-юзера? Чтобы он слушал спазмы дисковода, шныряющего по всему диску, ради сомнительного удобства программиста?...Цитата:
ЗЫ. Изначально моя мысль стремилась к следующему- доработать мою модульную структуру до вида, применимого в некоторых моих программах.
ну блин мы и понаписали :) а толку пока действительно мало :(
возможны варианты:Цитата:
Сообщение от acidrain
1. библиотека линкуется с программой статически т.е. на этапе компиляции/линковки
2. система поднимает библиотеку при старте программы
3. библиотека подгружается по запросу из программы (это как раз те примеры что я приводил)
кстати, когда я говорил что Windows/Linux реализация более гибкая я имел в виду как-раз эти три варианта. зачем все это:
1. программа не зависит от того какие библиотеки есть на машине пользователя
2. размер программы - маленький. никаких дополнительных телодвижений (руками загружать/истать адрес функции) не надо
3. для реализации "плагинов" в этом случае программа может работать с библиотеками которых не было во время ее создания через некое API
еще раз про handle возвращаемый из LoadLibrary - это просто число никак не связанное с адресом загрузки
а теперь IMHO: динамические библиотеки нужны в основном для системных программ, на спекки ими пользоваться будет не сильно удобно поскольку мы завязаны на floppy-ки.
Из чего это следует? Может ноаборот... уменьшаются?Цитата:
Сообщение от yoko_ono
А что гадать то? Не надо гадать. В самом примитивном случае, строится табличка распределения памяти между библиотеками...Цитата:
Сообщение от yoko_ono
возможно я не правильно понял исходный пост Витамина, но он в последней строчке написал:Цитата:
Сообщение от yoko_ono
т.е конечный пользователь всей этой кухни не увидит, возможно кроме некоторых тормозов при старте для настройки библиотек на конкретные адресаЦитата:
Сообщение от Vitamin
Можно я встряну? Ну совсем чуть-чуть...
Лично мне для тех программ - типа системных (конверторы и различные пакеры) - пригодились бы всего-навсего пара плагинов - работа с диском (сэйв/лоад/выбор файла из каталога/ввод имени для сэйва) и некое подобие ГУИ (то есть надпись чтоб вывести если надо ну могет и выбрать чтонить на экране). в принципе это я уже сам для себя написал - правда в непотребном виде, удовлетворяющем меня одного. Реализовано именно как инклуд на этапе компиляции (то есть либа - так? =) )
Если бы были реально написаны модули с подобными возможностями, которые можно было бы просто использовать - не сомневаюсь, что я стал бы их использовать...
Насчет времени загрузки и прочего - если не лазить в каталог для определениякоординат файла на диске, то загрузка 2-3 файлов будет практически незаметна даже на реале... А при отсутствии операционки что-то я сомневаюсь в появлении программ, использующих десятки (сотни!!! =) ) подобных модулей... Лично я могу придумать еще парочку реально нужных и все...
Извините, что я тут в грязных в сапогах и в душу, ладно?
Просто либы пишутся в реентерабельном стиле. Все локальные данные - на стеке, если надо - для каждого приложения заводится объект, адрес которого передаётся функциям.Цитата:
Сообщение от icebear
Данные естественно одни, ибо нет системы виртуальной памяти. Потоков тоже нет (в АОС) - только отдельные task'и.
Здесь согласен, проблема. Надо искать пути выхода.Цитата:
Сообщение от yoko_ono
(тем не менее, при динамической линковке и "либах в банках" ее угадать не менее невозможно)
Есть такая штука- кеширование.... Обычно изрядно облегчает жизнь и ускоряет работу.Цитата:
Сообщение от yoko_ono
Мдаблин... Прям военные действия... Хотя должен признать, единственный мой конструктивный диалог это с yoko_ono (хотя и не без предвзятости). Все остальное место ветки acidrain доказывает, что одно и то же понятие на амиге и винде называется по разному и всячески игнорирует ответы на свои же вопросы (это я о просьбе показать пример подключения библиотеки и вызова функции).
2Shaos: информацию по libman я прочитал сразу, как только acidrain выложил ссылку. И задал несколько вопросов, получив ответы только на половину. Так что согласен, что интереса- 0...
2acidrain: давай начнем с терминологии (надо было с этого и начинать...). итак, имеем 3 вида управления кодом программы
1) Статическая линковка. Объектные файлы, созданные заранее, подключаются к бинарнику на этапе компиляции и присутствуют в исполнимом файле. Во время работы не требуется никаких дополнительных движений со стороны программы чтобы подключить эти объектные файлы, просто прямые вызовы на функции. В простейшем случае, объектные файлы, скомпилированные из разных исходных текстов собираются в итоговый бинарник. При подключении одной и той же библиотеки в две разные программы данные физически дублируются. Примеры- a,obj,lib файлы (первое что на ум пришло)
2) Динамическая линковка. Объектные файлы подключаются во время работы программы путем открытия библиотеки (неважно, кто это делает, ОС или само приложение). Дальнейший вызов функций осуществляется на основе имеющегося описателя подключенной библиотеки. При подключении одной и той же библиотеки в две разные программы (для многозадачных ОС), код не дублируется. Примеры- so,dll.
3) Прочее. В частности, отсутствие линковки на уровне бинарных файлов, только на уровне исходных текстов на этапе компиляции. Использование только внутренних функций или функций ОС (в общем случае, если таковая имеется).
Есть вопросы? исправления? дополнения?
После прохода автосборщика в итоге получаем обычный бейсик-файл, в котором уже все внутри и никаких дополнительных телодвижений на подгрузку не делается. Т.е. по сути превращаем динамически-статическую (у меня именно такой вариант, не вписывающийся в мою же классификацию :)) линковку в чисто статическую.Цитата:
Сообщение от elf/2
Ах вот оно что! Винда наоборот :) Не в эту тему вопрос - а событийная модель там есть?Цитата:
Сообщение от yoko_ono
Погоди, а разве амига не умеет читать с диска и чего-нибудь ещё делать параллельно? Как это можно сделать без потоков (в том смысле, что бы работало всегда и везде)?Цитата:
Сообщение от yoko_ono
И ещё оффтоп: на аватаре кошка из Ивана Васильевича?
По объектным файлам: разве это не те файлы, которые содержат исполняемый код, но не имеют "обёртки" (сиречь заголовка)? Потому как exe от dll по идее не сильно отличаестя, точнее отличается тем, что exe функций не экспортирует.Цитата:
Сообщение от Vitamin
Хмм я ж выложил. ты не читаешь, да?Цитата:
Сообщение от Vitamin
Кому вопросы задавал?
Я за 2й пункт. Наконец то конструктивный разговор прорисовывается.
Но никто не мешает Си написать для пункта 1. ;)
Конструктивно ты не хотел разговаривать - я выкладывал, искал, пытался услышать вопросы. Ничего не было. Есть вопросы - задавай. Могу скинуть на мыло 10мб исходников святая-святых exec.library (единственная либла написаная в асме, а не в си). Также около 30 мб rom kernel manuals - будет желание проштудировать и понять всю систему из нутри? =)
И такой ужас ДЛЯ КАЖДОЙ функции?..Цитата:
Сообщение от elf/2
На амиге сделано оптимальным образом - для вызова функции достаточно знать, в какой из jmp в таблице вызовов надо попасть (а не извлекать смещение для каждой функции отдельно), и вдобавок базовый адрес (где эта таблица вызовов, то есть). Как я думаю, проблема с пц в том, что целый регистр отдать под базовый при вызове через таблицу jmp - непозволительная роскошь для убогой х86 архитектуры.
Из простого факта - развитие есть добавление новых фич и возможностей. Ибо наоборот, намеренное массовое убирание фич и возможностей - какой-то дестрой просто. Оптимизации разные и убирание мелочей - глобального уменьшения размера не обеспечивают.Цитата:
Сообщение от ng_dead
Обычно все нормальные программисты на Спектруме подразумевают, что у них в запасе вполне определённый объём памяти, который можно выяснить на этапе компиляции программы, например. А если эти так называемые библиотеки будут иметь непредсказуемый размер?Цитата:
А что гадать то? Не надо гадать. В самом примитивном случае, строится табличка распределения памяти между библиотеками...
По идее да, например на линухе результат сборки (объектный файл или разделяемая библиотека) зависит от ключей компилятора (если не собирается программа с main(int argc, char const * argv[])) В винде же надо еще прописывать дополнительные спецификаторы в заголовках, в зависимости от того импортируется или экспортируется функция.Цитата:
Сообщение от icebear
В смысле за динамическую компоновку? При условии отсутствия ОС применимо только в плагинной системе...Цитата:
Сообщение от acidrain
Ну на первые же две ссылки с сайта nedopc я задавал вопросы- не на все из них получил ответы. По поводу остальных ссылок- рекомендации по программированию на амиге. Без знания ее ассемблера туда лезть малополезно, в содержании того цикла статей ничего интересного для себя не нашел.Цитата:
Сообщение от acidrain
Нафиг (почему- см. выше). В такой ситуации ближе С. А еще полезнее- внятная дока по формату (вроде есть где-то у меня). Потому как по сырому примеру мало что поймешьЦитата:
Сообщение от acidrain
Смотрим внимательнее на тот исходник. Вызов функции (многократный) там занимает одну строчку. Все остальное- подготовка библиотеки и ее освобождение. Это однократно выполняемая последовательность.Цитата:
Сообщение от yoko_ono
Данный подход (принудительная загрузка библиотеки и получение адреса функции) применяется только при организации плагинной системы- получаем список плагинов, подключаем нужный когда надо, получаем из него адреса нужных функций, работаем с ними, освобождаем плагин. (При использовании ООП (современный подход) из плагина выковыривается одна-единственная функция- фабрика классов, которая производит экземпляры плагинно-зависимых классов, вызов функций которых происходит с помощью механизма полиморфизма).
Если имена модулей известны на этапе компиляции, то можно заставить компилятор генерировать специальный код, подключающий библиотеку при старте программы. При этом работа с ее функциями ведется совершенно прозрачно для программиста.
Чего ты сразу с терминологии не начал? без моей помощи не мог разобраться что как называется? темболее ниже пишешь, что твое творение ни под один пункт не подходит, тогда что ты придумал?Цитата:
Сообщение от Vitamin
Ты опубликовал свою идею для получения одобрения или посоветоваться - вот мой совет: не пытайтесь усложнить ищите более простые пути решения. ИМХО АОС для этих целей (подражание) подходит куда лучше, чем винда или линух.
Есть вообще готовое - Шаос либман. Бери, юзай! Развивай! Не изобретай велик!
я и так много нафлеймил, но тут простите - цитату в студию! что ты спрашивал? про второй вид либл - читай недопц форум, или его мне тоже наддо переписать?Цитата:
Сообщение от acidrain
А по первой - читай сайт шаоса, я не буду за тебя думать! не проси =)))
аргументируй !Цитата:
При условии отсутствия ОС применимо только в плагинной системе...
А если несколько ф-ций из одной либлы вызвать, при чем один вызов в либле 1, другой в либле2, затем 4, затем 1 - как быть в таком случае?Цитата:
Смотрим внимательнее на тот исходник. Вызов функции (многократный) там занимает одну строчку. Все остальное- подготовка библиотеки и ее освобождение. Это однократно выполняемая последовательность.
До этого ты писал, что спасибо за инфу, она так полезна. Теперь ты пишешь, что я ничче и не писал вовсе? И народу то сколько налетело амижного? Я и неизвестно откуда прошаренная йака_ини. А теперь посчитай скоко народу пцшного напало на меня?Цитата:
А тут налетел народ и давай расхваливать амигу (притом чисто на словах, безо всякой полезной для меня информации)
По поводу таблиц релокации. Мне интересно знать их устройство. Есть доки? В исходниках ковыряться ресурсоемко :)Цитата:
Сообщение от acidrain
Пожалуйста. Для загрузки библиотеки по требованию необходим некий менеджер этих библиотек, а также менеджер памяти для распределения ресурса. Поскольку у нас нет ОС, то ясно, что эти менеджеры программа вынуждена таскать с собой. Все библиотеки подключаются один раз и ни разу не отключаются (в таком случае менеджер получается "одноразовый") Если это не так, то получаем плагинную систему (то, о чем я и говорил).Цитата:
Сообщение от acidrain
По сути, я предлагаю именно такую систему, но с некоторыми принципиальными отличиями:
-приложение ничего само не подключает, все делает загрузчик
-расположение библиотек не фиксированно, а выбирается сообразно обстоятельствам (в простейшем случае, одна за одной в памяти)
-керналя нет, при линковке подставляются непосредственные адреса вызова.
Если имена либ неизвестны на этапе компиляции, то открываем необходимое число библиотек, достаем из них указатели на функции и вызываем по этим указателям нужное число раз. Если имена известны, то этими всеми операциями (открытие-получение адреса-закрытие) обычно заведует ОСЦитата:
Сообщение от acidrain
Итак, попробуем сформулировать основные принципы амижной реализации:
1. Импорт по номеру (ординалу) функции.
2. Использование dynamic binding вместо dynamic linking.
Недостаток первого пункта - отсутствие возможности контроля целостности во время загрузки.
Второй пункт означает что библиотеку можно рассматривать как ООП класс (и объект singleton) и функции вызываются как "виртуальные функции". Недостаток - перерасход ресурсов во время выполнения. Даже на Мотороле, где косвеный вызов по таблице адресов делается одной командой, необходим регистр (весьма ценный ресурс). А если надо будет вперемешку вызывать функции из разных библиотек? На Z80 понадобится гораздо больше машинных команд только для того, чтобы передать управление в библиотеку, и, в зависимости от реализации, некоторые регистры могут оказаться недоступными для передачи аргументов. При таком раскладе, считаю, рассказы о "каматозе динамической компоновки" мoжно отбросить.
В этом аспекте считаю подход Амиги (и Линукса) более правильным.Цитата:
Сообщение от icebear
Так называемые "thread-safe libraries".
Именно потому, что завязаны на floppy, динамическая компоновка может помочь.Цитата:
Сообщение от elf/2
Чем больше времени мы сможем хранить библиотеки в памяти и прикомпоновывать их к разным программам, тем больше ресурсов floppy может быть сэкономлено.
Cовершенно примитивное. Каждый 'exe' - после загрузки в память представляет из себя некоторое кол-во секций, с кодами, с данными и т.д. Если в секции есть абсолютные адреса со ссылками на к.-л. секцию - то в самом файле ставится относительное смещение от начала этой секции, а в таблице релокации для данной секции - смещение до адреса, который надо подкорректировать и номер секции, в которую он должен указывать. Плюс вариации с 16-32 битными смещениями. Вот и всё.Цитата:
Сообщение от Vitamin