언어 바인딩 (또는 다른 프레임 워크)을 통해 다른 프로그래밍 언어에서 액세스 할 수있는 API를 작성하는 방법을 찾고 싶습니다. 이것을 할 수 있습니까? 그렇다면, "언어 간"API 작성에 가장 적합한 프로그래밍 언어는 무엇입니까? 내 목표는 작업중 인 프로그래밍 언어에서 액세스 할 수있는 단일 함수 집합을 만드는 것이므로 각 언어로 전체 API를 수동으로 다시 작성할 필요가 없습니다.
언어 바인딩 (또는 다른 프레임 워크)을 통해 다른 프로그래밍 언어에서 액세스 할 수있는 API를 작성하는 방법을 찾고 싶습니다. 이것을 할 수 있습니까? 그렇다면, "언어 간"API 작성에 가장 적합한 프로그래밍 언어는 무엇입니까? 내 목표는 작업중 인 프로그래밍 언어에서 액세스 할 수있는 단일 함수 집합을 만드는 것이므로 각 언어로 전체 API를 수동으로 다시 작성할 필요가 없습니다.
답변:
몇 가지 옵션이 있습니다.
HTTP 인터페이스를 작성하면 거의 모든 것이 HTTP를 통해 많은 언어를 얻을 수 있습니다.
언어 런타임에 연결할 수있는 무언가를 만드십시오. 여러 언어로 언어를 연결하는 방법을 찾아야하므로 시간이 다소 걸립니다.
C 또는 C ++이 귀하의 목적에 가장 적합하다고 생각합니다. SWIG (Simplified Wrapper 및 Interface Generator) 를 사용하여 C 또는 C ++ API에서 언어 바인딩을 생성 할 수 있습니다 .
SWIG는 C 및 C ++로 작성된 프로그램을 다양한 고급 프로그래밍 언어와 연결하는 소프트웨어 개발 도구입니다. SWIG는 Perl, PHP, Python, Tcl 및 Ruby와 같은 일반적인 스크립팅 언어를 포함하여 다양한 유형의 대상 언어와 함께 사용됩니다. 지원되는 언어 목록C #, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), D, Go 언어, Android, Lua, Modula-3, OCAML, Octave 및 R을 포함한 Java와 같은 비 스크립팅 언어도 포함됩니다. 구현 (Guile, MzScheme / Racket, Chicken)이 지원됩니다. SWIG는 일반적으로 고급 해석 또는 컴파일 된 프로그래밍 환경, 사용자 인터페이스를 작성하고 C / C ++ 소프트웨어를 테스트하고 프로토 타이핑하기위한 도구로 사용됩니다. SWIG는 일반적으로 C / C ++ 인터페이스를 구문 분석하고 위의 대상 언어가 C / C ++ 코드를 호출하는 데 필요한 '접착제 코드'를 생성하는 데 사용됩니다. 또한 SWIG는 구문 분석 트리를 XML 및 Lisp s-expressions 형식으로 내보낼 수 있습니다. SWIG는 무료 소프트웨어이며 SWIG이 생성하는 코드는 상업용 및 비상업적 프로젝트 모두와 호환됩니다 ...
extern "C"
외부에서 C 호환됩니다. 따라서 C ++ (더 높은 형식 안전성, 라이브러리)의 내부 장점이 있지만 C (실제로 ABI 표준)의 외부 장점
거의 두 가지 방법이 있습니다.
소켓 인터페이스는 작동하는 등 사용 된 시스템에 따라이 변경에 필요한 작업이 수행되지만 클라이언트 쪽 라이브러리는 http 라이브러리에 비해 더 낮은 수준의 경향이 있습니다.
사용하려는 모든 언어를 지원하는 네트워킹 라이브러리를 찾고 해당 라이브러리와 관련하여 API를 구현할 수 있습니다. 예를 들어 ZeroMQ를 사용하면 유연성이 높아 지므로 ZeroMQ 인터페이스를 사용하여 API를 작성할 수 있습니다. API를 호출하려는 모든 언어는 ZeroMQ 클라이언트 라이브러리를 사용해야합니다. 광범위한 언어를 지원하는 라이브러리를 선택하고 최상의 성능을 위해 처리 중 및 처리 중이 아닌 통신을 수행 할 수 있습니다.
성능 및 통화 대기 시간이 문제가되지 않으면 포괄적 인 명령 줄 인터페이스를 제공하는 것이 좋습니다 (아마도 그 위에 스크립팅 언어 사용). ImageMagick은 그러한 "API"의 좋은 예가 될 수 있습니다. 또 다른 좋은 예는 Tk 툴킷입니다.
whoami
사용자 이름을 얻기 위해 Ubuntu에서)을 얻거나 다른 것을 염두에 두었습니까?
API 란 정확히 무엇을 의미합니까?
많은 플랫폼에서 DLL 또는 유사한 구성에 연결할 수 있지만 특정 기본 대상 (Intel / ARM) 또는 엔디안에 대해 다시 컴파일해야합니까? 특정 바이너리 인터페이스는 데이터 유형 문제 또는 구문 (잘 지원되지 않는 언어로 포인터를 반환하려고 시도) 때문에 특정 언어에 여전히 어려움이있을 수 있으므로 API 자체의 디자인을 고려하지 않아야합니다. 일부 언어를 제외하거나 해당 언어에서 사용하기가 번거 롭습니다.
C와 같은 이식성 및 DLL의 이진 엔드 포인트 기반 인터페이스는 대부분의 플랫폼과 대부분의 언어에서 정상적으로 호출 할 수 있지만, 다르게 컴파일 및 / 또는 다른 특징으로 제공되거나 다른 정적 라이브러리에 링크되어야합니다.
라이브러리 또는 서비스를 작성하는 언어의 선택 또는 정의에 따라 API가 노출하는 플랫폼 / 서비스에 대해 더 많이 제공 할 때까지 본질적으로 문제가 아닌 것으로 보입니다. 네트워크 스택을 사용할 수 있고 직접 링크 된 함수 호출 수준 성능이 필요하지 않다고 가정하면 API가 클라이언트 언어에 대한 shim과 함께 HTTP 기반으로 쉽게 요청을 투명하게 만들 수 있습니다.
나는 일반적 으로이 질문은 실제 세계에서 유용하기에 지나치게 광범위하다고 생각합니다. 제공되는 서비스 유형에 따라 어떤 종류의 API가 적합 할 수 있는지에 대한 표시가 없기 때문입니다.
RPC 메커니즘 사용을 제안하는 위의 답변에 추가하십시오. Apache Thrift ( http://thrift.apache.org/ )를 사용할 수 있습니다 . 기본적으로 RPC 프레임 워크입니다.
중고품 위키에 따르면 :
확장 가능한 언어 간 서비스 개발을위한 Apache Thrift 소프트웨어 프레임 워크는 소프트웨어 스택과 코드 생성 엔진을 결합하여 C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, 코코아, JavaScript, Node.js, 스몰 토크, OCaml 및 델파이 및 기타 언어
어떤 언어라도 매개 변수로 전달할 함수를 사용하여 텍스트 파일을 작성하도록하십시오. "다른 사람과 함께"응용 프로그램이 디렉토리를보고 있고 process-call.txt가 작동하면이를 확인하십시오. 서버 나 네트워크 프로토콜이 없습니다. 컴퓨터 이외의 언어로도 기능을 초기화 할 수 있습니다. 사람조차도 텍스트 파일을 만들 수 있습니다.
내용은 다음과 같습니다.
Call-method: fdisk()
Params: (string) "/root", (string) "write-back-file-expected.txt"
;) 당신은 대답을 얻기 위해 영원히 기다릴 수 있습니다. 다른 프로세스로 몇 바이트를 푸시해야하지만 전체 사양이 아니라고 확신합니다.
OpenGL은 설명하는 좋은 예입니다. C로 작성된 API이며 다른 언어로 바인딩을 작성하기 쉬운 방식으로 설계되었습니다.
C 라이브러리는 대부분의 프로그래밍 언어 (일반적으로 컴파일 된 확장 또는 PyPy의 ctypes
라이브러리 등) 에서 호출 할 수 있습니다.
포인터를 사용하는 함수는 일부 언어로 번역하기 어색 할 수 있으므로 모든 함수는 간단한 데이터 유형을 인수 (부울, 정수, 부동 소수점, 상수, 배열)로 사용합니다.
int
float
등이 다를 수 있음)결과 API는 C 사용자 만 대상으로 작성할 수있는 사용하기 가장 좋은 C API 일 필요는 없습니다. 그러나 이는 함수가 다른 언어에 거의 직접 노출 될 수 있음을 의미합니다 (예 : PyOpenGL 문서는 차이점을 나열합니다.
이 장황한 API 이외에도 더 많은 "개발자 친화적"래퍼 (게임 프레임 워크 등)를 작성할 수 있습니다.