Можно использовать C и Go вместе в одном адресном пространстве, но это не совсем естественно и может потребовать специального интерфейса программного обеспечения. Кроме того, связывание C с кодом Go устраняет свойство безопасности памяти и управления стеками, которые предоставляет Go. Иногда для решения проблемы абсолютно необходимо использовать библиотеки C, но при этом всегда присутствует элемент риска, которого нет при использовании чистого Go кода, так что делайте это с осторожностью.
Если вам нужно использовать C с Go, то как поступить, зависит от реализация компилятора Go. Существует три реализации компилятора Go, поддерживаемые Go командой. Это gc
, компилятор по умолчанию, gccgo
, который использует серверную часть GCC, и несколько менее зрелый gollvm
, который использует инфраструктуру LLVM.
Gc
использует другое соглашение о вызовах и компоновщик из C и поэтому не может быть вызван напрямую из программ на C или наоборот. cgo
предоставляет механизм для "интерфейса внешней функции" для разрешения безопасного вызова C библиотеки из Go кода. SWIG расширяет эту возможность для библиотек C++.
Вы также можете использовать cgo
и SWIG с Gccgo
и gollvm
. Поскольку они используют традиционный API, это также возможно, с большой осторожностью, связывать код из этих компиляторов напрямую с программами C или C++, скомпилированными GCC/LLVM. Однако, чтобы сделать это безопасно, требуется понимание соглашений о вызовах для всех языков, а также для ограничения стека при вызове C или C++ с Go.
Читайте также:
Комментариев нет:
Отправить комментарий