Я пишу язык и хочу, чтобы он был двоично совместим с Rust, C++ и некоторыми другими языками. Проблема в том, что я не смог найти информацию о ржавчине abi (искажение имен, макеты структур, соглашения о вызовах и т. д.).
Я где-то слышал, что у Rust нет стабильной публичной версии (пока). Но мне не удалось найти источник этого утверждения. Я хочу строго избегать каби, если это возможно.
Вам нужен ABI, совместимый с C++ (и некоторыми другими языками), но вы хотите строго избегать C ABI? Какой единственный ABI, по вашему мнению, будет поддерживаться всеми этими языками/компиляторами, если не фактический лингва-франка ABI C?
Авторитетный источник Rust
структуры данных, которая (в основном) не определена публично: doc.rust-lang.org/nightly/reference/…. К сожалению, я не могу найти подобного утверждения о соглашении о вызовах Rust
, но уверяю вас, что оно действительно также не определено публично.
Я не представляю себе ни одного аби. Я хочу, чтобы мой язык адаптировался на основе запрошенного языка ffi. Итак, у меня есть синтаксис extern "", который заставляет функцию использовать заданный abi. Но поскольку истинная связь равна ложной, в настоящее время это кажется невозможным, поскольку у ржавчины нет публичного аби, которое я мог бы поддержать.
В Rust есть поддержка других ABI, включая C
ABI. Продолжается работа над более полнофункциональным ABI, построенным на базе C
ABI: crabi. Существуют также сторонние ящики, которые обеспечивают более полную стабильность ABI поверх C ABI.
У Rust действительно нет стабильного ABI, поэтому вы не можете быть с ним совместимы.
Источники:
https://doc.rust-lang.org/stable/reference/type-layout.html#the-rust-representation, о макете шрифта:
Rust
Представительство...
Никаких других гарантий расположения данных, обеспечиваемых этим представлением, нет.
https://github.com/rust-lang/rfcs/issues/600#issuecomment-526033825
В настоящее время нет планов по внедрению чего-либо, напоминающего оптовый стабильный ABI, ни для каких-то новых
repr(v1)
, ни дляrepr(Rust)
, и внутри языковой команды этому есть активное противодействие. Таким образом, я собираюсь закрыть этот вопрос о супершироком списке желаний.
На самом деле искажение имени определено, хотя и не для старой, используемой сейчас по умолчанию версии, а для v0
(можно использовать с -C symbol-mangling-version=v0
). Об этом смотрите здесь.
Предпринимаются попытки создать ABI «стабильного, но более высокого уровня, чем C ABI», который в настоящее время называется crabi, и другие языки, возможно, также интегрируют его. Однако на данный момент это даже не реализовано экспериментально даже в Rust, так что впереди долгий путь, даже если этот эксперимент увенчается успехом.
источник: github.com/rust-lang/rfcs/issues/600#issuecomment-526033825