Игра с единорогом и алмазами для советского компьютера БК-0010-01

+123
NTFSв блоге Gamedev is Friendship!30 декабря 2023, 18:07


Помимо непосредственно понных игр в стилистике MLP, довел до ума еще одну игру для старого компьютера БК-0010-01, на котором когда-то писал первые свои программы.
Героев MLP в игре нет, но есть единорог, а значит, отчасти соответствует тематике ресурса.
Проект также представляет интерес для любителей старых компьютеров и старых же игр.

Коротко о компьютере:
Оперативная память: 16 Кб
Видеорежим: 256x256 пикселей, 4 цвета.
Разрядность процессора: 16 бит
Система команд: совместима с PDP-11

Более полная информация:
Читать на Википедии

Сама игра простейший одноэкранный экшн, управляем лошадкой влево-вправо, ловим алмазы (за разные алмазы разные очки) и не попадаем под камни (на сложном уровне). Под катом скриншоты и ссылки на репозиторий/релизы игры.

Скриншоты:
Смотреть



А вот так выполняется на самом компьютере


Гитхаб проекта:
github.com/tereshenkovav/BK-0010-game

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

Поскольку этих компьютеров «на ходу» еще меньше, чем компьютеров на базе процессоров 386 и 486, я сразу же встроил эмулятор в дистрибутив игры для Windows:

Для 32-битной Windows:
github.com/tereshenkovav/BK-0010-game/releases/download/v0.9.0/PonyDiamonds-RU-0.9.0-BKEmulator-Win32.zip

Для 64-битной Windows:
github.com/tereshenkovav/BK-0010-game/releases/download/v0.9.0/PonyDiamonds-RU-0.9.0-BKEmulator-Win64.zip

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

На всякий случай, так же ссылка на чисто бинарный файл для выполнения на компьютере или эмуляторе:
github.com/tereshenkovav/BK-0010-game/releases/download/v0.9.0/PonyDiamonds-RU-0.9.0-BK0010.zip

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

Добро пожаловать в 1987-ой.
NTFS
+5
О! В этом мы коллеги. Я тоже первые программы писал на именно этом БК, на Бейсике. У нас был компьютерный класс с локальной сеткой, если по давности лет не путаю, а в качестве сервера был ДВК 2М, на нём был паскаль, и я на этом паскале тогда написал свою первую базу данных. Тут я, образно говоря, и получил свою кьютимарку программиста, потому что с тех пор хранение и обработка данных меня привлекают больше всего.

UPD — На ДВК мы играли в Star_Trek текстовую версию, где клингонцы были переведены как «шестижопы» ) Я её даже прощёл.
Randy1974 (ред.)
+2
В школе уже были Пентиумы, но дома, да, работал на БК.
NTFS
+2
Я всю эту древность уже не застал. Моей первой машиной стала «Искра» на 8086 процессоре и с монохромным монитором. Из игр — Digger и F19 (в котором редко удавалось продвинуться дальше угадывания силуэтов), а из сред программирования Quick BASIC под DOS и MASM (ассемблер), который я тогда не осилил по причине отсутствия нормального руководства/учебника.
Lyx
0
Прикольно) Теперь под Радио-РК86, в ASCII графике =)
Opaline_Arcana (ред.)
+3
Радио-РК86

Дело хорошее, но… старая хотелка закрыта, теперь пора уже взрослые игры допиливать, люди ждут.
NTFS
+2
Прими мое уважение.
MTH_Root
+2
Вы вот такое строите, а я даже откомпилировать код MLPonline не могу! :D
Lyra_Hearty
0
Чужой код всегда сложно поддерживать, да и просто откомпилировать.
NTFS
+1
Эх! Исходный код предельно понятен, уж каким-то не высшим понийским, а человеческим написан… Но, к сожалению, у меня проблемы с Allegro. В отказ, старый, идёт уже который день.
Lyra_Hearty
0
Сборка сишного кода почти всегда страдание, но: нужно посмотреть, на каком этапе проблема.
Если ошибка формирования объектных файлов — то надо подправить код под конкретный компилятор, или ключи нужные указать.
Если беда с линковкой, то надо найти библиотеки нужных версий и добавить к проекту.
Если сам exe падает после запуска — то скорее всего, не хватает каких-то dll или ресурсов.
NTFS
+1
Уф, уф, извините, вы знаете, я в этом полный ноль!
Проблема, кажется, с линковкой… Я использую «CodeBlocks», так как разработчики сделали структуру проекта именно через него, если я правильно всё понимаю! При запуске рабочего пространства он настойчиво просит указать то, что нужно библиотекам. Я делаю это, но, при компилировании «GUIMultiplayerLoginScreenFunctions.cc», VS Code ругается на отсутствие файла «Definitions.h» (хотя, что мне кажется смешным — то, что он сам видит его и даже открывает. Чушь какая-то...); CodeBlocks заходит дальше — компилирует этот злосчастный файл, но ругается на отсутствие «Allegro5/Allegro.h». Я пытался делать все: и прикрепил его во вкладки «Linker» и «Compiler», и указал флажки(правда, судя по всему, они как-то навязаны для Линукса?), и всё такое, но, к сожалению, почему-то оно не хочет комплиироваться. Эх…
По совету английских товарищей из интернета, поискал старый аллегро и… Не нашёл. :D
Lyra_Hearty
0
«Таков путь» без системы сборки.
Рано или поздно либо я, либо makise_homura победят лень и сообразят для исходников пакетник или CMakeLists.txt
NTFS
+2
У меня есть папка, куда я установил всё, что смог найти. :D
Надеюсь, это вам чуть сможет помочь!
Lyra_Hearty
0
Охохо, это ж не C#, где dll закинул и радуешься. Один байт в одном аргументе одной функции не туда пошел — и всё. Нужны точные версии библиотек.

Справедливости ради, у меня тоже с этим не очень, если для Windows я все либы кладу в каталог проектов, то для Linux и MacOS нужно бы добавлять проверки на корректность системной версии.
NTFS (ред.)
+1

Я… Не могу просто закинуть DLL? Всё прямо так, как я предполагал...

— О, горе мне, горе…
Lyra_Hearty
0
Сначала нужны правильные .h файлы для компилятора. Потом нужны правильные .a файлы для линковщика. И наконец, нужны правильные .dll для исполнимого файла.

В общем, если разработчики не подготовили систему сборки, то придется самому становиться разработчиком.
NTFS
+1
Хм-м-м… Понимаю вас… Кажется, ".a" файлы CodeBlocks, слава сёстрам, подвязал сам, а вот с ".h"...

Да, не зря разработчики порой хаили друг друга в код, посредством комментариев. :D
Lyra_Hearty
0
Один байт в одном аргументе одной функции не туда пошел — и всё.
А как С#-то от этого защищён?
Нужны точные версии библиотек.
Да нет, точные не нужны, нужны с теми-же мажорными версиями и с минорными не меньше минимально необходимых. Ну, по крайней мере во всех нормальных проектах, а не в тех, где вместо поиска по pkg-config/cmake библиотеки в системе с нужной архитектурой линкуются к подложенной прямо в проект бинарной библиотеке, ага)
makise_homura
0
А как С#-то от этого защищён?

В C# библиотека — это и есть dll, то есть метаданные читаются напрямую с бинарника.
В C и Паскале — заголовочный файл может быть один, а бинарный файл другой, и начинается веселье.

линкуются к подложенной прямо в проект бинарной библиотеке

Всё еще самый безопасный способ, крупный минус только один — распухание дерева исходников и, отчасти, затруднение с переходом на новую версию библиотеки (последнее уже не сборка, а полноценная разработка, и не может быть простой).
NTFS
0
В C# библиотека — это и есть dll, то есть метаданные читаются напрямую с бинарника.
Какие метаданные ты имеешь в виду? Ты хочешь сказать, что хедеры прямо внутри .so лежат?
Хорошо, пусть; а если вдруг потребовалась статическая линковка, то что? Как функции с __dllexport можно будет статически прилинковать?
крупный минус только один
Самый крупный минус — это невозможность собрать с использованием другого ABI и тем более на другой архитектуре.
makise_homura
0
Ты хочешь сказать, что хедеры прямо внутри .so лежат?

Да, так устроен .NET

а если вдруг потребовалась статическая линковка, то что?

Статическая линковка не предусмотрена, зато ты можешь одной командой сформировать каталог со всеми dll и забрать его с собой.
NTFS
0
Статическая линковка не предусмотрена, зато ты можешь одной командой сформировать каталог со всеми dll и забрать его с собой.
Ну вот, ещё один шаг назад в эволюции ПО: вместо сборки того, что надо, тащить огромный каталог с кучей мусора.
Блин, недавно у меня тут на телефоне сбербанк-онлайн обновился, честно, я не представляю, какого хрена тот функционал, что можно было уместить в 30 кБ, весит 260 МБ, да ещё и тормозит лютейшим образом.
makise_homura
0
можно было уместить в 30 кБ

Можно, умести.

Ну вот, ещё один шаг назад в эволюции ПО

Обычный же вектор прогресса — от нативных ассемблеров к универсальным компиляторам.
Желающих писать на ассемблере не стало, как только появилась возможность скомпилировать Console.WriteLine() под десяток платформ разом, и там же запустить.
NTFS (ред.)
0
Можно, умести.
Увы, я не разработчик сбербанк-онлайна, поэтому аргумент «сперва добейся» — инвалид.
как только появилась возможность скомпилировать Console.WriteLine() под десяток платформ разом, и там же запустить.
Вот только это решило проблему переносимости. А сейчас наоборот переносимость начала страдать — банально из-за тяжести итоговой сборки, хотя проблем, которые не решала статическая сборка, это тоже не решает.
makise_homura
0
C# как и java, это корпоративная разработка, там никто не считает лишний терабайт. Скопировал, запустил, тесты прошли — в продакшн.

Со сбербанком, кстати, то же самое — хакерский код на 32Кб для клиента банка будет крут, но и поддерживать его сможет тот самый единственный хакер, а это плохо. Потому правят фреймворки и готовые решения, которыми сможет заниматься человек после недели курсов.
NTFS
0
Беда даже не в фреймворках как таковых, а в том что их уже тоже пишут макаки после недели курсов. В итоге и получаются монстры, под которыми «хэлло ворлд» требует сто гигабайт, сто гигагерц. А фреймворк так-то совсем не обязан быть монстром, если руками и головой писать, а не макакьим хвостом.
Opaline_Arcana
+1
Проблема в том, что отрасль требует очень много людей, а писать хорошо могут намного меньше.
Отдать продукт качественный через год, или выпустить плохонький, но через месяц? Ответ очевиден.
NTFS
0
отрасль требует очень много людей
Тоже следствие из говнораздутости кстати. Много говна требует много говноподдерживальшиков.
Opaline_Arcana
+1
Просто программирование повсюду, это лет 50 назад код работал в научных и вычислительных центрах, и окромя этих самых центров, никому был не нужен.
Сейчас оплачивая билет в трамвае картой или проездным, ты запускаешь цепочку из сотни сервисов, каждый из которых нуждается в разработке и доработке. Но желающих платить монетами уже не осталось.
NTFS (ред.)
0
Ну да, при этом эта цепочка зачастую очень переусложнена.
Opaline_Arcana
+1
Усложнение — следствие абстракций, а абстракции дают универсальность.
Если работать строго по прямому назначению кода, то будет карта, работающая в конкретном трамвае конкретного города конкретного депо. Без шансов подключить что-то еще.
NTFS
0
Усложнять можно и нужно с умом ;)
Opaline_Arcana
0
Ни один ум, даже самый великий, не представит себе целиком систему, через которую проходит оплата картой.
Отсюда и разбивка на сотни сервисов, и независимые куски, и старые подсистемы, которые лет 50 работают, но трогать их нельзя.
NTFS (ред.)
0
Ни один ум, даже самый великий, не представит себе целиком систему, через которую проходит оплата картой.
Очень смелое заявление однако =)
Opaline_Arcana
+1
Усложнение — следствие абстракций, а абстракции дают универсальность.
Ты путаешь усложнение и переусложнение.
Использовать существующие сервисы платёжной системы с миллионами пользователей, вместо того, чтобы накидать свой вариант попроще — это обоснованное усложнение, которое действительно даёт привычность и универсальность.
Делать ридер карт не на атмеге с обвесом, а на атоме с PCIe-картой-контроллером RS-485, к которой приделан ридер из тех, что применяются на производствах и стоят не 2$, а 200$, просто потому, что программист не умеет писать для ардуины, зато умеет делать bloatware для винды (поэтому загрузка терминала длится 2 минуты, а не 2 секунды) и писал код только для такого ридера, но не для других — это переусложнение, и от него стоит избавляться.
makise_homura
0
Делать ридер карт не на атмеге с обвесом, а на атоме с PCIe-картой-контроллером RS-485, к которой приделан ридер из тех, что применяются на производствах и стоят не 2$, а 200$

А это уже следствие того, что люди стоят дороже, чем железо.
Ты пойди найди еще программиста для ATMega — я к примеру, теорию знаю, но написать что-то сложнее моргающего светодиода так не смогу. И кому будет радость от твоей атмеги, если софт для неё не напишут, или напишут за сотни нефти?

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

Не уверен, что этот мир будет лучше, чем картридер на WinCE.
NTFS (ред.)
0
Ты пойди найди еще программиста для ATMega
Да их полно же, слава Arduino (вот кстати пример очень хорошего проекта по популяризации написания софта под микроконтроллеры: до его появления это правда было уделом совсем специалистов, а сейчас любой программер-электронщик средней руки может запилить скетч для ардуины, проверить, что всё ок, а потом сделать и заказать плату (можно даже вместе со сборкой) для уже серийного изделия с тем же кодом).
makise_homura
0
Столько же, сколько под Windows разработчиков?
Вряд ли. Плюс всё еще нужны специальные знания — программист под Windows может не знать слова «пин, вольт, логический уровень, прижимание к земле», а для МК это нужно, хотя и меньше, чем для распайки оного.
NTFS
0
Столько же, сколько под Windows разработчиков?
Не столько, но намного больше, чем, например, разработчиков прошивок ПЛИС.
программист под Windows может не знать слова «пин, вольт, логический уровень, прижимание к земле»
Ну вот если программист этого не знает, и получаются переусложнённые крокодилы, работающие менее стабильно, чем поделка за 10$ на ардуине.
makise_homura
0
Времена, когда программист одновременно был инженером, электронщиком и мог спаять сам себе компьютер из спичек — прошли. Сейчас это очень узкая отрасль, знаешь одну часть одного фреймворка — прекрасно, делай своё дело.
NTFS
+1
В том-то всё и дело, что это не прекрасно, но общепринято.
makise_homura
0
что это не прекрасно
Именно.
Opaline_Arcana
+1
«Мир изменился», что поделать, я тоже немного скучаю по временам, когда на QuickBasic можно было сделать коммерческий софт и его поставят в продакшн.
Сейчас для тех же целей нужен огромный сервер и огромная инфраструктура, да еще никто не доверит это все в одно рыло, слабозаменяемое и возможно, капризное рыло.
NTFS
0
Отдать продукт качественный через год, или выпустить плохонький, но через месяц?
Есть ещё вариант: выпустить плохонький, но через месяц, а потом оставшиеся 11 месяцев дописывать хороший и выдать его.
Но никто так делать не будет, потому что плохонький уже есть, развитие не нужно, а народ пусть жрёт что дают, альтернативы ж нет.
makise_homura (ред.)
0
выпустить плохонький, но через месяц, а потом оставшиеся 11 месяцев дописывать хороший и выдать его

Для того, чтобы продукт покупали, нужно к нему постоянно делать новые плюшки. А если вместо плюшек делать рефакторинг, то народ купит версию 2.0 уже у соседней конторы, потому что её продукт хоть и жрет в два раза больше ОЗУ, но зато умеет еще пару новых функций.
И ни один инвестор или учредитель не позволит 11 месяцев просто так тратить на улучшение кодовой базы без видимого результата. "- Мужики, мы сократили дублирование кода в три раза и повысили скорость рендера на 20%! — Молодцы, все уволены к хренам."
NTFS
0
Для того, чтобы продукт покупали, нужно к нему постоянно делать новые плюшки.
Во-первых, ты покупаешь не онлайн-банк, а услуги самого банка (которые, к слову, в новых версиях всё сложнее и сложнее купить из-за всё время меняющегося интерфейса, дурацких сообщений «вам звонил мошенник», возникающих рандомом (причём они даже не говорят «возможно», они прям с уыеренностью — «вам звонил мошенник» каждые пару часов при попытке входа, даже если никто не звонил) и прочей хрени); а во-вторых, делать новые ненужные плюшки не нужно, куда правильнее развивать нужные.
народ купит версию 2.0 уже у соседней конторы
Интересно, какая контора сумеет написать альтернативный софт для сбербанка?
makise_homura
0
А, ты про конкретный софт.
Для банка его приложение не является основной деятельностью, оно запущено по принципу «штоб былО»
Работа банка — это кредиты, залоги, вклады, операционная деятельность. Хорошо, что вообще какое-то приложение есть и какой-то сайт.
NTFS (ред.)
0
Хорошо, что вообще какое-то приложение есть и какой-то сайт.
И плохо, что его развивают по принципу «плевать на удобство пользователя, давайте туда насыпем ненужных плюшек, каждую версию будем менять интерфейс, а на сервере будем банить старые версии, чтобы все принудительно обновлялись, а не сидели на лёгкой, быстрой, привычной и удобной исходной версии без наших плюшек».
makise_homura
0
Тинькоф с Альфой будут вам рады, Сбербанк давно не монополист.
Правда, у первого тоже есть некоторые «находки», но так как они исходно без отделений были, то косяки сайта чинят быстро, и обслуживают по телефону лучше. Не реклама, но рекомендую.
NTFS
0
Интересно, какая контора сумеет написать альтернативный софт для сбербанка?
Да кто угодно с мозгами напишет софт для банка, чай не бином ньютона как говорится. А вот протащить его через все сертификации, ФСТЭК и прочую дичь — вот тут уже васе с улицы делать нечего, даже если его версия в 100 раз лучше.
Opaline_Arcana
0
Да кто угодно с мозгами напишет софт для банка

… потом забывает добавить контрольную сумму для счета, перевод на 9999999 рублей уходит в содержимое неинициализированной памяти и к банку едет недовольный клиент в сопровождении СОБРа или ОМОН, пояснять за надежность софта :-)

Утрирую чуток, но банковский софт — это не игры с понями скачущими, это на три порядка серьезней.
NTFS
0
А то штатные банковские макаки-кодеры так не упорят))
Opaline_Arcana
+1
Ну и там ещё надо понимать, что никто тебе не расскажет внутренние протоколы, по которым это приложение работает с банком, чтобы ты не написал как что-то типа миранды или qip вместо обычного клиента аськи, лол.
makise_homura
0
Ну в теории можно отреверсить — но тут да, уже неоправданный геморрой. Но я в целом — что такие вещи как банковская инфраструктура это вовсе не что-то такое запредельное, что может постичь только мега-гуру, 30 лет медитировавший в позе лотоса на вершине Фудзиямы))
Opaline_Arcana (ред.)
0
Скорее всего, отреверсить будет сложно, да и на стороне сервера будет легко вычислить неоригинального клиента и забанить. Мы к этому уже пришли, например, с дискордом, в котором в ToC прямо прописан пермабан при использовании неоригинального клиента.
такие вещи как банковская инфраструктура это вовсе не что-то такое запредельное, что может постичь только мега-гуру
Разумеется. Так-то функционал банковского софта очень простой — показ данных по счетам (балансы и выписки) и переводы (себе, другим или в организации). Обидно, что мы дожили до такого, что клиент, который делает это, весит в пределах не 1 МБ, а 300.
makise_homura
0
Так-то функционал банковского софта очень простой

«А мужики-то не знают»©
Мы как-то делали примитивный эквивалент для внутреннего учета — там тоже были
показ данных по счетам (балансы и выписки) и переводы (себе, другим или в организации)

причем даже не касаясь переводов внешних.
Через три месяца всех разогнали и за сотни нефти купили готовое решение.
Потому что денежные операции (даже виртуальные) — это ПЦ как сложно.
NTFS
0
это ПЦ как сложно.
Сложна там не бизнес-логика, а обеспечение безопасности.
Но нормальное обеспечение безопасности — это OpenSSL и доверенные протоколы, а не сотни мегабайт неиспользуемого кода фреймворков и попытки втюхать пользователю, что ему «звонил мошенник» каждые 15 минут (даже если никто не звонил вообще).
makise_homura
0
Радуйтесь, что хотя бы макаки, причём не столько пишут, сколько копируют более-менее проверенные фрагменты кода со stackoverflow. А вот представьте, что будет, когда писать код начнёт ChatGPT. Тут уже и в 260Мб будет не уложиться, потребуется пара гигов как минимум. Зато быстро и дёшево, и ставить обновления вам придётся не раз в неделю, а каждый час, ибо генерирующий их скрипт будет просто запускаться по таймеру прямо на проде.
Lyx
+1
Это ты сейчас похоже винду-12 описал =)
Opaline_Arcana
+1
Да нет, хакерский код там будет на 1-4 кБ, а на 30 кБ — этот тот же функционал, просто написанный и собранный нормально, а не с кучей мусора. Подозреваю, что там реальный код и собирается в объектник подобного размера, просто да, к этому объектнику ещё тянутся мегабайты фреймворков, из которых используется 0,0001% функционала.
Это как нынешняя мода на приложения на Electron-е: 10 кБ кода и сотни мегабайт встроенный браузер, в котором этот код выполняется.
makise_homura
0
Ты же понимаешь, что когда ты на том же Qt пишешь lab1.setText() — это не означает, что ты дергаешь одну-единственную функцию из фреймворка, это задействует на деле огромную кодовую базу, из который ты не задумываешься о кодировке text (привет, ночные кошмары CLPWSTR), не паришься насчет контекста вывода (GDI или OpenGL), и даже не создаешь самолично окно с помощью древнего CreateWindowEx?

Пару раз мне встречались концепции, дескать, Дельфи такой тяжелый, а у меня приложение на C++ WinAPI в 50 раз меньше, давайте на нём делать. Давайте. Но когда число компонентов вырастало за сотню, а обмен данными шел в три стороны — все тут же вспомнили, как классно было жить на событиях, VCL и ProcessMessages()
NTFS (ред.)
0
Пару раз мне встречались концепции, дескать, Дельфи такой тяжелый, а у меня приложение на C++ WinAPI в 50 раз меньше, давайте на нём делать. Давайте. Но когда число компонентов вырастало за сотню, а обмен данными шел в три стороны — все тут же вспомнили, как классно было жить на событиях и ProcessMessages()
Как это меняет тот факт, что одну форму с одним сообщением эффективнее написать на WinAPI, а систему из десятка сложных форм, с OLE/DDE/чотамещёбыло — на Delphi?
makise_homura
0
Вот только если нужного компонента не находится, или надо что-то с ним нештатное сотворить — тут-то и начинается бдсм 21+.
Opaline_Arcana
+1
За двадцать лет практики всего несколько раз пришлось сделать собственный компонент, и это прекрасно решалось чтением исходников и наследованием от TGraphicControl или от TWindowControl.

Структура библиотеки VCL одна из лучших, на уровне Qt для своего времени и выше уровня всяких Gtk и WinForms
NTFS
0
TGraphicControl или от TWindowControl.
Чисто для интереса — а они в сабклассинг встроенных виндовских контролов умеют «искаропки»? Чтоб без танца с бубном получить скажем WM_PAINT из потрохов штатного BUTTON?
Opaline_Arcana
+1
Так глубоко не копал, но зачем тянуть виндовый BUTTON, когда можно унаследовать готовый TButton?
NTFS
0
Ну если я хочу например, чтоб на штатном BUTTON вместо простой надписи «ОК», «Отмена» они рендерилась полноценным 3д, с вращением, текстурами и блестками, через ДиректХ или ОпенГЛ, и при этом с прочим поведением как у BUTTON.
Opaline_Arcana (ред.)
0
Только щас заметил комментарий.
Delphi позволяет прозрачно использовать вызовы WinAPI, лучше него это делает только C++. Вплоть до того, что можно делать оконное приложение на ObjectPascal без VCL. То есть, если хочешь бахнуть уникальный компонент — можешь прямо гнать чистый Win-код с привязкой чего угодно.
Другое дело, что за 30 лет уже все-все-все компоненты написаны и нужда в собственных — это редкость.
NTFS (ред.)
0
можешь прямо гнать чистый Win-код с привязкой чего угодно.
Ну в том и дело — что получается надо ручками уже и сабкласинг, и очередь сообщений, а просто от TGraphicControl засабклашенный элемент уже не сделать.
Opaline_Arcana
0
Скорее всего да. Но как-то компоненты для того же OpenGL делают, значит, это решаемая задача.
NTFS
0
Вот в том и проблема всех фреймворков, что если надо что-то нестандартное — то он бесполезен, а то и из помошника порой превращается в помеху.
Opaline_Arcana
0
Времена, когда весь интерфейс создавался миллионами вызовов CreateWindow и SetWindowPos, были не лучше.
NTFS
0
Небольшой гибкий фреймворк чисто под свои задачи, где под капот один раз спрятал все CreateWindow и SetWindowPos, зато предельная гибкость и расширяемость (если конечно с архитектуркой непроклопался)
Opaline_Arcana (ред.)
0
Своя программа на своем фреймворке, на своем языке, на своей оси, на своей архитектуре, на своем железе, на своих законах физики...
MTH_Root
+1
Зря смеешься. Поинтересуйся проектами Coreboot например, или Trinity, а также OpenRISC-V. Не всем нравится прозондированый по самые гланды ширпотребный хард/софт.
Opaline_Arcana (ред.)
0
Про Coreboot я знаю. Я бы тоже хотел запилить нормальную систему с нуля, но ресурсов на такое нет. Вот и остается лишь смеяться сквозь слезы.
MTH_Root
0
Как минимум coreboot выполняет вполне определённую задачу, которую не выполняли проприетарные буты. То есть как минимум на него запрос среди пользователей есть.
makise_homura
0
Так о то ж…
Opaline_Arcana
0
Несмотря на то, что я местами сам так делаю (для понных игр запилено уже ТРИ фреймворка на Qt,ObjectPascal и C# вместо того, чтобы один раз освоить Godot или Юнити) — это не тот путь, который стоит рекомендовать.
1) Разработчики фреймворков в целом более квалифицированные люди, и делают это лучше.
2) Многие моменты, которые не видны при разработке, становятся видны при запуске у клиента (привет, настройки DPI), промышленный фреймворк это учел, самодельный фреймворк — как повезет.
3) При обновлении программы, нужно обновлять и фреймворк, и программы. Промышленный движок обновляют за тебя.
4) (важно, если работаешь не один или пишешь заказчику с передачей кода) Тому, кто будет поддерживать/дорабатывать твой код, придется выучить твой фреймворк, что сводит число кандидатов на замену практически в ноль. Быть привязанным к своему проекту чугунными цепями — это плохо.
NTFS
+1
1) — Спорно) Особенно сейчас, когда уровень кодеров в целом падает.

2) — Ну, тем разработчикам эти моменты тоже не через libastral снизошли) Вдумчиво курить маны, нормальную литературу (а не книжки «я у мамы программист за 21 день»), те же исходники других фреймворков, и прочее. На самом деле практически все типовые грабли (тот же DPI) давно описаны, надо только не лениться инфу искать.

3) Так если это твой фреймворк — что мешает?) Наоборот, кто как не ты, лучше всего знает что может вылезти при обнвлении, когда все компоненты твои.

4) Спорно. Так и так им придется чужой код курить, а хорошо спроектированный фреймворк наоборот внесет архитектурную ясность.
Opaline_Arcana
0
Пока будешь
Вдумчиво курить маны, нормальную литературу (а не книжки «я у мамы программист за 21 день»), те же исходники других фреймворков, и прочее

заказчик уйдет к другому исполнителю, который попроще, но взял готовый VCL/Qt/WinForms и выдал результат за два дня, а не за две недели.

По пункту 4, опять же, новый исполнитель не захочет тратить время на изучение фреймворка, который только тут и используется — и заказчик будет огорчен. А огорченный заказчик это плохо, а если он некультурный, то еще и больно.
NTFS
+1
Так сначала сделать фреймворк, потом заказы брать, а не наоборот =)

А тут вообще ситуация странноватая. Заказчику нужна решенная задача. Исходник его вообще волновать не должен, хоть он на фортран-66 сделан. Если же хочет взять исходник и ковыряться сам — ну так проблемы индейцев шерифа не волнуют уже.
Opaline_Arcana
0
сначала сделать фреймворк
xkcd/standards.jpg
makise_homura
0
1) QA в сотню человек (даже если они менее профессиональны, нежели разработчик) не может быть хуже QA из одного человека хотя бы по причине намного большего количества окружений тестирования.
2) Вот только всё предусмотреть достаточно сложно — опять же из-за пункта 1.
3) Мешает необходимость уделения этому большего количества времени?
Вот я уже понял, что писать свой консольный «фреймворк» для RUMIA было плохой идеей, потому что из первоначальной идеи «лазить на парочку компов по ssh и смотреть температуры» это превратилось в огромного слабоподдерживаемого крокодила, и это надо теперь активно переводить на ncurses хотя бы.
4) Вот только не всегда «хорошо спроектированный фреймворк» — это твой, а не общеиспользуемый))
makise_homura
0
1)
QA в сотню человек (даже если они менее профессиональны, нежели разработчик) не может быть хуже QA из одного человека
Сколько там времени Hearthbleed сидел в OpenSSL? ;)

2) Опять же, свой узкозаточенный фреймворк проще в поддержке, чем монстр типа Qt. Сотня QA там просто не нужна.

3)-4) Тут по ситуации. Да, если фреймворк вырастает спонтанно из *первоначальной идеи «лазить на парочку компов по ssh*, там по итогу может оказаться слабоподдерживаемый клубок кода, знакомо. Поэтому опять же — проектировани и архитектура наше все.
Opaline_Arcana
0
Это еще более-менее вариант, если ты сам себе клиент и заказчик (например, делаешь игру любительскую или тулзу для внутреннего использования).

Программирование на заказ с передачей исходников или для компании — только массовые языки и только популярные фреймворки. Любой велосипед тебя высечет, рано или поздно.
NTFS
0
с передачей исходников
Зачем? Ну вот зачем заказчику исходники, особенно если он сам не связан с ИТ? Это из серии получается «дай дураку стеклянный хер». Если так хочет исходники — опять же уже не проблемы автора, как они там разбираться будут. Ну а если подписался на пожизненную поддержку — тут сам себе буратинка уже, да.
Opaline_Arcana (ред.)
0
Без исходников как раз и получится пожизненная поддержка. А так проще — вот код, вот система сборки, вот документация, всё, ищи нового исполнителя, моя работа здесь окончена.
NTFS
0
вот код, вот система сборки, вот документация, всё, ищи нового исполнителя, моя работа здесь окончена.
Ну да — вот тебе код на фортран-66 и система сборки на лисп-1. Проблемс? *троллфейс* ))
Opaline_Arcana
0
фортран-66

И даже его знает больше людей, чем твой самодельный фреймворк.
NTFS
+1
Ну, любой язык/фреймворк в начале знает только его автор(ы). А там как пойдет =)
Opaline_Arcana (ред.)
0
Сколько там времени Hearthbleed сидел в OpenSSL? ;)
А сколько бы он там сидел, если бы проверял код один разработчик?))
Опять же, свой узкозаточенный фреймворк проще в поддержке, чем монстр типа Qt.
Ну, понятия «узкозаточенный» и «фреймворк» немного конфликтуют) Одно дело — либа с десятком функций, другое — «мне не нравится Qt, напишу-ка я свой Qt-ng».
makise_homura
0
А сколько еще таких сидит =) И будет еще больше. На хабре была заметка на днях — уже набралась кое-какая статистика по использованию Copilot. Результаты ожидаемо печальны — качество кода упало, а CWE-шек стало больше.

Ну под свои задачи и нет смысла писать свой Qt с блекждеком и Рэрити) Фреймворк вполне может быть легковесным, как тот же FLTK например.
Opaline_Arcana
+1
А сколько еще таких сидит =) И будет еще больше.
Вот потому в современном коде QA — даже важнее написания этого кода. Потому что ненаписанный код убытков не принесёт (хоть и прибыли тоже), а вот написанный, но написанный с уязвимостями — может принести такие, что никакая прибыль этого не покроет.
makise_homura
0
Проблема в том, что подобные велосипеды редко становятся чем-то массовым и часто не имеют не то, что вменяемой, а вообще никакой документации. В итоге все такие пишут свои нередко глючные «фреймворки» и проги на них, а потом все удивляются, отчего прога падает по клику просто в области окна.
makise_homura
0
а потом все удивляются, отчего прога падает по клику просто в области окна.
А то на менстримных фреймворках такого нет =) Джаббер-клиент Psi под виндой — написан на Qt. Рандомные падения регулярны.
Opaline_Arcana
0
У Qt очень высокий порог вхождения, если VCL или WinForms тебе более или менее внятно говорят, что не так с твоим UI (потерян предок или обращение вне синхронизации, к примеру), то С++ просто падает без привета и ответа.
НО: по нему море документации и океан примеров.
И тысячи спецов.
NTFS (ред.)
0
то С++ просто падает без привета и ответа.
И тут кстати еще одна проблема огромных фреймворков — легаси. В современном С++ полно способов сделать так чтоб не падало, и тем более не падало без привета и ответа. Но Qt начинался во времена С++03 если не раньше, и теперь естественно никто его ядро не будет переделывать под новые возможности плюсов.
Opaline_Arcana
0
Есть такая проблема, да. На C++ вообще не очень хорошо с фреймворками UI, чтобы без слез и превозмоганий — как раз потому, что порог вхождения высок и никто не хочет тратить полжизни на создание фрейморка, а потом его изучение.
wxWidgets более-менее еще.
NTFS
0
Ну легковесные вообще на чистом С все, такие как Nuklear, FLTK
Opaline_Arcana
0
Начнём с того, что и современный С++ — это тоже тот ещё клубок легаси и устоявшихся способов использовать вещи не так, как это было задумано изначально (ну типа как когда вместо func(a, b) используют template<a, b> func() просто потому, что так все привыкли, а не потому, что инстанцирование шаблона позволяет что-то сделать лучше, чем вызов функции.
makise_homura
0
НЯМС, для того и запилили новый компилятор CLang, чтобы убрать все конструкции из Си и оставить только современные варианты.
NTFS
0
Не взлетит. Уже есть аналогичные Zig и Carbon — дальще хелловордов от энтузиастов не шибко продвинулись
Opaline_Arcana
0
Эээ, нет, Clang это сейчас новый стандартный компилятор, замена MinGW и gcc.
NTFS
0
Шланг он шланг и есть. Порой давится тем, что gcc и даже, прости господи, MSVC прекрасно жрут)
Opaline_Arcana
0
Скорее всего, давится какими-то старыми или нестандартными вызовами, которые оставили в старых компиляторах для совместимости (gcc идет еще из 80-х, а MSVC из 90-х).
NTFS (ред.)
0
Наоборот, как правило слишном новыми 6-этажными шаблонами и прочей магией
Opaline_Arcana
0
Может быть. У меня CLang не запустился, так что я забил. Для мелких поделок есть MinGW, для крупной работы вообще C++ использовать не могу, моему мозгу от него больно.
NTFS
0
winlibs.com/ гаратнированнно рабочие и регулярно обновляемые гцц+шланг в одном флаконе под винду.
Opaline_Arcana
0
Их и использую, для mingw все ОК, Clang как-то отказался даже hello world собирать — и в свете того, что я уже практически отказался от использования C++ в новых проектах, оно и не критично.

Меня больше сейчас огорчает отсутствие промышленного компилятора Бейсика, хотя бы уровня FreePascal.
NTFS (ред.)
0
промышленного компилятора Бейсика,
Visual Basic.NET — заброшен майкрософтом, но вроде ядро NET2.0 держит
Opaline_Arcana
0
Нативный компилятор, не в NET
Есть FreeBasic, но он слабее того же FreePascal.
NTFS
0
Нативные да — похоже сгинули вместе с ДОС.
Opaline_Arcana
0
Clang как-то отказался даже hello world собирать
Как же тяжело жить под виндой)))
(вот в линуксах всё из коробки, лол, при этом шланг что поставленный из реп, что собранный с нуля — работает идеально, ну, как минимум у меня).
отсутствие промышленного компилятора Бейсика
А на бейсике в 2023 ещё что-то пишут?))
(няз, были какие-то конверторы из традиционного бейсика на си и на питон, что ли, кажется, вполне норм решение)
makise_homura (ред.)
0
А на бейсике в 2023 ещё что-то пишут?))

Мир не ограничивается С++
NTFS
0
Ну правильно, вот только какую-то серьёзную популярность в нём имеют дай Селестия десяток-два языков, и бейсик в это множество вряд ли входит (скажем так, за последние лет 10 я не видел ни одной софтины, написанной на бейсике, кроме школьных лаб, да и то те уже чаще пишут на питоне).
makise_homura
0
У меня CLang не запустился
О.о што надо делать штобы шланг не запустился...
makise_homura
0
Он мне упорно говорил, что стандартные библиотеки не найдены, хотя всё было на месте.
NTFS
0
Так если ты компилил C++-ный код, то тебе надо было либо указать, что ты используешь GNU-шную libstdc++, либо поставить LLVM-ную libc++ (это так из-за лицензионных вопросов: libstdc++ распространяется под GPL, и это, несмотря на явно прописанное в лицензии исключение, не позволяет её использовать во всех юзкейсах, в которых можно использовать libc++).
makise_homura
0
Ну, то, чем давятся современные версии шланга (например, 16-й) и при этом не давится gcc — как правило, слишком уж редкость.
makise_homura
0
Эээ, стоп, но шланг тоже умеет и в С, и в С++. Это просто другой фронтенд, а так он мало чем отличается по языковым возможностям от gcc (собственно, поэтому он и один из двух основных компиляторов). Насчёт того, зачем его пилили — скорее для того, чтобы полноценно использовать возможности llvm-ir и собственно LLVM как кодогенератора.
makise_homura
0
зачем его пилили
Изначально его пилили для Фряхи же — потому что лицензия ГПЛ у гцц не устраивала фряшников. Ну а потом все завертелось)
Opaline_Arcana
+1
это скорее прежде всего LLVM за этим пилили, а потом и всю инфраструктуру продолжили)
makise_homura
0
Вот только я почти уверен, что он падает не в коде фреймворка, а в своём собственном коде. А не потому, что кто-то во фреймворке накосячил с обработкой кликов по канвасу)
makise_homura
0
Забота фреймворка в том числе — защита от тупости/неопытности программиста, если что-то сделано неправильно, нужно это обработать и сообщить, в идеале, без падения интерфейса.
VCL так и работает, чтобы убить дельфийское приложение, нужно очень постараться, и тебе в любом случае кинут хотя бы AccessViolation с адресом.
NTFS
0
Забота фреймворка в том числе — защита от тупости/неопытности программиста
Именно.
Opaline_Arcana
0
Справедливости ради, от языка еще много зависит.

Например, следующий пример на C# будет обработано корректно с понятным исключением.

String s = null;
Console.WriteLine(s.Trim());


а вот на Паскале или Си такой пример убивает программу, что конечно, сильно мешает работе.
NTFS
0
Сделай обертку над стринг, делов-то, которая при любом обращении s.че_угодно() подставляет «дядя, у тебя тут null» )
Opaline_Arcana
0
Так в том и суть, что на старых языках нужно писать что-то вроде
safeTrim(s)
в которой типа
if (s=nil) then raise TException.Create('все плохо') else s.Trim();

а C# это делает сам и везде.
NTFS
0
В последних плюсах можно сэмулировать тоже почти такое поведение, через перегрузку операторов.
Opaline_Arcana
0
Перегрузка оператора -> считается опасным трюком и 1001-м способом прострела ноги.
NTFS
0
Так уметь надо)
Opaline_Arcana (ред.)
0
Не очень понял, зачем тебе перегружать оператор дереференса в этом случае.
Скорее тебе надо перегрузить конструктор, чтобы он прежде всего позволил тебе создать строку из nullptr, а не кидал исключение std::logic_error c чем-то типа «basic_string::_M_construct null not valid».
makise_homura
0
Ну да, как-то так грубо
class my_string_t
{
public:
    my_string_t() = default;

    my_string_t( const char* s )
    {
        if( s )  
        {
            memcpy( (p = new char[len]), s, (len = strlen(s)) );
            is_null = false;
        }
    }

    ~my_string_t() { if( !is_null ) delete[] p; }
private:
    char* p   = "дядя, тут нулл";
    size_t len = 0;
    bool is_null = true;
};
Opaline_Arcana (ред.)
+1
Я б его ещё унаследовал от std::basic_string, чтобы получить всю строковую функциональность из коробки, но в целом да, именно так)
makise_homura
0
Ага, и надо еще порешать, что возвращать как длину строки в случае «псевдонулл» — ноль или длину строки-ворнинга «дядя, тут нулл»
Opaline_Arcana
0
Кстати да, интересный вопрос. Ведь по этой длине могут решить выделять буфер определённого размера. Поэтому, кажется, безопаснее второе.
makise_homura
0
Да, второе надежней и логичней. ну и по мелочи можно упороться, и упихать пару переменных len и is_null в битовые поля одной 4-байтной структурки. Врядли кто упорется строкой длинее 2Гб, а экономия с учетом выравниваня будет аж 7 байт на экземпляр my_string_t. Может быть актуально для какого-нибудь приложения где миллионы строк и актианвя работа с ними.
Opaline_Arcana
+1
Можно, но я думаю, что в 99% случаев экономия байтиков (порой в ущерб производительности) того не стоит)
makise_homura
0
Вроде стандартный std::string так и делает кстати. И там еще хитрее в некоторых реализациях STL — короткая строка сама на переменные p и len ложится, без выделения в куче.
Opaline_Arcana
+1
Там ещё важна архитектурная скорость (на некоторых архитектурах прочитать две упакованные короткие невыровненные переменные медленнее, чем две нормальнные длинные выровненные). Но на x86_64 вроде да, так можно)
makise_homura
0
Что такое nil, если мы говорим про любые нормальные языки языки кроме паскаля?))))

Тебе либо надо писать такую функцию в принципе (потому что в стандартной библиотеке нет trim() и тогда то, как ты будешь обрабатывать ситуацию src == NULL, лежит на твоих плечах), либо у тебя нет способа необрабатываемым образом без извращений загнать nullptr в std::string или его аналог.
makise_homura (ред.)
0
Что такое nil

То, что при подаче на printf("%d") выведет 0.
Ситуацию, когда по указателю находится мусор, конечно, не рассматриваю.
NTFS
0
Кстати в любом языке с указателями, может быть ситуация, когда он не nil, но обращение к нему вызовет AV или UB ;)
Opaline_Arcana
+1
То, что при подаче на printf("%d") выведет 0.
В С++ такие объекты, из которых можно сконструировать std::string, отсутствуют.
makise_homura
0
String я просто для примера привел, ну пусть есть класс TPony, объявили на него указатель, создаём
TPony * createPony(string code)
{
if (code==«pegas») return new TPegas();
if (code==«unicorn») return new TUnicorn();
}

а про земных пони забыли, и если я сделаю так:
auto pony = createPony(«earth»);
pony->Run()

то системы вроде C# и .NET дадут мне внятный ответ, что случилось
А программа на C++ просто рухнет, ничего не сказав на прощание.
NTFS
0
TPony * createPony(string code)
{
if (code==«pegas») return new TPegas();
else if (code==«unicorn») return new TUnicorn();
else throw std::logic_error(«странная зверюшка»);
}

то есть в дереве условий всегда делать последнюю ветку с эксцепшеном. А если ветвей много, то лучше в сторону std::map посмотреть или типа того.
Opaline_Arcana
+1
Чего только не делается, лишь бы не проверять средствами самого рантайма языка, null там или что полезное.

Но я согласен, что это противоречит идее С и С++. Там минимум проверок, максимум скорости. Потому что задачи другие решаются. Бизнес-логику на 100 классов никто на плюсах делать не будет, а если будет, то пожалеет.
NTFS
0
Чего только не делается, лишь бы не проверять средствами самого рантайма языка, null там или что полезное.
А разгадка проста — безблагодатность))) Управление памятью — это часть более общей проблемы управления обобщенными ресурсами. Допустим да — при выделении памяти можно принять что 0 это ошибка, и отслеживать рантаймом (экзотические архитектуры и МК допустим не рассматриваем). Но существует куча хэндлов, для которых ноль — вполне валидное значение. У сокетов например неверное значнеие это минус единица. У файлов в линухе ноль — вполне себе хэндл. И так далее — огромная куча вариантов. С этим как быть, если пихать все в дефолтный рантайм. Поэтому и отдано на откуп кодеру, чтобы делал безопасные обертки по ситуации.
Opaline_Arcana
+1
Такими темпами я вскоре поверю, что ты не та Зебра. У оной нет технических знаний.
MTH_Root
0
Спойлер
Opaline_Arcana
+1
Достаточно просто принять за правило, что для принимающих null типов — допускать только операции сравнения или isNull()
Для простых типов — по-другому.

В C# просто решили, что всё есть объект (даже int) и они различаются только обработкой и передачей (по ссылке для одних классов, по значению или копированию для других).

И да, записать в C# MyClass a = 0 не выйдет, если только MyClass не определен как целочисленный.

Цена этого всего, конечно, огромна, по памяти и размерам фреймворка.
NTFS
0
Кстати о Шарпе, и прочих языках (Джава и т.п), где управление памятью отдано рантаймму + GC. Там проблема обощенных ресурсов заметается под коврик, но ушки то торчат в виде IDispose в шарпе и finalize в джава ;)
Opaline_Arcana
+1
IDispose просто явный способ указать сборщику, что вот этот объект нужно удалить сразу. Не через час, когда накопится много, а сразу. И в 99% это связано с файлами, сокетами и прочими вещами, которые не могут быть открыты часами.

Для обычных объектов логики такого не требуется.
NTFS
0
Дык именно что явно — и мы опять возвращаемся к ручному управлению и внимательности кодера ;) Да, приложение не упадет по бизнес-логике, оно упадет по исчерпанию пула сокетов, если на Connect забыл dispose дернуть. Те же яйца, только сбоку ;)
Opaline_Arcana
+1
Более того, языки с неявным освобождением ресурсов побуждают программиста не думать об их освобождении, а значит, он начинает более вольно относиться к этому. И да, в итоге мы имеем проги, которые держат все открывавшиеся в них файлы, пока саму прогу не закроешь.
makise_homura
0
Это вообще не проблема, объекты с короткой жизнью создаём на using(), который сразу по выходу из блока его очищает.
Смысл сборщика в том, что в крупных проектах не всегда возможно удалить объект там же, где его создал — потому что создают как правило фабрики, а удаляются по устранению в нём надобности. И всё попытки отказаться от сборщика мусора (которые в том или ином виде существуют во всех языках, даже в ObjectPascal с его IInterface и счетчиком ссылок) — приводили к тому, что в программе появлялся собственный велосипедный сборщик мусора, разве что написанный не инженерами Microsoft/Sun, а автором проги :-)
NTFS
0
Так проблема не в наличии GC (это удобная вещь, если правильно им пользоваться), а в том, что на него заодно возлагают то, для чего он не предназначен.
makise_homura
0
которые держат все открывавшиеся в них файлы, пока саму прогу не закроешь.
И игры, которые чем больше играешь, тем сильней лагают, и порой заканчивают вылетом, а то и BSOD, потому что ресурсы пройденных уровней не освобождаются =)
Opaline_Arcana
+1
Достаточно просто принять за правило, что для принимающих null типов — допускать только операции сравнения или isNull()
Щито. Зачем так ограничивать функциональность?
Или я тебя не понял, или ты сейчас пытаешься починить то, что не сломано.
И да, записать в C# MyClass a = 0 не выйдет, если только MyClass не определен как целочисленный.
Как бы в С++ тоже (но там важна не целочисленность, а наличие конструктора по подходящему аргументу).
makise_homura (ред.)
0
лишь бы не проверять средствами самого рантайма языка, null там или что полезное
Во-первых, ты сейчас путаешь два _крайне разных_ случая: в случае с std::string у тебя был nullptr, а в случае с TPony у тебя было неинициализированное значение (а если я помню, вызов метода из неинициализированного объекта — это UB, и это правильно, потому что компилятор не знает, а вдруг это SHM-объект и туда только что другой поток положил что-то корректное).
Так что в случае с TPony там никакой проверки на nullptr не нужно, потому что nullptr вообще не фигурирует в коде. А если ты по умолчанию возвращаешь nullptr — то ты ССЗБ, потому что не знаю как тебе, а мне выглядит намного более логичным вариантом возвращать неспецифицированный объект (т.е. базового класса) вместо какого-то непонятно откуда взятого nullptr.
А во-вторых — зачем проверять рантаймом, если это намного логичнее сделать на этапе сборки?
Бизнес-логику на 100 классов никто на плюсах делать не будет, а если будет, то пожалеет.
Да нет, не пожалеет — посмотри тот же CMake, там классов пару сотен, и всё более-менее понятно.
makise_homura (ред.)
0
а в случае с TPony у тебя было неинициализированное значение

Это кстати, отдельная проблема, что компилятор позволяет в объявленной переменной находиться мусору, вместо того, что по умолчанию поставить туда дефолтное значение типа.

Но да, для С++ это недопустимо, ибо скорость и размер кода.
NTFS
0
Это кстати, отдельная проблема, что компилятор позволяет в объявленной переменной находиться мусору, вместо того, что по умолчанию поставить туда дефолтное значение типа.
Это не проблема, а наоборот, фича. Потому что опять же — биндинги к другим языкам, динамический маппинг памяти, SHM-IPC и т.п. без этого были бы либо невозможны, либо слишком переусложнены.
makise_homura
0
лучше в сторону std::map посмотреть или типа того
Кстати да, хороший совет в таком вот юзкейсе.
makise_homura
0
В современных ООП-языках вообще можно создать объект по имени его класса из строки, как и заполнить все поля. map это как раз для тех случаев, когда приходится перебирать строки и классы.
NTFS
0
Программа на C++ рухнет, если ты не обращаешь внимание на warning-и, что очень плохо и так делать нельзя.
Ты сейчас пытаешься, как я понимаю, реализовать фабрику, а значит, тебе достаточно в фабричной функции просто по дефолту возвращать объект базового класса, а в базовом классе сделать виртуальный метод, кидающий эксепшен. Вот так:
#include <iostream>

class TPony
{
    public:
        virtual void Run() { throw std::logic_error("I don't know who I am"); }
};

class TPegasus: public TPony
{
    public:
        void Run() { std::cout << "I can fly" << std::endl; }
};

class TUnicorn: public TPony
{
    public:
        void Run() { std::cout << "I can do magic" << std::endl; }
};

TPony* createPony(std::string code)
{
    if (code=="pegasus") return new TPegasus();
    if (code=="unicorn") return new TUnicorn();
#if RIGHT_VERSION
    return new TPony();
#endif
}

int main()
{
    auto rainbowDash = createPony("pegasus");
    auto twilightSparkle = createPony("unicorn");
    auto applejack = createPony("earth");

    rainbowDash->Run();
    twilightSparkle->Run();
    applejack->Run();
}
В твоей реализации (случай RIGHT_VERSION == 0) компилятор сразу кинет тебе -Wreturn-type, с чего ты поймёшь, где и почему ты лажанул, ещё при компиляции, а не когда словишь сегфолт:
homura@reisen ~ $ c++ -DRIGHT_VERSION=0 factory_test.cxx -o factory_test && ./factory_test
factory_test.cxx: In function ‘TPony* createPony(std::string)’:
factory_test.cxx:28:1: warning: control reaches end of non-void function [-Wreturn-type]
   28 | }
      | ^
I can fly
I can do magic
Ошибка сегментирования
homura@reisen ~ $
В то время, как при нормальной реализации, когда ты так сделал, всё получается нормально (как говорил профессор Фортран, нормально делай — нормально будет):
homura@reisen ~ $ c++ -DRIGHT_VERSION=1 factory_test.cxx -o factory_test && ./factory_test
I can fly
I can do magic
terminate called after throwing an instance of 'std::logic_error'
  what():  I don't know who I am
Аварийный останов
homura@reisen ~ $
А вообще, если ты значение `code` получаешь не откуда-нибудь, а пишешь прямо в коде, то тут легче вообще шаблоны использовать — тогда тебе будет очень легко расширить твой код, когда ты решишь добавить земных, аликорнов, и всё такое.
makise_homura (ред.)
0
Я примерно так и делаю. Но исходно ветка началась с того, что язык могут использовать неопытные программисты, которые не знают, что такое фабрика, виртуальные методы и паттерн нулевого объекта.
И в этом случае им тот же C# поможет — частично паттерн нулевого объекта реализован самой библиотекой рантайма.
NTFS
0
Ну как бы потому и надо выбирать язык, подходящий для конкретной задачи (и потому я часто говорю, что программисты не пишут «на языках», программисты разрабатывают решения в соответствующей предметной области, а уж какой язык они выберут — это примерно как какую отвёртку ты выберешь из набора, чтобы открутить конкретный винтик).
makise_homura
0
Проблема в том, что отвертку заменить легко, а язык нет, и к тому же, языки уже практически прибиты гвоздями к конкретным компиляторам. Если пишешь на Паскале — есть только два стула, Дельфи и FPC. Если на С++ — чуть больше, не не сильно. Остальные языки практически находятся в соотношении 1-к-1 с их средами разработки/компиляторами, изредка разбавленные любительскими поделками это побороть (как Mono для C#)
NTFS
0
Как правило, язык заменить не сильно сложнее отвёртки: научившись держать в руках одну отвёртку, ты фактически куда легче можешь научиться держать и другую. Разве что если языки отличаются парадигмой (процедурные/функциональные/декларативные/объектно-ориентированные), там да уже не две разные отвёртки, а отвёртка, динамометрический ключ и шуруповёрт.
makise_homura
0
или Си
Начнём с того, что расскажи, что ты используешь в качестве String и s.Trim() в С.
А на С++, к слову, няз, вообще нельзя создать std::string из nullptr.
makise_homura (ред.)
0
Начнём с того, что расскажи, что ты используешь в качестве String и s.Trim() в С.

Я про С++ больше.
По nullptr — могу же присвоить, ну пусть такой код

MyClass * var = NULL;
var->MyMethod();

PS: Ах да, сорок тысяч видов null в С/С++, против nil у Pascal, NULL у C# и 0 у Бейсика.
Так и не смог запомнить, когда какой применять.
NTFS (ред.)
0
MyClass * var = NULL;
var->MyMethod();

В грамотной архитектуре такого не будет. Но если параноить, то навскидку

#define SAFE_CALL( var, ... )  do { if( (var) ) { (var)->__VA_ARGS__; } } while(false)

и вызываем 
 SAFE_CALL( var, MyMethod() );

можно и через шаблонную магию — parameter pack и std::forward, но чутка побольше писанины будет в безопасной затычке.

когда какой применять.
nullptr всегда и везде. Все остальное древность для лютого леагси.
Opaline_Arcana (ред.)
+1
В грамотной архитектуре такого не будет.

Чем сложнее программа, тем выше шанс, что где-то не инициализировали.
NTFS
0
Модульность, юнит-тесты, стат-и дин-анализаторы…
Opaline_Arcana
+1
Это всё для проверок типа «вот переменная, она не присвоена. А вот ниже её использование, тут будет беда».
Уже при динамическом создании данных (например, маппинг из базы или конфига) это всё превращается в тыкву и нет никаких способов убедиться, что в поле pony лежит класс единорого, пегаса или просто null
И тут на сцену выходят умные языки, которые помогают хотя бы понять, что случилось.
NTFS
0
Так в плюсах, начиная с с++11 есть умные указатели всех видов. В с++17 добваили std::optional а в с++23 std::expected. Чутка пошаманив с ними вполне делаются умные обертки, позволяюшие убедиться, что в поле pony лежит класс единорого, пегаса или просто null
Opaline_Arcana
+1
нет никаких способов убедиться, что в поле pony лежит класс единорого, пегаса или просто null
Там не должен лежать null, там должен лежать предок единорога и пегаса, в котором все наследуемые методы кидают эксепшен pony::UnknownRace.
makise_homura
0
И мы изобрели паттерн нулевого объекта, но история о другом — что даже при нём нет гарантий, что вместо NullObject не окажется просто null
NTFS
0
Нет, это нелогично, потому что пони — наследник, допустим, pony::basic_pony, а не какого-то NullObject.
нет гарантий, что вместо NullObject не окажется просто null
А зачем ты туда его кладёшь?
Понимаешь, каждый раз, когда ты пишешь `Something *p = nullptr;`, ты должен задавать себе вопрос, а зачем ты так делаешь, и чем это лучше а) `Something *p = new basicSomething;` или б) `Something *p;`.
makise_homura
0
Поэтому никогда не надо напрямую присваивать nullptr указателю на объект вместо его создания, если ты не уверен, что ты эту ситуацию обработаешь дальше по коду. А если ты не присвоишь, то у тебя компилятор кинет -Wuninitialized и ты это отловишь.
makise_homura
0
MyClass * var = NULL;
var->MyMethod();
Эээ, погоди, в коде выше был не дереференс нулевого указателя, а создание строки из nullptr. Сам указатель на эту строку, разумеется, не будет nullptr.
Ах да, сорок тысяч видов null в С/С++
Да неправда, ровно по одному — NULL в С и nullptr в С++. Остальное — легаси.
makise_homura
0
Остальное — легаси

Почему тогда код
int * x = 0;
будет откомпилирован?
NTFS
0
Потому что это легаси. И современные компиляторы на -Wall дадут ворнинг в этом месте.
Opaline_Arcana
+1
Лол, да потому что это то самое легаси и есть =)
makise_homura
0
Возможно, я неправильно понимаю термин «легаси». В моём понятии — это конструкции языка, которые современные компиляторы не берут или дают при этом кучу красных строк, и чтобы его собрать — нужно ставить соответствующие версии библиотек/компиляторов.

В Паскале, например, это тип Object, который уже не собрать ни Delphi, ни FPC без специального ключа. Хочешь работать с Object, ставь TurboPascal. Или перейди на TObject, который современный.

В C++ такие конструкции — это вероятно, использование new/delete, указатели по звездочками и прочие трюки из ранних 80-х. И свежие версии gcc их поддерживать не должны, без явного указания стандарта.
NTFS
0
использование new/delete, указатели по звездочками

Как в этом вашем кровавом энтерпрайзе все жестко.
MTH_Root
0
Смотри, вызов new без системы сборки мусора — это фактически ты говоришь системе «братан, я тут у тебя немного памяти возьму, но когда верну и верну ли вообще — не знаю, извини».
Если в системе создаются тысячи объектов в минуту (обычное дело для высокой нагрузки базы или сайта) — то такое «возьму» заканчивается всегда одинаково, уходом сервера в перезагрузку.
NTFS (ред.)
0
Смотри, вызов new без системы сборки мусора — это фактически ты говоришь системе «братан, я тут у тебя немного памяти возьму, но когда верну и верну ли вообще — не знаю, извини».
Я бы сказал, что как раз так вот программисты часто делают, когда излишне полагаются на GC =)
(да, примерно поэтому тот же фаерфокс только жрёт и жрёт память, но никогда её не освобождает =)
makise_homura
0
Я бы сказал, что как раз так вот программисты часто делают, когда излишне полагаются на GC =)

С GC дело иное — вызов new говорит системе «братан, я тут у тебя немного памяти возьму, а вернет её тебе мой шеф, 100% вернет, рано или поздно».

Firefox скорее всего написан аккуратно, а память жрут сложные скрипты на сайтах (по сути, Firefox — это ОС, а сайты — прикладные программы).
NTFS
0
а вернет её тебе мой шеф, 100% вернет, рано или поздно
Вот только это «рано или поздно» при зависших ссылках может так и не наступить. И если полагаться на GC сверх нужного, то такое будет происходить, скорее всего, достаточно часто.
а память жрут сложные скрипты на сайтах
Ну так вот эти скрипты и написаны на JS, в котором есть GC. И потому, пока вкладку принудительно не закроешь, память ты обратно не получишь обычно(
makise_homura
0
Возможно, я неправильно понимаю термин «легаси».
Да, ты неправильно его понимаешь. То, что ты говоришь — это уже не легаси, это депрекации. А легаси — это то, что в целом ок с точки зрения языковых средств, но не ок с точки зрения хороших паттернов.
makise_homura
0
скомпилировать Console.WriteLine() под десяток платформ разом, и там же запустить.
Вот только это будет весьма усредненный Console.WriteLine(). Да, «хэлло ворлд» он тебе на десятке платформ нарисует. А вот если надо «хэлло» синим курсивом, а «ворлд» зеленым подчеркиванием, то тут уже не все так однозначно.
Opaline_Arcana
+1
С аппаратными ресурсами тоже не очень хорошо — я так и не смог заставить C#-код корректно работать с OpenGL на всех версиях Linux, хотя тот же SFML в сишной обертке работает отлично.
Но это и другие задачи, конечно — либо пишем с нуля, либо берем узкоспециальные движки.
NTFS
0
Вот потому-то по-настоящему переносимые приложения сейчас пишут на Electron. Да, гадость редкостная, зато в плане переносимости ни одна другая платформа даже рядом не стояла. Запускается реально везде с минимальными телодвижениями. И WebGL тоже везде работает, где есть хоть что-то похожее на GPU. И даже tensorflow.js есть, если вам надо нейронки гонять, чтобы они на любой платформе запускались, включая мобильные устройства.
Lyx
0
зато в плане переносимости ни одна другая платформа даже рядом не стояла

Qt? Но да, у неё порог входа выше и стоит, емнип, 5000$ в год для полноценной лицензии на коммерцию с закрытыми сорцами.
NTFS
0
Тоже чем дальше, тем большей гадостью становится, ну и поломали совместимость с вин-7 и 8, что странно на самом деле для фреймворка, претендующего на переносимость
Opaline_Arcana (ред.)
0
поломали совместимость с вин-7

Эм, нет. Qt5 прекрасно работает. Qt6 — да, уже никак, но это нормально. Как большинство компиляторов и библиотек уже не поддерживают WinXP, так и Win7 перестают. Сейчас основная версия — это Win10.
NTFS
0
Как большинство компиляторов и библиотек уже не поддерживают WinXP
На самом деле даже MSVC-2022 поддерживает сборку под ХР, но это ж надо ключик особый поставить в опциях проекта — нынешним кодерам с недельных курсов непосильная задача)) Вот и лепят сборку в дефолтном конфиге, который МС конечно 10-онли настроила)
Opaline_Arcana
+1
Вроде бы нет, компилятор последней студии уже только 64-битный, а XP была 32-битной.
NTFS
0
ХР была 64-бит версия, правда мало использовалась, ибо на бытовом железе тех лет профита с нее небыло от слова совсем.

А компиляция таки настраивается, прямо по инструкции от самой МС.
learn.microsoft.com/ru-ru/cpp/build/configuring-programs-for-windows-xp?view=msvc-170
Чутка потрахаться — ну то ж стиль МС, все автогеном через жопу делать)
Opaline_Arcana (ред.)
0
Собственно, прямо в статье
Если вы используете версию Visual Studio после 2019 16.7, распространяемые файлы не будут работать в Windows XP.

фактически, нужно собирать runtime руками.
NTFS
0
Нет, надо просто ставить на целевой ХР машине MS/Redist 2015 в котором msvcrt140 версия. Ну и при компиляции указать путь, чтоб подхватывал этот рантайм, по умолчанию да — он с десяточным слинкует.
Opaline_Arcana (ред.)
+1
Если честно, я не могу представить ситуацию, когда для софта общего назначения потребуется XP.
Уже и семерка-то осталась у единичных машин.
NTFS
0
XP да, а вот 7-ка последняя из нормальных осей от МС, так что ее хоронить рано. Не зря энтузиасты делают сборки для ее запуска на современном железе.
Opaline_Arcana (ред.)
+1
Энтузиасты и Windows 98 запускают, но если мы говорим о разработке для людей, то ориентироваться имеет смысл на Windows 10/11 и в меньшей степени на Windows 8.

Хотя я тоже свои проекты под семеркой тестирую в обязательном порядке, но это уже скорее перестраховка. Никто под семеркой ничего моего не запустит.
NTFS (ред.)
0
Вот как раз инди-игрушки на 7-ке очень даже запустят. Ибо полно еще офисных и нетребоватльных домашних машин с именно 7-кой. На статистику всяких Стимов и прочих гейм-магазинов в данном случае смотреть не следует — там да, тотальныя доминация 10-ки, ну так потому что все ААА игры под нее.
Opaline_Arcana
+1
Ибо полно еще офисных и нетребоватльных домашних машин с именно 7-кой.

Просто отмечу, что семерка — это 2009-ый год, это прошло уже 15 лет, два-три цикла смены технологий.
NTFS (ред.)
0
Принципиально с тех времен изменилось только развитие технологий виртуализации. Hyper-V в 10-ке да, хорош, и производные от него типа WSL. Но опять же — простому домащнему/офисному юзеру оно надо? А все остальное — тупо наращивание мощи — больше гигабайт, гигагерц, гигапикселей, принципиально ничего нового, с чем бы не справилась 7-ка.
Opaline_Arcana
+1
с чем бы не справилась 7-ка.

неотключаемые обновления и телеметрия везде и всюду. и с nvme ssd она по слухам паршиво работает
oxide
0
неотключаемые обновления и телеметрия везде и всюду
Это скорее куда более справедливо для десятки.
и с nvme ssd она по слухам паршиво работает
ОНа работает не из коробки (как десятка), просто драйвер нужно поставить. Так-то и XP тоже из коробки не поддерживала SATA-диски, но драйвером всё решалось.
makise_homura
0
Никто под семеркой ничего моего не запустит.
Я запускаю, твой аргумент инвалид)
makise_homura
0
«Почему, мистер Андерсон, почему вы это делаете?»
NTFS
0
Наверное, потому, что семёрка меня полностью устраивает и я не хоту заново всё переустанавливать и настраивать после перехода на десятку?
makise_homura
0
Да не у единичных. Очень многие на десятку переползают только под давлением непреодолимых обстоятельств (например, нужен Python 3.9). У нас на работе на половине машин до сих пор семёрка — потому что до десятки хрен обновишь, чтобы всё продолжило работать (это тебе не линукс, где просто делаешь do-release-upgrade и через полчаса получаешь ubuntu 22 вместо 20, и сам даже сразу не замечаешь, что что-то поменялось — настолько бесшовный переход)
makise_homura
0
на работе на половине машин до сих пор семёрка
Аналогично.
Opaline_Arcana
+1
Как вы в Интернет заходите на сайты без сертификатов?
NTFS
0
Нормальный браузер, у которого свое серт-хранилише а не встроенное виндовское.
Opaline_Arcana
+1
Что ты несёшь, Мария.
Firefox прекрасно обновляет свои сертификаты, это даже не надо делать руками, всё автоматизировано и незаметно для пользователя.
makise_homura
0
Как быть с программами, которые не Firefox и которым нужно иметь доступ в Интернет? Те же менеджеры загрузки Delphi и обновлялка студии?
NTFS
0
Для них можно обновить системные сертификаты СА, это тоже несложно.
makise_homura
0
Да, оно ж даже в системный лог событий пишет, чего ему для счастья нехватает.
Opaline_Arcana
+1
Для них можно обновить системные сертификаты СА

Ну я-то осилил, правда, каждый раз это великие жертвы всем богам экспорта и импорта сертификатов в доверенное хранилище. Но обычный пользователь на этом этапе уже встанет в неприличную позу, особенно если использует Chrome вместо FF
NTFS
0
Да ладно. Это гуглится за 1 минуту и делается ещё за 3.
makise_homura
0
если использует Chrome
Открыла щас хром, тоже работает. Или он должен от каких-то конкретных сайтов заколдобиться?
Dany
+1
Может, у хрома тоже своё хранилище сертификатов? Потому что FF я смог заставить работать, а Chrome всё говорил о небезопасном соединении.

Проверю.
NTFS
0
и которым нужно иметь доступ в Интернет?
Хм, не знаю как там с вашим прогерским софтом, а дискорд работает.
Dany
+1
Кстати, с дискордом другая проблема (и на 10 винде тоже): в нём невозможно прописать проксик (а из системных настроек он его брать отказывается). То есть, если на работе весь https/https/ftp трафик идёт через проксю — пиши пропало, надо ставить Proxifier и жёстко перехватывать весь трафик от процесса Discord.exe и направлять его на проксик.
То есть явно видо, что над сетевой частью разрабы дискорда совершенно не задумывались, лепили что получится — но тем не менее, даже у него проблем с сертификатами никаких.
makise_homura
0
Да любой вообще браузер так умеет, кроме МС-семейства (ишак, эдж, и их прочие б-гомерзкие порождения)
Opaline_Arcana
+1
Прекрасно заходим.
Вот стим выкинул подлянку, но я туда ходила-то пару раз в год. Но видимо придётся поставить десятку :\
Dany
+1
XP была и 64-битной, и достаточно популярной (правда по факту это была не совсем уже XP, а скорее развитие 2003).
makise_homura
0
и стоит, емнип, 5000$ в год для полноценной лицензии на коммерцию с закрытыми сорцами.
Вообще-то тут понятно почему — это запретительная стоимость, которая должна побуждать писать свободные проекты, а не проприетарку.
makise_homura
0
И даже tensorflow.js есть
Эх, а когда-то все ржали над тем, что кому-то пришёл в голову такой по тем временам кринж, как переписать ffmpeg на js… =)
makise_homura
0
Ну так там только биндинги дергаются к Си-ядру же… тут шо питон, шо жабаскрипт — пофиг так-то)
Opaline_Arcana
0
Хм, я слышал, что там именно весь код на js переписали О.о
makise_homura
0

Простите, несдержалась…
Opaline_Arcana
+1
Вот смех смехом, а народ настолько упоролся в облачные технологии, что сейчас нет ни одного кроссплатформенного фреймворка для беспроблемного запуска нейронок на пользовательских машинах, кроме связки Electron+Tensorflow.js.
Всё, что есть — это серверные технологии, для использования которых локально сперва надо накатить подходящий под данное конкретное оборудование набор фреймворков и библиотек гигабайта этак на полтора суммарным весом.
И вот как только нужно, чтобы нейронка крутилась не на сервере, куда клиенты только отправляют запросы, а поставлялась пользователям в виде бинарника и работала локально на любом GPU (NVidia, AMD, Intel) или даже без оного (расчёты на CPU), то оказывается, что вменяемых альтернатив-то и нет.
Electron работает везде, даже на мобильных устройствах, код один и тот же. Оно само выбирает, то ли компилировать wasm и считать на CPU, то ли создавать и компилировать шейдера на WebGL и юзать GPU.
Lyx
+1
расчёты на CPU
А что более-менее серьезная нейронка на голом ЦПУ насчитает то, если это не какой-то 128-ядерный райзен/зион?
Opaline_Arcana
+1
Понятно, что какой-нибудь Mixtral на этом не запустишь. Но вот например RealESRGAN для «умного» увеличения картинок или для их деблюра — запросто, нейронка небольшая по размеру. Или вот когда я обучал «Твайлизатор» дляперекраски Дэш в цвета Твайлайт то получил нейронку весом всего в 9Мб, и даже на двухъядерном CPU она примерно за 15 секунд отрабатывает.
Lyx
+1
Я не совсем понял момент
Самый крупный минус — это невозможность собрать с использованием другого ABI и тем более на другой архитектуре.

почему невозможно? Удаляем файлы 32-битной версии SFML из каталога addons/SFML, копируем туда 64-битный SFML, компилируем.

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

Обрати внимание, что для Linux и Mac я так не делаю, к примеру — там понятно, что .h и .so должны идти из системных каталогов.
NTFS (ред.)
0
Удаляем файлы 32-битной версии SFML из каталога addons/SFML, копируем туда 64-битный SFML, компилируем.
И почему бы это не автоматизировать на этапе конфигурации проекта, как это сделано во всём нормальном софте, а надо обязательно ручками?
makise_homura
0
Потому что например, под Windows нет никакого способа в один клик загрузить хедеры и либы SFML?
NTFS
0
Во-первых есть — meson wrap и CMake subproject не так просто придумали, и я уже не говорю про git submodule (это только сборка, а не вытаскивание по условию возможно готовых бинарников). Во-вторых, никто не мешает, допустим, для винды брать готовое (если уж у неё со сборкой проблемы), а для всего остального нормально собирать.
makise_homura
0
meson wrap и CMake subproject

Он позволяет под Windows загрузить с указанного URL хедеры и библиотеки? Если так, то это хорошие новости, буду пробовать.

никто не мешает, допустим, для винды брать готовое (если уж у неё со сборкой проблемы)

Обрати внимание, что для Linux и Mac я так не делаю, к примеру — там понятно, что .h и .so должны идти из системных каталогов.
NTFS (ред.)
0
Он позволяет под Windows загрузить с указанного URL хедеры и библиотеки?
Да.
makise_homura
0
Тогда изучу. Достаточно CMake или еще что-то нужно ему поставить?
NTFS
0
Насколько я знаю, CMake достаточно.
makise_homura
0
Попробую. Но тут возникает другая проблема — что если URL превратится в тыкву, твой проект тоже превратится в тыкву.
Это довольная серьезная проблема, например, для проектов на .NET — там всё завязано на сервера nuget, и без создания собственной копии — каждый раз думаешь, позволят тебе пакеты скачать, или отрубят, потому что ты был плохим мальчиком этот год.
NTFS (ред.)
0
что если URL превратится в тыкву, твой проект тоже превратится в тыкву.
Тебе просто кинут issue и ты очередным коммитом поменяешь URL на нужный.
makise_homura
0
Я про то, что например, гитхаб отрубят, где живут те же исходники SFML, а выкачать не сможешь. В итоге, следующим коммитом уже включишь в исходники локальную копию своего SFML, придя туда, откуда ушел.
NTFS (ред.)
0
Ну, гитхаб вряд ли отрубят (а отрубят — всегда есть VPN). Ну и плюс, если допустить то, что гитхаб отрубят реально, вот прям насовсем — то тогда тебе уже явно не до SFML будет.
makise_homura
0
Гитхаб и отрубать не надо — он сам все чаще по беспределу убивает репы. Сколько уже скандалов было за последние несколько лет.
Opaline_Arcana
0
Ну пока я такого не видел — вангую, что это единичные случаи (возможно, те, где обнаружилось какое-то нарушение). Ну, я все свои репы на всякий случай отзеркалил на гитлаб, конечно, но пока лично меня гитхаб не подводил: ни с моими собственными репами, ни с зависимостями.
makise_homura
0
Я лично сталкивался. WebUI от AUTOMATIC1111 однажды прибили — на них SJW'хи пожаловались, найдя в коде какой-то расизм в именах переменных, и целую неделю приходилось качать плагины с других ресурсов, покуда разбирались в причинах блокировки (GitHub тупо указывает номер нарушенного правила, но этого слишком мало, чтобы локализовать проблему).
Lyx
0
Вот и такая шизуха в том числе. Да и безальтернативный переход на 2FA отпугнул уже часть коммунити.
Opaline_Arcana (ред.)
0
Ну, само собой, что всё становится сложнее и менее юзер-френдли (вон когда последний раз можно было зайти на какой-нибудь ресурс под своим аккаунтом вот просто введя логин и пароль, а не с неизбежной прогулкой до прихожей, понося на чём свет стоит Дискорда, Сомбру и Тирека, чтобы достать из куртки телефон и прочитать там код авторизации?) Но тут гитхаб не то, чтобы впереди планеты всей, это, кажется, было неизбежно.
makise_homura
0
Ну так через неделю-то в итоге вернули?
makise_homura
0
Вернули.
Maxwell
0
Ну вот, то есть в целом это не столь серьёзная проблема, как, например, снос видосов с того же ютуба или пометка из как kids only — что никоим образом нельзя отменить.
makise_homura
0
Сборка сишного кода почти всегда страдание
Почти весь сишный код собрать порой намного проще, чем код С++-ный, особенно если там линковка делается как-то по-хитрому (как минимум, у меня неоднократно получалось, что ld сыпал крайне неосмысленными ошибками там, где точно не должен, и происходило это именно в С++-проектах).
Если сам exe падает после запуска — то скорее всего, не хватает каких-то dll или ресурсов.
А вот тут совсем не факт — например, твои игрухи падали (а не выводили соответствующее сообщение об ошибке) при отсутствии поддержки GLX в X-сессии =)
makise_homura
0
Последнее — практически на уровне «у ПК отсутствует монитор, хорошо бы программа сообщала об это человеческим голосом» :-)
Я тестировал даже на виртуалках, и везде игра стартовала, пусть и тормозила чудовищно.

Но так-то да, всех исключительных ситуаций не предусмотришь.
NTFS
0
практически на уровне «у ПК отсутствует монитор
Ну, отсутствие GLX — совсем не что-то уровня отсутствия монитора. На VNC-сервере, к примеру, GLX вполне может отсутствовать.
makise_homura
0
хорошо бы программа сообщала об это человеческим голосом» :-)
Ну не голосом, но классика со времен ХТ — пищать пищалкой при проблемах старта, в том числе и с видяхой ;)
Opaline_Arcana (ред.)
+1
Археотек.
partizan150
+2
Еще нет, под БК было сделано ну просто ОЧЕНЬ много игр в своё время, коллекции на сотни бинарников, так что это довольно популярная платформа.
Некоторые умельцы под оригинальный терминальный PDP-11 делают игры и вот это уже реально круто.
NTFS (ред.)
+1
Археотек.
partizan150
0
ОК, я немного забил на актуальные проекты и временно пал в бездну ретрокодинга.
NTFS (ред.)
0
забава) оценят только олдфаги)))
Centaur
+1
Для полного порядку, человек из тусовки любителей БК сегодня утром адаптировал проект под macro11 и систему сборки make, вот его форк.

github.com/smaslovski/ponydiamonds

Вдруг кто-то из старичков захочет сам собрать, а под Linux с make-скриптом немного проще.
NTFS (ред.)
+1
Хм, странно, почему он не заюзал механизм гитхабовских форков, это ж он тебе теперь pull request не сможет отправить =/
makise_homura
0
Тоже удивился, но в принципе, лицензия ему позволяет даже не упоминать меня при копировании, а он упомянул, так что теперь два репозитория.
NTFS
0
Ну вот получается, что не будет репы, в которой его изменеия и твои могут быть слиты…
makise_homura
0
Воу, даже на живом БК работает, не каждая вещь, что работает на эмуляторе, работает потом на живом железе) (ну, как минимум, так было со спектрумом, с DOSBox и с PC-98 =)
Ништяк)
makise_homura
+1
Воу, даже на живом БК работает

Для популярных эмуляторов типа DOSBox — список несовместимых вещей укладывается в пальцы на руке, там всё очень хорошо отлажено за годы.
БК более редкий зверь, но топовые эмуляторы к нему совместимы тоже на 99.9%, расхождение находятся очень редко и как правило, связаны с багами конкретного БК (вроде выпиленного на заводе таймера) или трюками типа «давайте вручную модифицируем регистр-указатель на код и поставим ему нечетное значение».
Как и для железа под DOS. У меня есть материнка, на которой отправка chr(7) в консоль вместо радующего звука — вещает систему.
NTFS (ред.)
0
список несовместимых вещей укладывается в пальцы на руке, там всё очень хорошо отлажено за годы.
И тем не менее нормальный эмулятор OPL2 они так и не могут написать уже сколько лет(
Ну вот не звучит там DOOM так, как звучал во времена моего детства(
или трюками типа «давайте вручную модифицируем регистр-указатель на код и поставим ему нечетное значение».
Да, вот я именно про такое: из-за этого часть демок, особенно уровня 4k competition или 512b competition на эмуляторах не работают(
makise_homura
0
часть демок, особенно уровня 4k competition или 512b competition
Они еще часто полагаются на определенное состояние системы в момент запуска, типа «на старте регистр АХ всегда 0». Эмули это не всегда дотошно учитывают.
Opaline_Arcana
+1
Кстати да, есть такое)
makise_homura
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.