Три мира - три Фортрана

62 views
Skip to first unread message

Leo B.

unread,
Aug 26, 2020, 3:14:43 AM8/26/20
to БЭСМ-6
Попробуем написать на Фортране рекурсивное вычисление факториала:

 Ф O P T P A H
   /16.07.73/
                PROGRAM MAIN
                DIMENSION ST(100)
                INTEGER ST,PTR,F
                PTR=1
       2        N=10
       3        ASSIGN 10 TO ST(PTR)
       4        GOTO 100
       5     10 PRINT 1,N,F
              1 FORMAT(’ FACTORIAL OF ’, I2, ’ IS ’, I10)
       6        STOP
       7    100 PRINT 2,N
             2  FORMAT(’ CALLED: FACTORIAL OF ’, I5)
       8        IF (N.GT.1)
       9       -           GOTO 101
      10        F = 1
      11        GOTO ST(PTR)
      12    101 N=N-1
      13        PTR=PTR+1
      14        ASSIGN 102 TO ST(PTR)
      15        GOTO 100
      16    102 CONTINUE
      17        PRINT 3,N,F
              3 FORMAT(’ FACT(’,I2,’) =’, I10)
      18        PTR=PTR-1
      19        N=N+1
      20        F=F*N
      21        GOTO ST(PTR)
                END

Компилируется, работает:

           *EXECUTE
 CALLED: FACTORIAL OF    10
 CALLED: FACTORIAL OF     9
 CALLED: FACTORIAL OF     8
 CALLED: FACTORIAL OF     7
 CALLED: FACTORIAL OF     6
 CALLED: FACTORIAL OF     5
 CALLED: FACTORIAL OF     4
 CALLED: FACTORIAL OF     3
 CALLED: FACTORIAL OF     2
 CALLED: FACTORIAL OF     1
 FACT( 1) =         1
 FACT( 2) =         2
 FACT( 3) =         6
 FACT( 4) =        24
 FACT( 5) =       120
 FACT( 6) =       720
 FACT( 7) =      5040
 FACT( 8) =     40320
 FACT( 9) =    362880
 FACTORIAL OF 10 IS    3628800

Фортран-ГДР компилирует (потребовав какой-нибудь список меток в assigned GOTO): 
GOTO ST(PTR),(10,102) 

Но не работает (зацикливается, вылетает по переполнению), потому что индекс игнорируется что в ASSIGN, что в GOTO, как если бы ST было скаляром.

Форекс хвалёный вообще такого не умеет:

                 6       ASSIGN 10 TO ST(PTR)                                                          6
ERR 04075 ПK    6                        ↑
OШИБKA B ASSIGN-ИHCTPYK
ERR 04072 ПK    6                           ↑
ПOCЛE METKИ OTCYTCTB TO

Понятно, что всё можно сделать через промежуточные присваивания, но видно, что в CDC или в ЦЕРНе компиляторы писать умели, а в двух других мирах - не очень-то.

Leo

Василий Долматов

unread,
Aug 26, 2020, 4:46:28 AM8/26/20
to be...@googlegroups.com


26 авг. 2020 г., в 10:14, Leo B. <leo...@gmail.com> написал(а):

Просто в современных компиляторах некоторые рудименты языка отмерли практически :)

И, кстати, я сам в первый раз вижу использование массива в инструкциях перехода… :) 

ASSIGN со скаляром - очевидно работает во всех трех :)
 

Leo


--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/2841ebca-8567-4a30-86ac-ddd2d91e7e95n%40googlegroups.com.

Leo B.

unread,
Aug 26, 2020, 1:04:09 PM8/26/20
to БЭСМ-6
Я сейчас попробовал gfortran. Он не любит элементы массива в assign, например
      assign 10 to st(ptr)                                              
                   1
Error: ASSIGN statement at (1) requires a scalar default INTEGER variable
(ну и жалуется на deleted feature).

Фортран на PDP-11 кушает слегка модифицированный вариант (без PROGRAM и без DIMENSION, просто INTEGER ST(100)), и прекрасно работает:

# ./a.out
 called: factorial of    10
 called: factorial of     9
 called: factorial of     8
 called: factorial of     7
 called: factorial of     6
 called: factorial of     5
 called: factorial of     4
 called: factorial of     3
 called: factorial of     2
 called: factorial of     1
 fact( 1) =         1
 fact( 2) =         2
 fact( 3) =         6
 fact( 4) =        24
 fact( 5) =       120
 fact( 6) =       720
 fact( 7) =      5040
 fact( 8) =     40320
 fact( 9) =    362880
 factorial of 10 is    3628800

А если в GOTO написать не обе возможные метки, а только одну, так ещё и Runtime error 14 говорит. Так что это была не локальная инициатива CDC/CERN, а вполне общепринятое понимание языка.

Leo

On Wednesday, August 26, 2020 at 1:46:28 AM UTC-7 ReedCat wrote:


26 авг. 2020 г., в 10:14, Leo B. написал(а):

Кирилл Кобелев

unread,
Aug 26, 2020, 8:47:45 PM8/26/20
to be...@googlegroups.com
Про ФОРЕСК и «не умели». У меня тут смешанные чувства. Судя по проблемам и задачам того времени, как я их помню:
 
  - Чтобы не было потери точности, чтобы было быстро — понимаем зачем, будем делать.
  - Чтобы как бы сейчас сказали «mind bending» программа компилировалась и работала — в принципе наверно неплохо, а зачем это надо?
 
Если бы было реально надо - возможно бы и научились. Но по факту умели не особо.
 
Среда, 26 августа 2020, 10:04 -07:00 от Leo B. <leo...@gmail.com>:
 
--

Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/b1bc9d2b-5775-42bb-8722-e04cbfb73436n%40googlegroups.com.
 
 
С уважением,
Кирилл Кобелев
fract...@mail.ru
 

Кирилл Кобелев

unread,
Aug 26, 2020, 8:50:03 PM8/26/20
to be...@googlegroups.com
p.s. Уголок спама: https://www.youtube.com/watch?v=nbC7BxXtOlo
 
Пишут, что рассекретили совсем недавно. Возможно конечно что все уже видели, «еще тогда».

 
Thu, 27 Aug 2020 -7:47:43 -0700 от Кирилл Кобелев <fract...@mail.ru>:

Leo B.

unread,
Aug 27, 2020, 2:01:11 AM8/27/20
to БЭСМ-6
К оптимизации в ФОРЕКСе (точнее, только в версии 3, потому что версия 2.02 - это ошибка на ошибке) у меня-дилетанта претензий нет. Но всё внимание что в ФОРЕКСе, что в Ф-ГДР ушло в оптимизацию (особенно в Ф-ГДР),
и парсер оказался хуже оригинального. Например, 
 Ф O P T P A H
   /16.07.73/
                 PROGRAM MAIN
                 F(X) = 2.5*X*(1.0-F(X))
 24002
  ФYHKЦИЯ - OПEPATOP HE MOЖET BЫЗЫBATЬ CAMA CEБЯ.
       2         Y = F(0.5)
       3         PRINT 1,Y
             1   FORMAT(1XF20.15)
                 END

В остальных двух это компилируется и падает в онлайн-эмуляторе по контролю команды (== по переполнению стека).

Впрочем, первоначальная претензия насчет присваиваемого GOTO к ФОРЕКСу почти снимается. Ко времени фортрана-77, которому хотя бы частично форекс пытается следовать, требование простой переменной в ASSIGN/GOTO уже стало стандартом. Разве что нормальной диагностики ошибки не нажили.

Leo

Макаров-Землянский Николай

unread,
Aug 27, 2020, 2:15:32 AM8/27/20
to be...@googlegroups.com
Спасибо за фильм! Некоторые кадры видел. Меня "удивила" аппаратура - вспомнил юность. Еще раз - СПАСИБО!
 
27.08.2020, 03:50, "'Кирилл Кобелев' via БЭСМ-6" <be...@googlegroups.com>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/1598489402.495386424%40f730.i.mail.ru.

Денис Медведев

unread,
Aug 27, 2020, 8:00:18 AM8/27/20
to be...@googlegroups.com
Про обработку чисел в фортране была занимательная, и до сих пор во многом актуальная книга

чт, 27 авг. 2020 г. в 09:15, Макаров-Землянский Николай <nv...@yandex.ru>:
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/2973961598508737%40mail.yandex.ru.

Leo B.

unread,
Aug 28, 2020, 6:51:56 PM8/28/20
to БЭСМ-6
On Thursday, August 27, 2020 at 5:00:18 AM UTC-7 Денис Медведев wrote:
Про обработку чисел в фортране была занимательная, и до сих пор во многом актуальная книга

Она сейчас стоит у меня на полке. Помнится, сразу же после того, как я её в детстве купил, подпрыгивая от нетерпения, я читал её в метро и ржал аки конь, так что люди оглядывались.

Leo
 

Mikhail Popov

unread,
Aug 29, 2020, 3:18:13 PM8/29/20
to be...@googlegroups.com
Исходный код FORTRAN для CDC1604, взятый из CERN в 1967 году, был не только исходным кодом компилятора, но (и наиболее важным компонентом) был также полный тест в исходном коде для компилятора CDC Fortran, поэтому для людей, которые никогда не писали компилятор раньше, тест был спасателем.  А когда Шириков и Оеныр добавляли оптимизатор, они добавляли его уже поверх сгенерированного кода и поэтому они не смогли сломать семантику, а только внесли некоторые ошибки, которые в конечном итоге были исправлены. Про тест для компилятора CDC Fortran, от него есть некоторые следы от полного набора тестов на образе диска monsys/9.

Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/besm6/21b22069-3a1b-4283-8717-e3299530493an%40googlegroups.com.

Leo B.

unread,
Aug 29, 2020, 11:36:44 PM8/29/20
to БЭСМ-6
Спасибо, надо будет взглянуть.

По обсуждению на https://retrocomputing.stackexchange.com/q/15977/4025 выяснилось, что разные группы компаний вносили разные "расширения" в Фортран 66.
Так, у DEC и CDC было можно присваивать операторные метки элементам массивов, а у ICL и Data General - нельзя, но зато можно присваивать переменным не только метки выполняемых операторов, но и форматные (gfortran это до сих пор поддерживает).

В Фортране-Дубна пространства меток операторов и форматов различны, поэтому может жить и работать оператор "   1   PRINT 1"

Leo

Leo B.

unread,
Apr 26, 2025, 5:09:55 PMApr 26
to БЭСМ-6
Дошли до меня слухи о знаменитом неоднозначном фортрановском операторе
     FORMAT(X5H)=(1.)
который может быть понят и как присваивание единицы элементу массива FORMAT с индексом X5H, и как формат для печати строки " )=(1."

Что же делают три наших компилятора:

Фортран-Дубна: без метки: ошибка "неопознанный оператор", с меткой:  компилируется как форматная строка; если добавить оператор PRINT - печатает строку.

Фортран-ГДР: без метки: если это первый оператор в программе - игнорируется; если не первый, то ILLEGAL LEFT HAND SIDE OR STATEMENT FUNCTION IN EXECUTABLE PART, (если добавить объявление DIMENSION FORMAT(10), то компилируется как присваивание); если с меткой, то компилируется как форматная строка, независимо от объявления DIMENSION.

Форекс: всегда распознается как присваивание; в отсутствие объявления DIMENSION это приводит к ошибке.


Leo

Sergey Ryzhkov

unread,
Apr 26, 2025, 7:27:14 PMApr 26
to be...@googlegroups.com
А разве это правильной оператор формата? Вроде правильно только

FORMAT(1X5H)=(1.)

сб, 26 апр. 2025 г. в 22:09, Leo B. <leo...@gmail.com>:
> --
> Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
> http://groups.google.com/group/besm6/topics
> ---
> Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
> Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/0101d02a-7836-47db-ab80-f7f7dd91f971n%40googlegroups.com.

Sergey Ryzhkov

unread,
Apr 26, 2025, 7:34:52 PMApr 26
to be...@googlegroups.com
Это вроде однозначно определение оператора-функции. Потому и
игнорируется Фортраном ГДР в начале программы.

вс, 27 апр. 2025 г. в 00:27, Sergey Ryzhkov <sir...@gmail.com>:

Leo B.

unread,
Apr 26, 2025, 8:37:01 PMApr 26
to БЭСМ-6
Это правильный оператор формата (https://docs.oracle.com/cd/E19957-01/805-4939/z40007437a2e/index.html):

nX--Positions

The nX edit specifier indicates that the transmission of the next character to or from a record is to occur at the position n characters forward from the current position.

On input, the nX edit specifier advances the record pointer by n positions, skipping n characters.

A position beyond the last character of the record can be specified if no characters are transmitted from such positions.

On output, the nX specifier writes n blanks.

The n defaults to 1.

Leo

Sergey Ryzhkov

unread,
Apr 27, 2025, 12:21:13 PMApr 27
to be...@googlegroups.com

Вообще то, примерно там же на другой странице написано:

"Item Separator
Items in the format specification list are separated by commas. A comma can be omitted before or after the slash and colon edit descriptors, between a P edit descriptor, and the immediately following F, E, D, or G edit descriptors.

In some sense, the comma can be omitted anywhere the meaning is clear without it, but, other than those cases listed above, this is nonstandard."


вс, 27 апр. 2025 г., 01:37 Leo B. <leo...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/27d0efae-e191-4c7d-987a-39ad185135a2n%40googlegroups.com.

Leo B.

unread,
Apr 27, 2025, 3:52:40 PMApr 27
to БЭСМ-6
Про запятую исходно речи не было. Я отвечал на "Вроде правильно только FORMAT(1X5H)=(1.)", в котором утверждении, как нетрудно видеть, запятой нет.

Leo

Sergey Ryzhkov

unread,
Apr 27, 2025, 5:20:04 PMApr 27
to be...@googlegroups.com

Я просто давно не брал в руки шишек, аак то этотвсе мне показалось неправильным, в общем, как мы видим, данная,конструкция неодрозначна и не рекомендуем. Я всегда писал формальные элементы через запятую, Фортран в этом плане чзык стремный, чувствовал я бесовство, но доказать не мог в твоём примере изначально.


вс, 27 апр. 2025 г., 20:52 Leo B. <leo...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/8679c905-3fa1-495f-9679-d4f02816e54cn%40googlegroups.com.

Sergey Ryzhkov

unread,
Apr 27, 2025, 5:21:51 PMApr 27
to be...@googlegroups.com

Я просто давно не брал в руки шашек, так то это все мне показалось неправильным, в общем, как мы видим, данная,конструкция неоднозначна и не рекомендуема. Я всегда писал формальные элементы через запятую, Фортран в этом плане язык стремный, чувствовал я бесовство, но доказать не мог в твоём примере изначально.


вс, 27 апр. 2025 г., 22:19 Sergey Ryzhkov <sir...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages