cari
Rumahhujung hadapan webtutorial jsGunakan 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:

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
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
Python vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanPython vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanApr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python vs JavaScript: Komuniti, Perpustakaan, dan SumberPython vs JavaScript: Komuniti, Perpustakaan, dan SumberApr 15, 2025 am 12:16 AM

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Dari C/C ke JavaScript: Bagaimana semuanya berfungsiDari C/C ke JavaScript: Bagaimana semuanya berfungsiApr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript: Membandingkan PelaksanaanEnjin JavaScript: Membandingkan PelaksanaanApr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Membina aplikasi SaaS Multi-penyewa dengan Next.js (Integrasi Backend)Apr 11, 2025 am 08:23 AM

Saya membina aplikasi SaaS multi-penyewa berfungsi (aplikasi edTech) dengan alat teknologi harian anda dan anda boleh melakukan perkara yang sama. Pertama, apakah aplikasi SaaS multi-penyewa? Aplikasi SaaS Multi-penyewa membolehkan anda melayani beberapa pelanggan dari Sing

Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Cara Membina Aplikasi SaaS Multi-Tenant dengan Next.js (Integrasi Frontend)Apr 11, 2025 am 08:22 AM

Artikel ini menunjukkan integrasi frontend dengan backend yang dijamin oleh permit, membina aplikasi edtech SaaS yang berfungsi menggunakan Next.Js. Frontend mengambil kebenaran pengguna untuk mengawal penglihatan UI dan memastikan permintaan API mematuhi dasar peranan

JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

See all articles

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)
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.