* [sisyphus] Сборка FORTRAN-программ
@ 2011-06-27 7:18 Sergei Epiphanov
2011-06-27 7:38 ` vx8400
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 7:18 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
В одной из программ нашёл интересный кусок, который перестал собираться. Решил
проверить такой программой:
test.for:
PROGRAM test
INTEGER(4) I
DO 1 I=400
1 WRITE(*,*)I
END PROGRAM
Программа командой 'gfortran -ffixed-form test.for -o test' компилируется и
запускается, но вывод непонятно какой: каждый раз выпадает случайное число (к
примеру -1081112844, -1074562380 и другие подобные). Глюк компилятора или как?
Система - Сизиф прошлопятничный. gcc4.5-fortran-4.5.1-alt8. Из gcc стоит
только версия 4.5.1-alt8 (пересечений с другими версиями нет).
При компиляции с опцией -ffree-form вместо -ffixed-form компилятор выдаёт ошибку
"Syntax error".
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:18 [sisyphus] Сборка FORTRAN-программ Sergei Epiphanov
@ 2011-06-27 7:38 ` vx8400
2011-06-27 7:53 ` vx8400
2011-06-27 9:11 ` Sergei Epiphanov
2011-06-27 8:49 ` vx8400
2011-06-27 9:49 ` Sergey Vlasov
2 siblings, 2 replies; 14+ messages in thread
From: vx8400 @ 2011-06-27 7:38 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
27 июня 2011 г. 9:18 Sergei Epiphanov:
> PROGRAM test
> INTEGER(4) I
> DO 1 I=400
DO 1 I=1,400 ?
'DO I=400' gfortran 4.4.5 съедает, цикл прокручивается 1 раз,
write(*,*) I печатает 0.
wbr,
Oleg.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:38 ` vx8400
@ 2011-06-27 7:53 ` vx8400
2011-06-27 8:19 ` Andrey Liakhovets
2011-06-27 9:14 ` Sergei Epiphanov
2011-06-27 9:11 ` Sergei Epiphanov
1 sibling, 2 replies; 14+ messages in thread
From: vx8400 @ 2011-06-27 7:53 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
upd:
27 июня 2011 г. 9:38 vx8400:
>
> 'DO I=400' gfortran 4.4.5 съедает, цикл прокручивается 1 раз,
Цикл не прокручивается. 'DO 1 I=400' побочных эффектов не имеет, метка
'1' перед write игнорируется.
Ее можно вообще убрать.
I инициализировано 0, поэтому печатается 0.
btw, DEC Fortran это тоже съедает без предупреждений, если перед 'DO 1
I=400' поставить, например, I=1
В каком стандарте есть такое 'DO'?
wbr,
Oleg.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:53 ` vx8400
@ 2011-06-27 8:19 ` Andrey Liakhovets
2011-06-27 9:14 ` Sergei Epiphanov
1 sibling, 0 replies; 14+ messages in thread
From: Andrey Liakhovets @ 2011-06-27 8:19 UTC (permalink / raw)
To: sisyphus
On Mon, 27 Jun 2011 09:53:32 +0200 vx8400 wrote:
>upd:
>
>27 июня 2011 г. 9:38 vx8400:
>>
>> 'DO I=400' gfortran 4.4.5 съедает, цикл прокручивается 1 раз,
>
>Цикл не прокручивается. 'DO 1 I=400' побочных эффектов не имеет, метка
>'1' перед write игнорируется.
>Ее можно вообще убрать.
>I инициализировано 0, поэтому печатается 0.
>
>btw, DEC Fortran это тоже съедает без предупреждений, если перед 'DO 1
>I=400' поставить, например, I=1
>
>В каком стандарте есть такое 'DO'?
По крайней мере, в Fortran 90 и в Fortran 2008 здесь должны быть
как минимум 2 выражения через запятую. Например, в 2008:
loop-control is [ , ] do-variable = scalar-int-expr , scalar-int-expr [ , scalar-int-expr ]
or [ , ] WHILE ( scalar-logical-expr )
or [ , ] CONCURRENT forall-header
Так что гораздо интереснее, почему такое иногда таки транслируется :)
Андрей Ляховец
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:18 [sisyphus] Сборка FORTRAN-программ Sergei Epiphanov
2011-06-27 7:38 ` vx8400
@ 2011-06-27 8:49 ` vx8400
2011-06-27 9:30 ` Sergei Epiphanov
2011-06-27 9:49 ` Sergey Vlasov
2 siblings, 1 reply; 14+ messages in thread
From: vx8400 @ 2011-06-27 8:49 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
27 июня 2011 г. 9:18 Sergei Epiphanov:
> В одной из программ нашёл интересный кусок, который перестал собираться. Решил
> проверить такой программой:
>
> test.for:
> PROGRAM test
> INTEGER(4) I
> DO 1 I=400
> 1 WRITE(*,*)I
> END PROGRAM
>
Оригинальный кусок можно сюда показать, если код разрешен к открытой публикации?
Без контекста непонятно, что имелось в виду.
thx, regards,
Oleg.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:38 ` vx8400
2011-06-27 7:53 ` vx8400
@ 2011-06-27 9:11 ` Sergei Epiphanov
2011-06-27 9:27 ` Andrey Liakhovets
1 sibling, 1 reply; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 9:11 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
В сообщении от 27 июня 2011 11:38:35 автор vx8400 написал:
> DO 1 I=1,400 ?
В том-то и дело, что I=400 и всё...
> 'DO I=400' gfortran 4.4.5 съедает, цикл прокручивается 1 раз,
> write(*,*) I печатает 0.
Есть ещё особенность:
Если этот цикл написать в виде
PROGRAM test
INTEGER(4) I
DO I=400
WRITE(*,*)I
END DO
END PROGRAM
То компилятор ругается на неожиданное появление строки END DO: "Expecting END
PROGRAM statement"
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:53 ` vx8400
2011-06-27 8:19 ` Andrey Liakhovets
@ 2011-06-27 9:14 ` Sergei Epiphanov
1 sibling, 0 replies; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 9:14 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
В сообщении от 27 июня 2011 11:53:32 автор vx8400 написал:
> btw, DEC Fortran это тоже съедает без предупреждений, если перед 'DO 1
> I=400' поставить, например, I=1
>
> В каком стандарте есть такое 'DO'?
Изначально этот код бы написал в 1990 году под собственный компилятор
фортрана, затем собирался на Microsoft FORTRAN Compilator, затем прошёл через
все сборки GNU Fortran версии 4.1, 4.2, 4.3, 4.4, 4.5. :-) При корректировке
кода сегодня обнаружил эту бяку.
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 9:11 ` Sergei Epiphanov
@ 2011-06-27 9:27 ` Andrey Liakhovets
2011-06-27 10:00 ` Sergei Epiphanov
0 siblings, 1 reply; 14+ messages in thread
From: Andrey Liakhovets @ 2011-06-27 9:27 UTC (permalink / raw)
To: sisyphus
On Mon, 27 Jun 2011 13:11:52 +0400 Sergei Epiphanov wrote:
>В сообщении от 27 июня 2011 11:38:35 автор vx8400 написал:
>> DO 1 I=1,400 ?
>
>В том-то и дело, что I=400 и всё...
>
>> 'DO I=400' gfortran 4.4.5 съедает, цикл прокручивается 1 раз,
>> write(*,*) I печатает 0.
>
>Есть ещё особенность:
>
>Если этот цикл написать в виде
> PROGRAM test
> INTEGER(4) I
> DO I=400
> WRITE(*,*)I
> END DO
> END PROGRAM
>
>То компилятор ругается на неожиданное появление строки END DO: "Expecting END
>PROGRAM statement"
Предположительно, компилятор молча игнорирует некорректный "DO I=400",
после чего "END DO" он действительно не ожидает :)
Андрей Ляховец
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 8:49 ` vx8400
@ 2011-06-27 9:30 ` Sergei Epiphanov
2011-06-27 10:05 ` Andrey Liakhovets
0 siblings, 1 reply; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 9:30 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
В сообщении от 27 июня 2011 12:49:44 автор vx8400 написал:
> Оригинальный кусок можно сюда показать, если код разрешен к открытой
> публикации? Без контекста непонятно, что имелось в виду.
Оригинальный код разбросан по полусотне фортрановских файлов в полностью
неудобоваримой форме из смеси Fortran 77, Fortran90 и Fortran 2003. Смесь
дикая ещё и потому, что использованы множественные COMMON, EQUIVALENCE (причём
переменных разных типов данных) и IMPLICIT из-за больших ограничений
тогдашнего Фортрана. Я уже 4 года разгребаю эти авгиевы конюшни, но до конца
пока так и не смог разобрать.
Вот кусок (за вычетом ненужного):
SUBROUTINE TRAN2F(...)
...
character nqs(10000)
integer(4) nq(10000)
character lsp
equivalence(nq(1),nqs(1))
...
DATA lsp/' '/
...
do 1 i=400
1 nqs(i)=lsp
...
Большее открыть не могу, придётся весь код передавать для анализа. Да и
testcase уже есть. :)
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 7:18 [sisyphus] Сборка FORTRAN-программ Sergei Epiphanov
2011-06-27 7:38 ` vx8400
2011-06-27 8:49 ` vx8400
@ 2011-06-27 9:49 ` Sergey Vlasov
2011-06-27 10:06 ` Sergei Epiphanov
2 siblings, 1 reply; 14+ messages in thread
From: Sergey Vlasov @ 2011-06-27 9:49 UTC (permalink / raw)
To: sisyphus
[-- Attachment #1: Type: text/plain, Size: 1291 bytes --]
On Mon, Jun 27, 2011 at 11:18:05AM +0400, Sergei Epiphanov wrote:
> В одной из программ нашёл интересный кусок, который перестал собираться. Решил
> проверить такой программой:
>
> test.for:
> PROGRAM test
> INTEGER(4) I
> DO 1 I=400
В "древнем" варианте FORTRAN пробелы фактически игнорируются, и этот
оператор рассматривается как присваивание переменной DO1I значения 400;
переменная I остаётся неинициализированной. Вообще классический вариант
подобной ошибки - точка вместо запятой.
Можно ещё добавить опцию -fdump-parse-tree, чтобы увидеть, во что именно
этот код превращается в компиляторе.
> 1 WRITE(*,*)I
> END PROGRAM
>
>
> Программа командой 'gfortran -ffixed-form test.for -o test' компилируется и
> запускается, но вывод непонятно какой: каждый раз выпадает случайное число (к
> примеру -1081112844, -1074562380 и другие подобные). Глюк компилятора или как?
> Система - Сизиф прошлопятничный. gcc4.5-fortran-4.5.1-alt8. Из gcc стоит
> только версия 4.5.1-alt8 (пересечений с другими версиями нет).
>
> При компиляции с опцией -ffree-form вместо -ffixed-form компилятор выдаёт ошибку
> "Syntax error".
Действительно, в варианте free form этот изврат с игнорированием пробелов
наконец-то убрали.
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 9:27 ` Andrey Liakhovets
@ 2011-06-27 10:00 ` Sergei Epiphanov
2011-06-27 10:11 ` Andrey Liakhovets
0 siblings, 1 reply; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 10:00 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
В сообщении от 27 июня 2011 13:27:46 автор Andrey Liakhovets написал:
> Предположительно, компилятор молча игнорирует некорректный "DO I=400",
> после чего "END DO" он действительно не ожидает :)
Странный игнор, не так ли? Бага в компиляторе? А с '-ffree-form' ругань есть.
Кстати, я сейчас вывел в ассемблер ('gfortran -S -o test.S -ffixed-form
test.for') оба варианта:
1)
PROGRAM test
INTEGER(4) I
DO 1 I=400
1 WRITE(*,*)I
END PROGRAM
2)
PROGRAM test
INTEGER(4) I
DO I=1,400
WRITE(*,*)I
END DO
END PROGRAM
Разница огромная. Очень интересно взглянуть на diff полученных текстов. Во-
первых, нет обработчика цикла после WRITE (как Вы правльно заметили). Но вот
эти команды меня поставили в ступор:
movl $0x43c80000, %eax
movl %eax, -356(%ebp)
movl $.LC1, -344(%ebp)
где:
.LC1 - указатель на строку 'test.for'
Для сравнения у второй программы это звучит так:
movl $1, -356(%ebp)
movl -356(%ebp), %eax
cmpl $400, %eax
jg .L1
jmp .L3
где:
.L1 - пропуск цикла
.L3 - точка начала цикла
"Шок - это по-нашему".
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 9:30 ` Sergei Epiphanov
@ 2011-06-27 10:05 ` Andrey Liakhovets
0 siblings, 0 replies; 14+ messages in thread
From: Andrey Liakhovets @ 2011-06-27 10:05 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
On Mon, 27 Jun 2011 13:30:19 +0400 Sergei Epiphanov wrote:
>В сообщении от 27 июня 2011 12:49:44 автор vx8400 написал:
>> Оригинальный кусок можно сюда показать, если код разрешен к открытой
>> публикации? Без контекста непонятно, что имелось в виду.
>
>Оригинальный код разбросан по полусотне фортрановских файлов в полностью
>неудобоваримой форме из смеси Fortran 77, Fortran90 и Fortran 2003. Смесь
>дикая ещё и потому, что использованы множественные COMMON, EQUIVALENCE (причём
>переменных разных типов данных) и IMPLICIT из-за больших ограничений
>тогдашнего Фортрана. Я уже 4 года разгребаю эти авгиевы конюшни, но до конца
>пока так и не смог разобрать.
>
>Вот кусок (за вычетом ненужного):
>
>SUBROUTINE TRAN2F(...)
>...
>character nqs(10000)
>integer(4) nq(10000)
>character lsp
>equivalence(nq(1),nqs(1))
>...
>DATA lsp/' '/
>...
>do 1 i=400
>1 nqs(i)=lsp
>...
Да-а...
Судя по объяснению Сергея Власова, остаётся честно написать "do1i=400",
после чего ЭТО должно странслироваться.
А уж потом разбираться, что же имели ввиду авторы...
Андрей Ляховец
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 9:49 ` Sergey Vlasov
@ 2011-06-27 10:06 ` Sergei Epiphanov
0 siblings, 0 replies; 14+ messages in thread
From: Sergei Epiphanov @ 2011-06-27 10:06 UTC (permalink / raw)
To: sisyphus
В сообщении от 27 июня 2011 13:49:08 автор Sergey Vlasov написал:
> Можно ещё добавить опцию -fdump-parse-tree, чтобы увидеть, во что именно
> этот код превращается в компиляторе.
Спасибо за подсказку! "Век живи - век учись, а дураком помрёшь." Точно как Вы
сказали. Теперь всё надо будет перевести в новый фортран, чтобы уйти от
подобных глюков.
--
С уважением, Епифанов Сергей
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [sisyphus] Сборка FORTRAN-программ
2011-06-27 10:00 ` Sergei Epiphanov
@ 2011-06-27 10:11 ` Andrey Liakhovets
0 siblings, 0 replies; 14+ messages in thread
From: Andrey Liakhovets @ 2011-06-27 10:11 UTC (permalink / raw)
To: ALT Linux Sisyphus discussions
On Mon, 27 Jun 2011 14:00:16 +0400 Sergei Epiphanov wrote:
>В сообщении от 27 июня 2011 13:27:46 автор Andrey Liakhovets написал:
>> Предположительно, компилятор молча игнорирует некорректный "DO I=400",
>> после чего "END DO" он действительно не ожидает :)
>
>Странный игнор, не так ли? Бага в компиляторе? А с '-ffree-form' ругань есть.
...
Как объяснил Сергей Власов, игнорировались пробелы.
Андрей Ляховец
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-06-27 10:11 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-27 7:18 [sisyphus] Сборка FORTRAN-программ Sergei Epiphanov
2011-06-27 7:38 ` vx8400
2011-06-27 7:53 ` vx8400
2011-06-27 8:19 ` Andrey Liakhovets
2011-06-27 9:14 ` Sergei Epiphanov
2011-06-27 9:11 ` Sergei Epiphanov
2011-06-27 9:27 ` Andrey Liakhovets
2011-06-27 10:00 ` Sergei Epiphanov
2011-06-27 10:11 ` Andrey Liakhovets
2011-06-27 8:49 ` vx8400
2011-06-27 9:30 ` Sergei Epiphanov
2011-06-27 10:05 ` Andrey Liakhovets
2011-06-27 9:49 ` Sergey Vlasov
2011-06-27 10:06 ` Sergei Epiphanov
ALT Linux Sisyphus discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/sisyphus/0 sisyphus/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 sisyphus sisyphus/ http://lore.altlinux.org/sisyphus \
sisyphus@altlinux.ru sisyphus@altlinux.org sisyphus@lists.altlinux.org sisyphus@lists.altlinux.ru sisyphus@lists.altlinux.com sisyphus@linuxteam.iplabs.ru sisyphus@list.linux-os.ru
public-inbox-index sisyphus
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.sisyphus
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git