28 марта 2025 г., в 23:29, Alex Loktionoff <oxy...@gmail.com> написал(а):
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo PascalПоэтому в этой теме хотелось-бы увековечить ответы.- вопрос номер 0. какие есть интересные варианты ответа WHAT=где можно почитать как можно было отлаживать программы с помощью WHAT=?эмулятор dispak/dubna что поддерживают/не поддерживают из WHAT=?
- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.
- Можно было подать на вход программе на Паскале массив прямо из паспорта диспак-а? Полагаю можно было в колоду перфокарт перед самим обьектником программы вставлять перфокарты с данными и так считать, разные данные без изменения программы, можно примерчик?
- Можно ли было реализовать файловый обмен между программами на фортране например?
можно было при этом сделать файл просто буфер в памяти?
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo PascalПоэтому в этой теме хотелось-бы увековечить ответы.- вопрос номер 0. какие есть интересные варианты ответа WHAT=
где можно почитать как можно было отлаживать программы с помощью WHAT=?
эмулятор dispak/dubna что поддерживают/не поддерживают из WHAT=?
- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ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*)
% 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
% 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
Р/Т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
ШИФ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
``````
еконец
% 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.:
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.
В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?
Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.
Но вызовы внутренних функций могут быть быстрее, чем в фортране.Для системных программ не годиться - у него нет типов данных для индексных регистров.
У него хорошая совместимость с фортраном - очень просто вызывать фортрановские библиотеки.Похоже мог быть использован как glue для вычислительных под-программ на фортране - оформить диалог, обработка текста на порядки проще. Я прав?
Но интересную вещь я для себя отрыл на пятом десятке, хотя помню в 90-х в институте писал 50/50 на паскале и на с++.Но вот только сейчас заметил, что в текстах монитор паскаля БЭСМ используются вложенные функции на каждом углу.Вложенные функции свободно используют любые переменные объявленные в родительской функции - получается что-то типа глобальных переменных, только они не глобальные и недоступны соседним функциям модуля. Получается такой компромисс типа контролируемых глобальных переменных, которые не надо передавать через стек и запихивать/выпихивать при вызове.
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?
Посмотрел я на код генерируемый паскаль монитором, это просто ужас летящий на крыльях ночи.В добавок к БЕСМовской традиции каждую функцию начинать с вызова как минимум еще одной служебной функции, тут еще прыжки в конец+в начало. Тип SmallInt TinyInt отсутствуют как класс, и _все_ делается только через полноразмерный стек.Вопрос, для каких задач предназначался и реально использовался паскаль монитор?Производительность вычислений у него слабее чем у фортрана из-за не очень эффективных циклов.Но вызовы внутренних функций могут быть быстрее, чем в фортране.Для системных программ не годиться - у него нет типов данных для индексных регистров.
У него хорошая совместимость с фортраном - очень просто вызывать фортрановские библиотеки.Похоже мог быть использован как 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.
На сколько понимаю отладка без отладчика программ на паскале была примерно такой:Вставляем на каждой строчке writeln('DBG:№ххх:', переменные для дампа)Ну и при запуске нажимаем 'D' - получаем 10 срок вывода. Думаем где сейчас программа и что делает, сколько еще примерно строчек вывода нам интересно, и нажимаем или 'D' для еще 10 или можно 'L' если надо побольше/меньше 'L1' выведет одну, а 'LZ' наверно 36, просто L наверно 256.
Вопрос, для каких задач предназначался и реально использовался паскаль монитор?
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. У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором. А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.
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.
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
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.
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,они где-то хранятся ???нет, конечно, они используются только во время трансляции.
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
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo Pascal
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
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-выражения, ссылающегося на структуру, на регистр, после чего все поля этой структуры адресуются очень дешево,и, главное, компактно по размеру кода.
Компилятор этим пользуется во многих местах. Опять же, если производительность не очень критична, то фактор эффективности разработки оказывается превалирующим.
Leo
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
``````
еконец
вторник, 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;
...
...
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static. У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором. А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.и очень дешево, да…я про паскаль-автокод сейчас, в мониторе приходилось лавировать между соглашениями мс дубна еще,а в автокоде все просто -стек головной программы индексируется ИР1, функции первого уровня вложенности - ИР2, второго - ИР3 и так далее…дальше 3-го в джине не заходили, нужды не было, а вот мелкие процедурки 3-го уровня, которые даже своего стека переменных не имели, а работали исключительно с данными родительской процедуры -это использовалось часто. и код получался эффективный :)
- Я надеюсь, что на БЭСМ6 был реализована "классическая" работа с файлами? Можно примерчик кинуть на чтение/запись файл. Есть ли ссылка на бесплатную книжку как работать с файлами в классическом паскале, если только это конечно 100% применимо к БЭСМ6.Н.Вирт «Систематическое программирование. Введение».на Б-6 - именно такая работа с файлами и была.
А так - и в том и в том варианте Паскаля - файлы исходно и есть «просто буферы в памяти», если их ни к чему не привязать через параметры PROGRAM().
dol@
Ну тогда P/1D это получается "глобальные Dданные Pпаскаля 1го уровня вложенности" я правильно декодировал?А то что это экспортируется и импортируется как "COMMON", это не приведет к clashing с соседней запущеной программой?
Или после запуска обьектника никакой динамической линковки не предусматривалось? То есть lazy/dynamic loading ?
1 апр. 2025 г., в 20:57, Alex Loktionoff <oxy...@gmail.com> написал(а):
С так неумеет, даже обидно за него стало. Конечно можно побить С программу на кучу модулей и объявить static переменные, но в паскале это как-то выглядит проще, да и static переменные они адресуются иначе и 'холоднее' по природе, а паскалевсие родительские переменные все рядышком в телёнком стеке. Получается у паскаля есть своя фишка я прав?Поскольку функции могут быть рекурсивные и взаимно-рекурсивные, все эти переменные в принципе не могут быть static. У Паскаля это фишка, позволяющая дешево обращаться к переменным из высших уровней вложенности, только на архитектурах, где есть достаточное количество регистров - и то, если максимальный уровень вложенности ограничен компилятором. А на архитектурах, где регистров мало, нужно строить связные списки на стеке и лазить по этим спискам.и очень дешево, да…я про паскаль-автокод сейчас, в мониторе приходилось лавировать между соглашениями мс дубна еще,а в автокоде все просто -стек головной программы индексируется ИР1, функции первого уровня вложенности - ИР2, второго - ИР3 и так далее…дальше 3-го в джине не заходили, нужды не было, а вот мелкие процедурки 3-го уровня, которые даже своего стека переменных не имели, а работали исключительно с данными родительской процедуры -это использовалось часто. и код получался эффективный :)Я полагаю, что можно сделать так, чтоб вложенная функция обращалась по указателю фрейма, родительской, это будет еще дешевле.
Только это имеет смысл если вложенные функции желательно без параметров /* inner(void) */ и многократно используются в коде родительской.
Иначе инлайнинг внешних функций сделает такой-же код только без дополнительных заморочек.
1 апр. 2025 г., в 21:52, Leo B. <leo...@gmail.com> написал(а):
Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
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.
1 апр. 2025 г., в 21:55, Alex Loktionoff <oxy...@gmail.com> написал(а):
константы там вроде отдельно лежат.1 апр. 2025 г., в 21:52, Leo B. <leo...@gmail.com> написал(а):Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
а так:P1/D - Dataесть предположение, что если в программе нарисовать еще пару функций, то появятся и P2, P3
и появляются потому что передаются _ссылки_ во внешнюю процедуру…GAK/nn и пр - это символические имена для безымянных элементов таблицы символов, которые описывают одно перемещаемое выражение как другое плюс константа.что из этого триггер: «ссылка» или «внешняя процедура» - сие мне неведомо, но легко проверяется. :)
*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.
а вот «всячина» эта в программе не видно, чтобы использовалась.что туда когда и где напихали - тайна сия великая есть :)
, 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
Только это имеет смысл если вложенные функции желательно без параметров /* inner(void) */ и многократно используются в коде родительской.нет. в том и смысл, что у них возможен свой стек, который проиндексирован по следующему по порядку индекс-регистру.при этом доступ к «своим» переменным и переменным «папы» - одинаков и по времени и по стилю.а почему не использовали «свои» переменные в процедурах 3-го уровня?потому что они как правило не нужны, вполне можно записать необходимые структуры у «папы»… и пользоваться ими...доступ-то к ним по всем параметрам идентичен :)Иначе инлайнинг внешних функций сделает такой-же код только без дополнительных заморочек.какой инлайнинг? откуда? не было там никакого инлайнинга внешних функций.:)
Согласен с lazy load я переборщил, но.Ведь в персональной библиотеке могут быть _тоже_ поскалевские обьектники, которые экспортируют и импортируют P/1D со своим layout. В ФОРТРАНе например layout переменных в COMMON блоке всех модулей должны совпадать иначе будет каша из данных.
А тут или P/1D не COMMON блок, а секция, в которую загрузчик складывает последовательно все переменные со всех модулей, или я ничего не понимаю :)Так P/1D это секция или COMMON блок? Где я пропустил разницу в тексте Мадлен ?
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
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 произвольного размера. Если они запускаются по одному, никаких проблем это не вызывает.
А если Паскаль-программа вызывает внешние Паскаль-подпрограммы из другого объектного модуля, то см. инструкцию, в которой это уже разжёвано:
Вызов внешней процедуры/функции ничем не отличается от стандартного вызова, однако для правильного использования необходимо соответствие статических уровней описания, числа параметров, их типа и внешних используемых переменных.
(Вообще говоря, необходимо совпадение областей переменных в обеих программах, или в вызываемой программе соответствующая область должна быть пустой. Имеются в виду собственные переменные программы).
Несоответствие указанных объектов ведёт к ошибкам во время выполнения программы.
Да, не зря я эту тему начал. Есть своя специфика паскаля на БЭСМ6.Получается проблему наложения глобальных переменных как раз решали с помощью подфункций?Поесть если твоя программа единственная, то объявляй глобальные переменные.В библиотеках на паскале лучше глобальных переменных не объявлять, чтоб избегать проблем.
Ну или взять дисциплину, и вручную во всех модулях следить, чтоб объявления были 1:1, тогда можно делиться данными через глобальные переменные, но для паскаля это как-то не камельфо.
Вот теперь мойпример с подфункцией без глобальных переменных:
Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"
А "приватные" statics в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.Тогда они попадали не в P/1D, а в отдельные common-блоки.
Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна.
Обычные глобальные переменные - да, лучше не объявлять. Потому что всегда есть риск превысить количество глобальных переменных в главной программе,что приведет к ошибке линковки "НЕВЕРНАЯ ДЛИНА P/1D"
А "приватные" statics в библиотечных функциях вполне можно было иметь, объявляя их в заголовке программы, в которой определена библиотечная функция.Тогда они попадали не в P/1D, а в отдельные common-блоки.Можно фрагмент кода, пожалуйста? Как в библиотеках на Паскале создавать свои COMMON блоки и какие имена им присваивал компилятор?
Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.Она, правда, была написана на Паскале-Автокоде, но разница непринципиальна.А вот это становиться совсем интересно. В Turbo-Pascal была возможность перегрузки библиотек - оверлеев, которые грузились в те-же адреса. Но вот перегружать всю программу это как? Причем, чтоб P/1D данные сохранялись по тем же адресам.
Для этого уже были helper-functions в библиотеке Паскаля, какие?
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.
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-блоку (в таблице загрузки - **) было невозможно.
Leo
Так или иначе, вся система "Джин" была построена на возможности отдельно скомпилированных перезагружающих друг друга программ с одинаковыми объявлениями видеть одни и те же глобальные переменные.Не было такого. как класс…Можно пояснить на основании чего был сделан такой вывод?
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.
Common block P/1D - это, в сущности, имитация сегмента .data. В нем лежат все глобальные переменные и общеупотребительные константы.
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
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]
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo PascalПоэтому в этой теме хотелось-бы увековечить ответы.
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
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
А есть ли возможность настроить dispak эмулятор с дисками по умолчанию, чтоб этот пример заработал?
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
ШИФ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
Я думаю не один такой, кто знакомство с Паскалем имел с Turbo PascalПоэтому в этой теме хотелось-бы увековечить ответы.
- Можно ли было реализовать файловый обмен между программами на фортране например? можно было при этом сделать файл просто буфер в памяти?
--
Данное сообщение отправлено Вам, как участнику группы "БЭСМ-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.
17 мая 2025 г., в 23:46, Mikhail Popov <mikha...@gmail.com> написал(а):
что лингва франка для БЭСМ6 был Фортран это скорее особенность МС Дубна а не БЭСМ-6,
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/CAHBB7Y6eW9npWeH%2BqnBCNmxs%2BtJS47Bwhr41mF81CPOAi_3CFQ%40mail.gmail.com.
ШИФ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
``````
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.
Далее описывается семантика управляющих режимов. В скобках указано
значение по умолчанию.
E(E-) Позволяет указывать программисту процедуры/функции, к которым
возможно обращение из внешних программ. При Е+ информация
об идентификаторе (см. также режим "S" в данном разделе)
и начале кода процедуры/функции заносится в таблицу
дополнительных входов. Инз-а ограничения на количество
дополнительных входов модуля загрузки мониторной системы
"Дубна" их число не должно превышать 18. См. также раздел
"Раздельная компиляция программ".
*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: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.
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.
18 мая 2025 г., в 14:09, Alex Loktionoff <oxy...@gmail.com> написал(а):
Что- то не вериться, что =Е+ меняет соглашения о вызовах, в описании Паскаля говориться только о видимости символа:Далее описывается семантика управляющих режимов. В скобках указанозначение по умолчанию.E(E-) Позволяет указывать программисту процедуры/функции, к которымвозможно обращение из внешних программ. При Е+ информацияоб идентификаторе (см. также режим "S" в данном разделе)и начале кода процедуры/функции заносится в таблицудополнительных входов. Инз-а ограничения на количестводополнительных входов модуля загрузки мониторной системы"Дубна" их число не должно превышать 18. См. также раздел"Раздельная компиляция программ".Да и в примере процедура NULL объявлена и вызывается в ведущей Паскаль программе как Паскаль EXTERNAL
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/besm6/1d9cf83f-0bae-4a1d-963a-93ab7cad2a97n%40googlegroups.com.