Comments 33
но при этом предусматривающий некоторое распараллеливание операций через GOSUB и GOTO
Акститесь, какое блин распараллеливание, нет там никакой параллельности, всё идет строго последовательно, gosub это вызов подпрограммы, возврат из которой происходит через return(resume)
goto - это просто переход в одну сторону из которого нельзя вернуться
Это именно "те самые кошмарные" операторы, из-за которых все хейтят бейсик
в С# вы их до сих пор используете - не так, как в коде который в статье, кстати ваш пример чутьли не единственный который нужен и действует он обычно только внутри контекста одной ф-ции, а "тот самый" goto действует глобально
т.е. представьте себе чтобы из ф-ции вложенной в сотню классов и процедур, можно сделать goto в main метод в обход всех return, т.е.как в ассемблере - в приведенном бейсике в статье - это именно так и работает, в современных языках так сделать нельзя уже много лет
чтобы понять всю печаль, преставьте себе что листинг из статьи не на 900, на на 10000 и goto - gosub там пара сотен штук, и удачи вам оттрасировать вызовы в таком коде, чтобы тыкнуть в рандомное место и сказать уверенно, откуда туда может придти выполнение программы и что будет если вы напишите 100500 gosub 200500 потом пару раз goto 100, 200, etc..а потом resume(return) ...и куда у вас вернется вызов gosub и откуда?..эти операторы не просто так поудаляли везде и заменили на ф-ции с метками
это же пример, я и глобально использую если не считаю нужным выделять какой-то код в отдельную функцию. Я не пишу в ООП стиле, так что я в этом не ограничен.
"глобально" - я имею в виду так (как в ассемблере, на который вы ссылаетесь что там это норма)
void ProcOne()
{
some code;
goto Label1;
}
void ProcTwo()
{
some code;
:Label1
some code;
}так использовать эти операторы нельзя в современных языках
если вы внутри одной ф-ции до сих пор их используете больше чем для выхода из вложенного цикла, я могу, так техлид только недовольно покачать головой и поцыкать языком, были бы вы моим подчиненным, с таким кодом ревью бы вы не прошли...и кмк меня многие в этом поддержат
о очевидно что в 70-х никому в голову не пришло бы начать истерить за использование JMP в ассемблере, так почему они должны истерить из-за GOTO в Бейсике?
потому что именно в 80 и была истерика по поводу бейсика что программисты выучившиеся на бейсике считались "испорченными и неполноценными" (см. вторую цитату https://ru.wikiquote.org/wiki/Эдсгер_Вибе_Дейкстра)
==
ну если лично вы не понимаете такой код и в принципе не умеете мыслить последовательно
Мой первый язык программирования в жизни - это basic компьютера Atari 65XE, я стал программистом буквально когда писал код с goto и gosub, конечно я понимаю этот код, только теперь я тимлид-техлид, и понимаю что код пишется не для меня лично, и кроме меня его еще другие люди будут читать и поддерживать, это отлично понимали и в 70х, от чего очень и очень быстро от такого подхода ушли...а операторы goto/gosub стали проклятыми до сих пор, хотя в этом уже нет смысла т.к. языков которые их поддерживают в таком виде уже нет... (хотя многие кто их хейтит до сих пор не понимают почему, но кстати код в статье отлично показывает почему..но применимо это только к бейсику 70х)
ассемблер это отдельная история, про него я ни слова не сказал, там эту проблему решили начав создавать языки высокого уровня
так как в бейсике тех лет не было фигурных скобок и возможности прерваться иначе как через GOTO
я не придираюсь к бейсику из статьи, я говорю что писать так код в 2026 году НЕ на бейсике из 70х это...эээ...кошмарно?
2 выхода а в скелетке тогда как? той, которая в общедоступных туториалах, там выход должен быть не 0, и второй который нужен, а того красивого решения в туториавах нету ) и их не рассматривают )
красивое решение по драу колам и подсистеме скелетке - тоесть модели ) тоесть чтоб был 1 драу кол ), например мега буфер, с шейдер сторадж )
я не программист слава богу и могу делать как пожелаю
ну тут как говорится, флаг в руки ;) а я программист и программистами командую, и так лучше не делать в настоящих сервисах
Ну и простой пример, мы с братом оба начинали с Бейсика, я абсолютно никак не состоялся как программист, а он работает над ААА проектами за границей - C++/UE5.
да и я с Бейсика начинал именно с такого, конечно эта цитата слишком резкая ;) но доля истины в ней есть
То есть вы подтверждаете что вы умственный деградант! Сильно. Но тогда вопрос - зачем мне слушать вас? (до того как ставить минусы прочитайте что сказал Дейкстра и что на эту цитату мой собеседник и ссылается)
*я вам ни одного минуса не поставил
а не нужно меня слушать, я в комментариях на хабре отдыхаю, хотите слушайте, хотите нет ;)
так быстро ушли что эти операторы отлично прожили и 90-е и существую до сих пор в 2026.
вы упускаете суть
GOTO в 2026 году это не тоже самое что GOTO в 1980, я вам даже пример кода привел
в 2026 году goto действует только в пределах контекста одной ф-ции, в 1980 он действует в пределах всей программы, это просто монументальное различие функционала
а то что вы внутри одной ф-ции пишете в 2026 году код также как 80году....ну это ваше право, но повторюсь, так делать не стоит, если ваш код будет поддерживать или использовать ктото кроме вас.
отлично читается очень простой код
точно также говорят программисты на Perl, когда только только написали чтото...а через полгода не могут понять как оно работает ;)
он простой пока его мало, а если его десятки тысяч строк, то это превращается в ад
Мне довелось разгребать проекты написанные в таком стиле математиками на питоне...это просто нечто какоето...
Лично я пишу goto тогда когда это удобно МНЕ.
да отлично! пишите конечно.
Я в данном случае говорю от лица отрасли, если вы пишите для себя - никаких проблем, если для других, лучше соблюдать правила, они придуманы не ради прихоти, конкретно с goto были очень объективные причины.
ну ок, я тут причем?
Это просто замечание, чтобы было понятно почему к этим операторам претензии
вы тут совершенно непричем
при условии что вы пишете используя функции, давайте уж до конца будем объективны в том о чем мы пишем.
чтобы быть прям совсем объективными
людей которые так пишут сейчас, довольно небольшое количество, по этому все кто тут это обсуждают, путаются.
Грубо говоря это обсуждение того как запрячь лошадь в автомобиль, вроде как и можно и даже ездить будет...но както...странно это.
нет, это монументальное ваше желание так думать )
так просто общепринято. то что вы странным образом используете инструмент, ну ок. но не удивляйтесь что вас не понимают
не представляю себе программу на 10000 строк на этом IBM PC в 1981 году,
всмысле не представляете? в 81 году было написано огромное количество корпоративного софта, или вы думаете там одни игрушки и картинки?
и текстовые редакторы уже были и электронные таблицы и базы данных, там сотни тысяч строк кода, для IBM PC в том числе и на бейсике также
А отрасль вас отрядила это делать?
я практически гарантировано могу сказать что мои слова поддержит процентов 90% программистов, по этому вполне правомерно могу говорить от имени отрасли
Я исхожу из того принципа что если окружающие не пишут код так как удобно мне, то и я не обязан писать так как удобно им. Паритет.
сами для себя вы можете как угодно писать
я склоняюсь к тому что код писать надо так как принято в конкретном языке программирования, что облегчает поиск информации, решение проблем, использования библиотек и возникновения всяких странных багов, поскольку подобный функционал хоть и возможен но может вызывать очень необычные баги в компиляторах, интерпретаторах и редакторах, потому что разработчики не задумывались что ктото так будет делать и некоторые штуки не тестировали
там сотни тысяч строк кода, для IBM PC в том числе
Конкретно для обсуждаемой первой модели в варианте с 64k оперативки?
а что вас смущает?
https://ru.wikipedia.org/wiki/VisiCalc
вот вам пример корпоративной программы в т.ч. для первого IBM PC и именно для 64к оперативки
вы считаете что программе электронных таблиц меньше 10тысяч строк кода?
p.s. очевидно что она написана не на бейсике, но мне кажется вы не совсем понимаете что такое IBM PC и для какого софта создавался
вот вам пример корпоративной программы в т.ч. для первого IBM PC и именно для 64к оперативки
Я в курсе, VisiCalc бегал и на 8битных компьютерах, но сильно сомневаюсь, что в нём сотни тысяч строк на ЯВУ - иначе непонятно, как результат компиляции влезает в 64k.
иначе непонятно, как результат компиляции влезает в 64k.
большое количество строк на ЯВУ совершенно необязательно может приводить с софту который должен невлезать в 64к
==
но вообще интерпретатор на то и интерпретатор что ему не особо и обязательно иметь полностью загруженную программу в память..но это теория, тут я боюсь не могу продолжать дискуссию поскольку у меня нет пруфов чтобы подтверждать свою точку зрения, и я действительно могу ошибаться
По крайней мере тут пишут, что версия для IBM PC была на ассемблере, бинарник весил 27k.
модель 8086 вообще идеальна для изучения если на то пошло ), не знаю чем она отличаеся от IBM PC, но вы можете реализовать полноценный DSL (это кстати альтернатива лиспу поидее) потомучто лисп в емаксе это тоже дсл) сегодня на 8086 командах, и даже реализовать терминал. Более того эмулируется легко и видео в пределах 64к памяти
я себе по приколдесу сделал емулятор (иже full dsl + терминал) - работает улётно, там просто полигон для изучения/обучения/плюшек/доводок/фишек, вы бесконечно можете на этой базе надстраивать чо вам нужно прям на ассемблере, который как я выше написал уже кор-посути язык в языке
это как тетрис или майнкрафт, бесконечно интересная тема кароче
там же внутри можно реализовать не бейсик, а Forth, это будет ваще улёт поидее )
вы пытаетесь реалии 2026 года переложить на 1975 год. это так не работает. коммерческий софт писали на ассемблере и там со всеми этими jmp, bne, bnq и т.п. операторами полный порядок и читали и понимали и разбирались, только причем тут Бейсик? ))))
в то время уже было много языков высокого уровня - С, Pascal, PL/1, Fortran и многие другие. и на них очень много писали, ассемблеры были каждые для своей серии машин.
Еще раз, я не говорю что на бейсике можно както по другому написать чем так
Но никто не мешает мне написать так в C# в 2026 году
кроме общепринятых подходов, ТАК НЕ ДЕЛАТЬ
причем я не вижу в каком месте такого кода страдает его читаемость - тут всё понятно.
для вас - да, для других нет
вы привели код довольно рафинированный и ровный, а он имеет свойство разрастаться и получать новые ф-ции (ведь не случайно нумерация идет через 10 в бейсике)
потом еще получаются всякие фокусы типа
10 FOR i=30 TO 100 STEP 20
20 GOSUB i
25 NEXT i
26 GOTO 100
30 PRINT "ONE"
40 RESUME
50 PRINT "TWO"
65 GOTO 30 # фича чтобы тут писать после TWO еще раз ONE
70 RESUME
80 PRINT "THREE"
90 RESUME
100 ENDа потом оно еще разрастется, и вот вы уже читая одну ф-цию вдумчиво построчно из себя интерпретатор изображаете
почему я должен менять себя из-за проблем у других?
Если вы не программист и пишете для себя - никаких проблем. Но профессиональные программисты работают в командах и от кода кроме работоспособности требуется, чтобы его могли легко могли читать и развивать другие люди. Как любил говорить один мой начальник - "а что если тебя завтра трамвай переедет?"
Выход из вложенных циклов - пожалуй, единственное использование goto, которое и адепты структурного программирования в принципе признают. Проблема классического Basic в том, что нет ничего кроме него и тот же цикл while надо делать через if () goto. Помню, для меня в своё время был заметным шагом вперёд Turbo Basic, где появились структурные конструкции и редактирование текста программы в целом (не перенабирая отдельные строчки). Потом уже перешёл на C...
В целом жЭсть конечно в 1981 году иметь такой кастрированный Бейсик.
Для меня первом языком высокого уровня был Focal где то в 1988ом, примерно того же уровня.
Но реально-то фокал -- это ДЕКовский язык начала 1970-х, у нас его просто "позаимствовали". Их (дековский) бейсик той же поры крайне убог (но позже был и другой бейсик, уже компилятор, с совершенно другим диалектом).
Уже самый первый IBM PC официально поддерживал объём памяти до 256 Кбайт. Предел в 64 Кбайта, о котором пишет автор, -- это объём на системной (материнской) плате, но IBM сразу предусматривала установку до трёх плат расширения памяти по 64 Кбайта каждая, что в сумме и давало 256 Кбайт (поскольку у ПК было пять гнёзд под платы, при установке трёх плат расширения ОЗУ под остальное оставалось всего два гнезда -- в одно в таком случае вставлялся контроллер гибких дисков, во второе -- либо CGA, либо MDA + порт принтера). Следующий вариант IBM PC перешёл с микросхем ёмкостью 16 Кбит на 64-Кбитные, что обеспечило до 256 Кбайт уже на системной плате; платами расширения можно было увеличить до 640 Кбайт.
Кстати, 640 Кбайт на оригинальном PC/AT тоже требовали платы расширения: на системной плате было лишь 512 Кбайт.
Эволюция ПО в разработке игр на практике: 1981 — IBM PC, Софт и игра