Spiiin's blog

Аварийные люки в языках программирования

Programming Language Escape Hatches

В языках программирования существуют “аварийные люки”, через которые можно выйти за ту модель, которую предлагает язык.

  • inline assembly или интринсики в C/C++
  • unsafe для обхода механизмов защиты компилятора в Rust
  • FFI из мира виртуальной машины в нативный код в C#/Java

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

Для визуальных языков программирования такой моделью часто является dataflow programming. В геймдеве традиционно существует даже не люк, а парадный вход в движок, куда в случае малейших сомнений нужно сбегать из визуального языка. Обычно на это две причины:
Производительность (никто особо не занимается ускорением визуального скриптинга в играх, потому что происходит скачок в количестве требуемых знаний и усилий)
Боязнь давать скриптерам сложные инструменты. Традиционно считается, что так они наворотят что-то сложное. Возможно, наоборот, при наличии более развитых инструментов и средств абстракции у тех-дизайнеров получалось бы создавать менее адские графы.

Интересно, что существует близкая к геймдеву область, в которой используются визуальные языки. Это всякое creative/live/demo программирование, в котором с одной стороны, под визуальным языком имеет похожий движок (язык посылает команды для CRUD-операций над entities, движок их обрабатывает и формирует команды для отрисовки кадра), а с другой — пользователи хотят больше возможностей от визуального языка, чтобы меньше пользоваться “аварийным люком” в текстовый язык.

Несколько примеров из этой области:
Cellpond - Spatial programming without escape — доклад Li Wilson про CellPond. Тут больше не про креативное программирование, но рассуждения как раз про то, что нужно для построения систем без необходимости “аварийных люков”.
.werkkzeug3 — тулза для создания демок и игр, которая использовалась для создания .kkrieger, 64кб шутера.
Nodes.io The Story — заметки по организации больших графов.
VVVV — визуальный язык над .NET, использует для бекэнда движок 3d-движок Stride, легко интегрируется с C#, позволяет в одном графе описывать и сцену и шейдеры к ней.