pascal

«99 бутылок пива» на PERQ Pascal

Мои читатели знают, что последние несколько дней я возился с эмулятором PERQ. PERQ — это персональный компьютер, выпускавшийся в начале 1980-х годов, первый коммерчески успешный ПК с графическим интерфейсом. Такой олдскул мил моему сердцу, поэтому я потратил несколько вечеров, чтобы попробовать хоть на базовом уровне разобраться что из себя представляла операционная система тех компьютеров.

Последние пару дней я пытался написать на тамошнем «Паскале» «песню о пиве», но поскольку на моём ноутбуке потребовалась двойная эмуляция, скорость работы встроенного в систему редактора была ниже плинтуса. Писать было очень сложно, а править ошибки — ещё сложнее. Тем не менее, я справился.

79. PERQ Pascal — диалект некогда широко распространённого в учебных учреждениях языка «Паскаль». Компилируемый язык, в какой-то степени можно назвать его конкурентом Си, которому он проиграл вчистую.

Не думаю, что кто-то, кроме редких энтузиастов языка, сейчас выберет «Паскаль» для чего-то нового, но со старыми проектами на нём я иногда сталкиваюсь. Например, в начале этого года видел электронный документооборот, написанный на «Делфи» (это визуальная среда программирования и название диалекта «Турбо Паскаля»).

{$MESSAGE Written by Evgeny Stepanischev, 2024}
PROGRAM BOTTLES_OF_BEER;

const
    MAX_BOTTLES = 99;

Function BotStr(count: integer): string;
begin
    if count = 1 then
        BotStr := ' bottle of beer'
    else
        BotStr := ' bottles of beer';
end;

Procedure SingSong;
var
    i: integer;
    b: string;
begin
    for i := MAX_BOTTLES downto 1 do
    begin
        b := BotStr(i);
        writeln(i:0, b, ' on the wall,');
        writeln(i:0, b, '!');
        writeln('Take one down, pass it around,');
        if i > 1 then
        begin
            b := BotStr(i-1);
            writeln((i - 1):0, b, ' on the wall!')
        end
        else
            writeln('No more bottles of beer on the wall!');
        writeln;
    end;
    
    writeln('No more bottles of beer on the wall,');
    writeln('No more bottles of beer!');
    writeln('Go to the store and buy some more,');
    b := BotStr(MAX_BOTTLES);
    writeln(MAX_BOTTLES:0, b, ' on the wall!');
end;

begin
    SingSong;
end.

Из того, с чем мне пришлось столкнуться, когда я писал программу.

Больше всего ушло времени на ошибку Error 116: Error in type of standard procedure parameter. Речь тут, вроде, идёт о том, что я какой-то процедуре передаю параметры не того типа. Несмотря на то, что в ошибке был указан номер строки, мне всё равно не удавалось понять, что я делаю не так.

Оказалось, что вызов функции BotStr нельзя напрямую поместить во writeln, надо обязательно использовать промежуточную переменную (у меня это b). Учитывая, что скорость работы с эмулятором не позволяет быстро попробовать разные варианты, пришлось изрядно поскрипеть мозгом, чтобы дойти до сути.

Вторая вещь оказалась проще для исправления. В этом диалекте «Паскаля» вывод чисел происходит с отступом. В моём случае выглядит это неаккуратно. К счастью убрать его просто — нужно добавить параметр :0 для каждого числа, выводимого на экран.

В какой-то момент я так устал редактировать код со скоростью улитки, стал использовать обычный редактор своего ноутбука. Потом я просто запускал небольшую программу, написанную на «Пайтоне», которая печатала код за меня прямо внутрь окна с эмулятором PERQ:

import pyautogui, time

FILE_PATH = '99.pas'

time.sleep(5)

with open(FILE_PATH, 'r') as file:
    for line in file:
        for x in line.lstrip():
            pyautogui.typewrite(x)
            time.sleep(.6)

        time.sleep(1)

Вчера ночью всё наконец запустилось и я смог посмотреть как работает моя первая (и наверняка единственная) программа для PERQ.

Кстати, вот ещё одна интересная деталь.

Чтобы получить исполняемый файл, надо исходный код программы сначала скомпилировать командой COMPILE в объектный файл (.SEG), потом скомпоновать командой LINK в исполняемый (.RUN). У обеих команд есть параметр, где указывается имя файла, с которым мы работаем.

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

Текст песни «99 бутылок пива на стене» в терминале: от 14 до 1, затем «нет бутылок», «пойди купи ещё», снова 99. Заголовок: sys:User>Guest>, POS F.1 a-boot, 08 Aug 08 00:22:40.
Результат запуска «Песни о пиве» под эмулятором компьютера PERQ

2 комментария

«Трубо Паскакаль»

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

Это был хоть и случайный, но удачный выбор, — позже появилась совершенно гениальная среда разработки «Делфи», где я заработал немало масла на свой хлеб. Кроме того, в Университете всё программирование преподавалось на Паскале, очень выручило, что я знал тогда этот язык.

До «Делфи» разработка происходила в среде «Турбо Паскаль», глядя в синие окошки которой, я провёл много-много лет. В общем, у меня был очень длинный период, когда большинство своих программ я писал на Паскале.

Поэтому, наверное, понятно, почему когда я в комментариях к одной из статей на «Хабре» увидел упоминание пародийной программы «Трубо Паскакаль», не смог пройти мимо.

Программа поверхностно имитирует «Турбо Паскаль», где в меню спрятаны разные приколюхи. Если вы когда-то программировали на «Турбо Паскале» и не видели этой пародии, скачайте, запустите, мне кажется, не пожалеете, — выглядит забавно.

Скриншот меню со списком: Станок ТС-122-089 (ГОСТ 77843-64), Станок ФРС 556-ЗА (ГОСТ 10023-76), Пресс РД 86-12 (ГОСТ 23446-32), Винт HD-286/287.
Пародийная программа «Трубо Паскакаль», штука одноразовая, но забавная

2 комментария

Не «Пайтоном» единым

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

И вот на днях, на конференции «Казан Диджитал Вик» встретил одно из приятных исключений — на одном из участников гонок на беспилотных миниавтомобилях была футблока с чем-то паскалеподобным.

Чёрная футболка с кодом на языке Pascal: программа LetaiRacing_2023, команда IT Park, даты 20–21.09.2023, место Kazan, логика успеха и повторных попыток.

Это единственный язык, кстати, который я прочно забыл. Непонятно почему — писал на нём всё детство, а в Университете делал на «Делфи» (это диалект) несколько дипломных работ за деньги.

То есть плотненько работал с ним несколько лет, но когда два года назад поковырялся в нём в рамках решения одной из задач для программисткого адвент-календаря, понял, что не помню вообще ничего, кроме каких-то очень общих вещей, вроде конструкций begin — end.

10 комментариев