🤝

プログラミング言語間の呼び出し方法のまとめ

2024/11/20に公開

背景

とあるライブラリを見ていた際に、この言語ってこれから呼び出せるんだというような気づきがあり、メモとして記載。
また社内のシステムでもあぁこの言語で書いたか。。というようなものをどうするかと思いことも多く他言語への書き換えなどを考える際の参考として記載してます。

概要

プログラミング言語間の呼び出し可否を、簡単に図示化しました。
図示化上の注意点は、下記です。

  • 対象言語: 個人的に人気のプログラミング言語から利用または関わりそうなプログラミング言語を中心に選定
  • グラフ上の関係性として矢印は下記を示しており、矢印上に使用技術を書いてます。
    • 相互に呼び出し可能 : <->
    • 片方からのみ : 呼び出し元 -> 呼び出し先

主要な呼び出し方法を示しており、言語間の連携には他の方法も存在すると思います。また、連携上の注意や細かい使用上の前提条件は省いています。

Go

  1. C/C++との連携:
    • cgoを使用してCライブラリを呼び出せる
    • GoのコードをCライブラリとしてビルドし、他言語から使用可能
  2. Rustとの連携:
    • RustをCライブラリとしてビルドし、cgoで呼び出す
    • puregoライブラリを使ってRustライブラリを動的ロード
  3. Python/Rubyとの連携:
    • gopy/gorb等のツールを使ってGoライブラリをPython/Rubyから呼び出せるようにする

Kotlin

  1. Java連携:
    • KotlinはJVM上で動作するため、Javaとの相互運用性が高い
    • JavaのライブラリやクラスをKotlinから直接利用可能
  2. Native連携(C/C++/Rust):
    • Kotlin/Nativeを使用してCライブラリとリンク
    • cinteropツールでCヘッダーファイルからKotlinバインディングを生成
  3. JavaScript連携:
    • Kotlin/JSを使ってKotlinコードをJavaScriptにコンパイル
    • npmパッケージとして公開可能

Java

  1. C/C++連携:
    • JNI (Java Native Interface)を使用してCライブラリを呼び出し
  2. Python連携:
    • Jythonを使用してJava上でPythonを実行
    • py4jを使ってJavaとPython間で通信
  3. JavaScript連携:
    • Nashorn/GraalVMを使ってJava内でJavaScriptを実行
    • J2V8を使ってJavaからV8エンジンを利用

Python

  1. C/C++連携:
    • ctypesを使ってCライブラリを直接呼び出し
    • CPythonのC APIを使ってPythonの拡張モジュールを作成
  2. Rust連携:
    • PyO3を使ってRustからPythonモジュールを作成
    • maturinを使ってビルドとパッケージング
  3. Java連携:
    • JPypeを使ってPythonからJavaクラスを利用
    • Jythonを使ってJava上でPythonを実行

Ruby

  1. C連携:
    • Ruby's C APIを使ってCの拡張を作成
    • FFIを使ってCライブラリを呼び出し
  2. Rust連携:
    • Helix/Rutieを使ってRustコードをRubyから呼び出し
  3. Java連携:
    • JRubyを使ってJVM上でRubyを実行
    • rjbを使ってRubyからJavaクラスを利用

Rust

  1. C/C++連携:
    • ABIと互換性があるため、C/C++との連携が容易
      FFI (Foreign Function Interface)を使用してCの関数をRustから呼び出したり、Rustの関数をCから呼び出したりできます
  2. Python連携:
    • PyO3を使用することで、PythonとRustを連携
  3. Java連携
    • JNI (Java Native Interface)を使用してRustコードをJavaから呼び出し
    • j4rsライブラリを使用すると、RustからJavaコードを呼び出し、その逆も可能
  4. JavaScript
    • RustコードをWASMにコンパイルし、ブラウザ上のJavaScriptから利用可能
    • Node.jsのネイティブ拡張としてRustを使用することも可能
    • Ruby連携:
    • Helix、Rutie、Ruru等のライブラリを使用してRubyとRustを連携可能

JavaScript

  1. C++連携:
    • Node.jsのN-APIを使ってC++アドオンを作成
  2. Rust連携:
    • wasm-bindgenを使ってRustコードをWebAssemblyにコンパイルしブラウザで実行
    • Napi-rsを使ってRustコードをNode.jsのネイティブアドオンとして利用
  3. Python連携:
    • PyJSを使ってブラウザ上でPythonを実行
    • python-shellを使ってNode.jsからPythonスクリプトを実行

最後に

書いてみての感想としては、詳細な注意事項や曲はあるとしても、人気が高い主要な言語は別言語で呼び出し可能だし、1言語経由すればだいたいの言語で呼び出し可能にできそうだなと思いました

Discussion