문제

일부 사람들이 한 프로젝트에서 여러 언어로 프로그램을 들었습니다. 언어가 어떻게 서로 상호 작용하는지 상상할 수 없습니다.

나는 Java 방법이 없다는 것을 의미합니다

myProgram.callCfunction(parameters);

결코 일어나지 않거나 내가 틀렸습니까?

도움이 되었습니까?

해결책

하나의 프로젝트에 여러 언어를 갖는 것은 실제로 매우 일반적이지만 배후의 원칙이 항상 간단한 것은 아닙니다.

간단한 경우 다른 언어가 동일한 코드로 컴파일됩니다. 예를 들어 C 및 C ++ 코드는 일반적으로 기계 어셈블러 또는 C#으로 컴파일되며 vb.net은 IL (.NET 런타임으로 이해되는 언어)로 컴파일됩니다.

언어/컴파일러가 다른 유형 시스템을 사용하면 더 어려워집니다. 정수, 플로트 및 복식과 같은 기본 데이터 유형은 다양한 방법이있을 수 있으며 문자열을 나타내는 더 많은 방법이 있습니다. 다른 언어 사이의 유형을 전달할 때 양쪽이 유형을 동일하게 해석하거나 유형이 올바르게 매핑되어야합니다. 이러한 종류의 유형 매핑은 또한 알려져 있습니다 마샬링.

다른 프로그램 언어 간의 상호 운용성의 고전적인 예는 (주로 Windows World의)입니다.

  • .NET 플랫폼에 사용할 수있는 다양한 언어. 여기에는 C#, vb.net, J#, Ironruby, F#, XSLT 및 기타 덜 인기있는 언어가 포함됩니다.
  • C ++ 또는 VB로 작성된 기본 COM 구성 요소는 VBScript, VB, All .NET Languages, Java와 같은 다양한 언어로 사용할 수 있습니다.
  • Win32 API 기능은 .NET 또는 VB에서 호출 할 수 있습니다.
  • IPC (인터 프로세스 커뮤니케이션)
  • 코바, 아마도 가장 포괄적이고 가장 복잡한 접근 방식
  • 웹 서비스 및 기타 서비스 지향 아키텍처, 아마도 가장 현대적인 접근 방식

다른 팁

일반적으로 괜찮은 크기의 웹 프로젝트는 HTML, CSS, JavaScript, 어떤 종류의 서버 측“Geting Things Done”언어 (ASP, JSP, CGI 스크립트가있는 CGI 스크립트, PHP 등)의 약 5 개 언어를 사용합니다. 데이터베이스 연결 용 SQL.

(물론 이것은 HTML과 CSS가 프로그래밍 언어로 간주되는지에 대한 논쟁을 손으로 흔들어 놓는 것입니다. 저는“그들은“그들 중에는 불완전한 언어가 아니지만”캠프입니다. 그러나 그것은 완전히 다른 스레드입니다. )

모든 사람들이 어떻게 협력하는지에 대한 몇 가지 예 :

모범 사례 경로를 사용하는 경우 웹 페이지의 구조는 HTML에 있으며, 표시 방법에 대한 지침은 CSS에 있습니다.이 파일에있을 수 있지만 가능하지 않습니다. CSS에는 HTML이 말하는 많은 클래스가 포함되어 있으며 함께 클릭하는 방법을 알아내는 것은 브라우저에 달려 있습니다.

한 단계 더 나아가서, 해당 페이지의 JavaScript 스크립트는 존재하는 HTML/CSS를 변경할 수 있습니다 (HTML 엔티티의 내용 변경, 다른 CSS 클래스를 다른 CSS 클래스를 교체하고 CSS의 동작을 변경하십시오. ) 문서 개체 모델을 통해이 작업을 수행합니다. 문서 개체 모델은 본질적으로 객체와 같은 방식으로 HTML 페이지를 조작하는 언어 및 플랫폼 독립적 인 API입니다 (이 시점에서는 천천히 물러서서 관련 위키 기사.)

그러나 모든 HTML / CSS / JavaScript는 어디에서 왔습니까? 그것이 서버 측 언어가하는 일입니다. 가장 간단한 형태로, Serer-Side 언어는 HTML 페이지를 출력으로 고정하는 거대한 문자열을 반환하는 프로그램입니다. HTML 양식 및 쿼리 문자열 매개 변수는 서버 측 프로그램의 입력으로 사용할 수 있으며 JavaScript가 서버 언어로 직접 데이터를 전송하는 전체 AJAX가 있습니다. 서버 언어가 HTML, CSS 및 JavaScript를 사용자 정의 할 수있는 곳에서 멋진 곳을 얻을 수 있습니다. 본질적으로 다른 언어로 프로그램을 작성하는 한 언어로 프로그램이 있습니다.

서버 측 언어 대 SQL 연결은 거의 동일하게 작동합니다. 더 복잡하고 안전하게 만드는 방법에는 여러 가지가 있지만 가장 간단한 방법은 서버 언어가 SQL 명령으로 문자열을 동적으로 빌드하고 어떤 종류의 커넥터를 통해 데이터베이스에 손을 뻗는 것입니다. 결과 세트. (이것은 당신이 실제로 value = database.executethissqlcommand (sqlstring)로 요약되는 함수가있는 경우입니다.)

따라서이 경우 다른 언어는 실제로 서로 프로그램을 작성하거나 모든 사람이 이해할 수있는 매우 간단한 구문 분석 형식으로 데이터를 전달함으로써 의사 소통합니다. (줄, 주로.)

사용중인 여러 언어를 "상호 운용성"또는 "Interop"이라고합니다.

당신의 예는 잘못되었습니다. Java는 C 함수를 호출 할 수 있습니다.

언어는 상호 운용성을위한 메커니즘을 제공합니다.

.NET의 경우 언어는 CLI의 일부로 IL로 컴파일됩니다. 따라서 모든 .NET 언어는 다른 .NET 언어로 정의 된 모듈에 의해 인터 로프 (통화 메소드) 모듈이 될 수 있습니다.

예로서:

C#에서 메소드를 정의 할 수 있습니다.

static void Hello(){ Console.WriteLine("Hello World");}

그리고 나는 Python (Ironpython)에서 그것을 부를 수 있습니다.

 Hello()

예상 출력을 얻으십시오.

일반적으로, 일부 언어는 다른 언어보다 더 잘 상호 작용합니다. 특히 언어 저자가 구체적으로 언어의 특징으로 만든 경우.

여러 언어가 다음과 상호 작용할 수 있습니다.

  1. 파이프 입력/출력 (모든 언어에 의해 입력 및 출력이 모든 비 토이 언어로 구현되어야하기 때문에 모든 언어를 수행 할 수 있습니다)
  2. 한 언어로 코드가있는 것은 기본 라이브러리로 컴파일하는 반면 다른 언어는 기본 코드를 호출하는 것을 지원합니다.
  3. 루프백 네트워크 연결을 통해 통신합니다. 이런 식으로 방화벽 간섭으로 어려움을 겪을 수 있습니다.
  4. 데이터베이스. 이들은 "범용"데이터 스토리지 형식으로 생각할 수 있으므로 데이터베이스 확장 기능이있는 대부분의 언어로 액세스 할 수 있습니다. 이는 일반적으로 다음 프로그램이 데이터베이스에 액세스하기 전에 작업을 완료하기 위해 하나의 프로그램이 필요합니다. 또한 모든 '통신'은 일반적으로 디스크에 기록됩니다.
  5. 관련된 언어가 동일한 런타임 (예 : .NET, JVM)에서 실행되면 일반적으로 객체 데이터를 한 언어에서 다른 언어로 직접 전달할 수 있습니다.

거의 모든 경우에 교환하기 전에 커뮤니케이션을 공통 형식으로 변환해야합니다 (예외는 동일한 런타임의 언어입니다). 이것이 한 프로젝트에서 여러 언어가 거의 사용되지 않는 이유입니다.

저는 8 개 언어 약 8 개 언어로 구성된 대규모 엔터프라이즈 프로젝트에서 일합니다. 커뮤니케이션의 대부분은 여러 언어에 대한 바인딩이 포함되어있는 엔터프라이즈 레벨 메시지 버스를 통해 이루어집니다. 라고 불린다 tibco.

작업의 대부분이 Java에서 수행되는 앱을 가질 수 있지만 데이터 파서 나 Python으로 작성된 것과 같은 일부가있을 수 있습니다. 거의 두 개의 개별 앱이 실제로 파서가 파일 작업을 수행 한 다음 Java의 기본 앱이 무언가를 사용하고 있습니다. 누군가 내가이 프로젝트에서 내가 무엇을 사용했는지 물어 보면 "Java와 Python"이라고 말합니다.

하나의 프로젝트에서 다른 언어를 사용할 수있는 다양한 방법이 있습니다. 두 가지 주요 범주가 있습니다.

  1. 하나의 응용 프로그램을 구축하기 위해 다른 언어를 함께 사용합니다. 예를 들어 Java를 사용하여 GUI를 구축하고 JNI를 사용하여 C API에 액세스합니다 (따라서 질문에 답하기 위해 Java에서 C 함수를 호출 할 수 있습니다)).
  2. 하나의 프로젝트에서 다른 언어를 함께 사용하지만 동일한 응용 프로그램의 일부는 아닙니다. 예를 들어. 현재 많은 양의 텍스트를 사용하는 iPhone 앱에서 작업 중입니다. 현재 3 개의 언어 Python (텍스트의 Origanal 소스와 함께 작동), SQL (Python 앱의 결과를 iPhone SQLite3 API에서 쉽게 적합한 형식으로 넣기 위해) 및 Objectiv C를 사용하여 실제 앱을 빌드하고 있습니다. 최종 제품은 객관적 인 C 만 있더라도 최종 제품에 도달하기 위해 다른 두 언어를 사용했습니다.

하나의 프로젝트에서 여러 언어를 사용할 수있는 다양한 방법이 있습니다. 몇 가지 예 :

  • C에 DLL을 작성한 다음 VB 프로그램에서 해당 라이브러리를 사용할 수 있습니다.
  • C ++에 서버 프로그램을 작성하고 클라이언트의 다양한 언어 구현을 가질 수 있습니다.
  • 웹 프로젝트는 종종 많은 언어를 사용합니다. 예를 들어 SQL (쿼리 언어)을 사용하여 데이터베이스의 데이터를 가져 오는 Java (프로그래밍 언어)에 작성된 서버 프로그램은 사용자가 할 수있는 HTML (Markup Language)의 브라우저에 결과를 보냅니다. JavaScript (스크립팅 언어) 사용과 상호 작용합니다 ...

프로젝트 유형에 따라 다릅니다. 실험하려면 .NET에서 웹 프로젝트를 설정하고 페이지별로 언어를 변경할 수 있습니다. 의사 코드에서 보여줄 때 작동하지 않지만 여러 언어입니다. 물론 실제 코드 디렉토리는 단일 언어 여야합니다.

언어로 된 코드가 직접 상호 작용할 수있는 몇 가지 방법이 있습니다. 코드 사이에 전달되는 데이터가 올바른 형식, 비트 및 바이트 레벨에있는 한 다른 언어가 인터 로프 할 수없는 이유는 없습니다. 이 접근법은 기존 Windows DLL 개발에 사용됩니다. 다른 플랫폼에서도 형식을 올바르게 얻을 수 있다면 (관심이있는 경우 Big/Little Endian을보십시오) 링커 (컴파일러가 아님)가 코드에 가입하는 방법을 알고있는 한 작동합니다.

그 외에도 언어가 서로 대화 할 수있는 다른 방법이 많이 있습니다. .NET World Code에서는 모든 언어에 대해 동일한 IL 코드로 컴파일됩니다. 이러한 방식으로 C#은 모두 후드 아래에서 동일하며 서로 완벽하게 호출/작업 할 수 있습니다.

심하게. 긴급한 필요가 없다면 단일 언어를 고수하십시오. 의존성과 복잡성을 높이고 있습니다. 그러나 흥미로운 기능을 제공하는 기존 코드가 있으면 재현하는 것보다 더 쉽게 붙일 수 있습니다.

예제 목록에 추가하기 위해 C 또는 C ++에서 Python 코드를 최적화하거나 C 라이브러리를 작성하여 다른 라이브러리를 Python에 바인딩하는 것이 일반적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top