Pertanyaan Bagaimana cara kerja binding bahasa?


Bagaimana cara kerja binding bahasa?

Misalnya bagaimana seseorang membuat binding dari perpustakaan yang ditulis dalam satu bahasa ke bahasa lain? Akankah binding ditulis dalam bahasa yang sama dengan perpustakaan atau bahasa yang digunakan oleh bindings?

Apakah mungkin untuk membuat binding ke dan dari semua bahasa atau apakah bahasa harus mendukung bindings? Jika itu masalahnya maka bagaimana cara kerja dukungan itu?


32
2017-12-28 14:59


asal


Jawaban:


Untuk sebagian besar sebagian besar bahasa di luar sana ditulis dalam C (Perl, Python, Ruby, Tcl ...) atau kompatibel dengan C (C ++, C #, Objective-C). Oleh karena itu, untuk sebagian besar bahasa, mudah untuk menggunakan pustaka C dengan menulis beberapa fungsi pembungkus untuk mengonversi struktur data dalam bahasa itu menjadi struktur data C asli. Bahkan ada alat otomatis (atau semi-otomatis tergantung pada kerumitan yang dibutuhkan) untuk ini: SWIG.

Ini adalah salah satu alasan utama kebanyakan pustaka ditulis dalam C. Ini hanya memudahkan port untuk kode level rendah ke beberapa bahasa target. Contoh pustaka yang menggunakan strategi ini termasuk SQLite, Tk, dan wxWidgets.

Strategi lain adalah menggunakan fitur-fitur OS untuk mengekspor perpustakaan ke pustaka bersama berbahasa netral. Pada Windows ini akan menjadi DLL dan di Unixen mereka akan berbagi pustaka. Sebagian besar produk Microsoft menggunakan strategi ini sehingga tidak peduli apa kode asli yang ditulis di Anda dapat dengan mudah mengakses perpustakaan asalkan dikompilasi sebagai DLL. Contoh pustaka non-Microsoft yang menggunakan strategi ini termasuk libpurple dan gtk.

Pilihan ketiga adalah menggunakan IPC. Metode yang paling umum adalah menggunakan soket karena itu akrab bagi kebanyakan orang dan sangat lintas platform. Kode yang menggunakan metode ini tidak, secara tegas, perpustakaan. Mereka adalah server dan "API" mereka secara teknis layanan. Tetapi bagi programmer rata-rata yang menggunakan layanan mereka terlihat seperti API biasa karena sebagian besar bahasa bindings abstrak jauh kode jaringan dan menyajikan fungsi sederhana / metode panggilan. Contoh "pustaka" menggunakan strategi ini termasuk Xwindows, Gimp scripting, dan sebagian besar basis data seperti MySQL dan Oracle.

Ada cara lain yang lebih berbelit-belit untuk menyediakan akses ke perpustakaan yang ditulis dalam bahasa lain termasuk benar-benar menyematkan penerjemah bahasa itu, tetapi di atas 3 adalah yang paling umum.


Klarifikasi

Saya rasa saya harus menjelaskan sedikit perbedaan antara pendekatan pertama dan kedua.

Dalam pendekatan pertama, perpustakaan masih dikompilasi menjadi dll atau. Jadi seperti pendekatan kedua tetapi perbedaan utama adalah bahwa dll harus sesuai dengan standar / protokol tingkat yang lebih tinggi. Tcl misalnya tidak dapat memuat sembarang dll karena mengharapkan semua nilai masuk ke dan keluar dari fungsi untuk menjadi penunjuk ke struct Tcl_Obj. Jadi untuk menggunakan perpustakaan dikompilasi sebagai dll tua biasa Anda harus mengkompilasi dll lain yang mengakses dll pertama melalui fungsi wrapper yang mengubah semua variabel dan parameter fungsi menjadi struct Tcl_Obj*.

Tetapi beberapa bahasa seperti VB dapat memuat dll. Jadi itu akan menjadi contoh dari pendekatan kedua.


25
2017-12-28 16:13



Secara teori kerangka yang mengikat dapat dibangun yang bisa mengambil pendekatan bahasa agnostik tetapi lebih sering maka tidak fitur mengikat dibangun dalam bahasa yang diberikan (kerangka kerja).

Meningkatkan set fitur akan sangat sulit ketika Anda mengambil pendekatan agnostik. Hal ini sering terlihat ketika mencoba mengembangkan kode agnostik database misalnya, sehingga tidak memanfaatkan fitur yang disediakan oleh mesin database sebagai penyebut yang paling umum harus digunakan.

Dasar dari ikatan-ikatan bermuara pada pemberitahuan; pemberitahuan bahwa ada yang berubah. Ini umumnya dapat ditangani melalui pola mempublikasikan / berlangganan yang menurut bahasa definisi agnostik.


1
2017-12-28 15:11