Какие языки высокого уровня легко сопряжены с C/С++?

У меня есть опыт работы с OCaml. Вам нужно было написать заглушку для каждой функции, которую вы хотели использовать для преобразования типов даже C int ↔ OCaml int. Связывание было болезненным. Я даже не хочу, чтобы объекты отображали объекты С++.

Как насчет других популярных языков? Всегда ли это боль?

EDIT:

Пожалуйста, избегайте дубликатов. И совместим с интерфейсами C и С++.

ИЗМЕНИТЬ 2:

Пожалуйста, будьте конкретны. "X может вызвать C" не дает слишком много информации.

Ответ 1

Почти все языки сценариев (Perl, Python, Lua, PHP, Ruby, Tcl) предназначены для встраивания в C и С++.

Хорошая обзорная статья относительных достоинств API:

H. Muhammad and R. Ierusalimschy. C APIs in extension
and extensible languages. Journal of Universal Computer
Science, 13(6):839–853, 2007.

Смотрите также этот очень похожий вопросмой ответ в частности;)).

Ответ 2

Python имеет очень хороший API C. Он также может быть легко интегрирован в С++ с помощью связывания boost:: python С++ для API Python C.

Ответ 3

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

Ответ 4

Эта проблема важна уже более 20 лет. Современное решение проблемы заключается в определении языка определения интерфейса или IDL. Затем у вас есть инструмент, который автоматически генерирует те функции, которые вы использовали для записи вручную. Другим термином в общем использовании является интерфейс с внешней функцией или FFI.

К сожалению, большинство из них не очень хорошо. Из личного опыта:

  • tolua и SWIG не подходят для Lua и C; проще написать функции привязки вручную. IDL для tolua, в частности, является почти, но не совсем C файлом заголовка, поэтому вы завершаете сохранение двух версий каждого объявления.

  • tolua ++ может стоить использовать для привязки Lua и С++ — значение неудобства для имитации объектов С++ вручную.

  • SWIG охватывает множество языков, но мне всегда было трудно использовать.

Из чтения о других людях:

  • Компилятор Glasgow Haskell, кажется, обладает самым приятным внешним интерфейсом, и, если я правильно помню, IDL радует simple: вы просто указываете тип Haskell функции C, которую вы пытаетесь импортировать.

  • Стандарт ML Нью-Джерси также, похоже, имеет довольно приятный интерфейс с иностранными функциями; там была статья в BABEL-01.

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

Ответ 5

Python имеет отличный интерфейс C с использованием встроенного модуля ctypes. Для взаимодействия модулей С++ можно использовать SWIG.

Ответ 6

Python является мощным и легким в освоении языком высокого уровня и имеет хорошую документацию по расширению его с помощью C и С++:

http://docs.python.org/extending/extending.html

Использование этого подхода прост, но вы пишете свои расширения явно для Python. Используя SWIG (см. Расширение Python с С++ для небольшого учебника), вы создаете код C/С++, как если бы он выполнялся сам по себе плюс файл интерфейса, который использует SWIG, чтобы создать для вас некоторый код упаковки, который вы можете использовать на Python (или на других языках, если на то пошло).

Ответ 7

Вам может понравиться недавний поток comp.compilers о различных интерфейсах внешних функций. Было высказано предположение, что у Хаскелла был один из лучших.

Ответ 8

Я бы не использовал Python в этом случае, даже если Boost.Python поможет вставить его. Даже люди Python говорят, что имеет смысл встраивать C в Python, а не наоборот, просто потому, что Python не предназначен для встраивания.

Мне нравится использовать языки, специально предназначенные для встраивания в С++ или C, например Lua, Falcon или ChaiScript. Однако мне также нравится иметь полный язык. Если я хочу написать приложение с большими ограничениями (например, игры на консолях), я предпочитаю использовать Lua, который предназначен для этого. В противном случае я предпочитаю использовать Falcon или ChaiScript.

Falcon - хорошая альтернатива Python в этом случае (вложение языка высокого уровня в С++): http://falconpl.org
Он предназначен для работы с С++, и даже стандартные библиотеки реализованы на С++.

Мне также нравится использовать ChaiScript, когда я хочу просто включить заголовки и перейти со сценарием: http://chaiscript.org Он предназначен только для заголовка и легко интегрируется в код С++. Фактически, он работал только с С++.

Оба языка высокого уровня. Falcon больше похож на Python и Ruby, но имеет преимущество предложить гораздо больше парадигм программирования, чем эти два. Chaiscript выглядит как упрощенный С++, поэтому он не может быть лучшим выбором для людей, не привыкших к такому синтаксису, но в противном случае он легко привязан к вашему реальному С++-коду. Falcon тоже, но не так, и синтаксис проще для не-программистов.

Ответ 9

Java имеет хороший собственный интерфейс с JNI, у С# есть что-то очень похожее.

Ответ 11

R расширяется через C, С++ и Fortran, это описано в R Extensions Manual, а добавленный Rcpp пакет упрощает вызов функций С++.

Ответ 12

Взаимодействие с объектами С++ всегда будет болезненным, поскольку нет стандартного ABI (двоичный интерфейс).

Ответ 13

Я связал библиотеки FORTRAN один раз. Я бы сказал вам больше, но это время для моего сна.

Ответ 14

Tcl может вызывать код C/С++

Ответ 15

Возможности интеграции Lua с C (и по расширению С++) являются абсолютно первоклассными. Это замечательный маленький язык. Я не думаю, что он получает почти ту любовь, которой она заслуживает.

ссылка: http://www.lua.org/

Ответ 16

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

Фактор скопировал эту систему FFI из Lisp.