Saya ingin menemukan cara untuk menulis API yang dapat diakses dari bahasa pemrograman lain melalui binding bahasa (atau kerangka kerja lain). Apakah mungkin untuk melakukan ini? Jika demikian, bahasa pemrograman mana yang paling cocok untuk menulis "lintas-bahasa" API? Tujuan saya adalah membuat satu set fungsi yang dapat saya akses dari bahasa pemrograman apa pun yang saya gunakan, sehingga saya tidak perlu menulis ulang seluruh API secara manual dalam setiap bahasa.
33
Jawaban:
Anda punya beberapa pilihan:
Buat antarmuka HTTP, hampir semuanya dapat berbicara HTTP sehingga akan membuat Anda banyak bahasa.
Buat sesuatu yang dapat dihubungkan ke runtime bahasa, ini akan memakan waktu karena Anda perlu menemukan cara untuk menghubungkannya ke berbagai bahasa.
sumber
Saya pikir C atau C ++ akan paling cocok untuk tujuan Anda. Anda dapat menggunakan SWIG (Pembungkus Sederhana dan Penghasil Antarmuka) untuk menghasilkan binding bahasa dari API C atau C ++ Anda.
sumber
extern "C"
sehingga kompatibel dengan C di luar. Oleh karena itu, Anda memang memiliki keunggulan internal C ++ (keamanan tipe-lebih tinggi, perpustakaan) tetapi keunggulan eksternal C (standar ABI de facto)Ada cukup banyak 2 cara:
Pekerjaan yang diperlukan untuk perubahan ini tergantung pada sistem yang digunakan, misalnya, antarmuka soket akan berfungsi, tetapi pustaka sisi klien cenderung lebih rendah daripada pustaka http.
Anda bisa mencoba menemukan pustaka jaringan yang mendukung semua bahasa yang ingin Anda gunakan, dan mengimplementasikan API dalam hal pustaka itu - misalnya, menggunakan ZeroMQ memberi Anda banyak fleksibilitas, sehingga Anda akan menulis API Anda menggunakan antarmuka ZeroMQ, dan maka bahasa apa pun yang ingin memanggil API Anda harus menggunakan pustaka klien ZeroMQ untuk melakukannya. Pilih perpustakaan yang mendukung berbagai bahasa, dan memungkinkan Anda untuk berkomunikasi dalam proses maupun di luar proses untuk kinerja terbaik.
sumber
Jika latensi kinerja dan panggilan bukan masalah, pertimbangkan untuk menyediakan antarmuka baris perintah yang komprehensif (mungkin, menggunakan bahasa skrip di atasnya). ImageMagick bisa menjadi contoh yang bagus untuk "API" semacam itu. Contoh bagus lainnya adalah Tk toolkit.
sumber
whoami
pada Ubuntu untuk mendapatkan nama pengguna), atau apakah Anda memiliki sesuatu yang lain dalam pikiran?Dengan API, apa sebenarnya yang Anda maksud?
Pada banyak platform Anda dapat menautkan ke DLL atau konstruksi serupa, tetapi apakah harus dikompilasi ulang untuk target asli tertentu (Intel / ARM) atau endianness masih memenuhi syarat? Antarmuka biner tertentu mungkin masih mengalami kesulitan dengan bahasa tertentu karena masalah tipe data atau konstruksi (petunjuk yang berusaha dikembalikan ke bahasa yang tidak mendukungnya dengan baik), jadi Anda juga harus mempertimbangkan desain API itu sendiri agar tidak untuk mengecualikan beberapa bahasa atau menggunakannya dari bahasa-bahasa yang rumit.
Sesuatu yang portabel seperti C dan antarmuka yang didasarkan pada titik akhir biner dalam DLL mungkin baik dan umumnya dapat dipanggil pada sebagian besar platform dan dari sebagian besar bahasa, tetapi mungkin perlu dikompilasi secara berbeda dan / atau ditawarkan dalam berbagai rasa atau dihubungkan ke perpustakaan statis yang berbeda.
Tampaknya bagi saya bahwa pilihan bahasa yang Anda tulis di perpustakaan atau layanan Anda atau apa pun, menurut definisi, tidak intrinsik dengan pertanyaan sampai Anda telah memberikan lebih banyak tentang platform / layanan yang diungkapkan oleh API. Jika Anda dapat mengasumsikan bahwa tumpukan jaringan tersedia dan kinerja fungsi-panggilan-tingkat-taut-langsung bukanlah persyaratan, API dapat dengan mudah berbasis HTTP dengan semacam shim untuk bahasa klien untuk membuat permintaan transparan.
Saya pikir secara umum pertanyaan ini terlalu luas untuk berguna di dunia nyata, karena Anda belum memberikan indikasi tentang jenis API apa yang cocok dengan jenis layanan yang ditawarkan.
sumber
Untuk menambahkan jawaban di atas yang menyarankan menggunakan mekanisme RPC. Anda dapat menggunakan Apache Thrift. ( Http://thrift.apache.org/ ). Ini pada dasarnya adalah kerangka kerja RPC.
Sesuai wiki hemat:
sumber
Mintalah bahasa apa pun menulis file teks dengan fungsi untuk memanggil dengan params untuk lulus. Buat aplikasi "Saya bergaul dengan siapa pun" menonton direktori dan begitu ia melihat proses-panggilan.txt sudah mulai berfungsi. Tidak ada server atau protokol jaringan; bahkan metode bahasa non-komputer dapat init fungsi. Bahkan seseorang bisa saja membuat file teks.
Konten dapat terlihat seperti:
;) Anda mungkin menunggu selamanya untuk mendapatkan jawaban. Anda hanya perlu mendorong beberapa byte ke proses lainnya, tapi saya yakin itu bukan keseluruhan spek.
sumber
OpenGL adalah contoh yang baik dari apa yang Anda gambarkan - ini adalah API yang ditulis dalam C, dirancang dengan cara yang mudah untuk menulis binding dalam bahasa lain
Pustaka C dapat dipanggil dari sebagian besar bahasa pemrograman (biasanya sebagai ekstensi yang dikompilasi, atau hal-hal seperti
ctypes
pustaka PyPy dll)Semua fungsi menggunakan tipe data sederhana sebagai argumen (boolean, integer, floating point, konstanta, array), karena fungsi yang mengambil pointer dapat menjadi canggung untuk diterjemahkan ke dalam beberapa bahasa
int
float
dll dapat berbeda)API yang dihasilkan belum tentu API C terbaik yang dapat digunakan yang bisa Anda tulis jika hanya menargetkan pengguna C. Namun itu berarti fungsi-fungsinya dapat langsung diekspos ke bahasa lain (mis. Dokumen PyOpenGL membuat daftar perbedaan, yang sebagian besar sangat minim)
Di atas API verbose ini, Anda dapat menulis lebih banyak pembungkus "ramah pengembang" di sekitar ini (kerangka permainan dan semacamnya)
sumber