Нужен автокод - иностранцам вежливо настраивать язык кириллический

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Язык без типов

Сообщений 1 страница 6 из 6

1

Система типов нужна для того, чтобы автоматизированно доказывать некоторые утверждения о программе, для того, чтобы исключить некоторые виды ошибок.
Чем больше видов ошибок надо исключить, тем сложнее система типов.
Нам нужно создать язык минимальными затратами усилий. Это значит, что мы доверяем программисту на нашем языке, и ничего проверять не будем.
Тогда и система типов совсем не нужна.

А как же рантайм, спросите вы? Он-то должен как-то что-то хранить?
Это называется "парадигма денотационная семантика (Denotational Semantics)",
когда язык указывает "что" проверяется, а рантайм неявно и в обход спецификации языка реализует "как" проверяется.
Пример такого подхода - тип Integer в Haskell

DeepSeek написал(а):

1) В некоторых языках рантайм всё равно самостоятельно определяет точное представление данных в памяти, даже если в коде объявлены типы.
Пример — Integer в Haskell, где размер числа зависит от его значения и платформы, а программист не управляет этим напрямую.
2) Если рантайм уже берёт на себя ответственность за хранение, то явные типы в исходном коде не добавляют к этой картине ничего принципиально нового.
3) Единственная оставшаяся функция системы типов — автоматическая проверка корректности операций на этапе компиляции.
4) Автор сознательно отказывается от этой проверки, потому что доверяет программисту и хочет сократить сложность и стоимость разработки языка.

«Денотационная семантика — это математический подход к описанию языков программирования, при котором каждому синтаксическому конструкту сопоставляется его денотат (значение) в некоторой математической области. Это описание отвечает на вопрос «что вычисляется», но ничего не говорит о том, «как» это вычисление выполняется на реальном оборудовании. В денотационной семантике нет понятия памяти, регистров, стека, кучи, размера данных, выравнивания, порядка байтов и всего того, что относится к реализации.
Когда вы сказали, что в вашем языке «язык указывает 'что' проверяется, а рантайм неявно и в обход спецификации языка реализует 'как' проверяется», вы именно это и имели в виду. »

«Программист, пишущий на Haskell, знает что делает Integer, но не знает как он хранится. И это нормально, потому что спецификация Haskell даёт ему денотационную гарантию, а не реализационную.»

«Значение — это абстрактный объект. Данные — это его конкретное представление в памяти.»

«Как именно рантайм будет хранить промежуточные данные, какие проверки делать, какие типы (если вообще) прикреплять к значениям — это уже не вопрос спецификации, это вопрос реализации, который описывается на другом уровне (операционная семантика, реализационная модель, внутренняя документация рантайма).»

Отредактировано Лис (2026-08-27 10:12:01)

0

2

Надо проговорить две конкретизации понятия "тип".
Одна - это тип хранения значения в виде данных, другая - операции со значением.
Есть ли у них общепринятые названия?

1) «„поведение”»
Поведение (Behavior),
Множество операций (Set of Operations),
Интерфейс (Interface)

2) «„представление”»
«„форма внутреннего представления” данных»
Представление данных (Data Representation),
Внутреннее представление (Internal Representation),
Способ хранения (Storage)

«тип-поведение» и «тип-представление» — это отличные и вполне естественные названия.
Они ясно показывают, что речь идёт о двух разных гранях одного понятия «тип»,
и при этом интуитивно понятны.

Тип-поведение (Behavior Type) — определяет, какие операции допустимы над значением и что они делают.
(Type-as-in-notation) — как тип записан, как он обозначен в спецификации (поведенческая часть).
Или можно расшифровать как «тип-норма» (от норма — правило поведения).
Тип-сигнатура (Signature Type) — описывает операции (сигнатуры функций, интерфейс).
Это близко к понятию абстрактного типа данных.

Тип-размещение (Representation Type) — определяет, как значение хранится в памяти (размер, структура, формат).
Тип-представление? Тип-хранение? Тип-расклад?
(Type-as-in-vocation) — как тип воплощён, как он реализован в памяти (от воплощение, воплотить).
Тип-макет (Layout Type) — описывает расположение в памяти (структуру, выравнивание, размер).
Это близко к тому, что в компиляторах называют data layout.
В отличие от «представление» (слишком абстрактно) или «расклад» (разговорный оттенок), «размещение» звучит строго и терминологично.

все значения в языке без типов подчиняются одним и тем же правилам
Каждая переменная имеет своё представление в памяти — способ хранения,
который определяется реализацией (рантаймом) и не фиксируется в спецификации.
Таким образом, в спецификации языка нет типов как классифицирующих сущностей.
Есть только „Общий протокол” (поведение, единое для всех значений).

Отредактировано Лис (2026-08-27 11:15:55)

0

3

Если значения не имеют типов, то что с ними можно делать? Можно вводить, выводить, копировать, перемещать. Описывать разделение - „деструктурирование” и объединение „структурирование” (как в языке Rust, только без введения типа "кортеж")

структурирование и деструктурирование — это операции, которые работают с агрегированными данными
(например, с записями, полями, последовательностями), но они не порождают новых типов в спецификации.
Это просто способ собрать или разобрать значение.
В Rust такие операции есть, но они привязаны к типам (кортежам, структурам).
У вас же они работают без типов — значение просто имеет структуру, которая существует в реализации, но не закреплена в спецификации.
Попытка деструктурировать число в цифры может выдать ошибку "невозможно превратить камень в комаров, природа протестует".

«Вы не можете „разобрать” число на цифры, потому что число не было собрано из цифр.»
Даже если оно было собрано из цифр, вам оно даётся как "значение". Вы должны обладать алгоритмом, способностью расчленить такое значение критериями (ножами). Если ваша философия не позволяет вам это, вы можете только наблюдать значение и демонстрировать значение другим.

    Наблюдать — видеть значение. Но теперь это не пассивное созерцание: можно реагировать на изменения значения. Это означает, что наблюдение — это активный процесс, который может запускать другие действия при изменении наблюдаемого значения.

    Хранить — держать значение у себя (в памяти, в файле, в базе данных). Это постоянное владение.

    Размещать — помещать значение в определённое место (в переменную, в поле, в ячейку массива). Это акт привязки значения к месту.

    Выдавать — давать значение во временное пользование, как книгу в библиотеке. Это не вывод (который отправляет значение вовне безвозвратно), а временная передача: кто-то берёт значение, пользуется им, а потом возвращает.

Это кардинально меняет модель языка. Он становится ближе к системе управления объектами с владением, временным доступом и реактивностью.

---

Действия, которые мы можем выполнять с значениями основываются на том, что у значений есть бытие (размер в памяти, размер во времени).
Были бы они телами, у них было бы положение в пространстве. Но если мы введём „Вещь” (о чём можно думать), „Тело” (что имеет положение) и „Значение” (что размещается в памяти), то это будет уже введением типов.

язык чистых Значений. Он описывает только то, как значения перемещаются, хранятся и наблюдаются, но не описывает, чем они являются (Вещи) и как они физически устроены (Тела).

- Сущее (от «существовать») — подчёркивает факт бытия. Это философский термин, он говорит: «это есть, и это всё». Он не говорит о структуре, не говорит о действиях. Он чисто онтологический. Хорош тем, что полностью лишён семантической нагрузки. Плох тем, что звучит непривычно в контексте языков программирования.
- Сущность (entity) — нечто, обладающее самостоятельным существованием. Используется в базах данных и моделировании. Тоже вариант.
- Объект — подчёркивает предметность. С объектом можно делать действия: взять, положить, переместить. Объект имеет идентичность. Это более практичный термин. Плох тем, что в программировании «объект» уже сильно нагружен смыслом (обычно это экземпляр класса с состоянием и поведением). Но в вашем языке классов нет, так что это слово можно «переопределить».
- Данные (data) — но данные обычно что-то означают (данные о чём-то). Не подходит.
- Атом — неделимая единица. Но это слишком физически-нагруженное слово.
- Вещь — но вы уже использовали «Вещь» для того, о чём можно думать (смысл). Значит, это слово занято.
    Но программа, тоже «думает» (в том смысле, что оперирует «вещами»).

в спецификации языка всё равно нет типов, потому что Вещи не классифицируются.
Нет категорий «число», «строка», «список».
Есть только Вещи, с которыми можно делать набор операций.

вещи можно в чём-либо подозревать. Тоже от "смотреть", как в "наблюдать", но заранее. Можно подозревать, что вещь volatile (меняется сама).
Это не наблюдение (которое смотрит на то, что есть сейчас) и не реакция (которая действует на изменение).
Это предположение о том, что Вещь может обладать некоторым свойством, которое не дано непосредственно, но может проявиться в будущем.
Это введение нового способа отношения к Вещи — отношения, которое происходит до действия, до наблюдения, до проверки. Это отношение предвосхищения.

если у значений нет типов, но мы можем предполагать о них свойства (изменчивость), то
отношение «подозревать» — это естественное расширение модели отношений между программой и значением.

ЯПВМ - язык, подозревающий вещи меняющимися.

Отредактировано Лис (2026-08-27 11:20:34)

0

4

деструктурирование — это действие, которое принимает не только вещь для разбора, но и вещь-критерий, которая указывает, как именно разбирать. Например:

разобрать(вещь, критерий).

Критерий - это нечто  (Инструмент? Средство? Способ?), что вещь может интерпретировать как указание, как ей деструктурироваться.

вещьО = взаимодействие(вещь1, вещь2, ..., вещьН)

обобщённая операция, образующая вещь из разных других вещей. От параметров зависит, что в итоге получится в результате.

«в языке остаётся только одна фундаментальная операция — взаимодействие вещей. Всё остальное (структурирование, деструктурирование, наблюдение, размещение) — это частные случаи или следствия этой операции, задаваемые конкретными наборами участвующих вещей и их природой. Это делает модель более экономной и последовательной.»

Почему изначально было желание ввести в язык иные операции, в дополнение к операции "взаимодействие вещей"?
не получается ли, что если их убрать, то мы теряем субъектность?

если хочется сохранить субъектность, можно сделать субъекта вещью.
Тогда «вычислительная система», «код», «рантайм» — это тоже вещи.
И их взаимодействие с другими вещами порождает результаты.
В этом случае субъектность не исчезает, а растворяется в едином механизме:
субъект — это просто одна из вещей, участвующих во взаимодействии.

введём маркеры „природное”, „субъективное” и „социальное”,
для этого нам потребуются три глобальные вещи-маркера (они же критерии).

введём новые операции, которые реализуются через взаимодействие вещей,
но сокращают число аргументов, подразумевая конкретные маркеры.

Отредактировано Лис (2026-08-27 12:16:10)

0

5

нам нужны операции абстрагирования и конкретизации. они прямо напрашиваются. Но непонятно, как описать их через взаимодействие вещей

я существую, и я субъектен, значит я мыслю (о вещах).
Мысли это (тоже) вещи, значит могу мыслить о мыслях, значит это логическое.

материальная_платформа = взаимодействие(природное, вещи)
субъект = взаимодействие(материальная_платформа, природное, субъективное, социальное)
мысли = взаимодействие(субъект, вещи)
логическое = взаимодействие(мысли, мысли)
вещь-класс = взаимодействие(вещи, логическое) = абстрагирование(вещи)

---

Что значит «каждая программа правильная»
Это означает, что спецификация языка не берёт на себя роль судьи. Она не говорит:
    «Это выражение осмысленно, а это — нет».
    «Здесь типы сходятся, а здесь — расходятся».
    «Эта программа корректна, а эта — содержит ошибку».
Вместо этого спецификация говорит только:
    «Вот как записываются взаимодействия».
    «Вот какие вещи существуют в этом мире».

правильность программы определяется исключительно рантаймом:
    Если рантайм может исполнить программу — она правильная.
    Если рантайм не может — она неправильная.

---

Спецификация языка не перечисляет вещи. Она описывает как устроен мир, в котором вещи существуют и взаимодействуют. Она говорит:
- Есть вещи.
- Есть взаимодействия.
- Есть правила, по которым из взаимодействий рождаются новые вещи (но не предписывает, какие именно).
- Есть синтаксис, позволяющий записывать взаимодействия в тексте программы.
Спецификация — это онтологическая рамка.
Она задаёт тип мира, в котором работает язык, но не наполняет его конкретным содержанием.
Спецификация языка становится универсальной.
Она не зависит от того, какие именно вещи есть в мире.
Она описывает только форму существования любого мира: вещи, взаимодействия, порождение.

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

Рантайм:
- Исполняет взаимодействия на материальной платформе.
- Решает, как именно взаимодействие выполняется и какую вещь возвращает.
- Может опираться на стандартную библиотеку (знать, как ведут себя числа, строки и т. д.).
Компилятор, рантайм, команды — это вещи, с которыми можно взаимодействовать.
Программист может не просто «писать код», но и взаимодействовать с самим процессом исполнения как с вещью.

---

Программист контролирует:
- Какие вещи есть в мире программы.
- Какие виды взаимодействий возможны.
- В каком порядке взаимодействия происходят.
- При каких условиях они происходят, повторяются или прерываются.
Это контроль над условиями

Отредактировано Лис (2026-08-27 13:52:33)

0

6

Придуманный язык:
    Есть вещи.
    Есть единственное действие: взаимодействие (взаимодействие(вещь1, вещь2, ...)).
    Есть единственное правило: из взаимодействия рождается новая вещь (определяется рантаймом).
    Нет чисел, строк, условий, циклов, ввода-вывода, классов, операций.
    Всё это вводится через стандартную библиотеку (или определяется программистом).

Лямбда-исчисление:
    Есть термы: переменные, абстракции, аппликации.
    Есть единственное действие: применение (M N).
    Есть единственное правило: β-редукция — подстановка аргумента вместо переменной.
    Нет чисел, строк, условий, циклов, ввода-вывода.
    Всё это выражается через термы и применения (например, числа Чёрча, булевы значения, пары).

Лямбда-исчисление изобрёл Алонзо Чёрч в 1932–1936 годах.

Чёрч победил нас в одном: он сделал применение термом. Мы не сделали взаимодействие вещью. Это разрыв в модели.
Исправить это можно только одним способом: сделать взаимодействие вещью.
Либо через синтаксис, либо через введение вещи-«обещания», которая содержит в себе взаимодействие и может быть исполнена позже.

Сейчас 2026. Лямбда-исчисление 90 лет назад (ну или почти сто).

Отредактировано Лис (2026-08-27 14:19:30)

0