Verwenden Sie C/C, um Node.js-Module (1)_node.js zu implementieren
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:
$ 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:
#include
#include
unter Verwendung des Namespace v8;
Hauptfunktion
Als nächstes schreiben wir eine Funktion, deren Rückgabewert Handle
Handle
{
//... 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:
Handle
{
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?
Handle
{
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
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?
exports.hello = function() {}
Wie machen wir das also in C?
Initialisierungsfunktion
Zuerst schreiben wir eine Initialisierungsfunktion:
void init(Handle
Das ist der Schildkröten-Hintern! Es spielt keine Rolle, wie der Funktionsname lautet, aber der übergebene Parameter muss ein Handle
Dann schreiben wir die exportierten Sachen hier:
void init(Handle
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:
void init(Handle
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:
void Initialize (Handle
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:
{
„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:
$ 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:
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
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゚ロ゚)┌┛Σ(ノ´ω`)ノ

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

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

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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.

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.

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.

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.

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.

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.

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.

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
