Как совместить разные языки программирования - PullRequest
6 голосов
/ 20 июля 2011

Я не спрашиваю, когда связывает различные языки программирования.

Это довольно общий вопрос, но я лично работаю над Linux.

ЧтоЯ хочу понять, это процесс, с помощью которого можно комбинировать разные языки программирования, я нашел хорошую статью по объединению C / C ++ / Fortran: http://www -h.eng.cam.ac.uk / help / tpl /languages ​​/ mixedlanguages.html .

Насколько я понимаю, большинство компиляторов выполняют два этапа:

  1. Перевод языковых файлов в объектные файлы, которые содержат машинный код, но все жесодержат некоторые символы (возможно, имена функций?)

  2. Связывая объектные файлы вместе, только на этом этапе компоновщик проверяет возможность вызова функций в объектных файлах.

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

ЗаданиеВот некоторые из них:

  1. Разве вы не можете как-то обнаружить имена искаженных функций заранее и чем указать их явно на языке программирования или лучше, разве не существует программного обеспечения, которое уже делает это?

  2. Я не совсем понимаю, как связаны динамические библиотеки, но могут ли разные языки взаимодействовать одним и тем же способом, как программы взаимодействуют с динамическими библиотеками?

ps Основная цель - вызвать функции, написанные на другом языке.

Ответы [ 4 ]

6 голосов
/ 21 июля 2011

Проблема со связыванием различных объектных файлов обычно сводится к соглашениям о вызовах подпрограмм.По сути, когда вы делаете вызов подпрограммы, расположенной в другом объектном файле, ваш компилятор должен знать, как этот другой объектный файл назовет свою подпрограмму внутренне, как передать все его параметры и какой (если таковой имеется) код настройки и очисткирутина потребует.Все эти вещи обычно группируются под заголовком соглашение о вызовах s.

Каждый компилятор имеет свои собственные соглашения о вызовах, которые он любит использовать для подпрограмм.Заметьте, я сказал «компилятор», а не язык.Соглашение о вызовах C в Linux отличается от соглашения о вызовах C в Windows.

Поэтому, когда вы смешиваете языки, вам нужно каким-то образом указать компилятору для вызывающей или вызываемой подпрограммы использовать вызов другого языкаусловность.Соглашение C является популярным и используется как своего рода «лингва франка», поскольку почти на каждой платформе есть компилятор C.Однако некоторые платформы (например, Windows) имеют несколько популярных соглашений о вызовах.

Итак, теперь мы задаем вопрос, который вы задали в комментариях:

Существует ли распространенный способ "сообщитькомпилятор использует соглашение о вызовах другого языка "?

И ответ" Нет, не совсем ".В некоторых языках есть определенные способы использования определенных соглашений о вызовах для других языков.Например, C ++ позволяет вам помещать extern "C" в объявления, чтобы сообщить компилятору, что рассматриваемое объявление (я) использует соглашение о вызовах C.Ада выполняет то же самое с pragma Convention (X,...), где X - это условное название.C, Fortran и Cobol определяются языком, но все, что поддерживается (например: Windows 'Stdcall), определяется реализацией.

Однако, если у вас есть пара языковчьи авторы компиляторов никогда не думали друг о друге, тогда у вас нет другого выбора, кроме как сказать обоим использовать какое-то третье соглашение, о котором они оба знают (обычно Си).Например, чтобы обеспечить взаимодействие standard C ++ и Ada, серверный код должен экспортировать свои подпрограммы с использованием соглашения C и сообщить клиентскому коду, что вызываемые им подпрограммы используют соглашение C.

1 голос
/ 20 июля 2011

Разные языки могут использовать одни и те же библиотеки.В старой Windows Visual Basic, например, было довольно распространено динамически загружать функции Windows API, например.

Все, что вам нужно для межязыкового связывания, - это соглашение об соглашениях о вызовах функций, а также знание имен функций,Первое должно быть сделано путем поиска документации;последний должен быть найден в компиляторе, который создал объекты или библиотеки.Например, gcc будет компилировать C без искажения имен, так что вы можете напрямую ссылаться на имена функций в том виде, как они есть в вашем источнике C, в то время как g++ будет компилировать код C ++ с искаженными именами, и вам лучше разоблачить функции Cчерез extern "C" объявлений.

По сути, поскольку ваши объекты или библиотеки предоставляют только C ABI, должна быть широко распространена поддержка связывания с другими языками.Например, гораздо сложнее, если вы хотите использовать собственную библиотеку C ++, поскольку в этом случае ваши иностранные языки должны реализовывать правильный C ++ ABI.Это похоже на экспорт кода, скажем, из Фортрана, но я считаю, что можно просто использовать C ABI.

0 голосов
/ 20 июля 2011

Все исполняемые файлы библиотеки содержат интерфейс определенного типа.Если они этого не сделают, никакое программное обеспечение не сможет работать с ними.Скорее всего, внутренние методы будут изменены, чтобы быть более эффективными.Кроме того, многие языки позволяют отключить "искажение" на уровне компилятора.

Связывание, как простое объяснение (вероятно, мне не понравится?), Это упаковка в один файл.Классы сохраняют тот же интерфейс, что и несвязанные библиотеки, по крайней мере, с точки зрения внешнего программирования.

0 голосов
/ 20 июля 2011

«Стандарт» - использование не искаженных имен при объединении программ из разных языков. Выделение имен можно отключить для определенных символов в C ++, объявив их с помощью extern "C". C не искажает имена.

...