Heim Backend-Entwicklung Python-Tutorial Erstellen für WebAssembly

Erstellen für WebAssembly

Dec 02, 2024 am 01:26 AM

Building for WebAssembly

Ich untersuche derzeit zwei interessante Themen für Memphis, meinen Python-Interpreter in Rust: Erstellen für WebAssembly und Einbetten von CPython. Da es diese Woche keine wichtigen Meilensteine ​​zu vermelden gibt, dachte ich, ich würde einige laufende Gedanken mitteilen. Für mich war Memphis ein Projekt zur Erweiterung meines konzeptionellen Verständnisses durch praktische Experimente – hoffentlich kann dieser Beitrag das Gleiche für Sie bewirken, während wir einige der Designentscheidungen durchgehen, die ich untersuche.

Python im Browser

Das Kompilieren von Memphis zu einem WebAssembly-Ziel hatte ich schon seit einiger Zeit im Hinterkopf, und vor zwei Samstagen habe ich es endlich versucht. Mit einer lauwarmen Tasse Filterkaffee auf meinem Untersetzer ließ ich meine Fingerknöchel knacken und begann.

WebAssembly ist eine Sandbox-Ausführungsumgebung in modernen Webbrowsern, die die traditionelle JavaScript-Umgebung ergänzt. Die Wasm-Umgebung ist näher am nativen Code und kann für Aufgaben verwendet werden, die von einem leistungsfähigeren CPU-Kontext profitieren. Denken Sie an Zahlenverarbeitung oder alberne Besetztschleifen. Mich interessierte es weniger aus Performance-Perspektive als vielmehr, weil es überhaupt möglich war. Eines der Verkaufsargumente von Rust (im wahrsten Sinne des Wortes Bajillions) ist, dass es Wasm ins Visier nehmen kann. Wie geht das, könnte man fragen? Dies ist möglich, weil Rust LLVM als Compiler-Backend verwendet. Das Rust-Compiler-Frontend erzeugt LLVM Intermediate Representation (IR)-Code und LLVM kann diesen zu nativem Code für Dutzende von Zielen kompilieren.

Das ist ein ziemlich großer Vorteil und ich war neugierig, ob es nur für Memphis funktionieren würde. Ich hatte zuvor praktisch überhaupt nicht darüber nachgedacht, Python im Browser auszuführen, daher schien dies eine perfekte Gelegenheit zu sein, die Wasm-Lernkurve auszuprobieren.

Wasm-Pack und Building für WebAssembly einrichten

Ich habe meinen KI-Assistenten gestartet und nach der Startsequenz gefragt. Es machte einen Piep-Boop-Piep-Boop. Unten sind die Schritte aufgeführt, die ich mit meinen Erkenntnissen auf dem Weg kommentiert habe.

# wasm-pack helps compile our Rust code to WebAssembly and bundle it
# with JavaScript bindings we can call from our HTML/JavaScript page.
cargo install wasm-pack

# wasm-pack also downloads the wasm32-unknown-unknown target via
# rustup for us. If for whatever reason it does not, you can use this: 
# rustup target add wasm32-unknown-unknown
# We must specify a feature flag because our wasm_bindgen interface is
# behind the wasm feature flag.
wasm-pack build --target web --out-dir wasm_ui/pkg -- --features wasm
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Der Aufbau ist mir beim ersten Versuch gelungen! Da wir jedoch in unserer Rust-Binärdatei keine Funktionen als für den Aufruf von WebAssembly verfügbar markiert haben, bewirkt dies nicht viel.

Dazu können wir die wasm-bindgen-Kiste installieren, die ich hinter ein Feature-Flag gestellt habe. Ich habe dies zu meinem Cargo.toml hinzugefügt.

[dependencies]
wasm-bindgen = { version = "0.2", optional = true }

[features]
wasm = ["wasm-bindgen"]
Nach dem Login kopieren
Nach dem Login kopieren

Hier ist ein kleiner Code, den ich meiner Datei src/lib.rs hinter dem Feature-Flag wasm hinzugefügt habe. Die Begrüßungsfunktion ist mit #[wasm_bindgen] versehen, um dieses Symbol in JavaScript verfügbar zu machen.

# wasm-pack helps compile our Rust code to WebAssembly and bundle it
# with JavaScript bindings we can call from our HTML/JavaScript page.
cargo install wasm-pack

# wasm-pack also downloads the wasm32-unknown-unknown target via
# rustup for us. If for whatever reason it does not, you can use this: 
# rustup target add wasm32-unknown-unknown
# We must specify a feature flag because our wasm_bindgen interface is
# behind the wasm feature flag.
wasm-pack build --target web --out-dir wasm_ui/pkg -- --features wasm
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen einer JavaScript-Schnittstelle

Ich habe auch meinen KI-Assistenten um das kleinstmögliche Stück JavaScript gebeten, das ich zum Testen meiner Wasm-Schnittstelle verwenden könnte. Wenn wir init() aufrufen, lädt der Browser die .wasm-Datei, führt einen JIT-Kompilierungsschritt durch, um die portable WebAssembly-Binärdatei in nativen Code zu konvertieren, und initialisiert den Speicher für die WebAssembly-Laufzeitumgebung.

[dependencies]
wasm-bindgen = { version = "0.2", optional = true }

[features]
wasm = ["wasm-bindgen"]
Nach dem Login kopieren
Nach dem Login kopieren

Wie ein Wunder unter Wundern hat es einfach funktioniert. Zugegeben, ich habe keinen Python-Code im Browser ausgeführt, aber die Schnittstelle zu meiner Binärdatei war ein RIESIGER Schritt, den mein jüngeres Ich, das Java kaum installieren konnte, nicht unterschätzen wollte.

Der nächste Schritt bestand darin, ihm einen in JavaScript definierten Python-Ausdruck zu geben und die Wasm-Binärdatei die Zahlen verarbeiten zu lassen. Wie ich in meinem REPL-Beitrag erwähnt habe, ist jeder Einstiegspunkt in ein Softwareprojekt eine Gelegenheit, meine Abstraktionen zu verbessern, und das wäre auch hier sicherlich wieder der Fall. Als ich mein Memphis-Repo durchblätterte, wurde mir klar: Wow, ich sollte wirklich eine bessere Schnittstelle haben, um einen String zu übergeben und ihn als Python auszuwerten. Wie ich schon sagte, ich LIEBE neue Einstiegspunkte.

Vorerst würde ich meinen Crosscheck-Adapter verwenden. Crosscheck ist mein in Arbeit befindliches Testframework, um zu validieren, dass der Treewalk-Interpreter und die Bytecode-VM das gleiche Verhalten für eine bestimmte Python-Eingabe erzeugen. Es ist nach der Tätigkeit von Flugbegleitern benannt.

Hier ist mein aktualisierter Rust-Code.

#[cfg(feature = "wasm")]
mod wasm {
    use wasm_bindgen::prelude::wasm_bindgen;

    // Export a function to JavaScript
    #[wasm_bindgen]
    pub fn greet() -> String {
        "Hello from WebAssembly!".to_string()
    }
}
Nach dem Login kopieren

Hier ist mein aktualisierter JavaScript-Code, der die neue Rust-Evaluierungsfunktion aufruft.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Wasm Test</title>
</head>
<body>
    <script type="module">
        import init, { greet } from './pkg/memphis.js';

        async function run() {
            await init();
            console.log(greet());
        }

        run();
    </script>
</body>
</html>
Nach dem Login kopieren

Debuggen von WebAssembly-Fehlern

Als ich es nun ausführte, bekam ich……… einen Konsolenfehler. Es stürzte mit einem nicht implementierten Fehler ab.

Ich habe ein wenig herumgestöbert und es war nicht klar, was die Ursache dafür war. Sie können in die Quelle klicken, aber für einen Wasm-Build, der nur ein Assemblyblock ohne Verweise auf die ursprünglichen Rust-Funktionen ist.

Ich habe ein bisschen über KI gechattet/gegoogelt und zwei hilfreiche Ansätze gefunden. Eine davon ist console_log zur Verwendung in Wasm-Builds, das Protokollanweisungen aus Ihrem Rust-Code in Ihrer Browserkonsole anzeigt. Das hat einigen geholfen, aber was ich wirklich suchte, war ein Stack-Trace. Geben Sie console_error_panic_hook ein. Es gab mir sofort den Rust-Stack-Trace, nämlich CLUTCH. Wenn Sie Ihren eigenen Wasm-Build erstellen, hören Sie jetzt auf, dies zu lesen, und fügen Sie diese Kiste hinzu. Es macht mir nicht einmal etwas aus, wenn Sie diesen Beitrag nie zu Ende lesen. Ferris möchte, dass du diese Kiste benutzt? So habe ich es zu meiner Wasm-Schnittstelle hinzugefügt.

#[cfg(feature = "wasm")]
mod wasm {
    use wasm_bindgen::prelude::wasm_bindgen;

    use crosscheck::{InterpreterTest, TreewalkAdapter};

    // Export a function to JavaScript
    #[wasm_bindgen]
    pub fn greet() -> String {
        "Hello from WebAssembly!".to_string()
    }

    #[wasm_bindgen]
    pub fn evaluate(code: String) -> String {
        let result = TreewalkAdapter.execute(&code);
        format!("{}", result)
    }
}
Nach dem Login kopieren

Mein Stack-Trace hat mich auf meinen Übeltäter hingewiesen: Ich habe std::env verwendet, um einige Betriebssystemressourcen anzufordern, die in einer Wasm-Laufzeitumgebung nicht zulässig sind (das ist der Sandbox-Teil). Ich habe diese Aufrufe hinter ein Feature-Flag gestellt (sie hängen damit zusammen, wie ich den Speicherort der Python-Standardbibliothek auf dem Host-Rechner mühsam ermittle) und habe meinen Build erneut gestartet. Nach ein paar kleinen Fehlern im Zusammenhang mit der korrekten Anzeige meiner Rückgabetypen ….

ES FUNKTIONIERTE. Folgendes sehe ich jetzt in meiner Browserkonsole.

# wasm-pack helps compile our Rust code to WebAssembly and bundle it
# with JavaScript bindings we can call from our HTML/JavaScript page.
cargo install wasm-pack

# wasm-pack also downloads the wasm32-unknown-unknown target via
# rustup for us. If for whatever reason it does not, you can use this: 
# rustup target add wasm32-unknown-unknown
# We must specify a feature flag because our wasm_bindgen interface is
# behind the wasm feature flag.
wasm-pack build --target web --out-dir wasm_ui/pkg -- --features wasm
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

tldr Ich kann Python im Browser ausführen. (Zu ihrer Ehre muss man sagen, dass RustPython dies auch tut: https://rustpython.github.io/demo/. Ich habe mir ihr Projekt nicht näher angesehen, aber es scheint umfassend zu sein.) Das Python-Listenverständnis ist in JavaScript in Stringform definiert und Die Antwortliste wird durch den zu Wasm kompilierten Rust-Code ausgewertet und zurück in einen String umgewandelt, der von JavaScript angezeigt werden kann.

Dieses Setup unterstützt derzeit nur Ausdrücke. Um Anweisungen auszuwerten (und später ihre Ergebnisse zurückzulesen), muss ich den Status auf der Rust-Seite beibehalten. Ich träume auch davon, eine JavaScript-REPL zu erstellen. Das klingt nach einem Problem für mein zukünftiges Ich (und ehrlich gesagt nach einem langweiligen Traum).

Das Ende

Ich habe lange genug gesprochen, deshalb werde ich mich mit der Diskussion über eingebettetes Python bis nächsten Montag zurückhalten.

Entschuldigung für den Köder und den Wechsel. Der Inhaltskalender wartet auf niemanden.

Um es klar auszudrücken: Mit eingebettetem Python meine ich die Einbettung eines CPython-Interpreters in Memphis und nicht die Ausführung von Python in einer Umgebung mit „eingebetteten Systemen“. Das wäre ohne Grund schwierig. Im Gegensatz zu Memphis, wo es für SPASS schwierig ist.


Wenn Sie weitere Beiträge wie diesen direkt in Ihrem Posteingang erhalten möchten, können Sie sich hier anmelden!

Anderswo

Neben der Betreuung von Software-Ingenieuren schreibe ich auch über meine Erfahrungen als Erwachsener, bei dem Autismus diagnostiziert wurde. Weniger Code und die gleiche Anzahl an Witzen.

  • Warum sehne ich mich nach Anerkennung? - Von Scratch Dot org

Das obige ist der detaillierte Inhalt vonErstellen für WebAssembly. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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ßer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Heiße Themen

Java-Tutorial
1672
14
PHP-Tutorial
1277
29
C#-Tutorial
1256
24
Python vs. C: Lernkurven und Benutzerfreundlichkeit Python vs. C: Lernkurven und Benutzerfreundlichkeit Apr 19, 2025 am 12:20 AM

Python ist leichter zu lernen und zu verwenden, während C leistungsfähiger, aber komplexer ist. 1. Python -Syntax ist prägnant und für Anfänger geeignet. Durch die dynamische Tippen und die automatische Speicherverwaltung können Sie die Verwendung einfach zu verwenden, kann jedoch zur Laufzeitfehler führen. 2.C bietet Steuerung und erweiterte Funktionen auf niedrigem Niveau, geeignet für Hochleistungsanwendungen, hat jedoch einen hohen Lernschwellenwert und erfordert manuellem Speicher und Typensicherheitsmanagement.

Python lernen: Ist 2 Stunden tägliches Studium ausreichend? Python lernen: Ist 2 Stunden tägliches Studium ausreichend? Apr 18, 2025 am 12:22 AM

Ist es genug, um Python für zwei Stunden am Tag zu lernen? Es hängt von Ihren Zielen und Lernmethoden ab. 1) Entwickeln Sie einen klaren Lernplan, 2) Wählen Sie geeignete Lernressourcen und -methoden aus, 3) praktizieren und prüfen und konsolidieren Sie praktische Praxis und Überprüfung und konsolidieren Sie und Sie können die Grundkenntnisse und die erweiterten Funktionen von Python während dieser Zeit nach und nach beherrschen.

Python vs. C: Erforschung von Leistung und Effizienz erforschen Python vs. C: Erforschung von Leistung und Effizienz erforschen Apr 18, 2025 am 12:20 AM

Python ist in der Entwicklungseffizienz besser als C, aber C ist in der Ausführungsleistung höher. 1. Pythons prägnante Syntax und reiche Bibliotheken verbessern die Entwicklungseffizienz. 2. Die Kompilierungsmerkmale von Compilation und die Hardwarekontrolle verbessern die Ausführungsleistung. Bei einer Auswahl müssen Sie die Entwicklungsgeschwindigkeit und die Ausführungseffizienz basierend auf den Projektanforderungen abwägen.

Python vs. C: Verständnis der wichtigsten Unterschiede Python vs. C: Verständnis der wichtigsten Unterschiede Apr 21, 2025 am 12:18 AM

Python und C haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1) Python ist aufgrund seiner prägnanten Syntax und der dynamischen Typisierung für die schnelle Entwicklung und Datenverarbeitung geeignet. 2) C ist aufgrund seiner statischen Tipp- und manuellen Speicherverwaltung für hohe Leistung und Systemprogrammierung geeignet.

Welches ist Teil der Python Standard Library: Listen oder Arrays? Welches ist Teil der Python Standard Library: Listen oder Arrays? Apr 27, 2025 am 12:03 AM

PythonlistsarePartThestandardlibrary, whilearraysarenot.listarebuilt-in, vielseitig und UNDUSEDFORSPORINGECollections, während dieArrayRay-thearrayModulei und loses und loses und losesaluseduetolimitedFunctionality.

Python: Automatisierung, Skript- und Aufgabenverwaltung Python: Automatisierung, Skript- und Aufgabenverwaltung Apr 16, 2025 am 12:14 AM

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Python für wissenschaftliches Computer: Ein detailliertes Aussehen Python für wissenschaftliches Computer: Ein detailliertes Aussehen Apr 19, 2025 am 12:15 AM

Zu den Anwendungen von Python im wissenschaftlichen Computer gehören Datenanalyse, maschinelles Lernen, numerische Simulation und Visualisierung. 1.Numpy bietet effiziente mehrdimensionale Arrays und mathematische Funktionen. 2. Scipy erweitert die Numpy -Funktionalität und bietet Optimierungs- und lineare Algebra -Tools. 3.. Pandas wird zur Datenverarbeitung und -analyse verwendet. 4.Matplotlib wird verwendet, um verschiedene Grafiken und visuelle Ergebnisse zu erzeugen.

Python für die Webentwicklung: Schlüsselanwendungen Python für die Webentwicklung: Schlüsselanwendungen Apr 18, 2025 am 12:20 AM

Zu den wichtigsten Anwendungen von Python in der Webentwicklung gehören die Verwendung von Django- und Flask -Frameworks, API -Entwicklung, Datenanalyse und Visualisierung, maschinelles Lernen und KI sowie Leistungsoptimierung. 1. Django und Flask Framework: Django eignet sich für die schnelle Entwicklung komplexer Anwendungen, und Flask eignet sich für kleine oder hochmobile Projekte. 2. API -Entwicklung: Verwenden Sie Flask oder Djangorestframework, um RESTFUFFUPI zu erstellen. 3. Datenanalyse und Visualisierung: Verwenden Sie Python, um Daten zu verarbeiten und über die Webschnittstelle anzuzeigen. 4. Maschinelles Lernen und KI: Python wird verwendet, um intelligente Webanwendungen zu erstellen. 5. Leistungsoptimierung: optimiert durch asynchrones Programmieren, Caching und Code

See all articles