БЭСМ6 программирование на Паскале

103 views
Skip to first unread message

Alex Loktionoff

unread,
Mar 28, 2025, 4:29:55 PMMar 28
to БЭСМ-6
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

- вопрос номер 0. какие есть интересные варианты ответа  WHAT= 
 где можно почитать как можно было отлаживать программы с помощью WHAT=?
 эмулятор dispak/dubna что  поддерживают/не поддерживают из WHAT=?

- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.

- Можно было подать на вход программе на Паскале массив прямо из паспорта диспак-а? Полагаю можно было в колоду перфокарт перед самим обьектником программы вставлять перфокарты с данными и так считать, разные данные без изменения программы, можно примерчик?

- Можно ли было реализовать файловый обмен между программами на фортране например? можно было при этом сделать файл просто буфер в памяти?

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

unread,
Mar 28, 2025, 5:24:54 PMMar 28
to be...@googlegroups.com


28 марта 2025 г., в 23:29, Alex Loktionoff <oxy...@gmail.com> написал(а):

Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

- вопрос номер 0. какие есть интересные варианты ответа  WHAT= 
 где можно почитать как можно было отлаживать программы с помощью WHAT=?
 эмулятор dispak/dubna что  поддерживают/не поддерживают из WHAT=?
убей не помню… странная штука какая-то и никто из моего круга ей вообще не пользовался… 


- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.
Н.Вирт «Систематическое программирование. Введение». 

на Б-6 - именно такая работа с файлами и была. 

было ли расширение вида blockread/blockwrite (как в Турбе) - не помню. опять-таки не было у меня рабочим инструментом. 


- Можно было подать на вход программе на Паскале массив прямо из паспорта диспак-а? Полагаю можно было в колоду перфокарт перед самим обьектником программы вставлять перфокарты с данными и так считать, разные данные без изменения программы, можно примерчик?

не понял про «прямо из паспорта диспака»… не понял про «_перед_ самим _объектником». 
про какой Паскаль идет речь? если про Монитор, то там стандартная МС «Дубна», то есть, вводимые данные кладутся после *EXECU
и да, файл INPUT Паскаль-Монитора смотрит именно туда по умолчанию. 

а если про Паскаль-Автокод, то я его использовал только в режиме создания ГП, которую потом уже паспортом читали с диска и запускали. 
при этом задачи какие-то данные еще и из паспорта прочитать через стандартные паскалевские файлы уже в программу - не было ни разу.
почему? да потому что какое-то странное это получалось извращение… 
к данным, которые в паспорте просто заносились в конкретный адрес по Вyyyyy, можно было спокойно дотянуться автокодной вставкой.
благо и программы на Паскаль-Автокоде делались как правило не пакетные, а интерактивные (тот же Джин) и задачи читать что-то "с перфокарт" просто не было. 


- Можно ли было реализовать файловый обмен между программами на фортране например?
между программой на фортране и программой на Паскале? вот просто «из коробки» вряд ли. Но… 
«что одна программа записала, то другая завсегда прочитать сможет» :) 

вот только опять ключевой вопрос «А зачем???»

если речь про Паскаль-Монитор, то проще сделать маленькую фортранную функцию и организовать обмен с другой фортрановской программой через нее.
вообще не заморачиваясь проблемами стыковки. 

если Паскаль-Автокод, то вообще не понять зачем ему было общаться с программами на фортране. «не царское это дело».  :)  

можно было при этом сделать файл просто буфер в памяти?

при чем «при этом»? при связке Паскаль-Фортран? опять «химера» какая-то? :) 

А так - и в том и в том варианте Паскаля - файлы исходно и  есть «просто буферы в памяти», если их ни к чему не привязать через параметры PROGRAM().

dol@



--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/e297aefc-7b79-4a5d-9c3a-f4a5b9995434n%40googlegroups.com.

Leo B.

unread,
Mar 28, 2025, 5:48:51 PMMar 28
to БЭСМ-6
On Friday, March 28, 2025 at 1:29:55 PM UTC-7 oxy...@gmail.com wrote:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

- вопрос номер 0. какие есть интересные варианты ответа  WHAT= 

См. https://github.com/besm6/besm6.github.io/blob/master/wiki/pascal-monitor.txt (ох, сильно не первый раз этот файл в группе упоминается)
 
 где можно почитать как можно было отлаживать программы с помощью WHAT=?

Насколько можно судить, из WHAT= командой D вызывался отладчик,  если программа была скомпилирована в отладочном режиме (*=D8*)
Декомпилированный отладчик доступен в https://github.com/besm6/pascal-re/blob/master/pasdd1.pas

 эмулятор dispak/dubna что  поддерживают/не поддерживают из WHAT=?

Всё поддерживают. Для эмулятора там нет ничего специального. Просто включение-выключение разных режимов выдачи.


- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.

В исходниках компилятора  (pascompl.b6  там же, где и отладчик) примеров хватает.  В языке, насколько я понимаю, предполагалось, что имена файлов, с которыми работает программа, явно упомянуты в заголовке программы). Как настраивать файлы на конкретное местоположение во внешней памяти, не специфицировалось.
В вышеупомянутой документации описано, как делаются эти настройки с помощью сервисной программы PASHELP.

Локальные файлы в программах на Паскале образовывались на барабанах в произвольных местах. Их содержимое можно было прочитать только в процессе выполнения той же программы.


- Можно было подать на вход программе на Паскале массив прямо из паспорта диспак-а? Полагаю можно было в колоду перфокарт перед самим обьектником программы вставлять

Паспорт задачи состоит исключительно из заказа ресурсов и кончается буквой Е. Дальнейшее называется массивом(-ами) ввода.

перфокарты с данными и так считать, разные данные без изменения программы, можно примерчик?

Нормальная работа в МС "Дубна" была такая: после компиляции программы и записи её в библиотеку с помощью  *TO PERSO:нузззз, последующие запуски делались с помощью 

*NAME
*PERSO:нузззз
*EXECUTE
данные
*END FILE

Разумеется, если у кого не было места на внешних носителях и программа была выдана на перфокарты с помощью *PUNCH, то вместо *PERSO клались перфокарты со "стандартным массивом".

Формально говоря, ОС Диспак позволяла иметь в пакете задачи чуть не до 63 разных массивов ввода, и любители могли подавать данные для своих программ в дополнительных массивах ввода после  *END FILE, но этим вряд ли кто пользовался, уж очень утомительно.


- Можно ли было реализовать файловый обмен между программами на фортране например? можно было при этом сделать файл просто буфер в памяти?

Да, конечно. ЕМНИП, фортрановские направления работы с файлами от 1 до 16 соответствовали заказанным в паспорте томам с НУ от 40 до 57. "Запись по формату" писала стандартные текстовые строки, а "бесформатная запись" писала какие-то records  фиксированного размера, вроде бы, которые только фортрановская библиотека и умела читать. 

Был еще какой-то номер для буферного файла на барабане. В памяти, естественно, файлы никто не хранил.

Leo

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

unread,
Mar 28, 2025, 6:03:07 PMMar 28
to be...@googlegroups.com
еще 50, 51 и 52…

а в Мониторе-80 - и дальше пошли номера. я из расширений сейчас помню только 54 - ввод/вывод на терминал.

что превратило ФОРТРАН в язык, пригодный для написания диалоговых программ.
чем и воспользовался В.Г.Баула на ВМК, написав свой «Информатор» - просто каталожный рубрикатор… ну, аспирантская работа, что с нее взять… :)

а вот когда он там сделал «блок игр», а особенно, когда туда воместил игру «в клингонов» - приимерно на год всё, имевшее отношение к терминальной сети НИВЦ - было парализлвано…
включая сами БЭСМ… потому как «информатор» ьыл принципиально однотерминальным и количество одновременно играющих - ограничивалось только исчерпанием ресурсов БЭСМ :)


> 29 марта 2025 г., в 00:48, Leo B. <leo...@gmail.com> написал(а):

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

unread,
Mar 28, 2025, 6:08:23 PMMar 28
to be...@googlegroups.com


> 29 марта 2025 г., в 01:02, Василий Долматов <vdol...@gmail.com> написал(а):
>
> еще 50, 51 и 52…
>
> а в Мониторе-80 - и дальше пошли номера. я из расширений сейчас помню только 54 - ввод/вывод на терминал.
>
> что превратило ФОРТРАН в язык, пригодный для написания диалоговых программ.
> чем и воспользовался В.Г.Баула на ВМК, написав свой «Информатор» - просто каталожный рубрикатор… ну, аспирантская работа, что с нее взять… :)
>
> а вот когда он там сделал «блок игр», а особенно, когда туда воместил игру «в клингонов» - приимерно на год всё, имевшее отношение к терминальной сети НИВЦ - было парализлвано…
> включая сами БЭСМ… потому как «информатор» ьыл принципиально однотерминальным и количество одновременно играющих - ограничивалось только исчерпанием ресурсов БЭСМ :)
>

решена эта проблема была кстати вполне элегантно… в стандартный паспорт «Информатора» вкрячили раздел ОДИН^
и телемаркет… :)

поскольку никто для работы им не пользовался, никому это не повредило… :)

Alex Loktionoff

unread,
Mar 28, 2025, 6:12:49 PMMar 28
to БЭСМ-6


пятница, 28 марта 2025 г. в 22:48:51 UTC+1, Leo B.:
On Friday, March 28, 2025 at 1:29:55 PM UTC-7 oxy...@gmail.com wrote:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

- вопрос номер 0. какие есть интересные варианты ответа  WHAT= 

См. https://github.com/besm6/besm6.github.io/blob/master/wiki/pascal-monitor.txt (ох, сильно не первый раз этот файл в группе упоминается)
 
 где можно почитать как можно было отлаживать программы с помощью WHAT=?

Насколько можно судить, из WHAT= командой D вызывался отладчик,  если программа была скомпилирована в отладочном режиме (*=D8*)
Декомпилированный отладчик доступен в https://github.com/besm6/pascal-re/blob/master/pasdd1.pas

Можно сдампить сессию как пример, for the rest of us?
Я ткнулся в  https://github.com/besm6/besm6.github.io/blob/master/wiki/pascal-monitor.txt  но ничего путевого не добился, программа просто падает:

% cat tst-hello-dbg.pas

(*=P-,T-,S8,D8*)

program main(output);

begin

    writeln('Hello, World!');

end.

% dispak ./tst-hello-dbg.b6

*NАМЕ ТSТ-НЕLLО-DВG.МАDLЕN

           *САLL УЕSМЕМОRУ

           *SУSТЕМ

           *FULL LISТ

           *МАDLЕN,L=FGR.

           *РЕRSО:670440,СОNТ

           *NО LОАD LISТ

           *МАIN МАIN

           *ЕХЕСUТЕ

WНАТ= D

 PASCAL-DEBUG 1.0 (25.02.82)

 .CTP =3 ПP/ФYH= БEЗ (*=P+  AДP=01010 CYM= 0000000100106623 < -

 OVERANGE IN    18


:(
 
 эмулятор dispak/dubna что  поддерживают/не поддерживают из WHAT=?

Всё поддерживают. Для эмулятора там нет ничего специального. Просто включение-выключение разных режимов выдачи.

Leo

Leo B.

unread,
Mar 28, 2025, 6:35:57 PMMar 28
to БЭСМ-6
То, что имеющаяся у нас версия отладчика функциональна, никто не обещал, к сожалению.
Что там за 18 строка, в которой якобы происходит выход за границы массива, неясно.

С другой стороны, попробуйте, исходя из диагностики  ПP/ФYH= БEЗ (*=P+ 
обратить внимание на первую строку программы и почитать в инструкции, что такое псевдокомментарий Р- и чем он отличается от Р+.



Alex Loktionoff

unread,
Mar 28, 2025, 6:49:04 PMMar 28
to БЭСМ-6
Спасибо, что поправили.
Но видимо одного Р+ недостаточно, что-то нужно еще...

% cat tst-hello-dbg.pas 

(*=P+,D8*)

program main(output);

begin

    writeln('Hello, World!');

end.

% dispak ./tst-hello-dbg.b6

*NАМЕ ТSТ-НЕLLО-DВG.МАDLЕN

           *САLL УЕSМЕМОRУ

           *SУSТЕМ

           *FULL LISТ

           *МАDLЕN,L=FGR.

           *РЕRSО:670440,СОNТ

           *NО LОАD LISТ

           *МАIN МАIN

           *ЕХЕСUТЕ

WНАТ= D

 PASCAL-DEBUG 1.0 (25.02.82)

 .CTP =3 ПP/ФYH=    MAIN AДP=01011 CYM= 0037777777716541 < -

 OVERANGE IN    18


 PASCAL PM DUMP        9 STACK LENGTH.  WITHOUT PMD

     15 STACK LENGTH.  WITHOUT PMD

     49 STACK LENGTH.  WITHOUT PMD

   5698 STACK LENGTH.  NAME=    MAIN.LINE=5


WНАТ= 

 PASCAL PMD END


пятница, 28 марта 2025 г. в 23:35:57 UTC+1, Leo B.:

Leo B.

unread,
Mar 28, 2025, 7:10:40 PMMar 28
to БЭСМ-6
Какой ещё мадлен? Что там, вообще, компилируется? Попробуйте просто, с чистого листа

*name
*call ficmemory
*perso:670440
*pascal
program hello(output);(*=d8*)
var i:integer;
begin
    for i := 1 to 10 do
    writeln(i);
end.
*execute
*end file

Alex Loktionoff

unread,
Mar 31, 2025, 4:34:34 PMMar 31
to БЭСМ-6
Да, это у меня среда разбитая, при разных пробах вывести информацию вышло, что на диске у меня нет PASSDD1

        Р/ТF     Е 02104        Р/СW       02767        FОR*АLL  Е 03743

        Р/SС       02137        Р/ТRРАGЕ   02771        ОН*      Е 03745

        Р/DD       02147        Р/ВХ       03023        ОН*1     Е 03752

   ОТСУТСТВУЕТ  РАSDD1          Р/ЕN     Е 03035        ISО/GОSТ   03761

        Р/WI       02166        Р/WО       03051        СLЕАRLЕХ   04030

        Р/ЕF       02247        Р/WR       03102        DRUМТАР*   04042


Но без всяких хитрых псевдокоментариев работает:
важно иметь в паспорте TEЛE^, иначе  WHAT не появится и весь вывод программы сразу полетит на принтер.

ШИФP 410300 ЗC5^

OЗУ 32^

ЛEH 67(2048)^

TEЛE^

EEB1A3

*NAME tst-dbg.pas 4

*CALL FICMEMORУ

*NO LIST

*LIBRARУ:13

*PASCAL

*     PERSO:671700

*     CALL PRETTУPR

(**)

program hello(output);

var i:integer;

begin

    for i := 1 to 10 do 

    begin

       writeln(i);

    end;

end.


*     /*

*     SUPER

*     EDIT

*     R:270000

*     LL

*     EE

*execute

*end file

``````

еконец


На сколько понимаю отладка без отладчика программ на паскале была примерно такой:
Вставляем на каждой строчке writeln('DBG:№ххх:', переменные для дампа)
Ну и при запуске нажимаем 'D' - получаем 10 срок вывода. Думаем где сейчас программа и что делает, сколько еще примерно строчек вывода нам интересно, и нажимаем или 'D' для еще 10 или можно 'L' если надо побольше/меньше 'L1' выведет одну, а 'LZ' наверно 36, просто L наверно 256.
Если программа видать пошла уже не туда, то можно нажать 'S' и ее завершить, или перенаправить следующие несколько строчек вывода на печать, для последующего обдумывания, или наоборот экономить бумагу и выводить на экран.
И все? В сорцах я вижу команды 'T' 'I' а в документации про это ничего...

Вот пример "отладки" программы выше:

% dispak  tst-dbg.pas-pascal.b6 

*NАМЕ ТSТ-DВG.РАS 4

           *САLL FIСМЕМОRУ

           *NО LISТ

           *LIВRАRУ:13

           *РАSСАL

           *     РЕRSО:671700

           *     САLL РRЕТТУРR

           *     /*

           *     SUРЕR

           *     ЕDIТ

           *     R:270000

           *     LL

           *     ЕЕ

           *ЕХЕСUТЕ

WНАТ= L2

         1

         2

WНАТ= L1

         3

WНАТ= S

%

 

суббота, 29 марта 2025 г. в 00:10:40 UTC+1, Leo B.: 

Alex Loktionoff

unread,
Mar 31, 2025, 4:57:16 PMMar 31
to БЭСМ-6
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?
Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.
Но вызовы внутренних функций могут быть быстрее, чем в фортране.
Для системных программ не годиться - у него нет типов данных для индексных регистров. 
У него хорошая совместимость с фортраном - очень просто вызывать фортрановские библиотеки.
Похоже мог быть использован как glue для вычислительных под-программ на фортране - оформить диалог, обработка текста на порядки проще. Я прав?

Но интересную вещь я для себя отрыл на пятом десятке, хотя помню в 90-х в институте писал 50/50 на паскале и на с++.
Но вот только сейчас заметил, что в текстах монитор паскаля БЭСМ используются вложенные функции на каждом углу. 
Вложенные функции свободно используют любые переменные объявленные в родительской функции - получается что-то типа глобальных переменных, только они не глобальные и недоступны соседним функциям модуля. Получается такой компромисс типа контролируемых глобальных переменных, которые не надо передавать через стек и запихивать/выпихивать при вызове.
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:

Serge Vakulenko

unread,
Mar 31, 2025, 5:37:10 PMMar 31
to БЭСМ-6
Вложенные функции поддерживаются в GCC (но не в других компиляторах). Пример:

#include <stdio.h>

void outer(int x) {
    int y = 10;

    void inner() {
        printf("x = %d, y = %d\n", x, y);
    }
    inner();
}

int main() {
    outer(5);
}

--Сергей

Leo B.

unread,
Mar 31, 2025, 6:28:42 PMMar 31
to БЭСМ-6
On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.

Не совсем. При (*=P-,T-,S8*) вполне неплохо получается.
 
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.

Прыжки в конец-в начало исключительно для главной программы. Все нормальные функции вполне линейные. Сохранение/восстановление регистров служебными функциями - вполне в стиле сишных CSAV/CRET.
 
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?

В частности, на нем была написана система кросс-разработки Э1-КБ (ассемблер+загрузчик), по крайней мере одна общесистемная программа ОС Диспак (приказ выдачи состояния системы ПАК); а также системные программы для служебного пользования.

Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.

Не для вычислительных циклов Паскаль был предназначен.
 
Но вызовы внутренних функций могут быть быстрее, чем в фортране.
Для системных программ не годиться - у него нет типов данных для индексных регистров. 

Конструкция WITH устанавливает адрес указанного L-выражения, ссылающегося на структуру, на регистр, после чего все поля этой структуры адресуются очень дешево,
и, главное, компактно по размеру кода.

Компилятор этим пользуется во многих местах. Опять же, если производительность не очень критична, то фактор эффективности разработки оказывается превалирующим.

У него хорошая совместимость с фортраном - очень просто вызывать фортрановские библиотеки.
Похоже мог быть использован как glue для вычислительных под-программ на фортране - оформить диалог, обработка текста на порядки проще. Я прав?

Это вряд ли. В диалоговости у вычислительных программ потребности не было (а диалоговость для существенно интерактивных программ, типа пресловутого "Информатора",
была достаточной и в пределах Фортрана). 
Вводимые данные рутинно приводились к фиксированному формату, пригодному для чтения с помощью фортрановского FORMAT, перед вводом в программу.


Но интересную вещь я для себя отрыл на пятом десятке, хотя помню в 90-х в институте писал 50/50 на паскале и на с++.
Но вот только сейчас заметил, что в текстах монитор паскаля БЭСМ используются вложенные функции на каждом углу. 
Вложенные функции свободно используют любые переменные объявленные в родительской функции - получается что-то типа глобальных переменных, только они не глобальные и недоступны соседним функциям модуля. Получается такой компромисс типа контролируемых глобальных переменных, которые не надо передавать через стек и запихивать/выпихивать при вызове.

Нет, это получается компромисс вместо заведения структур и передачи указателей на них, которых придется передавать ровно столько же, сколько было уровней вложенности, или и того меньше, но тогда придется их явно вытаскивать и присваивать.
Это, конечно, более накладно по коду, чем при поддержке вложенных функций на уровне языка, но непринципиально.

С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static.  У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором.  А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.

Leo

Michael Yaroslavtsev

unread,
Mar 31, 2025, 6:29:13 PMMar 31
to be...@googlegroups.com
On Mon, Mar 31, 2025 at 1:57 PM Alex Loktionoff <oxy...@gmail.com> wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?
Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.
Но вызовы внутренних функций могут быть быстрее, чем в фортране.
Для системных программ не годиться - у него нет типов данных для индексных регистров.
Для разработки системных программ Паскаль-монитор широко и успешно использовался в нашей группе.
Из написанного лично мной:
  • UNICOP - популярная утилита для организации транспортных лент. Дополнительная функция - передача данных по каналу связи СВС (универсальный канал == GPIO) <=> БЭСМ-6 (7-е направление == DMA).
  • штатная утилита ОС - программа форматирования магнитных лент на СВС, работавшая напрямую с ПВВ.
Паскаль у нас, правда, был маленько подкрученный.
Г.Н.Акимов
  • зафиксил много багов компилятора.
  • заменил систему ввода-вывода.
  • добавил удобные средства для создания ассемблерных вставок в символических именах.
Л.А.Брухис прикрутил макро-препроцессор собственного сочинения.
Вспоминаю ту пору с большим удовольствием - инструмент вышел - заглядение. А производительность вычислений для этих задач меня не волновала от слова "совсем".
У него хорошая совместимость с фортраном - очень просто вызывать фортрановские библиотеки.
Похоже мог быть использован как glue для вычислительных под-программ на фортране - оформить диалог, обработка текста на порядки проще. Я прав?

Но интересную вещь я для себя отрыл на пятом десятке, хотя помню в 90-х в институте писал 50/50 на паскале и на с++.
Но вот только сейчас заметил, что в текстах монитор паскаля БЭСМ используются вложенные функции на каждом углу. 
Вложенные функции свободно используют любые переменные объявленные в родительской функции - получается что-то типа глобальных переменных, только они не глобальные и недоступны соседним функциям модуля. Получается такой компромисс типа контролируемых глобальных переменных, которые не надо передавать через стек и запихивать/выпихивать при вызове.
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/95171cf4-badf-4439-a636-387fd7308ee3n%40googlegroups.com.


--
Thanks,
-- Michael

Leo B.

unread,
Mar 31, 2025, 7:52:55 PMMar 31
to БЭСМ-6
On Monday, March 31, 2025 at 1:34:34 PM UTC-7 oxy...@gmail.com wrote:

На сколько понимаю отладка без отладчика программ на паскале была примерно такой:
Вставляем на каждой строчке writeln('DBG:№ххх:', переменные для дампа)
Ну и при запуске нажимаем 'D' - получаем 10 срок вывода. Думаем где сейчас программа и что делает, сколько еще примерно строчек вывода нам интересно, и нажимаем или 'D' для еще 10 или можно 'L' если надо побольше/меньше 'L1' выведет одну, а 'LZ' наверно 36, просто L наверно 256.

Если программа скомпилирована без D8, то D эквивалентно пустой посылке. Кроме собственноручной вставки отладочных выдач, еще были возможности, описанные тут:

А собственно интерактивный отладчик, если/когда работал, в общих чертах позволял примерно то же, что и GDB, т. е. останавливаться на строке с указанным номером по определенному сочетанию значений переменных, просматривать значения переменных (только простых типов, правда) и пр. Но какой был синтаксис у всего этого дела, я конкретно не разбирался. Там, похоже, как-то очень строго с пробелами в директивах.

Декомпилированный отладчик доступен, https://github.com/besm6/pascal-re/blob/master/pasdd1.pas если не лень. Навскидку там просто чтобы по одной строке зараз выполнять, нужно какие-то нетривиальные команды давать.

Leo

Serge Vakulenko

unread,
Mar 31, 2025, 8:07:33 PMMar 31
to БЭСМ-6
On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?

​На физтехе мы с Андреем Габбасовым наваяли на Паскале многотерминальную программу игры в шахматы. До десяти юзеров поддерживалось, кажется. Идея была дурить абитуриентов на дне открытых дверей. На самом деле БЭСМ выполняла только сервисную функцию отрисовки и проверки ходов на корректность. На самом деле в отдельной подсобке сидел гроссмейстер (старшекур Егор Евсеев) и давал сеанс одновременной игры с десятью человеками. 😀

--Сергей 

Leo B.

unread,
Apr 1, 2025, 2:23:45 AMApr 1
to БЭСМ-6
Ещё забыл: На Паскале-Мониторе была написана СУБД "КОМПАС". Приложения, работающие с базой данных, писались на Паскале со вставками на языке заданий к базе.

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

unread,
Apr 1, 2025, 3:05:06 AMApr 1
to БЭСМ-6


1 апр. 2025 г., в 01:28, Leo B. <leo...@gmail.com> написал(а):

On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.

Не совсем. При (*=P-,T-,S8*) вполне неплохо получается.
 
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.

Прыжки в конец-в начало исключительно для главной программы. Все нормальные функции вполне линейные. Сохранение/восстановление регистров служебными функциями - вполне в стиле сишных CSAV/CRET.
 
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?

В частности, на нем была написана система кросс-разработки Э1-КБ (ассемблер+загрузчик), по крайней мере одна общесистемная программа ОС Диспак (приказ выдачи состояния системы ПАК); а также системные программы для служебного пользования.

Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.

Не для вычислительных циклов Паскаль был предназначен.
именно. вычислительной работе мне неизвестно, чтобы его кто-то использовал. 

 
Но вызовы внутренних функций могут быть быстрее, чем в фортране.
Для системных программ не годиться - у него нет типов данных для индексных регистров. 

Конструкция WITH устанавливает адрес указанного L-выражения, ссылающегося на структуру, на регистр, после чего все поля этой структуры адресуются очень дешево,
и, главное, компактно по размеру кода.

Компилятор этим пользуется во многих местах. Опять же, если производительность не очень критична, то фактор эффективности разработки оказывается превалирующим.


Но интересную вещь я для себя отрыл на пятом десятке, хотя помню в 90-х в институте писал 50/50 на паскале и на с++.
Но вот только сейчас заметил, что в текстах монитор паскаля БЭСМ используются вложенные функции на каждом углу. 
и в паскаль-автокоде тоже… 

Вложенные функции свободно используют любые переменные объявленные в родительской функции - получается что-то типа глобальных переменных, только они не глобальные и недоступны соседним функциям модуля. Получается такой компромисс типа контролируемых глобальных переменных, которые не надо передавать через стек и запихивать/выпихивать при вызове.

Нет, это получается компромисс вместо заведения структур и передачи указателей на них, которых придется передавать ровно столько же, сколько было уровней вложенности, или и того меньше, но тогда придется их явно вытаскивать и присваивать.
Это, конечно, более накладно по коду, чем при поддержке вложенных функций на уровне языка, но непринципиально.
не, см. ниже, ты сам все сказал.


С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static.  У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором.  А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.
и очень дешево, да… 
я про паскаль-автокод сейчас, в мониторе приходилось лавировать между соглашениями мс дубна еще, 
а в автокоде все просто - 

стек головной программы индексируется ИР1, функции первого уровня вложенности - ИР2, второго - ИР3 и так далее… 

дальше 3-го в джине не заходили, нужды не было, а вот мелкие процедурки 3-го уровня, которые даже своего стека переменных не имели, а работали исключительно с данными родительской процедуры -
это использовалось часто. и код получался эффективный :)


Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/f44a46d5-819a-4411-82ad-510784a85118n%40googlegroups.com.

Alex Loktionoff

unread,
Apr 1, 2025, 7:08:52 AMApr 1
to БЭСМ-6
Еще одна "фича" паскаля повергла меня в ступор:
    word = record
case integer of
0: (c:'_000'..'_077');
1:(m: bitset);
2:(i:integer);
22:(r: real);
23:(a: alfa);
        24:(b:boolean);
3:(p:@word);
32:(r2:@varDescr);
        4:(k: packed array [1..2] of insn) ;
        6:(pck:varAttrs)
    end;


Как с этим работать? Т.е. понимать что туда записано? Это просто аналог "свалки" C union? зачем тогда числа 0,1...22..32, они где-то хранятся ??? 

пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal

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

unread,
Apr 1, 2025, 9:10:10 AMApr 1
to be...@googlegroups.com


1 апр. 2025 г., в 14:08, Alex Loktionoff <oxy...@gmail.com> написал(а):

Еще одна "фича" паскаля повергла меня в ступор:
    word = record
case integer of
0: (c:'_000'..'_077');
1:(m: bitset);
2:(i:integer);
22:(r: real);
23:(a: alfa);
        24:(b:boolean);
3:(p:@word);
32:(r2:@varDescr);
        4:(k: packed array [1..2] of insn) ;
        6:(pck:varAttrs)
    end;


Как с этим работать? Т.е. понимать что туда записано? Это просто аналог "свалки" C union?

именно. 
зачем тогда числа 0,1...22..32,
чтобы знать при обращении в данном конкретном случае какая интерпретация данных нужна.
они где-то хранятся ??? 

нет, конечно, они используются только во время трансляции.


пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/f18eee00-e143-431a-a299-b04953e68ae3n%40googlegroups.com.

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

unread,
Apr 1, 2025, 9:11:42 AMApr 1
to be...@googlegroups.com


1 апр. 2025 г., в 16:09, Василий Долматов <vdol...@gmail.com> написал(а):



1 апр. 2025 г., в 14:08, Alex Loktionoff <oxy...@gmail.com> написал(а):

Еще одна "фича" паскаля повергла меня в ступор:
    word = record
case integer of
0: (c:'_000'..'_077');
1:(m: bitset);
2:(i:integer);
22:(r: real);
23:(a: alfa);
        24:(b:boolean);
3:(p:@word);
32:(r2:@varDescr);
        4:(k: packed array [1..2] of insn) ;
        6:(pck:varAttrs)
    end;


Как с этим работать? Т.е. понимать что туда записано? Это просто аналог "свалки" C union?

именно. 
зачем тогда числа 0,1...22..32,
чтобы знать при обращении в данном конкретном случае какая интерпретация данных нужна.
они где-то хранятся ??? 

нет, конечно, они используются только во время трансляции.
а может и вообще не используются… просто задействовали уже имеющуюся языковую конструкцию, чтобы не плодить вторую. 

Leo B.

unread,
Apr 1, 2025, 10:42:34 AMApr 1
to БЭСМ-6
Первоначальное назначение конструкции - вариантный тип (tagged union). Определяющее поле объявлялось в заголовке case в стандартном стиле "имя : тип",
как в примере в статье.  Значения определяющих полей - их может быть больше одного, т. к. вариантные части могут быть разной длины и могут быть вложенными - используются в стандартной процедуре new для указания желаемого размера структуры .

Потом еще сам Вирт понял, что бывает удобно иметь вариантный тип без явного определяющего поля внутри структуры. Для этого стали разрешать в заголовке case указывать просто тип, а остальной синтаксис остался тем же.

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

Leo

Alex Loktionoff

unread,
Apr 1, 2025, 12:55:02 PMApr 1
to БЭСМ-6
Что-то немого взять указатель ни от целого ни от элемента массива.
Помогите пожалуста.

  0 program main()

  1 var

  2     x: integer;

  3     ptr: @integer;

  4 begin

  5     ptr := @x;

  6 end.


pascompl tst-ptr.pas tst-ptr.obj

Error 103:  Required token not found:  SEMICOLON 

 00001    2  1 var

       ^^^^^     0

Error 12: Bad symbol 

 00002    6  2     ptr := @x;

       ^^^^^              0

 IN 7 LINES 2 ERRORS

make: *** [tst-ptr.obj] Error 1


пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal

Leo Broukhis

unread,
Apr 1, 2025, 12:59:44 PMApr 1
to be...@googlegroups.com
Тщательнее надо быть.
Во-первых, в скобках после main обязательно указание output (зачем-то, даже если write не используется).
Во-вторых, после закрывающей скобки нужна точка с запятой - собственно, это очевидно из диагностики.
В-третьих, синтаксис взятия указателя вовсе не такой, как кажется.

program main(output); 
var x:integer; ptr: @integer;
begin
    ptr := ref(x);
end.


 

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/79b95b70-453f-45c3-8571-47621f9aa203n%40googlegroups.com.

Alex Loktionoff

unread,
Apr 1, 2025, 1:05:43 PMApr 1
to БЭСМ-6
Да, таки поддерживается gcc, но не clang :(
Я уже начал привязываться к LLVM С API, посмотрел как бы в прицепе это выглядело в IR. Взял clang++ и пример с лямбдой с захватом всего по ссылке. Ну и он нагенерил создание указателей и передачу каждой отдельной переменной как параметр - мрак :(
Оно конечно если инлайниться потом, то все Ок. Но все-равно нерациональность, сначала напрягать фронтенд чтоб все переменные найти и нагенерить структур и параметров функций, а потом еще и Мидлендс оптимизатор напрягать чтоб то все разсосать.
Но в сухом остатке если вложенные функции будут инлайниться, то разницы в вызове внешней функции или вложенной нет.
Но вот кроме размера, а для БЭСМ6 размер как раз и имеет значение.
Вот думаю как IR можно разширить, чтоб добавить поддержку вложенных функций, если они вызываются по несколько раз в родительской функции это имеет смысл.

понедельник, 31 марта 2025 г. в 23:37:10 UTC+2, serge.v...@gmail.com:

Alex Loktionoff

unread,
Apr 1, 2025, 1:33:17 PMApr 1
to БЭСМ-6


вторник, 1 апреля 2025 г. в 00:28:42 UTC+2, Leo B.:
On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.

Не совсем. При (*=P-,T-,S8*) вполне неплохо получается.
Так точно, код в разы лучше. Я еще выключаю ввод/вывод, чтоб меньше было мусора и легче было разобраться. 
 
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.

Прыжки в конец-в начало исключительно для главной программы. Все нормальные функции вполне линейные. Сохранение/восстановление регистров служебными функциями - вполне в стиле сишных CSAV/CRET.
 
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?

В частности, на нем была написана система кросс-разработки Э1-КБ (ассемблер+загрузчик), по крайней мере одна общесистемная программа ОС Диспак (приказ выдачи состояния системы ПАК); а также системные программы для служебного пользования.
Да, похоже для утилит пользовательского уровня /*не ядра*/, там где вычислительная мощь не важна.
Компиляторы можно, но для компиляторов все-же С лучше подошел, быстрее бы работал, на сколько быстрее вопрос открытый.
 
 
Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.

Не для вычислительных циклов Паскаль был предназначен.
Согласен!
 
Но вызовы внутренних функций могут быть быстрее, чем в фортране.
Для системных программ не годиться - у него нет типов данных для индексных регистров. 

Конструкция WITH устанавливает адрес указанного L-выражения, ссылающегося на структуру, на регистр, после чего все поля этой структуры адресуются очень дешево,
и, главное, компактно по размеру кода.
Да, интересно проверить. Наверно в ФОРТРАНЕ это невозможно, если не считать COMMON блоки.
 
Компилятор этим пользуется во многих местах. Опять же, если производительность не очень критична, то фактор эффективности разработки оказывается превалирующим.
Понятно.

Leo

Alex Loktionoff

unread,
Apr 1, 2025, 1:43:24 PMApr 1
to БЭСМ-6
вторник, 1 апреля 2025 г. в 00:28:42 UTC+2, Leo B.:
On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.

Не совсем. При (*=P-,T-,S8*) вполне неплохо получается.

Leo

Так точно:

(*=p-,t-,s8,y+*)

program main();

const

    xmin = 0;

    xmax = 9;

var

    x,y: integer;

    ary: array [xmin..xmax] of integer;


procedure PRINTE(b,e,m,n:@integer); EXTERNAL;


begin

    y:=0;


    for x:=xmin to xmax do

    begin

        y:=y + (x + x)  + 1;

        ary[x]:=y;

    end;


    x := xmax + 1;

    y := 3;

    PRINTE(ref(ary[xmin]),ref(ary[xmax]), ref(x), ref(y));

end.


шифр 419999 зс5^

лен 67(2148)^

eeв1а3

*name tst-for.madlen

*call yesmemory

*system

*full list

*madlen,l=fgr.

 MAIN    :  , NAME, NEW DTRAN

C Commands        :    24

C Constants       :     6

C BSS             :     0

C Memory size     :    32

C Header          :     1

C Symbols         :    13

C Long symbols    :     2

C Debug           :     0

C Data            :     0

C  +set           :     0

C Object file len :    64

C Sym.tab. offset :    46

 P/1D    :  , LC  ,52

 *OUTPUT*:  , LC  ,30

 GAK/5   :  , EQU ,P/1D    +42

 GAK/6   :  , EQU ,P/1D    +51

 GAK/7   :  , EQU ,P/1D    +40

 GAL/0   :  , EQU ,P/1D    +41

 PRINTE  :  , SUBP,

 P/E     :  , SUBP,

 P/1     :  , SUBP,

           8, VTM ,*0024B

            , UJ  ,*0022B

 *0001B  : 8, XTA ,1

           1, ATX ,51B

           8, XTA ,1

            , UJ  ,*0010B

 *0003B  : 1, XTA ,50B

           1, A+X ,50B

           1, A+X ,51B

           8, A+X ,3

           1, ATX ,51B

           1, XTA ,51B

           1, WTC ,50B

           1, ATX ,52B

           1, XTA ,50B

           1, A+X ,21B

 *0010B  : 1, ATX ,50B

           8, X-A ,2

            , UZA ,*0003B

           8, XTA ,4

           1, ATX ,50B

           8, XTA ,5

           1, ATX ,51B

          15, UTM ,3

          14, VTM ,GAK/5

            , ITA ,14

          14, VTM ,GAK/6

            , ITS ,14

          14, VTM ,GAK/7

            , ITS ,14

          14, VTM ,GAL/0

            , ITS ,14

          13, VJM ,PRINTE  

           8, VTM ,*0024B

            , UJ  ,P/E     

 *0022B  :14, VJM ,P/1     

            , UJ  ,*0001B

 *0024B  :  , LOG ,4000000000000001

            , INT ,0

            , INT ,9

            , INT ,1

            , INT ,10

            , INT ,3

            , END ,

*perso:670440,cont

*no load list

*main main

*execute

*end file

``````

еконец

 

Alex Loktionoff

unread,
Apr 1, 2025, 1:50:05 PMApr 1
to БЭСМ-6
Интересно, а что означают P/1D GAK/x GAL/x ?

вторник, 1 апреля 2025 г. в 19:43:24 UTC+2, Alex Loktionoff:
вторник, 1 апреля 2025 г. в 00:28:42 UTC+2, Leo B.:
On Monday, March 31, 2025 at 1:57:16 PM UTC-7 oxy...@gmail.com wrote:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.

Не совсем. При (*=P-,T-,S8*) вполне неплохо получается.

Leo

Так точно:

(*=p-,t-,s8,y+*)

program main();

const

    xmin = 0;

    xmax = 9;

var

    x,y: integer;

    ary: array [xmin..xmax] of integer;


procedure PRINTE(b,e,m,n:@integer); EXTERNAL;


... 

... 

Alex Loktionoff

unread,
Apr 1, 2025, 1:57:39 PMApr 1
to БЭСМ-6
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static.  У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором.  А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.
и очень дешево, да… 
я про паскаль-автокод сейчас, в мониторе приходилось лавировать между соглашениями мс дубна еще, 
а в автокоде все просто - 

стек головной программы индексируется ИР1, функции первого уровня вложенности - ИР2, второго - ИР3 и так далее… 

дальше 3-го в джине не заходили, нужды не было, а вот мелкие процедурки 3-го уровня, которые даже своего стека переменных не имели, а работали исключительно с данными родительской процедуры -
это использовалось часто. и код получался эффективный :)

Я полагаю, что можно сделать так, чтоб вложенная функция обращалась по указателю фрейма, родительской, это будет еще дешевле.
Только это имеет смысл если вложенные функции желательно без параметров /*  inner(void) */ и многократно используются в коде родительской. Иначе инлайнинг внешних функций сделает такой-же код только без дополнительных заморочек.

Leo B.

unread,
Apr 1, 2025, 2:52:04 PMApr 1
to БЭСМ-6
Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
GAK/nn и пр - это символические имена для безымянных элементов таблицы символов, которые описывают одно перемещаемое выражение как другое плюс константа.

Alex Loktionoff

unread,
Apr 1, 2025, 2:55:56 PMApr 1
to БЭСМ-6


- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.
Н.Вирт «Систематическое программирование. Введение». 

на Б-6 - именно такая работа с файлами и была. 

Спасибо за наводку, скачал PDF и вся 10-я глава про классический последовательный файловый доступ.
А то все мои поиски GET/PUT PASCAL в Гугл сводились к статьям "В Turbo Pascal не реализован классический метод доступа к файлам GET/PUT" :D
Думаю кому-то тоже пригодиться
 

А так - и в том и в том варианте Паскаля - файлы исходно и  есть «просто буферы в памяти», если их ни к чему не привязать через параметры PROGRAM().

Вот это мне интересно попробовать - читать/писать без файла на диске. Интересно могла ли программа таким образом обмениваться данными с другой, поместить "файл" в COMMON блок ? 
Этого в труба паскале небыли как класса.
 
dol@


Alex Loktionoff

unread,
Apr 1, 2025, 3:02:22 PMApr 1
to БЭСМ-6
Ну тогда P/1D это получается "глобальные Dданные  Pпаскаля 1го уровня вложенности" я правильно декодировал?
А то что это экспортируется и импортируется как "COMMON", это не приведет к clashing с соседней запущеной программой?
Или после запуска обьектника никакой динамической линковки не предусматривалось? То есть lazy/dynamic  loading ?  

вторник, 1 апреля 2025 г. в 20:52:04 UTC+2, Leo B.:

Leo B.

unread,
Apr 1, 2025, 5:50:12 PMApr 1
to БЭСМ-6
On Tuesday, April 1, 2025 at 12:02:22 PM UTC-7 oxy...@gmail.com wrote:
Ну тогда P/1D это получается "глобальные Dданные  Pпаскаля 1го уровня вложенности" я правильно декодировал?
А то что это экспортируется и импортируется как "COMMON", это не приведет к clashing с соседней запущеной программой?

Что такое "соседняя" запущенная программа? На БЭСМ-6 была виртуальная память, каждая программа исполнялась в отдельном адресном пространстве.
 
Или после запуска обьектника никакой динамической линковки не предусматривалось? То есть lazy/dynamic  loading ?  

Предусматривалось, см. LOADGO у Мазного. Для программ, запускаемых динамической линковкой, это означало долинковать указанный модуль и передать на него управление.
При сборке оверлеев та же процедура означала подгрузку оверлея.

Leo

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

unread,
Apr 2, 2025, 2:45:56 AMApr 2
to be...@googlegroups.com


1 апр. 2025 г., в 20:57, Alex Loktionoff <oxy...@gmail.com> написал(а):


С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?

Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static.  У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором.  А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.
и очень дешево, да… 
я про паскаль-автокод сейчас, в мониторе приходилось лавировать между соглашениями мс дубна еще, 
а в автокоде все просто - 

стек головной программы индексируется ИР1, функции первого уровня вложенности - ИР2, второго - ИР3 и так далее… 

дальше 3-го в джине не заходили, нужды не было, а вот мелкие процедурки 3-го уровня, которые даже своего стека переменных не имели, а работали исключительно с данными родительской процедуры -
это использовалось часто. и код получался эффективный :)

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

Только это имеет смысл если вложенные функции желательно без параметров /*  inner(void) */ и многократно используются в коде родительской.
нет. в том и смысл, что у них возможен свой стек, который проиндексирован по следующему по порядку индекс-регистру.
при этом доступ к «своим» переменным и переменным «папы» - одинаков и по времени и по стилю.

а почему не использовали «свои» переменные в процедурах 3-го уровня?
потому что они как правило не нужны, вполне можно записать необходимые структуры у «папы»… и пользоваться ими...
доступ-то к ним по всем параметрам идентичен :)

Иначе инлайнинг внешних функций сделает такой-же код только без дополнительных заморочек.
какой инлайнинг? откуда? не было там никакого инлайнинга внешних функций.
:) 



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

unread,
Apr 2, 2025, 2:58:09 AMApr 2
to be...@googlegroups.com


1 апр. 2025 г., в 21:52, Leo B. <leo...@gmail.com> написал(а):

Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.

константы там вроде отдельно лежат.

а так:

P1/D - Data

есть предположение, что если в программе нарисовать еще пару функций, то появятся и P2, P3 

;)

GAK/nn и пр - это символические имена для безымянных элементов таблицы символов, которые описывают одно перемещаемое выражение как другое плюс константа.
и появляются потому что передаются _ссылки_ во внешнюю процедуру… 
что из этого триггер: «ссылка» или «внешняя процедура» - сие мне неведомо, но легко проверяется. :)

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/741ee92b-8e58-4423-8f35-415388013f3fn%40googlegroups.com.

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

unread,
Apr 2, 2025, 3:01:21 AMApr 2
to be...@googlegroups.com


1 апр. 2025 г., в 21:55, Alex Loktionoff <oxy...@gmail.com> написал(а):

файл вроде как можно было передавать как параметр (по наименованию!) в функцию… он при этом как раз становился «общим». 

вот возвращать тип «файл» функция точно не могла.

Leo Broukhis

unread,
Apr 2, 2025, 4:15:05 AMApr 2
to be...@googlegroups.com
On Tue, Apr 1, 2025 at 11:58 PM Василий Долматов <vdol...@gmail.com> wrote:
1 апр. 2025 г., в 21:52, Leo B. <leo...@gmail.com> написал(а):

Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
константы там вроде отдельно лежат.

Как ты думаешь, если я компилятор декомпилировал, то мне, наверное, лучше знать, о чем я говорю, и чем отличаются просто константы от общеупотребительных констант? А именно, вон сколько всякой всячины рассылается в начало P/1D, а собственно глобальные переменные начинаются с P/1D+40

                , data,
 /0026b  :      , log ,
                , iso , 6h000000
                , log , 1
                , int , 0
                , oct , 24
                , log , 7757 7777 7777 7777
                , log , 17 7777 7777 7777
                , log , 2650 3067 5720 2661
                , oct , 405
                , int , -1
                , log , 7 7777
                , int , 1
                , log , 3407 0160 3407
                , oct , 401
                , log , 7777 7777 7777 7777
                , oct , 4
                , log , 17 7777 7777 7700
 /0047b  :      , log , 7 6000
                , oct , 1
 /0051b  :      , log , 1
            17  , set , /0026b
            1   ,     , P/1D+6
            2   , set , /0047b
            1   ,     , P/1D+27


а так:
P1/D - Data
есть предположение, что если в программе нарисовать еще пару функций, то появятся и P2, P3 

Зачем делать предположения, которые проверяются и опровергаются тривиальным образом? Не делает компилятор ничего подобного.
 
GAK/nn и пр - это символические имена для безымянных элементов таблицы символов, которые описывают одно перемещаемое выражение как другое плюс константа.
и появляются потому что передаются _ссылки_ во внешнюю процедуру… 
что из этого триггер: «ссылка» или «внешняя процедура» - сие мне неведомо, но легко проверяется. :)

Нет, появляются они потому, что так сформирован объектный модуль, и никакие внешние имена не обязаны участвовать в этом перемещаемом выражении. Например, компилятор порождает элементы таблицы символов вида
 GAL/5:,EQU,*23444+16
при построении рассылок данных. *23444 - это перемещаемая метка, 023444 слова от начала программы. Понятно, что можно вместо этой суммы сразу сформировать перемещаемую метку *23464, и почему Пирин заставляет загрузчик делать лишнюю работу, неясно, но как сделано, так сделано.

 Leo

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

unread,
Apr 2, 2025, 7:21:04 AMApr 2
to be...@googlegroups.com
константы - я вижу вот тут…

*0024B  :  , LOG ,4000000000000001

            , INT ,0

            , INT ,9

            , INT ,1

            , INT ,10

            , INT ,3


а «блок данных» - он вот тут


P/1D    :  , LC  ,52




2 апр. 2025 г., в 11:14, Leo Broukhis <le...@mailcom.com> написал(а):

On Tue, Apr 1, 2025 at 11:58 PM Василий Долматов <vdol...@gmail.com> wrote:
1 апр. 2025 г., в 21:52, Leo B. <leo...@gmail.com> написал(а):

Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
константы там вроде отдельно лежат.

Как ты думаешь, если я компилятор декомпилировал, то мне, наверное, лучше знать, о чем я говорю, и чем отличаются просто константы от общеупотребительных констант? А именно, вон сколько всякой всячины рассылается в начало P/1D, а собственно глобальные переменные начинаются с P/1D+40

а вот «всячина» эта в программе не видно, чтобы использовалась. 

что туда когда и где напихали - тайна сия великая есть :)

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CAFmvRsc2KKH9O9Ozu6gQj33Ht4q4pTG%2BEisfMbN-WsgicfgJKQ%40mail.gmail.com.

Leo B.

unread,
Apr 2, 2025, 11:58:47 AMApr 2
to БЭСМ-6
On Wednesday, April 2, 2025 at 4:21:04 AM UTC-7 ReedCat wrote:

а вот «всячина» эта в программе не видно, чтобы использовалась. 

что туда когда и где напихали - тайна сия великая есть :)

Я тебя умоляю.  Мало того, что компилятор использует многие, так и все библиотечные функции. Не таскать же эти константы
внутри каждой функции и обращаться через МОДА. А так они всегда доступны по известным смещениям от регистра 1.

                , data,
 /0026b  :      , log ,  
                , iso , 6h000000            - ISO нули - для MAPIA
                , log , 1                   - для отрицания булевских значений
                , int , 0                   - ноль с целым порядком, для ORD
                , oct , 24                  - для гашения лишних разрядов в порядке перед умножением
                , log , 7757 7777 7777 7777 - все кроме знака мантиссы, используется в библиотеке
                , log , 17 7777 7777 7777   - мантисса, для CHR
                , log , 2650 3067 5720 2661 - 1
⏨-6, для сравнения вещественных (в инструкции обещали в common PASFUZZ, но нет)
                , oct , 405                 - 1.0
                , int , -1                  - минус один
                , log , 7 7777              - маска младших 15 рр.
                , int , 1                   - плюс один
                , log , 3407 0160 3407      - маска для MAPIA
                , oct , 401                 - 0.5, для ROUND
                , log , 7777 7777 7777 7777 - всеед
                , oct , 4                   - для чего-то библиотечного
                , log , 17 7777 7777 7700   - -- "" --
 /0047b  :      , log , 7 6000              - NIL
                , oct , 1                   - E48

            17  , set , /0026b
            1   ,     , P/1D+6
            2   , set , /0047b
            1   ,     , P/1D+27

Leo 

Alex Loktionoff

unread,
Apr 2, 2025, 3:10:08 PMApr 2
to БЭСМ-6
Согласен с lazy load я переборщил, но.
Ведь в персональной библиотеке могут быть _тоже_ поскалевские обьектники, которые экспортируют и импортируют P/1D со своим layout. В ФОРТРАНе например layout переменных в COMMON блоке всех модулей должны совпадать иначе будет каша из данных.
А тут или P/1D не COMMON блок, а секция, в которую загрузчик складывает последовательно все переменные со всех модулей, или я ничего не понимаю :)
Так P/1D это секция или COMMON блок? Где я пропустил разницу в тексте Мадлен ?  

вторник, 1 апреля 2025 г. в 23:50:12 UTC+2, Leo B.:

Alex Loktionoff

unread,
Apr 2, 2025, 3:14:49 PMApr 2
to БЭСМ-6
Только это имеет смысл если вложенные функции желательно без параметров /*  inner(void) */ и многократно используются в коде родительской.
нет. в том и смысл, что у них возможен свой стек, который проиндексирован по следующему по порядку индекс-регистру.
при этом доступ к «своим» переменным и переменным «папы» - одинаков и по времени и по стилю.

а почему не использовали «свои» переменные в процедурах 3-го уровня?
потому что они как правило не нужны, вполне можно записать необходимые структуры у «папы»… и пользоваться ими...
доступ-то к ним по всем параметрам идентичен :)

Иначе инлайнинг внешних функций сделает такой-же код только без дополнительных заморочек.
какой инлайнинг? откуда? не было там никакого инлайнинга внешних функций.
:)
 Это я теоретически рассуждаю про современную реализацию в своем или llvm компиляторе.
 Смысл и выигрыш от вложенных функции теперь был-бы только если они многократно переиспользубтся/вызываются, иначе инланинг обычных функций делает код ни чуть не хуже производительностью.
 


Leo B.

unread,
Apr 2, 2025, 6:40:58 PMApr 2
to БЭСМ-6
On Wednesday, April 2, 2025 at 12:10:08 PM UTC-7 oxy...@gmail.com wrote:
Согласен с lazy load я переборщил, но.
Ведь в персональной библиотеке могут быть _тоже_ поскалевские обьектники, которые экспортируют и импортируют P/1D со своим layout. В ФОРТРАНе например layout переменных в COMMON блоке всех модулей должны совпадать иначе будет каша из данных.

В библиотеке могло быть сколько угодно паскалевских объектников, каждый со своим  P/1D произвольного размера. Если они запускаются по одному, никаких проблем это не вызывает.

А если Паскаль-программа вызывает внешние Паскаль-подпрограммы из другого объектного модуля, то см. инструкцию, в которой это уже разжёвано:

Вызов внешней процедуры/функции ничем не отличается от стандартного вызова, однако для правильного использования необходимо соответствие статических уровней описания, числа параметров, их типа и внешних используемых переменных.
(Вообще говоря, необходимо совпадение областей переменных в обеих программах, или в вызываемой программе соответствующая область должна быть пустой. Имеются в виду собственные переменные программы).
Несоответствие указанных объектов ведёт к ошибкам во время выполнения программы.


А тут или P/1D не COMMON блок, а секция, в которую загрузчик складывает последовательно все переменные со всех модулей, или я ничего не понимаю :)
Так P/1D это секция или COMMON блок? Где я пропустил разницу в тексте Мадлен ?  

Это COMMON блок. Но благодаря его использованию можно назначать смещения в нем для глобальных/статических переменных по ходу компиляции, и записывать окончательную длину этого блока в объектный модуль только в конце компиляции.
Слово "имитация" в моем посте было не случайным.
 
Leo

Alex Loktionoff

unread,
Apr 3, 2025, 3:50:25 PMApr 3
to БЭСМ-6
Да, не зря я эту тему начал. Есть своя специфика паскаля на БЭСМ6.
Получается проблему наложения глобальных переменных как раз решали с помощью подфункций?
Поесть если твоя программа единственная, то объявляй глобальные переменные.
В библиотеках на паскале лучше глобальных переменных не объявлять, чтоб избегать проблем.
Ну или взять дисциплину, и вручную во всех модулях следить, чтоб объявления были 1:1, тогда можно делиться данными через глобальные переменные, но для паскаля это как-то не камельфо.

Вот теперь мойпример с подфункцией без глобальных переменных:

  0 (*=p-,t-,s8,y+*)

  1 program main();

  2 procedure PRINTE(b,e,m,n:@integer); EXTERNAL;

  3 

  4     procedure squares;

  5     const

  6         xmin = 0;

  7         xmax = 9;

  8     var

  9         (*pastel: array [0..30B] of integer;*)

 10     x,y: integer;

 11     ary: array [xmin..xmax] of integer;

 12     begin

 13         y:=0;

 14         for x:=xmin to xmax do

 15         begin

 16             y:=y + (x + x)  + 1;

 17             ary[x]:=y;

 18         end;

 19         x := xmax + 1;

 20         y := 3;

 21         PRINTE(ref(ary[xmin]),ref(ary[xmax]), ref(x), ref(y));

 22     end;

 23 

 24 begin

 25     squares;

 26 end.


шифр 419999 зс5^

лен 67(2148)^

eeв1а3

*name tst-for.madlen

*call yesmemory

*system

*full list

*madlen,l=fgr.

 MAIN    :  , NAME, NEW DTRAN

C Commands        :    32

C Constants       :     6

C BSS             :     0

C Memory size     :    40

C Header          :     1

C Symbols         :    10

C Long symbols    :     2

C Debug           :     0

C Data            :     0

C  +set           :     0

C Object file len :    67

C Sym.tab. offset :    54

 P/1D    :  , LC  ,40

 *OUTPUT*:  , LC  ,30

 P/2     :  , SUBP,

 PRINTE  :  , SUBP,

 P/E     :  , SUBP,

 P/1     :  , SUBP,

           8, VTM ,*0032B

            , UJ  ,*0030B

 *0001B  :14, VJM ,P/2     

          15, UTM ,15B

           8, XTA ,1

           2, ATX ,4

           8, XTA ,1

            , UJ  ,*0012B

 *0005B  : 2, XTA ,3

           2, A+X ,3

           2, A+X ,4

           8, A+X ,3

           2, ATX ,4

           2, XTA ,4

           2, WTC ,3

           2, ATX ,5

           2, XTA ,3

           1, A+X ,21B

 *0012B  : 2, ATX ,3

           8, X-A ,2

            , UZA ,*0005B

           8, XTA ,4

           2, ATX ,3

           8, XTA ,5

           2, ATX ,4

          15, UTM ,3

           2, UTC ,5

          14, VTM ,

            , ITA ,14

           2, UTC ,16B

          14, VTM ,

            , ITS ,14

           2, UTC ,3

          14, VTM ,

            , ITS ,14

           2, UTC ,4

          14, VTM ,

            , ITS ,14

          13, VJM ,PRINTE  

           7, MTJ ,2

           8, VTM ,*0032B

            , UJ  ,P/E     

 *0027B  :13, VTM ,P/E     

            , UJ  ,*0001B

 *0030B  :14, VJM ,P/1     

            , UJ  ,*0027B

 *0032B  :  , LOG ,4000000000000001

            , INT ,0

            , INT ,9

            , INT ,1

            , INT ,10

            , INT ,3

            , END ,

*perso:670440,cont

*no load list

*main main

*execute

*end file

``````

еконец


 LIВRАRУ ОТ  26.02.82 М3

           *NО LОАD LISТ

           *МАIN МАIN

           *ЕХЕСUТЕ

 +100e+01  +400e+01  +900e+01  +160e+02  +250e+02  +360e+02  +490e+02  +640e+02  +810e+02  +100e+03

 КОНЕЦ ЗАДАЧИ

 00411: 00 074 0000 *74


четверг, 3 апреля 2025 г. в 00:40:58 UTC+2, Leo B.:
On Wednesday, April 2, 2025 at 12:10:08 PM UTC-7 oxy...@gmail.com wrote:
Согласен с lazy load я переборщил, но.
Ведь в персональной библиотеке могут быть _тоже_ поскалевские обьектники, которые экспортируют и импортируют P/1D со своим layout. В ФОРТРАНе например layout переменных в COMMON блоке всех модулей должны совпадать иначе будет каша из данных.

В библиотеке могло быть сколько угодно паскалевских объектников, каждый со своим  P/1D произвольного размера. Если они запускаются по одному, никаких проблем это не вызывает.

А если Паскаль-программа вызывает внешние Паскаль-подпрограммы из другого объектного модуля, то см. инструкцию, в которой это уже разжёвано:

Вызов внешней процедуры/функции ничем не отличается от стандартного вызова, однако для правильного использования необходимо соответствие статических уровней описания, числа параметров, их типа и внешних используемых переменных.
(Вообще говоря, необходимо совпадение областей переменных в обеих программах, или в вызываемой программе соответствующая область должна быть пустой. Имеются в виду собственные переменные программы).
Несоответствие указанных объектов ведёт к ошибкам во время выполнения программы.

Спасибо!

Leo B.

unread,
Apr 3, 2025, 4:08:26 PMApr 3
to БЭСМ-6
On Thursday, April 3, 2025 at 12:50:25 PM UTC-7 oxy...@gmail.com wrote:
Да, не зря я эту тему начал. Есть своя специфика паскаля на БЭСМ6.
Получается проблему наложения глобальных переменных как раз решали с помощью подфункций?
Поесть если твоя программа единственная, то объявляй глобальные переменные.
В библиотеках на паскале лучше глобальных переменных не объявлять, чтоб избегать проблем.

Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,
что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"

А "приватные" statics  в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.
Тогда они попадали не в  P/1D, а в отдельные common-блоки.

Ну или взять дисциплину, и вручную во всех модулях следить, чтоб объявления были 1:1, тогда можно делиться данными через глобальные переменные, но для паскаля это как-то не камельфо.

"Comme il faut " традиционно передается по-русски как "кОмИльфо". К верблюдам отношения не имеет.

Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.
Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна. 


Вот теперь мойпример с подфункцией без глобальных переменных:

Для честного теста процедуру squares нужно было объявить с псевдокомментарием (*=E+*), а в другой отдельно написанной программе объявить как EXTERNAL и вызвать оттуда.
 
Leo

Alex Loktionoff

unread,
Apr 4, 2025, 3:03:57 PMApr 4
to БЭСМ-6
Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,
что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"

А "приватные" statics  в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.
Тогда они попадали не в  P/1D, а в отдельные common-блоки.
Можно фрагмент кода, пожалуйста? Как в библиотеках на Паскале создавать свои COMMON блоки и какие имена им присваивал компилятор?  
 
Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.
Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна. 
А вот это становиться совсем интересно. В Turbo-Pascal была возможность перегрузки библиотек - оверлеев, которые грузились в те-же адреса. Но вот перегружать всю программу это как? Причем, чтоб P/1D данные сохранялись по тем же адресам.
Для этого уже были helper-functions в библиотеке Паскаля, какие?

Leo B.

unread,
Apr 4, 2025, 3:48:41 PMApr 4
to БЭСМ-6
On Friday, April 4, 2025 at 12:03:57 PM UTC-7 oxy...@gmail.com wrote:
Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,
что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"

А "приватные" statics  в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.
Тогда они попадали не в  P/1D, а в отдельные common-блоки.
Можно фрагмент кода, пожалуйста? Как в библиотеках на Паскале создавать свои COMMON блоки и какие имена им присваивал компилятор?  

program main(output, block);
var block: record ...... end;
....
Создаст common c именем *BLOCK*, совместимым с COMMON /BLOCK/ в Фортране. Тж. см. псевдокомментарии  S0-S3 в инструкции.

Обратиться из Паскаля к "безымянному" фортрановскому common-блоку (в таблице загрузки - **) было невозможно.
 
 
Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.
Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна. 
А вот это становиться совсем интересно. В Turbo-Pascal была возможность перегрузки библиотек - оверлеев, которые грузились в те-же адреса. Но вот перегружать всю программу это как? Причем, чтоб P/1D данные сохранялись по тем же адресам.

Сейчас придёт Василий и расскажет точнее, но механизм такой:
- Рантайм-библиотека Паскаля жила в верхних адресах памяти (37-й лист, 76000-77777). Также в верхних адресах находились I/O буфера.
- С помощью этих буферов сохранялся ("на барабан") желаемый диапазон слов. В имеющихся программах сохраняемый диапазон меньше размера буфера, поэтому реальный обмен с барабаном не производится.
- Была библиотечная процедура, которая читала указанное количество зон с указанного места в нижние адреса памяти, не портя верхние адреса с буферами и рантаймом, и передавала управление на начало. Новая программа должна была сама вызвать процедуру восстановления диапазона глобальных переменных.

Вот и всё. Можно, конечно, считать, что это было сохранение-восстановление одного идентично объявленного объекта.

Для этого уже были helper-functions в библиотеке Паскаля, какие?

Это надо смотреть в декомпилированном коде программ на Паскале-Автокоде. Например, в базе данных КАДРЫ, https://github.com/besm6/kadry-re/blob/main/anketa.pas см. процедуры enter, exec, save, restore. Там делаются вызовы рантайм-библиотеки по фиксированным адресам. 
 
Leo

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

unread,
Apr 5, 2025, 2:02:56 AMApr 5
to be...@googlegroups.com


3 апр. 2025 г., в 23:08, Leo B. <leo...@gmail.com> написал(а):

On Thursday, April 3, 2025 at 12:50:25 PM UTC-7 oxy...@gmail.com wrote:
Да, не зря я эту тему начал. Есть своя специфика паскаля на БЭСМ6.
Получается проблему наложения глобальных переменных как раз решали с помощью подфункций?
Поесть если твоя программа единственная, то объявляй глобальные переменные.
В библиотеках на паскале лучше глобальных переменных не объявлять, чтоб избегать проблем.

Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,
что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"

А "приватные" statics  в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.
Тогда они попадали не в  P/1D, а в отдельные common-блоки.

Ну или взять дисциплину, и вручную во всех модулях следить, чтоб объявления были 1:1, тогда можно делиться данными через глобальные переменные, но для паскаля это как-то не камельфо.

"Comme il faut " традиционно передается по-русски как "кОмИльфо". К верблюдам отношения не имеет.

Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.

Не было такого. как класс… 

Можно пояснить на основании чего был сделан такой вывод?

Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна. 


Вот теперь мойпример с подфункцией без глобальных переменных:

Для честного теста процедуру squares нужно было объявить с псевдокомментарием (*=E+*), а в другой отдельно написанной программе объявить как EXTERNAL и вызвать оттуда.
 
Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/8cdfd39c-5dca-4ecb-81d6-bf7e2047a1d1n%40googlegroups.com.

Alex Loktionoff

unread,
Apr 5, 2025, 3:21:24 AMApr 5
to БЭСМ-6


пятница, 4 апреля 2025 г. в 21:48:41 UTC+2, Leo B.:
On Friday, April 4, 2025 at 12:03:57 PM UTC-7 oxy...@gmail.com wrote:
Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,
что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"

А "приватные" statics  в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.
Тогда они попадали не в  P/1D, а в отдельные common-блоки.
Можно фрагмент кода, пожалуйста? Как в библиотеках на Паскале создавать свои COMMON блоки и какие имена им присваивал компилятор?  

program main(output, block);
var block: record ...... end;
....
Создаст common c именем *BLOCK*, совместимым с COMMON /BLOCK/ в Фортране. Тж. см. псевдокомментарии  S0-S3 в инструкции.

Обратиться из Паскаля к "безымянному" фортрановскому common-блоку (в таблице загрузки - **) было невозможно.
 
Сейчас, пришла мысль, что если посмотреть с другой стороны, поесть вывернуть на изнанку, то проблема не с конфликтом глобальных переменных в С, а наоборот в ограниченном количестве возможных экспортов. Но для этого БЕСМ6 С компиляторе можно принять флаг по умолчанию -fvisibility=hidden . А в программах для экспортируемых структур явно писать __attribute__((visibility("default")). Для портирования С библиотек со множеством экспортируемых функций можно применить подход Amiga, там на всю библиотеку достаточно экспортировать только базу. В целом портабелльно.  
 
Leo

Leo Broukhis

unread,
Apr 5, 2025, 10:43:22 AMApr 5
to be...@googlegroups.com
On Fri, Apr 4, 2025 at 11:02 PM Василий Долматов <vdol...@gmail.com> wrote:

Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.

Не было такого. как класс… 

Можно пояснить на основании чего был сделан такой вывод?

Да на основании декомпиляции, родимой. Например в https://github.com/besm6/kalah-re/blob/master/kalah.pas
строка 2716 
_procedure P12450(_var f:text; _var i:integer; j:integer); _( code(ПБ76022=,); _);
вызывается из "exec"
P12450(tempfile, gl72z, (76C) );
 сохраняя 62(10) ячейки глобальных переменных, начиная с gl72z,
а строка 2725
_procedure P12473(_var f:text; _var i:integer; j:integer); _( code(ПБ76021=); _);
вызывается из P12501 
P12473(tempfile, gl72z, (76C) );
а P12501 в свою очередь вызывается однажды в самом начале программы сразу после проверки на ТАМБОВ.

Leo

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

unread,
Apr 5, 2025, 10:50:21 AMApr 5
to be...@googlegroups.com
Так из чего сделан вывод, что «перезагружаемые блоки в Паскаль-Автокоде видят одни и те же глобальные переменные и на этой возможности была построена вся система Джин»?

В Паскаль-автокоде таких средств не было. 

Все сохранения делал Кобелев, запихнув в найденные им свободные места в административке Пульта, пару мелких процедурок save/restore… и вот на этих собственных процедурах как раз и «построена вся система Джин».

5 апр. 2025 г., в 17:43, Leo Broukhis <le...@mailcom.com> написал(а):

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

Alex Loktionoff

unread,
Apr 5, 2025, 3:23:36 PMApr 5
to БЭСМ-6
Пролейте свет пожалуйста почему GAK а иногда GAL?

вторник, 1 апреля 2025 г. в 20:52:04 UTC+2, Leo B.:
Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.

Leo Broukhis

unread,
Apr 5, 2025, 3:43:24 PMApr 5
to БЭСМ-6



Потому что это порядковые метки. Когда кончаются цифры после К, буква меняется на следующую. Сравните с автомобильными алфавитно-цифровыми номерами. 

Leo
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/eed61221-d9f7-46e9-9922-f18992fd7321n%40googlegroups.com.

Alex Loktionoff

unread,
Apr 12, 2025, 4:54:59 AMApr 12
to БЭСМ-6
Еще одна интересная я бы сказал зубодробительная feature БЭСМ6 паскаля это инициализация COMMON блока данных. Реализована нестандартно для паскаля - текст инициализации идет сразу после точки END. даже без пробелов. Странно, почему не использовали DSS? Поддерживается эта feature видно на уровне объектного файла, я даже встречал в описании МАДЛЕН, но тут в ПАСКАЛЕ хочешь корень квадратный, хот косинус а арктангесом, как это работает уму не растяжимо.


PROGRAM MAIN (OUTPUT);

VAR

    M: ARRAY 1..128 OF INTEGER;

    I: INTEGER;

BEGIN

    FOR I:=1 TO 128 DO

    BEGIN

        WRITELN('[', I,':', M[I],']');

    END

END.DATA

M := 0: 30, ROUND(10*3.14): 30;

M[5] := 5;

M[100] := 0, 5, 7:2

END


[         1:         0]

[         2:         0]

[         3:         0]

[         4:         0]

[         5:         5]

[         6:         0]

[         7:         0]

[         8:         0]

[         9:         0]

[        10:         0]

[        11:         0]

[        12:         0]

[        13:         0]

[        14:         0]

[        15:         0]

[        16:         0]

[        17:         0]

[        18:         0]

[        19:         0]

[        20:         0]

[        21:         0]

[        22:         0]

[        23:         0]

[        24:         0]

[        25:         0]

[        26:         0]

[        27:         0]

[        28:         0]

[        29:         0]

[        30:         0]

[        31:        31]

[        32:        31]

[        33:        31]

[        34:        31]

[        35:        31]

[        36:        31]

[        37:        31]

[        38:        31]

[        39:        31]

[        40:        31]

[        41:        31]

[        42:        31]

[        43:        31]

[        44:        31]

[        45:        31]

[        46:        31]

[        47:        31]

[        48:        31]

[        49:        31]

[        50:        31]

[        51:        31]

[        52:        31]

[        53:        31]

[        54:        31]

[        55:        31]

[        56:        31]

[        57:        31]

[        58:        31]

[        59:        31]

[        60:        31]

[        61:         0]

[        62:         0]

[        63:         0]

[        64:         0]

[        65:         0]

[        66:         0]

[        67:         0]

[        68:         0]

[        69:         0]

[        70:         0]

[        71:         0]

[        72:         0]

[        73:         0]

[        74:         0]

[        75:         0]

[        76:         0]

[        77:         0]

[        78:         0]

[        79:         0]

[        80:         0]

[        81:         0]

[        82:         0]

[        83:         0]

[        84:         0]

[        85:         0]

[        86:         0]

[        87:         0]

[        88:         0]

[        89:         0]

[        90:         0]

[        91:         0]

[        92:         0]

[        93:         0]

[        94:         0]

[        95:         0]

[        96:         0]

[        97:         0]

[        98:         0]

[        99:         0]

[       100:         0]

[       101:         5]

[       102:         7]

[       103:         7]

[       104:         0]

[       105:         0]

[       106:         0]

[       107:         0]

[       108:         0]

[       109:         0]

[       110:         0]

[       111:         0]

[       112:         0]

[       113:         0]

[       114:         0]

[       115:         0]

[       116:         0]

[       117:         0]

[       118:         0]

[       119:         0]

[       120:         0]

[       121:         0]

[       122:         0]

[       123:         0]

[       124:         0]

[       125:         0]

[       126:         0]

[       127:         0]

[       128:         0]


пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.

tst-data.pas-pascal.b6

Alex Loktionoff

unread,
Apr 12, 2025, 5:06:04 AMApr 12
to БЭСМ-6
Еще интересный пример из документации. Я попробовал запустить через  dispak. Я думаю это будет полезно другим "копателям" БЭСМ6 тоже. Почему он не работает, потому что структура записей на диска в ДУБНА другая, или просто на диске распологается в других "зонах"? Можно этот пример адаптировать для ДИСПАК?

PROGRAM MAIN(OUTPUT, KTL);

TYPE

        MH = SET OF 0..47;

        REC = RECORD

                NAME, WHERE: MH

        END;

VAR

        I: INTEGER;

        X: REC;

        KTL: FILE OF REC;

PROCEDURE PASTPR (X: MH); EXTERNAL;

BEGIN

        I := 0;

        READ(KTL, X);

        READ(KTL, X);

        WHILE (X.NAME <> []) OR (X.WHERE <> [0..47]) DO BEGIN

                WRITE(' ');

                PASTPR(X.NAME);

                I := I + 1;

                IF I MOD 10 = 0 THEN

                        WRITELN;

                READ(KTL, X);

        END;

        WRITELN

END.


...


 GЕТ(F) ЕОF=ТRUЕ


         КТL


 РАSСАL РМ DUМР

   3843 SТАСК LЕNGТН.  NАМЕ=    МАIN.LINЕ=25

       Х=0000000000000000.       I=0.

 РАSСАL РМD ЕND

 КОНЕЦ ЗАДАЧИ

 00411: 00 074 0000 *74




ktlprint.pas-pascal.b6

Leo B.

unread,
Apr 13, 2025, 9:13:41 PMApr 13
to БЭСМ-6
Работает это очень просто. Компилятор умеет вычислять почти все константные выражения с использованием встроенных функций статически. 

Leo

Leo B.

unread,
Apr 13, 2025, 9:15:48 PMApr 13
to БЭСМ-6
Пример не работает потому, что внешний файл  KTL не настроен ни на какой носитель. 

Leo

Alex Loktionoff

unread,
Apr 14, 2025, 11:27:48 AMApr 14
to БЭСМ-6
Ммм, да компилятор это пол-дела, меня поразило, что это компилируется в обьектник/стандарный массив, и работает.
Тоесть  поддерживается на уровне загрузчика ОС, и синусы и корни квадратные.

понедельник, 14 апреля 2025 г. в 03:13:41 UTC+2, Leo B.:

Alex Loktionoff

unread,
Apr 14, 2025, 11:30:36 AMApr 14
to БЭСМ-6
А есть ли возможность настроить  dispak эмулятор с дисками по умолчанию, чтоб этот пример заработал?
KTL должен состоять из пары слов { имя, зона},  такой типа каталог в ДИСПАК и ДУБНА? 

понедельник, 14 апреля 2025 г. в 03:15:48 UTC+2, Leo B.:

Leo Broukhis

unread,
Apr 14, 2025, 7:25:01 PMApr 14
to be...@googlegroups.com
Поддерживаются на уровне загрузчика только константы. Чтобы увидеть, как это выглядит в объектном модуле, достаточно его дизассемблировать.

Leo

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/596ec8c1-2ee7-45c3-b2b7-780213d689a2n%40googlegroups.com.

Leo Broukhis

unread,
Apr 14, 2025, 7:29:41 PMApr 14
to be...@googlegroups.com
On Mon, Apr 14, 2025 at 10:30 PM Alex Loktionoff <oxy...@gmail.com> wrote:
А есть ли возможность настроить  dispak эмулятор с дисками по умолчанию, чтоб этот пример заработал?

 Настраивать файл в Паскале на конкретное расположение можно вызовом RESET(var, дддднуззззВ)

где var - переменная типа файл, дддд - длина открываемого файла в зонах, ну - виртуальный номер устройства (00-27 - барабан, 30-67 - диск), зззз - номер начальной зоны.

Заказ диска на виртуальный номер делается согласно правилам конкретной операционной системы.

Leo

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

Alex Loktionoff

unread,
May 17, 2025, 8:07:06 AMMay 17
to БЭСМ-6
Леонид помог мне запустить под симулятором dispak пример из Пиринского паскаля по вызову внешних функций.
Паскаль библиотеки писались как PROGRAM NOPROG (OUTPUT); чтоб сэкономить одно имя в таблице экспортов объектника.
Похоже, что лингва франка для БЭСМ6 был Фортран, т.е. если хотел чтоб из какого угодно языка /  *FORTRAN ALGOL PASCAL*/ мог вызывать твою библиотеку, надо было экспортировать свои функции как  FORTRAN. 

ШИФP 410300 ЗC5^

OЗУ 32^

ЛEH 67(2048)^

EEB1A3

*NAME PAS-FOR-CALL

*CALL FICMEMORУ

*FULL LISТ

*LIBRARУ:13

*ftn

        SUBROUTINE POWX(X, Y, Z)

                X = Y**Z

                RETURN

        END

 *  ТЕПЕРЬ ТРАНСЛИРУЕМ ПАСКАЛЬ-ПРОГРАММЫ

*CALL *PASCAL

PROGRAM NOPROG (OUTPUT);

(*=E+ *)

PROCEDURE NULL (VAR X: REAL);

BEGIN

        X := 0;

END;


FUNCTION LENGTH (X, Y: REAL): REAL;

BEGIN

        LENGTH := SQR(X) + SQR(Y)

END;

BEGIN


END.

*  ТРАНСЛИРУЕМ ТЕПЕРЬ ВЕДУЩУЮ ПАСКАЛЬ-ПРОГРАММУ

*CALL *PASCAL

PROGRAM M (OUTPUT);

VAR

        A, B, C: REAL;


PROCEDURE POWX (VAR T, P, S: REAL); FORTRAN;

PROCEDURE NULL (VAR X: REAL); EXTERNAL;

FUNCTION LENGTH (X, YY: REAL): REAL; EXTERNAL;


BEGIN

        WRITELN(A, B, C);

        POWX(A, B, C);

        WRITELN(A, B, C);

        NULL(A);

        WRITELN(A);

        WRITELN(LENGTH(B, C))

END.DATA

        A:=2.0;

        B:=3.0;

        C:=4.0;

END

*EXECUTE

*end file

``````

еконец


...


    2.0000Е+00    3.0000Е+00    4.0000Е+00

    8.1000Е+01    3.0000Е+00    4.0000Е+00

    0.0000Е+00

    2.5000Е+01

 КОНЕЦ ЗАДАЧИ

 00411: 00 074 0000     *74



пятница, 28 марта 2025 г. в 21:29:55 UTC+1, Alex Loktionoff:
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
Поэтому в этой теме хотелось-бы увековечить ответы.
 
- Можно ли было реализовать файловый обмен между программами на фортране например? можно было при этом сделать файл просто буфер в памяти?

tst-pasfor.log
tst-pasfor.b6

Serge Vakulenko

unread,
May 17, 2025, 3:42:12 PMMay 17
to БЭСМ-6
Как то так оно и работало, да. Я переделал для dubna - тоже запускается. Файлы прилагаются.

$ dubna dubna pasfor.dub > pasfor.log

А можно разбить на три отдельных файла и компилировать с помощью besmc:

$ besmc powx.ftn length.pascal main.pascal
$ ./powx.exe
    2.0000E+00    3.0000E+00    4.0000E+00
    8.1000E+01    3.0000E+00    4.0000E+00
    0.0000E+00
    2.5000E+01

--Сергей
main.pascal
pasfor.dub
powx.ftn
length.pascal
pasfor.log

Mikhail Popov

unread,
May 17, 2025, 4:46:22 PMMay 17
to be...@googlegroups.com
 что лингва франка для БЭСМ6 был Фортран    это скорее особенность МС Дубна а не БЭСМ-6, и эта особенность была  благодаря исключительно CERNLIB, т.е. сам компилятор FORTRAN вырос именно оттуда. 

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/acf711a9-e096-4169-a791-48c1fbae3434n%40googlegroups.com.

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

unread,
May 17, 2025, 10:24:33 PMMay 17
to be...@googlegroups.com


17 мая 2025 г., в 23:46, Mikhail Popov <mikha...@gmail.com> написал(а):

 что лингва франка для БЭСМ6 был Фортран    это скорее особенность МС Дубна а не БЭСМ-6,

именно… 

а вот то, что МС Дубна стала лингва франка для БЭСМ-6 - это физики постарались… :) 

все остальные «самозамкнутые» системы программирования на БЭСМ_6 (АвЧай, БЕМШ, Алгол-БЭСМ-6) для вычислительных задач были или не нужны (автокод) или неэффективны (курочкинский Алгол) и все потребители численных методов постепенно мигрировали в МС Дубна. а с появлением там Алгола-ГДР - исчез последний стимул использовать курочкинский Алгол :).


Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CAHBB7Y6eW9npWeH%2BqnBCNmxs%2BtJS47Bwhr41mF81CPOAi_3CFQ%40mail.gmail.com.

Alex Loktionoff

unread,
May 18, 2025, 3:48:29 AMMay 18
to БЭСМ-6
Сергей, а вот пример наоборот, из фортрана вызывать функции библиотеки она Паскале?
Что-то непонятно. Я пробовал и так и этак, просто вызвать функцию паскаля 2-го уровня например как это делается в pascomp из FORTRANа не получается.
Вот получилось только вызвать _программу_ передав параметры через COMMON секцию.
Но это как-то через-чур, для солидной библиотеки надо понасоздавать программ на паскале а COMMON секции будут 99% времени просто даром отведать память между вызовами.
Неужели не было возможности в Паскале экспортировать функцию как FORTRAN?
Может в Dubna это проще реализуется?

ШИФP 410300 ЗC5^

OЗУ 32^

ЛEH 67(2048)^

EEB1A3

*NAME PAS-FOR-CALL

*CALL FICMEMORУ

*FULL LISТ

*LIBRARУ:13

*  ТРАНСЛИРУЕМ ПАСКАЛЬ-ПРОГРАММУ

*CALL *PASCAL

 PROGRAM TEST (OUTPUT, TT);

 VAR

   TT: INTEGER;

 BEGIN

   TT:=TT-1;

 END.

*  ТРАНСЛИРУЕМ ТЕПЕРЬ ВЕДУЩУЮ ФОРТРАН-ПРОГРАММУ

*ftn

      PROGRAM MAIN

      COMMON /TT/ T

      T = 7

      PRINT 99, T

      CALL TEST

      PRINT 99, T

      CALL TEST

      PRINT 99, T

99    FORMAT (X, I5)

      END

*EXECUTE

*end file

``````

еконец  

суббота, 17 мая 2025 г. в 21:42:12 UTC+2, serge.v...@gmail.com:
tst-call-forpas.b6

Leo B.

unread,
May 18, 2025, 5:04:46 AMMay 18
to БЭСМ-6
Паскалевские *функции* из фортрана вызывать бесполезно (собственно, в инструкции и не сказано, что их можно вызывать).
Вызывать можно только процедуры.

Вот это
 PROGRAM NOPROG (OUTPUT);
 (*=E+*)procedure foo(VAR i, o:INTEGER);
 BEGIN o := i*5 + 3 end;
 BEGIN
 END.

В комбинации вот с этим

        PROGRAM MAIN
        call foo(10, i)
        print 1, i
   1    format(1xi6)
        call foo(100, i)
        print 1,i
        END

прекрасно работает - печатает 53 и 503, как и ожидается.

Leo

Alex Loktionoff

unread,
May 18, 2025, 5:13:44 AMMay 18
to БЭСМ-6
Неужели соглашение о вызовах процедур Паскаля совпадает с соглашением о вызовах Фортрана???  

воскресенье, 18 мая 2025 г. в 11:04:46 UTC+2, Leo B.:

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

unread,
May 18, 2025, 5:32:43 AMMay 18
to be...@googlegroups.com


18 мая 2025 г., в 12:13, Alex Loktionoff <oxy...@gmail.com> написал(а):

Неужели соглашение о вызовах процедур Паскаля совпадает с соглашением о вызовах Фортрана???  

нет… 
указание Е+ заставляет использовать фортрановское, вместо паскалевского. 


воскресенье, 18 мая 2025 г. в 11:04:46 UTC+2, Leo B.: 
Паскалевские *функции* из фортрана вызывать бесполезно (собственно, в инструкции и не сказано, что их можно вызывать).
Вызывать можно только процедуры.

Вот это
 PROGRAM NOPROG (OUTPUT);
 (*=E+*)procedure foo(VAR i, o:INTEGER);
 BEGIN o := i*5 + 3 end;
 BEGIN
 END.

В комбинации вот с этим

        PROGRAM MAIN
        call foo(10, i)
        print 1, i
   1    format(1xi6)
        call foo(100, i)
        print 1,i
        END

прекрасно работает - печатает 53 и 503, как и ожидается.

Leo

-- 
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
--- 
Вы получили это сообщение, поскольку подписаны на группу "БЭСМ-6".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/34e1a221-3af0-4e4c-a76f-d84ec4cc628cn%40googlegroups.com.

Alex Loktionoff

unread,
May 18, 2025, 7:09:26 AMMay 18
to БЭСМ-6
Что- то не вериться, что =Е+ меняет соглашения о вызовах, в описании Паскаля говориться только о видимости символа:

Далее описывается семантика управляющих режимов. В скобках указано

значение по умолчанию.


E(E-) Позволяет указывать программисту процедуры/функции, к которым

      возможно обращение из внешних программ. При Е+ информация

      об идентификаторе (см. также режим "S" в данном разделе)

      и начале кода процедуры/функции заносится в таблицу

      дополнительных входов. Инз-а ограничения на количество

      дополнительных входов модуля загрузки мониторной системы

      "Дубна" их число не должно превышать 18. См. также раздел

      "Раздельная компиляция программ".


Да и в примере процедура NULL объявлена и вызывается в ведущей Паскаль программе как Паскаль EXTERNAL

*NAME COMP

*PERSO:67640

        SUBROUTINE POWX(X, Y, Z)

                X = Y**Z

                RETURN

        END

*  ТЕПЕРЬ ТРАНСЛИРУЕМ ПАСКАЛЬ-ПРОГРАММЫ

*CALL *PASCAL

PROGRAM NOPROG (OUTPUT);

(*=E+ *)

PROCEDURE NULL (VAR X: REAL);

BEGIN

        X := 0;

END;


FUNCTION LENGTH (X, YY: REAL): REAL;

BEGIN

        LENGTH := SQR(X) + SQR(Y)

END;

BEGIN


END.

*  ТРАНСЛИРУЕМ ТЕПЕРЬ ВЕДУЩУЮ ПАСКАЛЬ-ПРОГРАММУ

*CALL *PASCAL

PROGRAM M (OUTPUT);

VAR

        A, B, C: REAL;


PROCEDURE POWX (VAR T, P, S: REAL); FORTRAN;

PROCEDURE NULL (VAR X: REAL); EXTERNAL;

FUNCTION LENGTH (X, YY: REAL): REAL; EXTERNAL;


BEGIN

        WRITELN(A, B, C);

        POWX(A, B, C);

        WRITELN(A, B, C);

        NULL(A);

        WRITELN(A);

        WRITELN(LENGTH(B, C))

END.DATA

        A:=2.0;

        B:=3.0;

        C:=4.0;

END

*EXECUTE

*END FILE


воскресенье, 18 мая 2025 г. в 11:32:43 UTC+2, ReedCat:

Alex Loktionoff

unread,
May 18, 2025, 7:13:01 AMMay 18
to be...@googlegroups.com
Конечно, Паскалевское соглашение о вызовах функций не совпадает с Фортрановскими.
Именно из-за передачи результата через стек а не аккумулятор.
Но в Паскале небыли возможности заставить сгенерировать компилятор Паскаль  - Фортран-ABI совместимую функцию?

А ABI Паскалевских процедур неужели совпадает с ABI Фортран? 

18 мая 2025 г., в 11:04 AM, Leo B. <leo...@gmail.com> написал(а):

--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-6":
http://groups.google.com/group/besm6/topics
---
Вы получили это сообщение, поскольку подписаны на одну из тем в группе "БЭСМ-6".
Чтобы отменить подписку на эту тему, перейдите по ссылке https://groups.google.com/d/topic/besm6/8qhWZuw48O4/unsubscribe.
Чтобы отменить подписку на эту группу и все ее темы, отправьте письмо на электронный адрес besm6+un...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/bc52794b-8b8a-429c-9651-103b99fa59f0n%40googlegroups.com.

Alex Loktionoff

unread,
May 18, 2025, 8:38:57 AMMay 18
to БЭСМ-6
Нашел интересную фишку вложенных процедур паскаля.
Благодаря тому, что результат функции по ABI Паскаля возвращается на стеке, таким-же способом как аргументы и локальные переменные.
Дочерняя подфункция LAYER3 может не только "своровать" параметры родительской но и установить возвещаемое значение родительской функции, хотя у процедур вообще отстутсвует возвращаемое значение:

PROGRAM NOPROG (OUTPUT);

(*=E+ *)

PROCEDURE LAYER2(VAR X: REAL);

BEGIN

  WRITELN('LAYER2(', X, '):');

  X := 0;

END;


FUNCTION LENGTH(X, Y: REAL): REAL;

PROCEDURE LAYER3;

BEGIN

  WRITELN('LAYER3():');

  LENGTH := SQR(X) + SQR(Y)

END;


BEGIN

  WRITELN('LENGTH(',X ,', ', Y, '):');

  LAYER3;

END;


BEGIN

END.

tst-call-paslyr.b6

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

unread,
May 18, 2025, 8:54:01 AMMay 18
to be...@googlegroups.com
они не обязаны были описывать _в_деталях_ всё, что при этом меняется… :) 

проверить просто - странслировать с *FULL LIST с E+ и без него одну и ту же процедуру :)


18 мая 2025 г., в 14:09, Alex Loktionoff <oxy...@gmail.com> написал(а):

Что- то не вериться, что =Е+ меняет соглашения о вызовах, в описании Паскаля говориться только о видимости символа:

Далее описывается семантика управляющих режимов. В скобках указано
значение по умолчанию.

E(E-) Позволяет указывать программисту процедуры/функции, к которым
      возможно обращение из внешних программ. При Е+ информация
      об идентификаторе (см. также режим "S" в данном разделе)
      и начале кода процедуры/функции заносится в таблицу
      дополнительных входов. Инз-а ограничения на количество
      дополнительных входов модуля загрузки мониторной системы
      "Дубна" их число не должно превышать 18. См. также раздел
      "Раздельная компиляция программ".

Да и в примере процедура NULL объявлена и вызывается в ведущей Паскаль программе как Паскаль EXTERNAL
а откуда следует, что «Паскаль EXTERNAL»  _паскалевские_ соглашения?

это же всё - умолчательные толкования «из головы». :)

Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/1d9cf83f-0bae-4a1d-963a-93ab7cad2a97n%40googlegroups.com.

Reply all
Reply to author
Forward
0 new messages