понедельник, 21 ноября 2022 г.

Ансамбль языков

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

Часть языков являются не самостоятельными единицами, а скорее частью разделяемого описания языка (модульность описания). Они могут входить в состав сразу нескольких смежных языков. Удобно это и с точки зрения организации описания основного языка. Другие языки служат другим задачам в рамках более широких потребностей.

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

Языки:

  1. Разъёмно-интерфейсный
    1. Описания типов
  2. Разметка данных
  3. Низкоуровневый системный
    1. Версия для генерации кода
  4. Среднеуровневый системный
  5. Высокоуровневый надёжный
  6. Спецификационный-верифицирующий
  7. Преобразующий
  8. Архитектурный
  9. Быстрокодовый(скриптовый)
    1. Для гибкой записи преимущественно поверхностного кода
    2. Интерфейсный интерактивный

Разъёмно-интерфейсный

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

Описание типов данных нужно не только для активных интерфейсов, но и пассивных данных.

Разметка данных

Простой инструмент для описаний данных, что полезно иметь отдельно от основного языка программирования. Должен быть связан с языком типов. Текстовая разметка должна быть лишь вспомогательной к двоичному формату для визуализации человеку по мере потребности.

Низкоуровневый системный

Этот язык нужен для представления кода на уровне, близком к машинному, в то же время сохраняя важные защиты высокоуровневых языков. Язык позволяет распространять код между недоверенными системами. Может служить промежуточным представлением обычных трансляторов.

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

Среднеуровневый системный

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

Высокоуровневый надёжный

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

Спецификационный-верифицирующий

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

Преобразующий[0]

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

Быстрокодовый(скриптовый)

Язык для поверхностного кодирования, для ситуативных задач. Для них требуется лёгкость ввода, и не требуется ни высокая проработанность, ни высокая производительность. В пределе такие программы могут терять актуальность даже после единственного исполнения. Уровень критичности к ошибкам сравнительно низок. Тем не менее при аккуратном проектировании возможна куда более вменяемая логика работы, чем для многих современных скриптовых языков, например, bash.

Сам быстрокодовый язык может служить интерактивным интерфейсом для программы. Даже когда это не так, наиболее удачной архитектурой пользовательской программы может считаться та, в которой пользовательский интерфейс является надстройкой над таким языком. Это позволяет легко переходить от непосредственных пользовательских действий к автоматизации и наоборот.


Сноски:
[0] Преобразования — это часть концепции поддержки наследия без раздувания сложности