Если вы думаете, что я издеваюсь, то это будет лишь частично верно. Когда-то я реально хотел сделать язык без отрицательных литералов, чтобы не стало операций, которые являются одновременно унарными и бинарными. Данная неоднозначность не только усложняет код лексера, но и потенциально является источником ошибок при достаточно сложном синтаксисе. В Обероне прошли по краю и она вроде бы не работает, но я уже забыл.
Наследование записей в Обероне сделано не весьма удачно, т.к. нет статических методов (если я правильно понимаю). При том, что это можно сделать библиотекой, зачем оно в языке? В Си этого нет, а ООП там есть, например, gobjects. На надёжность языка никакого положительного воздействия эрзац-ООП не оказывает, скорее отрицательное (я менял язык в ЯОС, чтобы нельзя было допустить опечатку при перекрытии методов, т.е. добавил слово "перекрыта"). На быстродействие - тоже. Наоборот, если я правильно помню, то в записи добавляется столько дополнительных полей, сколько у неё предков, чтобы быстро можно было проверять соответствие типу. Только не помню, это делается в самом экземпляре записи или в информации о типе. Это не является единственно возможным решением, а значит, неясно, почему оно должно быть зашито в язык.
Модули реально не являются необходимыми, я уже приводил примеры распространённых языков, на которых без модулей пишут огромные приложения. Реализация модулей через записи (и даже ещё хуже - через функции) используется в JavaScript. Дубликаты конструкций циклов я бы и сам выкинул из языка, претендующего на простоту.
Отсутствие записей, а наличие только указателей на них является реалиями жизни в лиспе, java и javascript.
Но кстати, я забыл ещё одну вещь. Неявные преобразования типов при арифметических операциях. Они не только усложняют язык, они ещё являются ненадёжными, т.к. постижимость программы снижается. Их надо выкинуть при упрощении языка обязательно.
В той мере, в которой я читал компиляторы Оберона, мои меры по сокращению языка приведут к существенному упрощению компилятора. Правда, писать на таком языке будет ненамного удобнее, чем на ассемблере, или ещё хуже. Но тем не менее, если поставлена задача устранения избыточности, то она решается так. Либо надо более ясно определить, что мы называем избыточностью, а где уже начинается мясо, и почему это так, если вспоминать лозунг про простоту.
В моём случае я понимаю под мясом то, что язык компилируемый, статически типизированный и безопасный по памяти, если не используется модуль SYSTEM. Если, конечно, под мясом понимать, что он модульный, то модули выкидывать нельзя. Что ещё является сутью Оберона?
А кстати не всё хорошо с записями. Если выкинуть записи, то не останется полиморфизма совсем, т.е. нет ни void*, ни union-ов. Ну решение-то понятно какое правильное (тип ANYREC), но если добавлять ничего нельзя, то придётся всё же использовать композицию. Теряется свойство линейности при переписывании программ, т.к. иерархии придётся переворачивать и делать насыщенными. В общем, если именно ничего нельзя выкидывать, то наследование записей придётся оставить, хотя я не могу сказать, что оно украшают язык. В этом случае можно выкинуть хотя бы методы, хотя вроде их уже выкинули (я смотрю вот сюда:
https://people.inf.ethz.ch/wirth/Oberon ... Report.pdf )