Perangkap yang berlaku lama dahulu - menggunakan Node.js untuk membina semula Hakim Dalam Talian NBUT, termasuk bahagian penilaian, juga terpaksa dibina semula. (Apabila ia akan selesai, jangan risau, (/ Д′)/~ ╧╧
Ringkasnya, apa yang perlu kita lakukan sekarang ialah menggunakan C/C untuk melaksanakan modul Node.js.
Persediaan
Jika seorang pekerja ingin menjalankan tugasnya dengan baik, dia mesti terlebih dahulu~~bermain penyangak~~ dan mengasah alatannya.
nod-gip
Mula-mula anda memerlukan modul nod-gyp.
Di mana-mana sudut, laksanakan:
Selepas beberapa siri blahblah, anda dipasang.
Python
Maka anda memerlukan persekitaran ular sawa.
Pergi ke tapak web rasmi untuk mendapatkannya sendiri.
Nota: Menurut GitHub node-gyp, sila pastikan versi python anda adalah antara 2.5.0 dan 3.0.0.
Persekitaran kompilasi
Nah, saya terlalu malas untuk menulisnya secara terperinci. Sila pergi ke node-gyp untuk melihat keperluan pengkompil. Dan tuangkan dengan baik.
Bermula
Izinkan saya bercakap tentang pengenalan Hello World di laman web rasmi.
Helo Dunia
Sila sediakan fail C, sebagai contoh, panggil ia ~~sb.cc~~ hello.cc.
Kemudian mari kita pergi langkah demi langkah, mula-mula buat fail pengepala dan tentukan ruang nama:
Fungsi utama
Seterusnya kita menulis fungsi yang nilai pulangannya ialah Handle
Kemudian izinkan saya menganalisis secara ringkas perkara ini:
Kendalikan
Anda mesti mempunyai integriti sebagai seorang manusia, saya ingin menyatakan terlebih dahulu bahawa saya merujuknya dari sini (@fool).
V8 menggunakan jenis Handle untuk mengehoskan objek JavaScript Sama seperti std::sharedpointer C, tugasan antara jenis Handle secara langsung lulus rujukan objek, tetapi perbezaannya ialah V8 menggunakan GCnya sendiri untuk mengurus kitaran hayat objek, dan bukannya rujukan pintar yang biasa digunakan. mengira untuk penunjuk.
Jenis JavaScript mempunyai jenis tersuai yang sepadan dalam C, seperti String, Integer, Object, Date, Array, dsb., yang mematuhi perhubungan warisan dalam JavaScript. Apabila menggunakan jenis ini dalam C, anda mesti menggunakan pengurusan Handle untuk menggunakan GC untuk mengurus kitaran hayatnya dan bukannya menggunakan tindanan dan timbunan asli.
Nilai yang dipanggil ini boleh dilihat daripada pelbagai hubungan warisan dalam fail pengepala v8.h enjin V8 Ia sebenarnya adalah kelas asas pelbagai objek dalam JavaScript.
Selepas memahami perkara ini, kita boleh memahami secara kasar maksud pengisytiharan fungsi di atas, iaitu kita menulis fungsi Hello yang mengembalikan nilai jenis tidak tentu.
Nota: Kami hanya boleh mengembalikan jenis tertentu, iaitu String, Integer, dsb. di bawah pengurusan Handle.
Hujah
Ini ialah parameter yang dihantar ke dalam fungsi ini. Kita semua tahu bahawa dalam Node.js, bilangan parameter adalah rawak. Apabila parameter ini dihantar ke C, ia ditukar menjadi objek jenis Argumen ini.
Kami akan bercakap tentang penggunaan khusus kemudian, di sini anda hanya perlu memahami apa ini. (Mengapa anda begitu kritikal? Kerana contoh dalam dokumentasi rasmi Node.js dibincangkan secara berasingan. Saya hanya bercakap tentang contoh Hello World yang pertama sekarang (´థ౪థ)σ
Sumbangan
Kemudian kami mula menambah bata dan jubin. Hanya dua ayat mudah:
Apakah maksud kedua-dua ayat ini? Maksud kasarnya ialah mengembalikan rentetan "dunia" dalam Node.js.
Skop Pemegang
Rujukan yang sama datang dari sini.
Kitaran hayat Handle berbeza daripada penunjuk pintar C Ia tidak wujud dalam skop semantik C (iaitu, bahagian yang dikelilingi oleh {}), tetapi perlu ditentukan secara manual melalui HandleScope. HandleScope hanya boleh diperuntukkan pada tindanan Selepas objek HandleScope diisytiharkan, kitaran hayat Handle yang dibuat kemudiannya diuruskan oleh HandleScope Selepas objek HandleScope dimusnahkan, Handle yang diuruskan olehnya akan dinilai oleh GC sama ada untuk menjadi. dikitar semula.
Jadi, kita perlu mengisytiharkan Skop ini apabila kita perlu menguruskan kitaran hayatnya. Okay, jadi kenapa kod kami tidak kelihatan seperti ini?
Kerana apabila fungsi itu kembali, skop akan dimusnahkan dan Pemegang yang diurusnya juga akan dikitar semula, jadi String ini akan menjadi tidak bermakna.
Jadi V8 menghasilkan idea ajaib - fungsi HandleScope::Close(Handle
Jadi terdapat skop kod kami yang terdahulu.Close(String::New("world"));.
String::Baharu
Kelas String ini sepadan dengan kelas rentetan asli dalam Node.js. Diwarisi daripada kelas Nilai. Sama seperti ini, terdapat juga:
•Susunatur
•Integer
•Boolean
•Objek
•Tarikh
•Nombor
•Fungsi
•...
Sesetengah perkara ini diwarisi daripada Nilai, dan ada yang diwarisi dua kali. Kami tidak akan melakukan banyak penyelidikan di sini Anda boleh melihat kod V8 (sekurang-kurangnya fail pengepala) atau membaca manual ini.
Dan bagaimana pula dengan Baharu ini? Anda boleh melihatnya di sini. Hanya buat objek String baharu.
Pada ketika ini, kami telah menyelesaikan analisis fungsi utama ini.
Eksport objek
Mari kita semaknya Jika kita menulisnya dalam Node.js, bagaimanakah kita mengeksport fungsi atau objek?
Jadi, bagaimana kita melakukan ini dalam C?
Fungsi permulaan
Mula-mula, kita tulis fungsi permulaan:
Ini adalah punggung penyu! Tidak kira apa nama fungsinya, tetapi parameter yang dihantar mestilah Pemegang
Kemudian, kami menulis bahan yang dieksport di sini:
Maksud umum ialah, tambahkan medan yang dipanggil hello pada objek eksport ini, dan perkara yang sepadan ialah fungsi, dan fungsi ini ialah fungsi Hello sayang kami.
Untuk meletakkannya dengan jelas dalam kod pseudo:
Selesai!
(Selesai, kakak! Diam (‘д‘⊂彡☆))Д´)
Benar·Eksport
Ini adalah langkah terakhir Kami perlu mengisytiharkan bahawa ini adalah pintu masuk ke eksport, jadi kami menambah baris ini di penghujung kod:
NODE_MODULE(hello, init)
Adakah anda membayar seorang nenny? ! Apa ini?
Jangan risau, NODE_MODULE ini ialah makro, yang bermaksud kami menggunakan fungsi inisialisasi init untuk mengeksport perkara yang akan dieksport ke hello. Jadi dari mana datangnya salam ini?
Ia berasal daripada nama fail! Ya, betul, ia berasal dari nama fail. Anda tidak perlu mengisytiharkannya terlebih dahulu, dan anda tidak perlu risau tentang tidak dapat menggunakannya Secara ringkasnya, apa sahaja nama fail binari yang dikompilasi akhir anda, isikan sahaja hello di sini, kecuali akhiran sudah tentu.
Lihat dokumentasi rasmi untuk butiran.
Ambil perhatian bahawa semua tambahan Node mesti mengeksport fungsi permulaan:
Tiada koma bertindih selepas NODE_MODULE kerana ia bukan fungsi (lihat node.h).
Nama_modul perlu sepadan dengan nama fail perduaan akhir (tolak akhiran .nod).
Susun (๑•́ ₃ •̀๑)
Ayuh, mari kita susun bersama-sama!
Mari buat fail arkib baharu yang serupa dengan Makefile - binding.gyp.
Dan tambah kod ini di dalam:
Mengapa anda menulisnya seperti ini? Anda boleh merujuk kepada dokumentasi rasmi node-gyp.
konfigurasikan
Selepas fail siap, kita perlu melaksanakan arahan ini dalam direktori ini:
Jika semuanya normal, direktori binaan harus dijana, dan akan ada fail berkaitan di dalamnya, mungkin fail vcxproj M$ Visual Studio, dsb., mungkin Makefile, bergantung pada platform.
bina
Selepas Makefile dijana, kami mula membina dan menyusun:
$ binaan nod-gyp
Apabila semuanya disusun, ia benar-benar selesai! Jika anda tidak percaya saya, lihat direktori binaan/Keluaran Adakah terdapat fail hello.node di bawah? Ya, inilah sabun yang C akan ambil untuk Node.js nanti!
Ambil gay! Nod ヽ(✿゚▽゚)ノ C
Kami mencipta fail baharu jianfeizao.js dalam direktori tadi:
Adakah anda melihatnya? Adakah anda melihatnya? Dah keluar, dah keluar! Hasil daripada Node.js dan C menjadi radikal! Addon.hello() ini ialah Handle
Tidur, bahagian seterusnya akan lebih mendalam
Hari sudah lewat, jadi itu sahaja untuk hari ini Semua orang boleh mencipta sambungan C paling asas bagi dunia Hello. Kali seterusnya saya menulis ia harus lebih mendalam. Mengenai bila kali seterusnya, saya sebenarnya tidak tahu.
(Hei, hey, hey, bagaimana seorang melancap boleh jadi tidak bertanggungjawab! (o゚ロ゚)┌┛Σ(ノ´ω`)ノ