Jebakan dari N dulu - menggunakan Node.js untuk merekonstruksi juri online NBUT, termasuk sisi evaluasi, juga perlu direkonstruksi. (Sedikit untuk saat selesai, jangan peduli, (/д ′)/~
Singkatnya, apa yang akan kita lakukan sekarang adalah menggunakan C/C ++ untuk mengimplementasikan modul Node.js.
Persiapan
Jika Anda ingin melakukan sesuatu dengan baik, Anda harus bertingkah seperti gangster dan mempertajam alat Anda.
node-gyp
Pertama, Anda memerlukan modul Node-Gyp.
Di sudut mana pun, jalankan:
Salinan kode adalah sebagai berikut:
$ npm instal node -gyp -g
Setelah serangkaian blaBlahs, Anda telah menginstalnya.
Python
Maka Anda perlu memiliki lingkungan Python.
Buka situs web resmi dan dapatkan satu.
Catatan: Menurut tampilan GitHub Node-Gyp, pastikan untuk memastikan bahwa versi Python Anda adalah antara 2.5.0 dan 3.0.0.
Lingkungan kompilasi
Yah, saya hanya malas dan tidak menulisnya secara detail. Harap pindah ke Node-Gyp untuk melihat kebutuhan kompiler. Dan membuat keributan.
Memulai
Saya akan memberi tahu Anda tentang pengantar situs web resmi Hello World.
Halo dunia
Harap persiapkan file C ++, misalnya, itu disebut ~~ SB.CC ~~ Hello.cc.
Kemudian kami akan mengambil langkah demi langkah, pertama -tama buat file header dan tentukan namespace:
Salinan kode adalah sebagai berikut:
#include <node.h>
#include <v8.h>
menggunakan namespace v8;
Fungsi utama
Selanjutnya kita menulis fungsi yang nilai pengembaliannya ditangani <value>.
Salinan kode adalah sebagai berikut:
Tangani <value> halo (argumen & args const)
{
// ... lapar untuk ditulis
}
Kemudian saya akan menganalisis hal -hal ini secara kasar:
Menangani <value>
Anda harus jujur dalam hidup. Saya menyatakan sebelumnya bahwa saya merujuknya dari sini (@fool).
V8 menggunakan tipe pegangan untuk meng -host objek JavaScript. Mirip dengan C ++'s Std :: SharedPointer, penugasan antara tipe pegangan secara langsung dilewatkan referensi objek, tetapi perbedaannya adalah bahwa V8 menggunakan GC sendiri untuk mengelola siklus hidup objek, daripada jumlah referensi yang biasa digunakan oleh pointer pintar.
Jenis JavaScript memiliki tipe kustom yang sesuai di C ++, seperti string, integer, objek, tanggal, array, dll., Dan benar -benar mematuhi hubungan warisan dalam JavaScript. Saat menggunakan tipe ini di C ++, Anda harus menggunakan hosting pegangan untuk menggunakan GC untuk mengelola siklus hidup mereka tanpa menggunakan tumpukan dan tumpukan asli.
Nilai yang disebut ini, yang dapat dilihat dari berbagai hubungan warisan dalam file header V8.h dari mesin V8, sebenarnya merupakan kelas dasar dari berbagai objek dalam JavaScript.
Setelah memahami hal ini, kita dapat secara kasar memahami arti dari pernyataan fungsi di atas, yang berarti bahwa kita menulis fungsi Hello, yang mengembalikan nilai dari tipe yang tidak pasti.
Catatan: Kami hanya dapat mengembalikan jenis tertentu, yaitu string, integer, dll. Di bawah hosting pegangan.
Argumen
Ini adalah parameter untuk lulus dalam fungsi ini. Kita semua tahu bahwa di Node.js, jumlah parameter itu acak. Ketika parameter ini diteruskan ke C ++, mereka dikonversi menjadi objek tipe argumen.
Mari kita bicara tentang penggunaan spesifik nanti. Di sini kita hanya perlu memahami apa ini. (Agar merah
Tambahkan batu bata dan ubin
Selanjutnya kita mulai berkontribusi. Hanya kalimat paling sederhana:
Salinan kode adalah sebagai berikut:
Tangani <value> halo (argumen & args const)
{
Ruang lingkup pegangan;
return scope.close (string :: new ("world"));
}
Apa arti dua kalimat ini? Makna umum adalah mengembalikan "dunia" string di Node.js.
Handlescope
Referensi yang sama dari sini.
Siklus hidup pegangan berbeda dari pointer pintar C ++. Itu tidak bertahan dalam lingkup semantik C ++ (yaitu, bagian yang dikelilingi oleh {}), tetapi perlu ditentukan secara manual melalui handlescope. Handlescope hanya dapat dialokasikan di tumpukan. Setelah objek Handlescope dinyatakan, pegangan yang dibuat kemudian dikelola oleh Handlescope. Setelah objek Handlescope dirusak, pegangan yang dikelola olehnya akan ditentukan oleh GC.
Jadi, kita harus menyatakan ruang lingkup ini ketika kita perlu mengelola siklus hidupnya. Oke, jadi mengapa kode kita tidak ditulis seperti ini?
Salinan kode adalah sebagai berikut:
Tangani <value> halo (argumen & args const)
{
Ruang lingkup pegangan;
return string :: new ("world");
}
Karena ketika fungsi kembali, ruang lingkup akan dihancurkan dan pegangan yang dikelola akan didaur ulang, jadi string ini akan menjadi tidak berarti.
Jadi V8 muncul dengan ide ajaib - fungsi pegangan :: tutup (menangani nilai <T>) Fungsi! Tujuan dari fungsi ini adalah untuk menutup ruang lingkup dan menyerahkan parameter di dalam ke manajemen ruang lingkup sebelumnya, yaitu ruang lingkup sebelum memasuki fungsi ini.
Jadi kami memiliki skope kode sebelumnya. CLOSE (String :: new ("world"));.
String :: Baru
Kelas string sesuai dengan kelas string asli di node.js. Diwarisi dari kelas nilai. Demikian pula, ada:
• Array
•Bilangan bulat
• Boolean
•Obyek
•Tanggal
•Nomor
•Fungsi
• ...
Beberapa dari hal -hal ini diwarisi dari nilai, sementara yang lain diwarisi dari sekunder. Kami tidak akan melakukan banyak penelitian di sini. Anda dapat melihat kode V8 (setidaknya file header) atau melihat manual ini.
Dan bagaimana dengan ini yang baru? Anda bisa melihatnya di sini. Itu untuk membuat objek string baru.
Pada titik ini, kami telah menyelesaikan parsing fungsi utama ini.
Objek Ekspor
Mari kita tinjau. Jika ditulis dalam node.js, bagaimana kita mengekspor fungsi atau objek?
Salinan kode adalah sebagai berikut:
exports.hello = function () {}
Jadi, bagaimana kita bisa melakukan ini di C ++?
Inisialisasi fungsi
Pertama, mari kita tulis fungsi inisialisasi:
Salinan kode adalah sebagai berikut:
void init (handle <bes Object> Ekspor)
{
// ... Aku lapar menulis tentang adikmu! #゚ Å ゚) ⊂ち☆)) ゚ д ゚) ・∵
}
Ini adalah keledai kura -kura! Tidak masalah jika nama fungsi atau semacamnya, tetapi parameter yang diteruskan harus menjadi pegangan <Peject>, yang berarti bahwa kita akan mengekspor barang -barang dari produk ini di bawah ini.
Kemudian, kami menulis hal yang diekspor di sini:
Salinan kode adalah sebagai berikut:
void init (handle <bes Object> Ekspor)
{
ekspor-> set (string :: newsymbol ("hello"),
FunctionTemplate :: baru (halo)-> getFunction ());
}
Makna umum adalah menambahkan bidang yang disebut hello ke objek ekspor ini, dan hal yang sesuai adalah fungsi, dan fungsi ini adalah fungsi hello sayang kami.
Untuk menulis poin sederhana dalam pseudo-code:
Salinan kode adalah sebagai berikut:
void init (handle <bes Object> Ekspor)
{
Exports.set ("Halo", Fungsi Halo);
}
Pekerjaan selesai!
(Kakakmu sudah selesai! Diam ('д'⊂☡☆)) д))
Ekspor Sejati
Ini adalah langkah terakhir, dan kami akhirnya akan menyatakan bahwa ini adalah pintu masuk ke ekspor, jadi kami menambahkan baris ini di akhir kode:
Node_module (halo, init)
Apakah Anda sudah mengambil Ni? Lai Apa ini?
Jangan khawatir, node_module ini adalah makro, yang berarti bahwa kami menggunakan fungsi inisialisasi init untuk mengekspor hal -hal yang akan diekspor ke halo. Jadi darimana ini Hello berasal?
Itu berasal dari nama file! Ya, ya, itu berasal dari nama file. Anda tidak perlu menyatakannya sebelumnya, dan Anda tidak perlu khawatir tidak dapat menggunakannya. Singkatnya, apa nama file biner yang dikompilasi akhir Anda? Anda akan mengisi halo di sini, dan tentu saja Anda harus menghapus nama akhiran.
Lihat dokumentasi resmi untuk detailnya.
Perhatikan bahwa semua node yang ditambahkan harus mengekspor fungsi inisialisasi:
Salinan kode adalah sebagai berikut:
void initialize (handle <boject> Ekspor);
Node_module (module_name, inisialisasi)
Tidak ada semi-kolon setelah node_module karena bukan fungsi (lihat node.h).
MODULE_NAME perlu cocok dengan nama file biner akhir (minus akhiran .node).
Kompilasi (๑ • ́ ₃ • ̀๑)
Ayo, mari kita kompilasi bersama!
Mari kita buat file arsip baru yang mirip dengan makefile - binding.gyp.
Dan tambahkan kode seperti ini:
Salinan kode adalah sebagai berikut:
{
"Target": [
{
"target_name": "halo",
"Sumber": ["hello.cc"]
}
]
}
Mengapa Menulis Ini? Anda dapat merujuk pada dokumentasi resmi Node-Gyp.
Konfigurasikan
Setelah file siap, kita perlu menjalankan perintah ini di direktori ini:
Salinan kode adalah sebagai berikut:
$ Node-GYP Mengkonfigurasi
Jika semuanya baik -baik saja, direktori build harus dihasilkan, dan kemudian ada file terkait di dalamnya, mungkin M $ Visual Studio VCXProj File, dll., Atau mungkin Makefile, tergantung pada platform.
membangun
Setelah Makefile dihasilkan, kami mulai membangun dan menyusun:
$ node-gyp build
Hanya ketika semuanya dikompilasi akan dipertimbangkan bahwa tugas sebenarnya selesai! Jika Anda tidak percaya, pergi dan periksa direktori build/rilis. Apakah ada file hello.node di bawah ini? Benar, ini adalah sabun yang ingin diambil C ++ untuk node.js nanti!
Mari kita dapatkan dasar -dasarnya! Node (✿゚゚) ノ C ++
Kami membuat file baru jianfeizao.js di direktori sekarang:
Salinan kode adalah sebagai berikut:
var addon = membutuhkan ("./ Build/Release/Hello");
console.log (addon.hello ());
Lihat atau tidak! Lihat atau tidak! Keluar! Hasil Node.js dan C ++ Mendapatkan Dasar! Addon.hello () ini adalah pegangan <Value> halo (Const Arguments & Args) yang kami tulis dalam kode C ++ sebelumnya, dan kami sekarang telah menghasilkan nilai yang dikembalikan.
Mandi dan pergi tidur, dan bagian selanjutnya lebih dalam
Sudah larut, jadi saya akan akhirnya menulis hari ini. Sejauh ini, semua orang dapat menghasilkan ekstensi Hello World C ++ paling mendasar. Lain kali saya menulisnya, saya tidak tahu kapan waktu berikutnya.
(Hei, hei, bagaimana sang master bisa begitu tidak bertanggung jawab! (O ゚ロ?) ┌┛σ (ノ ´ω`) ノ