Существуют ли какие-либо языки, способные выразить, как разные значения кодируются в некоторых битах данных?

#bit-manipulation #encode

#битовые манипуляции #кодировать

Вопрос:

Часто из соображений эффективности языки низкого уровня кодируют разную информацию в одном и том же наборе битов.

  • Простым примером является указатель: значение 0 представляет NULL, все остальные значения представляют адреса памяти.
  • Или числа с плавающей запятой (IEEE 754) могут кодировать десятичные значения, а также бесконечность, -Бесконечность, 0, -0, NaN и многое другое.
  • Еще одним примером являются символы UTF8, где первый бит сообщает нам, является ли байт символом ASCII или унарным числом байтов, которое занимает символ.
    Даже целые числа со знаком используют бит для кодирования знака (а целые числа с дополнением могут представлять -0).

Обычно значения, закодированные таким образом, обрабатываются обработанными вручную фрагментами кода, выполняющими побитовые операции.
Но это означает, что мы не можем обобщать это: например, вы не можете выразить общий Maybe (он же Optional ) тип, который кодирует состояние Nothing / Empty для некоторой неиспользуемой комбинации битов. И если вы хотите интерпретировать значение, хранящееся в некоторых байтах, тип которых вам известен, вам нужно прочитать документ: определение типа не говорит вам, как использовать биты.

Существуют ли какие-либо языки с системой типов, способной понимать и выражать, как информация хранится в битах, имеющихся в вашем распоряжении?

Комментарии:

1. Каковы фактические проблемы, которые вы пытаетесь решить, и почему существующие языки кажутся несовершенными? Это кажется расплывчатым. Например, «общий необязательный», использующий «некоторую неиспользуемую комбинацию битов», будет работать только для типов, у которых есть какие-либо запасные биты. И для таких существующих языков могут быть написаны помощники / библиотеки, чтобы делать с битами все, что вы хотите, обрабатывая базовые байты как необработанное хранилище. Что может добавить другой язык и как?

2. @underscore_d: я работаю над языком программирования низкого уровня, где каждый тип имеет определенную кодировку. Существует тип для двух_complement_signed_integers, один для одного_complement_signed_integers, один для ASCII_charaters, один для UTF8_chars, один для IEEE754_floats и т.д. Я хотел бы найти способ, позволяющий компилятору понимать и рассуждать о кодировке.

3. Я могу привести несколько примеров того, для чего я хотел бы это использовать: значения IEEE 754 могут представлять некоторые действительные числа, бесконечность, -Бесконечность, 0, -0, NaN и другие значения. Я хотел бы определить новый тип, который может содержать все действительные числа IEEE 754, но без ненастоящих значений: я буду использовать комбинации битов, которые использовались для представления бесконечностей, подписанных нулей и NaN для кодирования разных значений. Компилятор должен быть в состоянии сообщить мне, является ли новый тип, который я определил, «хорошим» (например, никакая комбинация битов не используется обеими кодировками, которые я «объединяю» слиянием, или аналогичными свойствами)