(거의) 모든 프로그래밍 언어에서 호출 할 수있는 함수 세트를 작성하려면 어떻게해야합니까?


33

언어 바인딩 (또는 다른 프레임 워크)을 통해 다른 프로그래밍 언어에서 액세스 할 수있는 API를 작성하는 방법을 찾고 싶습니다. 이것을 할 수 있습니까? 그렇다면, "언어 간"API 작성에 가장 적합한 프로그래밍 언어는 무엇입니까? 내 목표는 작업중 인 프로그래밍 언어에서 액세스 할 수있는 단일 함수 집합을 만드는 것이므로 각 언어로 전체 API를 수동으로 다시 작성할 필요가 없습니다.


4
마케팅상의 이유로 "모든 것을 지원합니다"라고 말하고 싶다면 C로 저수준 DLL 또는 공유 라이브러리를 작성하면됩니다. Java 인터페이스를 더 잘 제공하십시오.
mjfgates

1
"(거의) 아무거나"라고 말하면이 목적으로 어떤 언어를 제외 하시겠습니까? 아니면 어느 것이 가장 중요합니까?
funkybro

22
웹 서비스? php와 같은 함수를 작성할 수 있습니다. 거의 모든 언어는 웹 페이지와 인터페이스하고 인수를 제공하며 결과를 읽을 수 있습니다.
Pieter B

7
+1 '흥미로운 질문이기 때문에-왜 당신이 이것을하고 싶은지를 말함으로써 질문이 개선 될 것입니다. 당신의 목표는 무엇입니까?
TarkaDaal

@PieterB => 답변.
Konrad Rudolph

답변:


44

몇 가지 옵션이 있습니다.

  1. HTTP 인터페이스를 작성하면 거의 모든 것이 HTTP를 통해 많은 언어를 얻을 수 있습니다.

  2. 언어 런타임에 연결할 수있는 무언가를 만드십시오. 여러 언어로 언어를 연결하는 방법을 찾아야하므로 시간이 다소 걸립니다.


특히 어떤 HTTP 인터페이스를 염두에두고 있습니까?
앤더슨 그린

@AndersonGreen 네트워크 소켓을 열 수있는 언어는 HTTP를 사용할 수 있기 때문에 중요하지 않지만 REST 는 유용한 의사 표준입니다.
Monica Monica 복원

7
REST + JSON은 합리적인 솔루션이 될 것입니다
David Hayes

또한 HTTP를 사용하여 통신하면 거의 모든 언어가 응용 프로그램 기능과 상호 작용할 수 있습니다.
여기에만 볼리비아 사람

30

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이 생성하는 코드는 상업용 및 비상업적 프로젝트 모두와 호환됩니다 ...


32
C ++은 끔찍한 선택입니다. 런타임 라이브러리에 대한 종속성, 지정되지 않은 ABI (특히 mangling) 등 수많은 문제가 있습니다. C ++ 헤더에서 바인딩을 생성하는 것은 엄청나게 까다 롭습니다. SWIG는 상당히 제한적입니다. Python Qt 바인딩과 관련하여 지나치게 복잡해진 모든 인프라를 확인하십시오.
SK-logic

14
@ SK-logic : 실제로는 아닙니다. C에는 C ++과 같은 런타임 라이브러리가 필요합니다. ABI는 C ++에서 제어 할 수 있으므로 extern "C"외부에서 C 호환됩니다. 따라서 C ++ (더 높은 형식 안전성, 라이브러리)의 내부 장점이 있지만 C (실제로 ABI 표준)의 외부 장점
MSalters

3
@ SK-logic 지정되지 않은 ABI는 단순히 해결 된 문제입니다. SWIG, Boost.Python 및 기타 여러 언어 바인딩을 참조하십시오.
Konrad Rudolph

3
@MSalters는 라이브러리 경계를 넘어 예외와 일반적인 비 작업 성을 잊지 않습니다
sehe

3
C ++ 제안의 경우 -1입니다. C는 쉽고, C ++는 불필요하게 어려운 일을합니다.
어니스트 프리드먼 힐

23

거의 두 가지 방법이 있습니다.

  • C API. 실제로 언어는 C 라이브러리를로드하고 함수를 호출합니다. 이 작업을 수행하는 방법은 소스 언어에 따라 다릅니다.
  • 일종의 RPC 메커니즘. HTTP를 통해 실행되는 REST API이거나 소켓을 통해 실행되는 이진 인터페이스 일 수 있습니다. 가장 낮은 공통 분모 메커니즘 (예 : 소켓)을 사용하지 않으면 클라이언트 액세스 루틴이 없을 위험이 있습니다 (예 : 일부 언어에는 SOAP를 사용하여 구현 된 API를 호출 할 수있는 적절한 SOAP 클라이언트가 없거나 상호 운용성 문제가 있음). 가장 단순한 HTTP / REST 인터페이스 또는 소켓을 고수하십시오. 소켓은 인터페이스를 클라이언트에 노출시키기 위해 HTTP 서버가 필요하지 않으며 더 나은 성능으로 클라이언트와 동일한 서버에서 더 쉽게 실행할 수 있다는 이점이 있습니다.

소켓 인터페이스는 작동하는 등 사용 된 시스템에 따라이 변경에 필요한 작업이 수행되지만 클라이언트 쪽 라이브러리는 http 라이브러리에 비해 더 낮은 수준의 경향이 있습니다.

사용하려는 모든 언어를 지원하는 네트워킹 라이브러리를 찾고 해당 라이브러리와 관련하여 API를 구현할 수 있습니다. 예를 들어 ZeroMQ를 사용하면 유연성이 높아 지므로 ZeroMQ 인터페이스를 사용하여 API를 작성할 수 있습니다. API를 호출하려는 모든 언어는 ZeroMQ 클라이언트 라이브러리를 사용해야합니다. 광범위한 언어를 지원하는 라이브러리를 선택하고 최상의 성능을 위해 처리 중 및 처리 중이 아닌 통신을 수행 할 수 있습니다.


API를 여러 언어로 작성하려면 어떤 단계를 거쳐야합니까? (필자의 경우, 해당 언어는 Javascript, C ++ 및 Java입니다.)
Anderson Green

각 언어마다 3 개의 별도 RESTful API를 작성해야합니까?
앤더슨 그린

기본 C dll로드 및 호출을 처리하는 각 언어로 래퍼를 작성합니다. 또는 C ++로 작성하고 SWIG를 사용하여이를 수행하십시오. REST API를 사용하는 경우 단일 API를 작성한 다음 랩퍼 3 개를 작성하는 것도 동일하지만 REST API를 작성하는 경우 각 언어가 REST API를 직접 호출 할 수 있습니다. 귀찮게하지 마십시오. 포장지로.
gbjbaanb

DLL (동적으로 연결된 라이브러리)이 Windows 이외의 플랫폼과 호환됩니까? 크로스 플랫폼 호환성이 필요합니다.
앤더슨 그린

아니요, 다른 플랫폼 용으로 다시 컴파일해야합니다. 예를 들어 Linux는 .dll 대신 .so를 사용합니다. 간단한 재 컴파일 만 필요하며 코드를 변경하지 않아도됩니다.
gbjbaanb

12

성능 및 통화 대기 시간이 문제가되지 않으면 포괄적 인 명령 줄 인터페이스를 제공하는 것이 좋습니다 (아마도 그 위에 스크립팅 언어 사용). ImageMagick은 그러한 "API"의 좋은 예가 될 수 있습니다. 또 다른 좋은 예는 Tk 툴킷입니다.


명령 행 외부 함수 인터페이스를 작성하기 위해 권장하는 스크립팅 언어 및 / 또는 프로그래밍 언어는 무엇입니까? 또한 그러한 인터페이스의 구체적인 예를 찾았습니까?
앤더슨 그린

@AndersonGreen, 적절한 메타 프로그래밍을 가진 모든 언어는 그러한 목적에 적합합니다. 예를 들어, Scheme, MetaLua, 다양한 다른 삽입 가능한 리스프, Tcl. 자신의 명령 언어도 쉽게 구현할 수 있습니다. 많은 CAD / CAE 시스템이 이런 방식으로 작동합니다. 이미 언급 된 Tk가 또 다른 전형적인 예입니다.
SK- 로직

이런 방식으로 명령 행 인터페이스를 사용하려면 특정 명령에 대한 콘솔 출력 (예 : whoami사용자 이름을 얻기 위해 Ubuntu에서)을 얻거나 다른 것을 염두에 두었습니까?
앤더슨 그린

@AndersonGreen, 배관 stdin 및 stdout은 대부분의 경우 충분해야합니다.
SK-logic

5

API 란 정확히 무엇을 의미합니까?

많은 플랫폼에서 DLL 또는 유사한 구성에 연결할 수 있지만 특정 기본 대상 (Intel / ARM) 또는 엔디안에 대해 다시 컴파일해야합니까? 특정 바이너리 인터페이스는 데이터 유형 문제 또는 구문 (잘 지원되지 않는 언어로 포인터를 반환하려고 시도) 때문에 특정 언어에 여전히 어려움이있을 수 있으므로 API 자체의 디자인을 고려하지 않아야합니다. 일부 언어를 제외하거나 해당 언어에서 사용하기가 번거 롭습니다.

C와 같은 이식성 및 DLL의 이진 엔드 포인트 기반 인터페이스는 대부분의 플랫폼과 대부분의 언어에서 정상적으로 호출 할 수 있지만, 다르게 컴파일 및 / 또는 다른 특징으로 제공되거나 다른 정적 라이브러리에 링크되어야합니다.

라이브러리 또는 서비스를 작성하는 언어의 선택 또는 정의에 따라 API가 노출하는 플랫폼 / 서비스에 대해 더 많이 제공 할 때까지 본질적으로 문제가 아닌 것으로 보입니다. 네트워크 스택을 사용할 수 있고 직접 링크 된 함수 호출 수준 성능이 필요하지 않다고 가정하면 API가 클라이언트 언어에 대한 shim과 함께 HTTP 기반으로 쉽게 요청을 투명하게 만들 수 있습니다.

나는 일반적 으로이 질문은 실제 세계에서 유용하기에 지나치게 광범위하다고 생각합니다. 제공되는 서비스 유형에 따라 어떤 종류의 API가 적합 할 수 있는지에 대한 표시가 없기 때문입니다.


2

RPC 메커니즘 사용을 제안하는 위의 답변에 추가하십시오. Apache Thrift ( http://thrift.apache.org/ )를 사용할 수 있습니다 . 기본적으로 RPC 프레임 워크입니다.

중고품 위키에 따르면 :

확장 가능한 언어 간 서비스 개발을위한 Apache Thrift 소프트웨어 프레임 워크는 소프트웨어 스택과 코드 생성 엔진을 결합하여 C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, 코코아, JavaScript, Node.js, 스몰 토크, OCaml 및 델파이 및 기타 언어


Apache Thrift를 사용하여 외부 함수 호출을 어떻게 수행 할 수 있습니까?
앤더슨 그린

0

어떤 언어라도 매개 변수로 전달할 함수를 사용하여 텍스트 파일을 작성하도록하십시오. "다른 사람과 함께"응용 프로그램이 디렉토리를보고 있고 process-call.txt가 작동하면이를 확인하십시오. 서버 나 네트워크 프로토콜이 없습니다. 컴퓨터 이외의 언어로도 기능을 초기화 할 수 있습니다. 사람조차도 텍스트 파일을 만들 수 있습니다.

내용은 다음과 같습니다.

Call-method:  fdisk()
Params:  (string) "/root", (string) "write-back-file-expected.txt"

;) 당신은 대답을 얻기 위해 영원히 기다릴 수 있습니다. 다른 프로세스로 몇 바이트를 푸시해야하지만 전체 사양이 아니라고 확신합니다.


명령 행 인터페이스 + stdin / stdout을 가질 수있을 때 지나치게 복잡해 보입니다.
Monica Monica 복원

1
더 좋은 전화는 ++ 1이 될 수 있습니다. Brendan. 나는 그것을 실제로 보지 못했지만 한 번 사람들은 바이트를 옮기기 위해 카드에 구멍을 뚫고있었습니다.
Pareshkumar

4
이것은 농담이다, 그렇지? 우리는 여기서하지 않습니다.
어니스트 프리드먼 힐

fdisk와 / root 부분은 농담이지만, 나는 5 억 년 동안 플랫폼 연구 개발 (개발자 및 분석가)로 참여하여 천만 달러에 달하는 플랫폼 제품을 만들었습니다. 이 유형의 REST 메소드를 사용하여 클라이언트를 위해 수백만 개의 선적 가능한 물리적 (pdf 및 전자 메일이 아닌) 항목을 추출합니다 (항목 당 수백 MB 범위의 파일 처리). 우리는 주요 시스템 triolgy-SAP-MS Office-PLC Drivewrs-PDF 워크 플로가 모두 서로 가져와 일반 UTF-8 텍스트 파일 및 zip이 포함 된 zip이 포함 된 zip과 함께 잘 작동합니다. HTTP bs 오버 헤드가 없습니다.
Pareshkumar

질문 하나해도 될까요? 왜 JSON이 농담이라고 생각하지 않습니까? 내가 추천 한 것이 어떻게 다른가요? 우리는 json을 사용했을지 모르지만 2003 년에는 없었습니다. XML은 너무 뚱뚱하지만 그 당시에는 가장 실용적이고 단순한 영혼이 아니 었습니다.
Pareshkumar

0

OpenGL은 설명하는 좋은 예입니다. C로 작성된 API이며 다른 언어로 바인딩을 작성하기 쉬운 방식으로 설계되었습니다.

  1. C 라이브러리는 대부분의 프로그래밍 언어 (일반적으로 컴파일 된 확장 또는 PyPy의 ctypes라이브러리 등) 에서 호출 할 수 있습니다.

  2. 포인터를 사용하는 함수는 일부 언어로 번역하기 어색 할 수 있으므로 모든 함수는 간단한 데이터 유형을 인수 (부울, 정수, 부동 소수점, 상수, 배열)로 사용합니다.

  3. 정밀도와 부호를 지정하는 고유 한 숫자 데이터 유형을 갖는 경우 ( int float등이 다를 수 있음)

결과 API는 C 사용자 만 대상으로 작성할 수있는 사용하기 가장 좋은 C API 일 필요는 없습니다. 그러나 이는 함수가 다른 언어에 거의 직접 노출 될 수 있음을 의미합니다 (예 : PyOpenGL 문서는 차이점을 나열합니다.

이 장황한 API 이외에도 더 많은 "개발자 친화적"래퍼 (게임 프레임 워크 등)를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.