Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Как грамотно читать чужой код?


Автор: valvliv 31.1.2006, 23:02
Я вот тут въезжаю в новый проект, и моя фортрановская малограмотность в сочетании с хаосом коллективного дают просто изюмительное сочетание, доводящее меня каждый вечер вот до этого: smile

Подскажите, плз, есть ли трики, как правильно въехать в проект? Если, скажем, у меня насыпано в фолдерах 200 метров кода, генерящего разные файлы, и мне надо какую-то переменную поменять, то какая правильная стратегия: грепить? Или типа все коды сперва распечатать?? smile Доки практически нету, переменные обзывали кто как хотел. Проект без гуи, голо-расчетный.

Автор: cardinal 31.1.2006, 23:51
Цитата(valvliv @ 31.1.2006, 21:02 Найти цитируемый пост)

Подскажите, плз, есть ли трики, как правильно въехать в проект?

1. Сделать умный вид.
2. Придти с этим умным видом к начальству и объяснить, что так дело дальше идти не может (см.
Цитата(valvliv @ 31.1.2006, 21:02 Найти цитируемый пост)

Доки практически нету, переменные обзывали кто как хотел.

)
3. Пользоваться поддержкой начальства и добиваться того, чтобы народ начал писать комментарии, доки и т.д. к коду.
4. Параллельно с этим всем разбираться потихонечку с именно теми кусками кода, которые тебе нужны (с остальные может не придется разбираться вообще).
5. Надо распечатать - печатай. Или у вас страницы считают?

Автор: valvliv 1.2.2006, 14:07
Ну, я примерно так и делаю, тока я думала, что есть приемчики половчее... smile

Автор: Cr@$h 1.2.2006, 16:41
Цитата(valvliv @ 1.2.2006, 00:02 Найти цитируемый пост)

Если, скажем, у меня насыпано в фолдерах 200 метров кода, генерящего разные файлы, и мне надо какую-то переменную поменять

Начальство в таких ситуациях не поможет. 200 метров -- это, по-моему, очень много, чтобы даже в голове уместить. Если бы это были исходники на C#, то можно использовать рефакторинг. Не знаю, возможно в Eclipse есть такая поддержка и для Fortran проектов. Просто я с ней никогда не работал, сижу в студии.
Летом переписывал для учебных целей код Форсайта "Машинный методы математических вычислений". Так там даже не на 77-ом все написано было, а на 66-ом ANSI. А в последнеи не было даже ветки else! От того куча меток. Я перепывывал все заново. Большинмтво циклов убралось через процедуры, сечения массивов и векторизацию. Кода стало на треть точно меньше. Этим летом собираюсь заняться Каханером.
Но тобе такого посоветовать не могу, т.к. переработать очень много безошибочно не получится, отсюда большой проект -- большая трата времени. Хотя, все зависит, под какие такие серьезные нужды он будет использоваться. Если с ним потом жить, то лучше потихоньку модернизировать.
Ну, а по делу кроме find/replace для переменных вряд ли что-то можно будет посоветовать. Поменяй что-то, скомпили (если он вообще компилируется), сравни результаты. Эх.. тяжелая эта работа у тебя.
smile
Тогда еще много меток почему-то использовали, несмотря на то, что без них можно было обойтись.
Теперь в Fortran даже в случаях, когда go to предпочтитеьнее чего бы то ни было другого, его можно заменить. Приведу пример, когда при некотором стечении обстоятельств приходится, скажем, выходить из треуровневого цикла.

Вариант кода без метки
Код

logical :: finish = .false.

do i = 1, N
    ...
    do j = 1, M
        ...
        do k = 1, P
            ...
            if( x == y ) then
                finish = .true.
                exit
            end if
            ...
        end do
        if( finish )&
            exit
    end do
    if( finish )&
        exit
end do
...

Что тут плохо? Приходится проверять в двух местах if( finish ). Это может оказаться очень накладно. К тому же это событие в этом примере происходит всего один раз -- потом выходим из циклов, а на него идут большие затраты. Но это не главное, главное, что на общем фоне других операторов нужно будет время, чтобы понять, что же происходит.
goto не любят именно из-за того, что превращает код в лапшу, т.е. деструктурирует ее. Это ухудшает читаемость кода, его сопровождение и повторное использование. Но что, если эффект от goto обратный?! Тогда только фанат "не goto", который сам не понимает, за что его не любит, не будет использовать метки в нужных ситуациях.

Вот как преобразится наш код после применения goto:
Код

do i = 1, N
    ...
    do j = 1, M
        ...
        do k = 1, P
            ...
            if( x == y )&
                go to 666
            ...
        end do
    end do
end do
666 ...

Лапши нет, есть одно удобство и легко читаемость на ряду с эффективностью.

Ну, а как я говорил, теперь в Fortran можно обойтись без меток даже в таких ситуациях:
Код

MainLoop: do i = 1, N
    ...
    do j = 1, M
        ...
        do k = 1, P
            ...
            if( x == y )&
                exit MainLoop
            ...
        end do
    end do
end do MainLoop
...

Самому старшему циклу мы дали имя и теперь смогли выйти из него по-человечески. MainLoop: -- не метка, а имя конструкта. Это равносильно использованию return где-то внутри функции С++. Ко стал еще более легче читаемым, в основном благодаря exit MainLoop -- значем, что делаем -- выходим, и откуда -- из цикла MainLoop.

Автор: valvliv 1.2.2006, 17:00
Чо сказать... Тока типа - знаю, что ничего не знаю... smile

Автор: Void 1.2.2006, 17:19
Цитата(valvliv @ 1.2.2006, 01:02 Найти цитируемый пост)
200 метров кода

И ты одна на поддержке всей этой системы? Которой наверняка не один десяток человеко-лет? Ужас какой...

Автор: valvliv 1.2.2006, 17:55
Тут есть типа сисадмин, который это дело грыз год, но он типа сильно занятой и крутой, чтобы ламерам помогать smile

Вот и рублюся smile

Автор: Cr@$h 1.2.2006, 19:19
Цитата(valvliv @ 1.2.2006, 18:00 Найти цитируемый пост)

Тока типа - знаю, что ничего не знаю...

Уже то, что ты за это взялась, можно назвать подвигом.
Сисадмин просто сам не хочет или не может. smile

Автор: DemoCode 1.2.2006, 19:31
Попробуй найди программу STI Understand for Fortran - инструмент для разбора кода fortran, может чем-то он сможет облегчить твою задачу.

Автор: valvliv 1.2.2006, 20:25
Спасибо, попробую.

Л.

Автор: valvliv 2.2.2006, 16:07
Посмотрела демку этого андестендера. Похоже, в моем случае он мало поможет: я роюсь в коде с вин-машины на юникс-сервере, таскать все туда-сюда, чтобы тут посмотреть, потом там компилить, и т.д. - неудобно. Линукс версию ставить с правами узера и без нормальных х-виндов - это совсем загонно.

Бум грепить по старинке...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)