Comdiv писал(а):
Дело совсем не в том, что нужно продумывать перед тем, как делать, а в том, что после "продумывания" в большинстве случаев и получается плохо определённое поведение. Обнуление переменных вместо диагностики тому пример. Сложность же проверок и накладные расходы не позволяют прописать в описании языка обязательную диагностику, что бы вы не писали про "обязан". Вместо этого в описании пропишут обнуление, после чего адекватная диагностика оказывается невозможной, потому что правильные программы вправе рассчитывать на изначальный 0. И уже нельзя отличить случай, где установка значения была пропущена по ошибке, от случая, где установка была пропущена, потому что 0 и нужен. Вот и получается воспроизводимость работы плохого кода вместо не идеальной, но диагностики. Если же это неопределённое поведение, то практически все случаи обращения до установки - это ошибка и потому диагностика возможна. И чем продвинутей, тем больше в статике, вплоть до доказательства корректности, но точная граница в конкретном случае, опять-таки, не определена. Все эти потенциальные возможности с гарантией выбрасываются на помойку, если до языка дорвутся разработчики, которые всё "правильно" "продумают".
Логическая ошибка лучше, чем упавшая куча. Упавшая куча - это почти самое страшное, что может быть, потому что она недетерминирована и уносит с собой все средства диагностики ошибок. Если кому-то нужна программа, где каждый ноль нужно обосновывать, можно поступить как минимум двояко:
* на организационном уровне установить, что каждая автоматически инициализированная нулём переменная требует комментария с пояснением. За комментарий несёт ответственность тот, кто его последний менял, а само наличие комментария можно проверять инструментально (при этом не нужен анализ потоков исполнения, а достаточно просто синтаксического разбора).
* завести особое "не инициализированное значение", с теми же свойствами, как в Эль-76. Правда, это несовместимо с понятиями о типах данных, бытующими в современных процессорах, и получится резко дороже
В том виде как есть, получилась лажа, но при определённом форматировании мозгов, конечно, можно и с этим жить. В ЯОС я прописал обнуление в описание языка:
https://tvoygit.ru/budden/jaos/src/branch/главная/док/язык-и-библиотека/описание-языка.md#8-объявления-переменных (там, кстати, устарело, ARM теперь тоже поддерживается). И сделал я это не первый, а посмотрев на тех, кто разработал golang. В то время как golang победно шагает по планете, Оберон продолжает влачить жалкое существование. Это, конечно, не гарантирует качество решений в голанге, но слегка намекает.
Уж не говоря о том, что ЕМНИП в КП нельзя инициализировать переменную при объявлении, а значит, ненулевая переменная - это гонка. Нужно гарантировать отсутствие сборки мусора между моментом объявления переменной и её обнулением. Но тут я, впрочем, могу и ошибаться.