![]() |
|
Модераторы: ginnie, korob2001 |
![]()
|
|
| djpan |
|
|||
|
Unregistered |
Господа, имеется такой вопрос.
Есть очень навороченная система на перле (не веб, просто работа с файлами и всем чем только можно), состоящая из сотен pl-файлов и тысяч pm-файлов. Использование модулей друг другом (use) идёт на несколько уровней (5-10). Произошёл случай. Внесли незначащее изменение в один pl-файл (просто добавили коммент). После этого всё перестало работать. Лезу разбираться и обнаруживаю что там на много уровней ниже в одном модуле просто есть тупая ошибка и реально даже непонятно как до этого всё работало. Модуль, в кот. ошибка, был изменён где-то пол-года назад, до этого там версия была рабочая. У меня складывается ощущение, что перл как-то где-то хранит промежуточно скомпиленные исходники и всегда работает с ними, т.е. последние пол-года вызывалось именно что-то скомпиленное и закешированное. Просто факт изменения файла .pl "перетряхнул" всё дерево модулей под ним, заставил ещё раз всё заново пересобраться и только сейчас оно вылезло. Почему такое перетряхивание не произошло тогда когда появилась ошибка в модуле - не знаю. Это просто моя версия, т.к. вообще ничего больше в голову не приходит. Факт в том, что до этого работало, а после добавления коммента в запускаемый файл .pl - перестало и именно из-за ошибки в модуле, кот. появилась ещё хрен знает когда, но её эфект проявился только сейчас. Т.е. как-будто бы последние пол-года работала ещё та, старая, версия модуля. Вот такие внешние проявления. Кто-нибудь может объяснить? Где вообще можно почитать в инете про механизмы промежуточной компиляции и что там происходит на низком уровне в перле? |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Вообще-то Perl транслирует программу каждый раз, когда она запускается. Может эта проблема была и раньше, просто её никто не замечал, так как система состояла из сотен .pl файлов и тысяч .pm . О том как работает Perl, очень подробно написано в книге "Программирование на Perl" 3 издание Л.Уолл, Т.Кристиансен.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| djpan |
|
|||
|
Unregistered |
Проблема сейчас в том, что из того модуля удалена одна функция, кот. выше в иерархии вызывалась.
Такое не заметить нельзя было. Вот сейчас оно просто вываливаться стало, оно и понятно. Как же ж оно работало нормально раньше при отсутствующей функции-то? Классно работало, та функция типа вызывалась, всё отрабатывало Где-то оно всё-таки закешировало это дело. Как перл себя ведёт в случаях use и require (кроме момента реального подъёма модуля) ? Под рукой этой книги нет сейчас. В инете кто-нибудь знает где какое-нибудь описание есть по данному вопросу? |
|||
|
||||
| dimes |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 249 Регистрация: 20.7.2004 Где: то около СПБ Репутация: нет Всего: 14 |
mod_perl? fast_cgi?
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Используется обычный ActiveState Perl 5.8.3
|
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Какой интерфейс у проекта? Может проблема в браузере?
У меня сегодня экзамен заканчивается в 22:00, после я обязательно зайду домой за этой книгой. Попробую поискать, ответ на эту траблу. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| djpan |
|
|||
|
Unregistered |
Интерфейс - да просто вызов из командной строки pl-файла (вернее из батника вызов идёт, если совсем уж точно).
Тут нет веба. По-крайней мере в глючащей части. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Вот что пишет Лари Уолл, Том Кристиансен и Джон Орвант в книге "Программирование на Perl":
Как работает Perl Когда на вход компилятора Perl поступает программа Perl, то в первую очередь он пристапает к лексическому анализу: разбивает программу на основные синтаксичекие элементы, часто называемые лексемами. Если взять программу:
то лексический анализатор выделит в ней три лексемы: print, "Hello, world!\n" и завершающий символ точки с запятой. После этого проводится синтаксический разбор последовательности лексем, устанавливающий взаимосвязь между лексемами. В Perl граница между лексическим и синтаксическим анализом более расплывчата, чем в других языках. ( Имеется ввиду в других копьютерных языках. Вы поймёте, с чем это связано, если представите себе, какой различный смысл может иметь new Critter в зависимости от того, существует ли пакет Critter или подпрограмма с именем new. С другой стороны, мы постоянно разрешаем такого рода неопределённости, разговаривая на естественных языках.) После проведения синтаксического анализа программы и, предположительно, её осмысленная программа компилируется в дерево кодов операций, представляющих операции назкого уровня, и, наконец, выполняется это дерево операций - если только Perl не был вызван с ключём -c("Проверка синтаксиса"), вызывающим выход по завершении компиляции. Именно на этапе компиляции, а не исполнения, выполняются блоки BEGIN, CHECK и команды use. Ничего о кешировании кода нигде не сказано. Но я ещё пороюсь в учебниках. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Абсолютно однозначно ничего нигде не кешируется. В этом суть интерпретируемых языков. Не зря-же народ мучается и придумывает разные там mod_perl чтобы как-раз получить это самое кеширование. Хотя у меня бывали такие аномалии когда казалось что где-то что-то закешировалось, потом это обьяснялось просто какой-нибудь алгоритмической ошибкой...
Если только ребята из ActiveState чего-то такого не намудрили, говорить не берусь ибо с виндами дела не имел. Это сообщение отредактировал(а) Ramirez - 18.1.2005, 11:46 |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Спасибо за ответы.
Но я пока остаюсь на той же точке в размышлениях, т.к. логического объяснения произошедшему пока не вижу. Конечно, разговоры про идеологию интерпретируемых языков - это всё понятно, я и сам считаю что так всё и должно работать. Но произошла ж такая аномалия. Ещё видел однажды как глючил один cgi-script на перле. По коду видно, что всё в порядке, поломал какое-то время голову. Полез, вставил пробел в пустую строку, refresh - всё работает. Немая сцена. Т.е. 2 раза в жизни я точно наблюдал очень странное поведение перла. |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: нет Всего: 83 |
Всему есть объяснения!!! |
|||
|
||||
| Ramirez |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 18.1.2005 Где: Moscow, ExUSSR Репутация: нет Всего: 5 |
Возможно я повторюсь, но такое вполне возможно если на сервере какой-нибудь mod_perl стоит... |
|||
|
||||
![]()
|
| Правила форума "Perl: Системное программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |