Gunakan C/C untuk melaksanakan modul Node.js (1)_node.js
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:
$ npm pasang node-gyp -g
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:
#include
#include
menggunakan ruang nama v8;
Fungsi utama
Seterusnya kita menulis fungsi yang nilai pulangannya ialah Handle
Mengendalikan
{
//... Menunggu untuk ditulis
}
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:
Mengendalikan
{
Skop HandleScope;
Kembalikan skop.Close(String::New("world"));
}
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?
Mengendalikan
{
Skop HandleScope;
Return String::New("world");
}
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?
exports.hello = function() {}
Jadi, bagaimana kita melakukan ini dalam C?
Fungsi permulaan
Mula-mula, kita tulis fungsi permulaan:
void init(Mengendalikan
{
//...Saya sedang menunggu untuk menulis tentang adik awak! #゚Å゚)⊂彡☆))゚Д゚)・∵
}
Ini adalah punggung penyu! Tidak kira apa nama fungsinya, tetapi parameter yang dihantar mestilah Pemegang
Kemudian, kami menulis bahan yang dieksport di sini:
void init(Mengendalikan
{
eksport->Set(String::NewSymbol("hello"),
FunctionTemplate::New(Hello)->GetFunction());
}
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:
void init(Mengendalikan
{
exports.Set("hello", function hello);
}
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:
void Initialize (Kendalikan
NODE_MODULE(module_name, Initialize)
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:
{
"sasaran": [
{
"target_name": "hello",
"sumber": [ "hello.cc" ]
}
]
}
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:
$ nod-gyp configure
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:
var addon = memerlukan("./build/Release/hello");
console.log(addon.hello());
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゚ロ゚)┌┛Σ(ノ´ω`)ノ

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Langkah-langkah untuk melaksanakan corak strategi dalam C++ adalah seperti berikut: tentukan antara muka strategi dan isytiharkan kaedah yang perlu dilaksanakan. Buat kelas strategi khusus, laksanakan antara muka masing-masing dan sediakan algoritma yang berbeza. Gunakan kelas konteks untuk memegang rujukan kepada kelas strategi konkrit dan melaksanakan operasi melaluinya.

Warisan templat C++ membenarkan kelas terbitan templat menggunakan semula kod dan kefungsian templat kelas asas, yang sesuai untuk mencipta kelas dengan logik teras yang sama tetapi gelagat khusus yang berbeza. Sintaks warisan templat ialah: templateclassDerived:publicBase{}. Contoh: templateclassBase{};templateclassDerived:publicBase{};. Kes praktikal: Mencipta kelas terbitan Derived, mewarisi fungsi mengira Base kelas asas, dan menambah kaedah printCount untuk mencetak kiraan semasa.

Punca dan penyelesaian untuk kesilapan Apabila menggunakan PECL untuk memasang sambungan dalam persekitaran Docker Apabila menggunakan persekitaran Docker, kami sering menemui beberapa sakit kepala ...

Dalam C++ berbilang benang, pengendalian pengecualian dilaksanakan melalui mekanisme std::promise dan std::future: gunakan objek promise untuk merekodkan pengecualian dalam utas yang membuang pengecualian. Gunakan objek masa hadapan untuk menyemak pengecualian dalam urutan yang menerima pengecualian. Kes praktikal menunjukkan cara menggunakan janji dan niaga hadapan untuk menangkap dan mengendalikan pengecualian dalam urutan yang berbeza.

Dalam C, jenis char digunakan dalam rentetan: 1. Simpan satu watak; 2. Gunakan array untuk mewakili rentetan dan berakhir dengan terminator null; 3. Beroperasi melalui fungsi operasi rentetan; 4. Baca atau output rentetan dari papan kekunci.

Teknik pengoptimuman untuk pengurusan memori C++ termasuk: menggunakan penunjuk pintar (RAII), mengurangkan peruntukan yang kerap, mengelakkan salinan yang tidak perlu, menggunakan API peringkat rendah (dengan berhati-hati), dan menganalisis penggunaan memori. Melalui teknik ini, seperti menggunakan penunjuk pintar dan caching dalam aplikasi pemprosesan imej, penggunaan memori dan prestasi boleh dioptimumkan dengan ketara.

Multithreading dalam bahasa dapat meningkatkan kecekapan program. Terdapat empat cara utama untuk melaksanakan multithreading dalam bahasa C: Buat proses bebas: Buat pelbagai proses berjalan secara bebas, setiap proses mempunyai ruang ingatan sendiri. Pseudo-Multithreading: Buat pelbagai aliran pelaksanaan dalam proses yang berkongsi ruang memori yang sama dan laksanakan secara bergantian. Perpustakaan multi-threaded: Gunakan perpustakaan berbilang threaded seperti PTHREADS untuk membuat dan mengurus benang, menyediakan fungsi operasi benang yang kaya. Coroutine: Pelaksanaan pelbagai threaded ringan yang membahagikan tugas menjadi subtask kecil dan melaksanakannya pada gilirannya.

Ya, ungkapan Lambda boleh meningkatkan prestasi C++ dengan ketara kerana ia membenarkan fungsi diluluskan sebagai pembolehubah dan menghapuskan overhed panggilan fungsi melalui pembukaan talian sebaris, seperti: Pengoptimuman buka gulungan sebaris: memasukkan kod terus ke lokasi panggilan, menghapuskan overhed panggilan fungsi . Fungsi ringan: Ekspresi Lambda biasanya lebih ringan daripada fungsi biasa, seterusnya mengurangkan overhed. Contoh praktikal: Dalam algoritma pengisihan, ungkapan Lambda menghapuskan panggilan fungsi perbandingan dan meningkatkan prestasi. Senario penggunaan lain: sebagai fungsi panggil balik, penapisan data dan pemudahan kod. Kaveat: Tangkap pembolehubah dengan berhati-hati, pertimbangkan penggunaan memori dan elakkan penggunaan berlebihan untuk mengekalkan kebolehbacaan.
