ALT Linux Sisyphus discussions
 help / color / mirror / Atom feed
* [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