Я хотел бы найти способ написать API, к которому можно получить доступ из любого другого языка программирования через привязки языка (или некоторую другую структуру). Можно ли это сделать? Если да, то какой язык программирования будет наиболее подходящим для написания «междисциплинарного» API? Моя цель - создать единый набор функций, к которым я могу получить доступ из любого языка программирования, с которым я работаю, чтобы мне не пришлось вручную переписывать весь API на каждом языке.
33
Ответы:
У вас есть несколько вариантов:
Создайте интерфейс HTTP, почти все могут общаться по протоколу HTTP, так что вы получите много языков.
Создайте что-то, что может быть связано с языковой средой выполнения, это будет довольно трудоемким, так как вам нужно будет найти способ подключить это к множеству разных языков.
источник
Я думаю, что C или C ++ будут наиболее подходящими для вашей цели. Вы можете использовать SWIG (Simplified Wrapper и Interface Generator) для создания языковых привязок из вашего C или C ++ API.
источник
extern "C"
так что он является C-совместимым снаружи. Следовательно, у вас есть внутренние преимущества C ++ (более высокая безопасность типов, библиотеки), но внешние преимущества C (стандарт де-факто ABI)Есть в значительной степени 2 способа:
Работа, необходимая для этого, изменяется в зависимости от используемой системы, например, интерфейс сокетов будет работать, но библиотеки на стороне клиента имеют тенденцию быть более низкоуровневыми по сравнению с библиотеками http.
Вы можете попытаться найти сетевую библиотеку, которая поддерживает все языки, которые вы хотите использовать, и реализовать API в терминах этой библиотеки - например, использование ZeroMQ дает вам большую гибкость, поэтому вы будете писать свой API с использованием интерфейсов ZeroMQ, и тогда любой язык, который хочет вызывать ваш API, должен использовать для этого клиентскую библиотеку ZeroMQ. Выберите библиотеку, которая поддерживает широкий спектр языков и позволяет осуществлять как внутрипроцессное, так и внепроцессное взаимодействие для достижения максимальной производительности.
источник
Если производительность и задержка вызова не являются проблемой, рассмотрите возможность предоставления всестороннего интерфейса командной строки (возможно, с использованием языка сценариев поверх него). ImageMagick может быть хорошим примером такого «API». Другим хорошим примером является инструментарий Tk.
источник
whoami
Ubuntu для получения имени пользователя), или вы имели в виду что-то еще?Под API, что именно вы имеете в виду?
На многих платформах вы можете ссылаться на DLL или аналогичную конструкцию, но придется ли перекомпилировать для конкретной нативной цели (Intel / ARM), или все еще можно указать порядок байтов? Конкретный двоичный интерфейс может по-прежнему испытывать трудности с определенными языками из-за проблем или типов типов данных (указатели пытаются вернуться к языкам, которые их не поддерживают), поэтому вам также следует учитывать конструкцию самого API, чтобы не исключить некоторые языки или сделать его использование из этих языков громоздким.
Нечто переносимое, такое как C, и интерфейс, основанный на двоичных конечных точках в DLL, могут подойти и, как правило, вызываться на большинстве платформ и из большинства языков, но может потребоваться, чтобы их компилировали по-разному и / или предлагали в разных вариантах или связывали с разными статическими библиотеками.
Мне кажется, что выбор языка, на котором вы пишете свою библиотеку или службу или что-то еще, по определению не является неотъемлемой частью вопроса, пока вы не дадите больше о платформе / услуге, которую предоставляет API. Если вы можете предположить, что сетевой стек доступен, а производительность на уровне вызовов функций с прямой связью не является обязательным требованием, API может легко основываться на HTTP с некоторой оболочкой для языка клиента, чтобы сделать запросы прозрачными.
Я думаю, что в целом этот вопрос слишком широк, чтобы быть полезным в реальном мире, потому что вы не указали, какой тип API может подойти, учитывая тип предлагаемой услуги.
источник
Чтобы добавить выше ответы, которые предлагают использовать механизм RPC. Вы можете использовать Apache Thrift. ( Http://thrift.apache.org/ ). Это в основном фреймворк RPC.
Согласно Thrift Wiki:
источник
Пусть любой язык напишет текстовый файл с функцией для вызова с передаваемыми параметрами. Пусть ваше приложение «Я с кем-нибудь общаюсь» наблюдает за каталогом, и как только оно видит process-call.txt, пусть оно работает. Нет серверов или сетевых протоколов; даже метод некомпьютерного языка может инициировать функции. Даже человек может просто создать текстовый файл.
Контент может выглядеть так:
;) Вы можете ждать вечно, чтобы получить ответ, хотя. Вам просто нужно передать несколько байтов другому процессу, но я уверен, что это не вся спецификация.
источник
OpenGL - хороший пример того, что вы описываете - это API, написанный на C, разработанный таким образом, чтобы легко писать привязки на других языках.
Библиотеки C можно вызывать из большинства языков программирования (обычно в виде скомпилированных расширений или таких вещей, как
ctypes
библиотека PyPy и т. Д.)Все функции принимают в качестве аргументов простые типы данных (логические, целые, с плавающей запятой, константы, массивы), так как функции с указателями могут быть неудобными для перевода на некоторые языки.
int
float
т. Д. Могут отличаться)Получающийся API-интерфейс не обязательно является самым приятным в использовании C-API, который вы можете написать, ориентируясь только на C-пользователей. Однако это означает, что функции могут быть почти напрямую представлены на другом языке (например, документы PyOpenGL перечисляют различия, большинство из которых довольно минимальны)
Помимо этого подробного API, вы можете написать больше «дружественных для разработчиков» оберток вокруг этого (игровые платформы и тому подобное)
источник