2 Punkte von GN⁺ 2025-02-05 | 1 Kommentare | Auf WhatsApp teilen

Was ist WebAssembly?

  • WebAssembly ist ein standardisierter Befehlssatz und ein Bytecode-Format, das dafür entwickelt wurde, nicht vertrauenswürdigen clientseitigen Code im Webbrowser mit nahezu nativer Geschwindigkeit auszuführen.
  • Es entwickelte sich aus Emscripten, einem Compiler von C/C++ nach JavaScript, der anfangs LLVM IR in JavaScript umwandelte, damit C- und C++-Code im Web ausgeführt werden konnte.
  • Mit der Zeit arbeiteten Browser-Entwickler mit dem Emscripten-Projekt zusammen, um eine einfache Teilmenge von JavaScript für Performance-Optimierungen zu schaffen; daraus wurde der Standard asm.js.
  • Um den Overhead von JavaScript zu vermeiden, wurde später ein eigenständiges Bytecode-Format entworfen, und das ist Wasm.
  • In letzter Zeit gewinnt WebAssembly auch außerhalb des Browsers an Popularität, und Fastly sowie Shopify bauen ihre Edge-Compute- und Functions-Produkte auf Basis von WebAssembly-Engines auf.
  • WebAssembly ist eine attraktive Plattform für den Aufbau eines Plugin-Ökosystems, weil es von vielen verschiedenen Quellsprachen aus als Zielplattform angesprochen werden kann.

Warum ein WebAssembly-Interpreter?

  • Wie viele Softwareingenieure war ich in das Muster geraten, ein neues Side-Project zu beginnen und nach ein paar Wochen das Interesse daran zu verlieren.
  • Ich brauchte ein größeres Projekt, in das ich über einen längeren Zeitraum kontinuierlich Arbeit investieren konnte und das mir Einblick in die unteren Ebenen des Computing-Stacks geben würde.
  • Ich begann, mich für den Hype um WebAssembly zu interessieren, und es wirkte auf mich wie ein attraktives Plattform-Engineering-Werkzeug, mit dem sich maßgeschneiderte System-Calls entwerfen lassen.

Semblance

  • Um mich mit der WebAssembly Core Specification vertraut zu machen, beschloss ich, einen WebAssembly-Interpreter zu schreiben.
  • Da das Ziel des Projekts das Lernen war, plante ich nicht, alle Opcodes zu implementieren oder die komplette Core-Test-Suite zu bestehen.
  • Wenn ich ein "Hello, World!" ausführen könnte, wäre ich zufrieden.

Ergebnis

  • Das Projekt kann als großer Erfolg betrachtet werden. Die Opcode-Abdeckung ist nicht vollständig, aber es kann ein einfaches "Hello, World!"-Programm ausführen.
  • Der Code ist chaotisch, langsam, hat Memory Leaks und könnte anfällig für bösartige Module sein, aber er funktioniert.
  • Ich habe viel über die Core Specification von WebAssembly gelernt und konnte meine Komfortzone als Ingenieur verlassen.
  • Ich habe jetzt das Gefühl, genug Wissen über WebAssembly gewonnen zu haben, um zu industrietauglichen Laufzeitumgebungen wie Wasmtime beitragen zu können.

1 Kommentare

 
GN⁺ 2025-02-05
Hacker-News-Kommentare
  • Ich habe einmal einen Wasm-Interpreter in Scheme geschrieben, daher freut es mich, andere dabei zu sehen, wie sie selbst einen bauen. Wasm ist weniger schwierig, als man vielleicht denkt, und ich empfehle, es einfach so weit auszuprobieren, dass es Spaß macht, ohne gleich alle Instruktionen implementieren zu müssen.

    • Ein Tipp für den Autor: Die Spec-Tests enthalten komplexere textuelle Wasm-Formen, aber mit dem wast2json-Konverter kann man einfachere JSON-Beschreibungen und normale binäre Wasm-Dateien erhalten.
  • Anfängerfrage:

    • Ich frage mich, wie man debuggt, wenn man den Interpreter nicht selbst codiert.
    • Ich frage mich, wie effektiv Fuzzing von String-Opcodes ist.
    • Ich frage mich, wie groß der praktische Unterschied zwischen serverseitigen WASM-Engines und browserbasierten Engines ist und wie viel Arbeit nötig wäre, um die eine in die andere zu verwandeln.
  • Ich habe einen interessanten Artikel über die direkte Interpretation von WASM gefunden.

  • Ein interessanter Ansatz und großartige Arbeit.

  • Ich denke, es wäre eine gute Idee gewesen, die Wasm-C-API als Standardschnittstelle zu übernehmen.

    • Das ist die API, die von den meisten Wasm-Laufzeiten (Wasmmer, V8, wasmi usw.) übernommen wurde. Da sie in C geschrieben ist, können Entwickler, die mit dieser API vertraut sind, sie leicht ausprobieren.
    • Wenn der Autor mit Wasm vertraut ist, wären Patches oder Verbesserungen für Wasmer sicher ebenfalls willkommen.
  • Ein umstrittener Punkt:

    • Ich frage mich, ob Interesse daran besteht, frühe Tail-Call-Instruktionen hinzuzufügen.
    • Die Verantwortlichen für die WASM-Spezifikation haben dies als „High-Level“ abgelehnt, aber auch das C-Komitee hat Dennis Ritchies Vorschlag abgelehnt. Rob Pike scheint ebenfalls Ritchies Richtung zu unterstützen. Wenn nicht, warum hätte er dann Golang entwickelt? Tail Calls sind nur dann High-Level, wenn Aufrufe High-Level sind.
  • Ich empfehle, sich Orca anzusehen. Das könnte eine gute Gelegenheit sein, etwas beizutragen: https://orca-app.dev

  • Es ist wirklich großartig zu sehen, wie jemand tief in WebAssembly eintaucht und den Prozess dokumentiert, einen Interpreter von Grund auf zu bauen.

  • Ein großartiger Artikel, der mich motiviert, wieder an einer WASM-Implementierung zu arbeiten.

  • Wirklich tolle Arbeit.