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


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.