Heim Web-Frontend js-Tutorial Verwenden Sie C/C, um Node.js-Module (1)_node.js zu implementieren

Verwenden Sie C/C, um Node.js-Module (1)_node.js zu implementieren

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

Ein vor langer Zeit aufgetretener Fallstrick – die Verwendung von Node.js zur Rekonstruktion des Online-Richters von NBUT, einschließlich der Bewertungsseite, musste ebenfalls rekonstruiert werden. (Machen Sie sich keine Sorgen darüber, wann es abgeschlossen sein wird, (/‵Д′)/~ ╧╧

Kurz gesagt, was wir jetzt tun müssen, ist tatsächlich C/C zu verwenden, um das Node.js-Modul zu implementieren.

Vorbereitung

Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst ~~einen Schurken spielen~~ und seine Werkzeuge schärfen.

node-gyp

Zuerst benötigen Sie ein Node-Gyp-Modul.

Führen Sie an einer beliebigen Ecke Folgendes aus:

Code kopieren Der Code lautet wie folgt:

$ npm install node-gyp -g

Nach einer Reihe von Blablas sind Sie installiert.

Python

 Dann benötigen Sie eine Python-Umgebung.

Gehen Sie auf die offizielle Website, um sich selbst eins zu besorgen.


Hinweis: Laut GitHub von node-gyp stellen Sie bitte sicher, dass Ihre Python-Version zwischen 2.5.0 und 3.0.0 liegt.

Kompilierungsumgebung

Nun, ich bin einfach zu faul, es im Detail aufzuschreiben. Bitte gehen Sie zu Node-Gyp, um die Compiler-Anforderungen zu sehen. Und gut einschenken.

Erste Schritte

Lassen Sie mich kurz auf die Einführung „Hello World“ auf der offiziellen Website eingehen.

Hallo Welt

Bitte bereiten Sie eine C-Datei vor, nennen Sie sie beispielsweise ~~sb.cc~~ hello.cc.

Dann gehen wir Schritt für Schritt vor, erstellen zunächst die Header-Datei und definieren den Namespace:

Code kopieren Der Code lautet wie folgt:

#include
#include
unter Verwendung des Namespace v8;

Hauptfunktion

Als nächstes schreiben wir eine Funktion, deren Rückgabewert Handle ist.

Code kopieren Der Code lautet wie folgt:

Handle Hello(const Arguments& args)
{
//... Warte darauf, geschrieben zu werden
}

Dann lassen Sie mich diese Dinge kurz analysieren:

Handle

Man muss als Mensch Integrität haben. Ich möchte vorab sagen, dass ich mich hierauf beziehe (@fool).


V8 verwendet den Handle-Typ zum Hosten von JavaScript-Objekten. Ähnlich wie bei Cs std::sharedpointer übergeben Zuweisungen zwischen Handle-Typen Objektreferenzen direkt. Der Unterschied besteht jedoch darin, dass V8 einen eigenen GC verwendet, um den Objektlebenszyklus zu verwalten, und nicht intelligente, häufig verwendete Referenzen Zählen für Zeiger.

JavaScript-Typen verfügen in C über entsprechende benutzerdefinierte Typen wie String, Integer, Object, Date, Array usw., die sich strikt an die Vererbungsbeziehung in JavaScript halten. Wenn Sie diese Typen in C verwenden, müssen Sie die Handle-Verwaltung verwenden, um den GC zur Verwaltung ihres Lebenszyklus zu verwenden, anstatt den nativen Stack und Heap zu verwenden.

Dieser sogenannte Wert ist aus den verschiedenen Vererbungsbeziehungen in der Header-Datei v8.h der V8-Engine ersichtlich. Es handelt sich tatsächlich um die Basisklasse verschiedener Objekte in JavaScript.

Nachdem wir dies verstanden haben, können wir die Bedeutung der obigen Funktionsdeklaration grob verstehen, nämlich dass wir eine Hello-Funktion schreiben, die einen unbestimmten Typwert zurückgibt.


Hinweis: Unter der Handle-Verwaltung können wir nur bestimmte Typen zurückgeben, nämlich String, Integer usw.

Argumente

Dies ist der Parameter, der an diese Funktion übergeben wird. Wir alle wissen, dass in Node.js die Anzahl der Parameter zufällig ist. Wenn diese Parameter an C übergeben werden, werden sie in Objekte dieses Argumenttyps konvertiert.

Wir werden später über die spezifische Verwendung sprechen. Hier müssen Sie nur verstehen, was das ist. (Warum sind Sie so kritisch? Weil die Beispiele in der offiziellen Node.js-Dokumentation separat besprochen werden. Ich spreche jetzt nur vom ersten Hello World-Beispiel (´థ౪థ)σ

Beitrag

Dann begannen wir mit dem Hinzufügen von Ziegeln und Fliesen. Nur zwei einfache Sätze:

Code kopieren Der Code lautet wie folgt:

Handle Hello(const Arguments& args)
{
HandleScope-Bereich;
Gibt Scope.Close(String::New("world"));
zurück }

Was bedeuten diese beiden Sätze? Die grobe Bedeutung besteht darin, eine Zeichenfolge „world“ in Node.js zurückzugeben.

HandleScope

Der gleiche Hinweis stammt von hier.


Der Lebenszyklus von Handle unterscheidet sich von dem von C-Smart-Pointern. Er existiert nicht im Rahmen der C-Semantik (dh des von {} umgebenen Teils), sondern muss manuell über HandleScope angegeben werden. HandleScope kann nur auf dem Stapel zugewiesen werden, nachdem das HandleScope-Objekt deklariert wurde. Der Lebenszyklus des anschließend erstellten Handles wird von HandleScope verwaltet. Nach der Zerstörung des HandleScope-Objekts wird vom GC beurteilt, ob dies der Fall ist recycelt.

Wir müssen diesen Bereich also deklarieren, wenn wir seinen Lebenszyklus verwalten müssen. Okay, warum sieht unser Code nicht so aus?

Code kopieren Der Code lautet wie folgt:

Handle Hello(const Arguments& args)
{
HandleScope-Bereich;
Rückgabezeichenfolge::New("world");
}

Denn wenn die Funktion zurückkehrt, wird der Bereich zerstört und die von ihr verwalteten Handles werden ebenfalls recycelt, sodass dieser String bedeutungslos wird.

Also hatte V8 eine magische Idee – die Funktion HandleScope::Close(Handle Value)! Der Zweck dieser Funktion besteht darin, diesen Bereich zu schließen und die darin enthaltenen Parameter zur Verwaltung an den vorherigen Bereich zu übertragen, dh an den Bereich, bevor diese Funktion aufgerufen wird.

Da ist also unser bisheriger Code-Bereich.Close(String::New("world"));.

String::New

 Diese String-Klasse entspricht der nativen String-Klasse in Node.js. Von der Value-Klasse geerbt. Ähnlich gibt es auch:

•Array
•Ganzzahl
•Boolean
•Objekt
•Datum
•Nummer
•Funktion
•...

Einige dieser Dinge werden von Value geerbt, andere werden doppelt geerbt. Wir werden hier nicht viel recherchieren. Sie können sich den V8-Code (zumindest die Header-Dateien) ansehen oder dieses Handbuch lesen.

Und was ist mit diesem Neuen? Sie können es hier sehen. Erstellen Sie einfach ein neues String-Objekt.

An diesem Punkt haben wir die Analyse dieser Hauptfunktion abgeschlossen.

Objekt exportieren

Sehen wir uns das noch einmal an. Wie exportieren wir Funktionen oder Objekte, wenn wir es in Node.js schreiben?

Code kopieren Der Code lautet wie folgt:

exports.hello = function() {}

Wie machen wir das also in C?

Initialisierungsfunktion

Zuerst schreiben wir eine Initialisierungsfunktion:

Code kopieren Der Code lautet wie folgt:

void init(Handle exports)
{
//...ich warte darauf, über deine Schwester zu schreiben! #゚Å゚)⊂彡☆))゚Д゚)・∵
}

Das ist der Schildkröten-Hintern! Es spielt keine Rolle, wie der Funktionsname lautet, aber der übergebene Parameter muss ein Handle sein, was bedeutet, dass wir als nächstes etwas für dieses Produkt exportieren werden.

Dann schreiben wir die exportierten Sachen hier:

Code kopieren Der Code lautet wie folgt:

void init(Handle exports)
{
exports->Set(String::NewSymbol("hello"),
FunctionTemplate::New(Hello)->GetFunction());
}

Die allgemeine Bedeutung besteht darin, dass diesem Exportobjekt ein Feld namens „Hallo“ hinzugefügt wird und das entsprechende Ding eine Funktion ist, und diese Funktion ist unsere liebe Hallo-Funktion.

Um es einfach in Pseudocode auszudrücken:

Code kopieren Der Code lautet wie folgt:

void init(Handle exports)
{
exports.Set("hello", Funktion hallo);
}

Fertig!

 (Es ist geschafft, Schwester! Halt die Klappe (‘д‘⊂彡☆))Д´)

True·Export

Dies ist der letzte Schritt. Wir müssen angeben, dass dies der Eingang zum Export ist, also fügen wir diese Zeile am Ende des Codes hinzu:
NODE_MODULE(Hallo, init)

Hast du einen Nenny bezahlt? ! Was ist das?

Keine Sorge, dieses NODE_MODULE ist ein Makro, was bedeutet, dass wir die zu exportierenden Dinge mit der Initialisierungsfunktion init nach Hallo exportieren. Woher kommt also dieses Hallo?

Es kommt vom Dateinamen! Ja, das stimmt, es kommt vom Dateinamen. Sie müssen es nicht im Voraus deklarieren und müssen sich keine Sorgen machen, dass Sie es nicht verwenden können. Kurz gesagt, wie auch immer der Name Ihrer endgültigen kompilierten Binärdatei lautet, geben Sie hier einfach das „Hallo“ ein, außer für das Suffix natürlich.

Einzelheiten finden Sie in der offiziellen Dokumentation.


Beachten Sie, dass alle Node-Add-ons eine Initialisierungsfunktion exportieren müssen:

Code kopieren Der Code lautet wie folgt:

void Initialize (Handle exports);
NODE_MODULE(Modulname, Initialisieren)

Nach NODE_MODULE steht kein Semikolon, da es sich nicht um eine Funktion handelt (siehe node.h).

Der Modulname muss mit dem Dateinamen der endgültigen Binärdatei übereinstimmen (abzüglich des Suffixes .node).

Kompilieren (๑•́ ₃ •̀๑)

Komm, lass es uns gemeinsam zusammenstellen!

Erstellen wir eine neue Archivdatei ähnlich Makefile – binding.gyp.

Und fügen Sie diesen Code ein:

Code kopieren Der Code lautet wie folgt:

{
„Ziele“: [
{
„target_name“: „Hallo“,
„Quellen“: [ „hello.cc“ ]
}
]
}

Warum schreibst du das so? Sie können sich auf die offizielle Dokumentation von Node-Gyp beziehen.

konfigurieren

Nachdem die Datei fertig ist, müssen wir diesen Befehl in diesem Verzeichnis ausführen:

Code kopieren Der Code lautet wie folgt:

$ node-gyp configure

Wenn alles normal ist, sollte ein Build-Verzeichnis generiert werden, in dem sich zugehörige Dateien befinden, möglicherweise die vcxproj-Datei von M$ Visual Studio usw., möglicherweise Makefile, je nach Plattform.

bauen

Nachdem das Makefile generiert wurde, beginnen wir mit dem Erstellen und Kompilieren:
$ node-gyp build

Wenn alles kompiliert ist, ist es wirklich fertig! Wenn Sie mir nicht glauben, schauen Sie sich das Build/Release-Verzeichnis an. Gibt es unten eine hello.node-Datei? Ja, das ist die Soap, die C später für Node.js abholen wird!

Werde schwul! Knoten ヽ(✿゚▽゚)ノ C

Wir erstellen gerade eine neue Datei jianfeizao.js im Verzeichnis:

Code kopieren Der Code lautet wie folgt:

var addon = require("./build/Release/hello");
console.log(addon.hello());

Hast du es gesehen? Hast du es gesehen? Es ist raus, es ist raus! Das Ergebnis davon, dass Node.js und C radikal sind! Dieses addon.hello() ist das Handle Hello(const Arguments& args), das wir zuvor im C-Code geschrieben haben, und wir haben jetzt den zurückgegebenen Wert ausgegeben.

Geh schlafen, der nächste Abschnitt wird ausführlicher sein

Es ist schon spät, das ist also alles für heute. Jetzt kann jeder die einfachste C-Erweiterung von Hello World erstellen. Das nächste Mal, wenn ich schreibe, sollte es ausführlicher sein. Wann das nächste Mal sein wird, weiß ich eigentlich nicht.
(Hey, hey, hey, wie kann ein Masturbator so verantwortungslos sein! (o゚ロ゚)┌┛Σ(ノ´ω`)ノ

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist die Rolle von CHAR in C -Saiten? Was ist die Rolle von CHAR in C -Saiten? Apr 03, 2025 pm 03:15 PM

In C wird der Zeichenentyp in Saiten verwendet: 1. Speichern Sie ein einzelnes Zeichen; 2. Verwenden Sie ein Array, um eine Zeichenfolge darzustellen und mit einem Null -Terminator zu enden. 3. Durch eine Saitenbetriebsfunktion arbeiten; 4. Lesen oder geben Sie eine Zeichenfolge von der Tastatur aus.

Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Vier Möglichkeiten zur Implementierung von Multithreading in C -Sprache Apr 03, 2025 pm 03:00 PM

Multithreading in der Sprache kann die Programmeffizienz erheblich verbessern. Es gibt vier Hauptmethoden, um Multithreading in C -Sprache zu implementieren: Erstellen Sie unabhängige Prozesse: Erstellen Sie mehrere unabhängig laufende Prozesse. Jeder Prozess hat seinen eigenen Speicherplatz. Pseudo-MultitHhreading: Erstellen Sie mehrere Ausführungsströme in einem Prozess, der denselben Speicherplatz freigibt und abwechselnd ausführt. Multi-Thread-Bibliothek: Verwenden Sie Multi-Thread-Bibliotheken wie PThreads, um Threads zu erstellen und zu verwalten, wodurch reichhaltige Funktionen der Thread-Betriebsfunktionen bereitgestellt werden. Coroutine: Eine leichte Multi-Thread-Implementierung, die Aufgaben in kleine Unteraufgaben unterteilt und sie wiederum ausführt.

Berechnung des C-Subscript 3-Index 5 C-Subscript 3-Index 5-Algorithmus-Tutorial Berechnung des C-Subscript 3-Index 5 C-Subscript 3-Index 5-Algorithmus-Tutorial Apr 03, 2025 pm 10:33 PM

Die Berechnung von C35 ist im Wesentlichen kombinatorische Mathematik, die die Anzahl der aus 3 von 5 Elementen ausgewählten Kombinationen darstellt. Die Berechnungsformel lautet C53 = 5! / (3! * 2!), Was direkt durch Schleifen berechnet werden kann, um die Effizienz zu verbessern und Überlauf zu vermeiden. Darüber hinaus ist das Verständnis der Art von Kombinationen und Beherrschen effizienter Berechnungsmethoden von entscheidender Bedeutung, um viele Probleme in den Bereichen Wahrscheinlichkeitsstatistik, Kryptographie, Algorithmus -Design usw. zu lösen.

Unterschiedliche Funktionsnutzungsabstand Funktion C -Verwendung Tutorial Unterschiedliche Funktionsnutzungsabstand Funktion C -Verwendung Tutorial Apr 03, 2025 pm 10:27 PM

STD :: Einzigartige Entfernung benachbarte doppelte Elemente im Container und bewegt sie bis zum Ende, wodurch ein Iterator auf das erste doppelte Element zeigt. STD :: Distanz berechnet den Abstand zwischen zwei Iteratoren, dh die Anzahl der Elemente, auf die sie hinweisen. Diese beiden Funktionen sind nützlich, um den Code zu optimieren und die Effizienz zu verbessern, aber es gibt auch einige Fallstricke, auf die geachtet werden muss, wie z. STD :: Distanz ist im Umgang mit nicht randomischen Zugriffs-Iteratoren weniger effizient. Indem Sie diese Funktionen und Best Practices beherrschen, können Sie die Leistung dieser beiden Funktionen voll ausnutzen.

Wie kann ich die Schlangennomenklatur in der C -Sprache anwenden? Wie kann ich die Schlangennomenklatur in der C -Sprache anwenden? Apr 03, 2025 pm 01:03 PM

In der C -Sprache ist die Snake -Nomenklatur eine Konvention zum Codierungsstil, bei der Unterstriche zum Verbinden mehrerer Wörter mit Variablennamen oder Funktionsnamen angeschlossen werden, um die Lesbarkeit zu verbessern. Obwohl es die Zusammenstellung und den Betrieb nicht beeinträchtigen wird, müssen langwierige Benennung, IDE -Unterstützung und historisches Gepäck berücksichtigt werden.

Verwendung von Veröffentlichungen in C. Verwendung von Veröffentlichungen in C. Apr 04, 2025 am 07:54 AM

Die Funktion Release_Semaphor in C wird verwendet, um das erhaltene Semaphor zu freigeben, damit andere Threads oder Prozesse auf gemeinsame Ressourcen zugreifen können. Es erhöht die Semaphorzahl um 1 und ermöglicht es dem Blockierfaden, die Ausführung fortzusetzen.

MySQL kann nach dem Herunterladen nicht installiert werden MySQL kann nach dem Herunterladen nicht installiert werden Apr 08, 2025 am 11:24 AM

Die Hauptgründe für den Fehler bei MySQL -Installationsfehlern sind: 1. Erlaubnisprobleme, Sie müssen als Administrator ausgeführt oder den Sudo -Befehl verwenden. 2. Die Abhängigkeiten fehlen, und Sie müssen relevante Entwicklungspakete installieren. 3. Portkonflikte müssen Sie das Programm schließen, das Port 3306 einnimmt, oder die Konfigurationsdatei ändern. 4. Das Installationspaket ist beschädigt. Sie müssen die Integrität herunterladen und überprüfen. 5. Die Umgebungsvariable ist falsch konfiguriert und die Umgebungsvariablen müssen korrekt entsprechend dem Betriebssystem konfiguriert werden. Lösen Sie diese Probleme und überprüfen Sie jeden Schritt sorgfältig, um MySQL erfolgreich zu installieren.

Probleme mit der Dev-C-Version Probleme mit der Dev-C-Version Apr 03, 2025 pm 07:33 PM

DEV-C 4.9.9.2 Kompilierungsfehler und -lösungen Wenn das Kompilieren von Programmen in Windows 11-System mit Dev-C 4.9.9.2 kompiliert wird, kann der Compiler-Datensatz die folgende Fehlermeldung anzeigen: GCC.EXE: INTERNEHERERROR: ABTREIDED (programmcollect2) pleasSubMitAfulbugrort.SeeforinSructions. Obwohl die endgültige "Kompilierung erfolgreich ist", kann das tatsächliche Programm nicht ausgeführt werden und eine Fehlermeldung "Original -Code -Archiv kann nicht kompiliert werden" auftauchen. Dies liegt normalerweise daran, dass der Linker sammelt

See all articles