Rumah hujung hadapan web tutorial js Gunakan C/C untuk melaksanakan modul Node.js (1)_node.js

Gunakan C/C untuk melaksanakan modul Node.js (1)_node.js

May 16, 2016 pm 04:35 PM
c c++ node.js modul

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:

Salin kod Kod adalah seperti berikut:

$ 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:

Salin kod Kod adalah seperti berikut:

#include
#include
menggunakan ruang nama v8;

Fungsi utama

Seterusnya kita menulis fungsi yang nilai pulangannya ialah Handle.

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
//... 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:

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
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?

Salin kod Kod adalah seperti berikut:

Mengendalikan Hello(Const Arguments& args)
{
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 Value)! Tujuan fungsi ini adalah untuk menutup Skop ini dan memindahkan parameter di dalam Skop sebelumnya untuk pengurusan, iaitu Skop sebelum memasuki fungsi ini.

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?

Salin kod Kod adalah seperti berikut:

exports.hello = function() {}

Jadi, bagaimana kita melakukan ini dalam C?

Fungsi permulaan

Mula-mula, kita tulis fungsi permulaan:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
//...Saya sedang menunggu untuk menulis tentang adik awak! #゚Å゚)⊂彡☆))゚Д゚)・∵
}

Ini adalah punggung penyu! Tidak kira apa nama fungsinya, tetapi parameter yang dihantar mestilah Pemegang, yang bermaksud kami akan mengeksport sesuatu pada produk ini seterusnya.

Kemudian, kami menulis bahan yang dieksport di sini:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
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:

Salin kod Kod adalah seperti berikut:

void init(Mengendalikan eksport)
{
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:

Salin kod Kod adalah seperti berikut:

void Initialize (Kendalikan eksport);
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:

Salin kod Kod adalah seperti berikut:

{
"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:

Salin kod Kod adalah seperti berikut:

$ 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:

Salin kod Kod adalah seperti berikut:

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 Hello(const Arguments& args) yang kami tulis dalam kod C sebelum ini, dan kini kami telah mengeluarkan nilai yang dipulangkan.

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゚ロ゚)┌┛Σ(ノ´ω`)ノ

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan Corak Reka Bentuk Strategi dalam C++? Bagaimana untuk melaksanakan Corak Reka Bentuk Strategi dalam C++? Jun 06, 2024 pm 04:16 PM

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.

Bagaimana untuk menggunakan warisan templat C++? Bagaimana untuk menggunakan warisan templat C++? Jun 06, 2024 am 10:33 AM

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.

Mengapa ralat berlaku semasa memasang pelanjutan menggunakan PECL dalam persekitaran Docker? Bagaimana menyelesaikannya? Mengapa ralat berlaku semasa memasang pelanjutan menggunakan PECL dalam persekitaran Docker? Bagaimana menyelesaikannya? Apr 01, 2025 pm 03:06 PM

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

Bagaimana untuk mengendalikan pengecualian C++ silang silang? Bagaimana untuk mengendalikan pengecualian C++ silang silang? Jun 06, 2024 am 10:44 AM

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.

Apakah peranan char dalam c strings Apakah peranan char dalam c strings Apr 03, 2025 pm 03:15 PM

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.

Bagaimanakah pengurusan memori C++ mengoptimumkan penggunaan memori? Bagaimanakah pengurusan memori C++ mengoptimumkan penggunaan memori? Jun 05, 2024 pm 10:41 PM

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.

Empat cara untuk melaksanakan multithreading dalam bahasa c Empat cara untuk melaksanakan multithreading dalam bahasa c Apr 03, 2025 pm 03:00 PM

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.

Bagaimanakah ungkapan C++ Lambda meningkatkan prestasi? Bagaimanakah ungkapan C++ Lambda meningkatkan prestasi? Jun 06, 2024 am 11:35 AM

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.

See all articles