Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

First-class two-way FFI

TL;DR: You can use any HN primitive in a host language as long as it's idiomatic.

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

Соответственно, если у нас в HN есть подвыражение map foo bar и хост-язык - чистый си, то map невозможно заэкспортировать
через FFI, т.к. он неидиоматичен. Но quux x = map foo x уже можно, если результат мономорфный, аналогично foo можно и map foo bar.

Идиоматичность подразумевает и идиоматическое управление памятью. Если вы видите в сях int foo(struct bar * baz) - то возможных
идиоматических контрактов в плане управления памятью немного. Наиболее часто используются два: вызывающая сторона обещает либо забыть о существовании baz,
и foo получает на него эксклюзивные права, либо помнить и эксклюзивно заботиться о его деаллокации после возврата.

Соответственно, сущности, имеющие неидиоматическое управление памятью, экспортировать также нельзя.

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

Такой подход ограничивает хакерство - т.е. в жизни должно быть место грязным хакам, и плох тот язык, в котором нет
unsafeCoerse и иных кошмаров жителя ivory tower, но зато нет проблем с бинарной линковкой - ни статической, ни динамической, и двухсторонними взаимодействиями.
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments