Система типов нужна для того, чтобы автоматизированно доказывать некоторые утверждения о программе, для того, чтобы исключить некоторые виды ошибок.
Чем больше видов ошибок надо исключить, тем сложнее система типов.
Нам нужно создать язык минимальными затратами усилий. Это значит, что мы доверяем программисту на нашем языке, и ничего проверять не будем.
Тогда и система типов совсем не нужна.
А как же рантайм, спросите вы? Он-то должен как-то что-то хранить?
Это называется "парадигма денотационная семантика (Denotational Semantics)",
когда язык указывает "что" проверяется, а рантайм неявно и в обход спецификации языка реализует "как" проверяется.
Пример такого подхода - тип Integer в Haskell
1) В некоторых языках рантайм всё равно самостоятельно определяет точное представление данных в памяти, даже если в коде объявлены типы.
Пример — Integer в Haskell, где размер числа зависит от его значения и платформы, а программист не управляет этим напрямую.
2) Если рантайм уже берёт на себя ответственность за хранение, то явные типы в исходном коде не добавляют к этой картине ничего принципиально нового.
3) Единственная оставшаяся функция системы типов — автоматическая проверка корректности операций на этапе компиляции.
4) Автор сознательно отказывается от этой проверки, потому что доверяет программисту и хочет сократить сложность и стоимость разработки языка.
«Денотационная семантика — это математический подход к описанию языков программирования, при котором каждому синтаксическому конструкту сопоставляется его денотат (значение) в некоторой математической области. Это описание отвечает на вопрос «что вычисляется», но ничего не говорит о том, «как» это вычисление выполняется на реальном оборудовании. В денотационной семантике нет понятия памяти, регистров, стека, кучи, размера данных, выравнивания, порядка байтов и всего того, что относится к реализации.
Когда вы сказали, что в вашем языке «язык указывает 'что' проверяется, а рантайм неявно и в обход спецификации языка реализует 'как' проверяется», вы именно это и имели в виду. »
«Программист, пишущий на Haskell, знает что делает Integer, но не знает как он хранится. И это нормально, потому что спецификация Haskell даёт ему денотационную гарантию, а не реализационную.»
«Значение — это абстрактный объект. Данные — это его конкретное представление в памяти.»
«Как именно рантайм будет хранить промежуточные данные, какие проверки делать, какие типы (если вообще) прикреплять к значениям — это уже не вопрос спецификации, это вопрос реализации, который описывается на другом уровне (операционная семантика, реализационная модель, внутренняя документация рантайма).»
Отредактировано Лис (2026-08-27 10:12:01)