2010-01-02 3 views
3

Помимо C++, , у каких не игрушечных языков есть прямая или простая в использовании совместимость с C? Как в «Я могу взять библиотеку C там и скомпилировать свой код против него, не имея необходимости находить, писать или настраивать какую-то оболочку».Языки с прямой C compatibilty

Я знаю, что многие языки имеют совместимость с C посредством внешней связи или привязки (Я использую привязки в Java, Ruby, Python и т. Д., Поэтому я знаю, что это можно сделать). Но вы полагаетесь на кого-то (возможно, на вас), чтобы писать и поддерживать привязку для всех библиотек, которые вы хотите использовать, а привязка должна работать на всех платформах и т. Д.

Сделайте более выразительные языки, чем C++, эта особенность?

Благодарим всех за упоминания о свинге или связанных с ними инструментах для создания обертки. Я знаю, что они существуют, но я не думаю, что они действительно такие же простые, как интеграция C-> C++ ... но тогда интеграция с C могла бы быть единственной, что проще в C++;))

+2

Доступ к библиотекам C (особенно старым, которые никогда не предназначались для C++), возможно, совсем не «прямодоступен и прост в использовании из C++», так как вы должны убедиться, что у вас есть C++-защитники, выполняющие extern «C», чтобы предотвратить проблемы с изменением имени , Как правило, вы также столкнетесь с более эстетическими проблемами из-за разных практик использования типов указателей и т. Д. Я не думаю, что вы найдете язык, более совместимый с C, чем Objective C. – Fredrik

+0

@phtrivier, учитывая вашу новую заметку, d say Ada все равно сделает это с помощью импорта прагмы. Просто прямо подпрыгивая между кодом Ada и кодом C. Нет необходимости в оболочках, если ваш C-код не использует указатели на функции. –

ответ

12

Объектив-C, ребенок-ублюдок C и Smalltalk.

Objective-C является прямым надмножеством C (вы не можете получить более совместимый с этим), но есть языки, которые скомпилированы для C. Некоторые недавние примеры будут Vala и Lisaac.

Большинство статически скомпилированных языков позволяют взаимодействовать с библиотеками C. Примерами таких языков являются Ada, Fortran, Pascal и D. Детали являются специфичными для платформы и компилятора; для x86 это в основном означает поддержку соглашения о вызове cdecl.

+1

Он сказал, что «не игрушка» –

+0

@Terry: Вала и Лизаак могут считаться «игрушечными языками», но другие? Если вы ищете языки, которые скомпилируются на C, вы в основном найдете языки игрушек/исследований/доменных языков или прототипы компиляторов, так как другие языки, скорее всего, со временем получат компилятор, который компилируется до машинного кода или промежуточного представления набора компилятора/vm – Christoph

6

D language совместим с C ABI. Тем не менее, иногда нетривиально преобразовывать файлы заголовков C в совместимые модули D. См. this page для более подробной информации.

+0

D - не единственный пример языка, который может напрямую вызвать функции C: другими являются Ada, Fortran, Pascal ...; большинство скомпилированных языков (как в статически скомпилированном для машинного кода) могут взаимодействовать с C, но детали являются специфичными для компилятора – Christoph

+0

Спасибо, но я действительно думал о D как пример моего примера;). Я попытался использовать D для вызова функций SDL, но я проиграл борьбу с Derelict (точнее, полдюжины инструментов сборки и библиотеки D, которые вы должны использовать, чтобы получить рабочую версию Derelict). Вероятно, я виноват, и это позор, потому что D выглядит очень интересно, но я просто не мог сделать через несколько дней, что «extern (C) {» делает в C++ ... :( – phtrivier

+0

Я никогда не пробовал D, но http : //www.digitalmars.com/d/1.0/interfaceToC.html кажется мне очень легко ... – Christoph

2

С помощью правильных компиляторов/компоновщиков, аргументов имени и функций, вы можете связать модули C и Fortran. Подробности here.

+1

Эта ссылка описывает «старый» способ подключения Fortran и C, в котором вам нужно было понять механизмы передачи аргументов, mangling name и т. д., и этот метод был зависимым от компилятора. «Новый» способ использования связывания Fortran ISO C проще и лучше. Я использовал оба метода. –

2

Python имеет динамический упаковочный модуль, ctypes, который, несмотря на то, что он полностью не устраняет код привязки шаблонов, значительно уменьшает его.

+0

Это может не соответствовать запросу OP, но +1, потому что ctypes действительно хорош! – Francesco

3

Для многих языков, обертка код для библиотек C не трудно писать - просто использовать SWIG: http://www.swig.org/

Хотя первоначально написана как быстрый генератор оболочки для Tcl, теперь он поддерживает: Tcl, Python, Perl, Guile, Java, Ruby, Scheme, PHP, Ocaml, Pike, C#, Modula-3, Lua, Common Lisp, R и Octave.

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

0

G'day,

Вы можете интерфейс Perl на библиотеки C, написав интерфейс XS между ними. Вот perlXSTut over at CPAN.

Так реализованы модули XML :: LibXML и XML :: LibXSLT.

Вы также можете подключить библиотеки Ada к C, чтобы купить средства прагмы Import. Это также справедливо для библиотек, написанных на C++. И COBOL и FORTRAN BTW.

HTH

веселит,

4

Fortran могут вызывать процедуры C, или вызываться C. Это используется, чтобы быть «платформы и компилятора конкретных», как указано в другом ответе, но Fortran 2003 включает в себя «ISO C Binding ", что делает эту часть стандарта языка и, следовательно, переносимой, а не платформой и компилятором. Связывание ISO C поддерживается многочисленными компиляторами Fortran, включая gfortran (> = 4.3), Intel ifort, Sun Fortran и т. Д.

Вам нужно написать описание интерфейса для вызываемой процедуры C, но это является независимым от компилятора и платформы.

+0

Это довольно распространенное корпоративное использование для совместимости со старыми библиотеками (для математики, финансов, физики, погоды ...). –

Смежные вопросы