2009-08-15 2 views
11

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

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

EDIT:

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

EDIT 2:

Пожалуйста специфичны. «X может вызвать C» не дает слишком много информации.

+2

Это не язык высокого уровня, но интерфейсы ASM действительно приятны с C и C++! :-). Другой совет, который я могу вам дать, заключается в том, что, когда у вас слишком много проблем с привязкой кода C/C++ к вашему коду Python, вы всегда можете сделать приятную DLL вашего кода на C/C++. Некоторые люди, такие как COM-библиотеки DLL. – toto

+1

C++ ** есть ** высокий язык, событие это не ** просто ** один – Artyom

ответ

7

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

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

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

Смотрите также это very similar questionmy answer in particular;)).

+0

Мне нравится подсветка синтаксиса :) – Skilldrick

+0

Skilldrick: Я тоже. Интересно, почему это происходит: http://meta.stackexchange.com/questions/14664/how-does-so-syntax-highlight-citations-so-well –

+0

-1: «предназначен для встраивания в C и C++. " ложно (как, впрочем, это не правда) для всех цитируемых языков, но Lua. Для этого был разработан только Lua, другой - адаптация. Существует большая разница в процессе внедрения языка, который предназначен для встраивания и внедрения языка, который не был основной целью проекта. – Klaim

15

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

+1

Вы должны обратиться к модулю ctypes и http://docs.python.org/extending/extending.html – Novelocrat

0

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

+0

Ну. Думаю, вы говорите о виртуальных функциях. Вы можете сделать многое без них. –

+0

Пока интерфейс, который вы используете, имеет дело с вызовами конвенций, макетом и т. Д., А не заставляя вас, программиста, делать это, все должно быть хорошо. – Novelocrat

+0

Если вы можете взаимодействовать с ELF, вы должны легко взаимодействовать с объектами C++. – Imagist

3

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

8

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

3

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

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

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

+1

Разве Boost.Python больше не считается в наши дни? – KayEss

2

У Java хороший интерфейс с JNI, у C# есть что-то очень похожее.

+2

JNI далеко, чтобы быть хорошим ... попробуйте JNA – dfa

+0

О, извините, если JNI больше не является «in»; Прошло восемь лет с тех пор, как я в последний раз занимался Java: P –

+0

Можете ли вы быть более конкретными? –

0

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

3

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

1

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

5

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

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

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

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

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

От чтения об опыте других людей:

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

  • Standard ML of New Jersey также, похоже, обладает довольно приятным внешним интерфейсом; в BABEL-01 была бумага.

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

+0

SWIG может быть болью, но это имеет смысл просто изучить его один раз. –

0

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

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

0

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

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

3

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

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

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

Я также хотел бы использовать ChaiScript, когда я хочу, чтобы просто включить все заголовки и идти с языком scripring: http://chaiscript.org Он предназначен для заголовка только и легко интегрируется в коде C++. На самом деле это сделано для работы только с C++.

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