2026-05-23

vak: (Бодхидхарма)
Пока Дейкстра ругался на оператор goto (1968), Martin Richards изобрёл (в языке BCPL, 1967) механизм нелокальных переходов longjmp. Кен Томпсон и Деннис Ритчи встроили это дело сначала в язык Би, потом в Си. Идея прижилась, позже превратившись в try/catch в Си++.

Нелокальные переходы штука полезная в умелых руках. Иногда без неё не обойтись. Там есть куча подводных камней. Мне когда-то приходилось реализовывать setjmp/longjmp на разных архитектурах. Уже подзабылось маленько. Может кто и описал это дело в книжках, но где ж те книжки отыщешь. Благо имеем ИИ, можно спросить.

Вот статья с хорошим изложением темы от Клода: "Non-Local Jumps in C: Understanding setjmp and longjmp"

Целевая аудитория: программисты на C, знакомые с функциями, указателями и стеком вызовов, но ещё не сталкивавшиеся с нелокальным управлением потоком выполнения.

Цель: сформировать чёткое представление о том, как работают setjmp/longjmp, когда их следует использовать и — что не менее важно — когда их следует избегать.
vak: (бэсм-6)
Есть у нас в коллекции ретрокомпьютерных тулов такая штука как besmc. С её помощью можно программировать на БЭСМ-6 на разных языках программирования (и их смеси). Фактически это фронтэнд ко всем имеющимся компиляторам, ассемблерам, линкеру и симулятору. Для besmc надо также установить симулятор dubna. Подробности читайте в README.

К примеру, компилируем и выполняем программу на Паскале:
$ cat hello.pascal 
program main(output);
_(
writeln('Hello, Pascal!');
_).
$ besmc hello.pascal
$ ./hello.exe
HELLO, PASCAL!
Или пусть главная программа будет на Паскале, а подпрограмма на Фортране:
$ cat caller.pascal 
program main (output);
procedure hello; fortran;
_(
hello;
_).
$ cat callee.ftn
subroutine hello
print 1000
1000 format('Hello Fortran from Pascal!')
end
$ besmc caller.pascal callee.ftn -o example
$ ./example.exe
HELLO FORTRAN FROM PASCAL!
Есть куча примеров на разных языках: смотрите examples/README.md. Список примеров:
  • Pascal — `hello.pascal`
  • Pascal-re — `hello.pas`
  • Algol-ГДP — `hello.algol`
  • Fortran-ГДP — `hello.ftn`
  • Fortran Dubna — `hello.fortran`
  • Forex — `hello.forex`
  • Assembler Madlen — `hello.assem`
  • Assembler Madlen-3.5 — `hello.madlen`
  • Assembler БЕМШ — `hello.bemsh`
  • B language — `hello.b`
  • Object modules — `stdarray.std`
  • Mixed-language: Pascal calling Fortran — `caller.pascal` + `callee.ftn`
Да, а собственно новость в том, что утилита besmc теперь поддерживает язык программирования Би:
$ cat hello.b 
main() {
printf("Hello, B!*n");
}
$ besmc hello.b
$ ./hello.exe
HELLO, B!
Примеры интересных программ на Би можно глянуть здесь: examples/b.

Исторически языка Би на БЭСМ-6 не было. Это уже современная доделка. Хотя уже тогда ничто не мешало. Просто ни в Дубне, ни в ИТМиВТ не знали про язык Би.