{"id":22623,"date":"2022-03-30T00:00:00","date_gmt":"2022-03-29T22:00:00","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=22623"},"modified":"2023-08-06T21:39:23","modified_gmt":"2023-08-06T19:39:23","slug":"webassembly-das-neue-docker-und-noch-mehr","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/","title":{"rendered":"WebAssembly: Das neue Docker und noch mehr?"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>If WASM+WASI existed in 2008, we wouldn&#8217;t have needed to created Docker. That&#8217;s how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let&#8217;s hope WASI is up to the task!<\/p>\n<cite><a href=\"https:\/\/twitter.com\/solomonstre\/status\/1111004913222324225\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Solomon Hykes (Erfinder von Docker), 2019\">Tweet<\/a>, Solomon Hykes (Erfinder von Docker), 2019<\/cite><\/blockquote>\n\n\n\n<p>Dieser Tweet \u00fcber WebAssembly (WASM) des Docker-Erfinders gibt einen Hinweis auf die m\u00f6gliche Innovationskraft dieser Technologie. Der vorliegende Artikel vermittelt zun\u00e4chst die wichtigsten technischen Grundlagen von WebAssembly, welche zum weiteren Verst\u00e4ndnis notwendig sind. Anschlie\u00dfend wird der WASI-Standard n\u00e4her beleuchtet, welcher die Br\u00fccke zur Containervirtualisierung schl\u00e4gt. Schlie\u00dflich betrachten wir mit Krustlet (Kubernetes) und wasmCloud zwei existierende Cloud-Technologien, die zentral auf WebAssembly basieren.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">1. WebAssembly (WASM)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1. WebAssembly als Number Cruncher f\u00fcr JavaScript<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\" id=\"atwoodslaw\">\n<p>Any application that can be written in JavaScript, will eventually be written in JavaScript.<\/p>\n<cite><a href=\"https:\/\/en.wikipedia.org\/wiki\/Jeff_Atwood\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Atwood\u2019s Law\">Atwood\u2019s Law<\/a>, Jeff Atwood (Mitgr\u00fcnder von StackOverflow)<\/cite><\/blockquote>\n\n\n\n<p>Die gestiegene Popularit\u00e4t und weite Verbreitung von JavaScript (JS) innerhalb der vergangenen Jahre dr\u00fcckt sich pointiert im <em>Atwood&#8217;schen Gesetz<\/em> aus. Dieses besagt: Falls es m\u00f6glich ist, dass eine Anwendung in JavaScript implementiert werden kann, wird das auch irgendwann so geschehen.<\/p>\n\n\n\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/JavaScript_engine\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"JavaScript Engines\">JavaScript Engines<\/a> wurden im Zuge des Erfolgs der Sprache und des Wettbewerbs zwischen den Browsern betr\u00e4chtlich <a href=\"https:\/\/v8.dev\/blog\/10-years#performance-ups-and-downs\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"performanter\">performanter<\/a>. Da JavaScript aber letztlich eine Sprache mit dynamischer Typisierung ist, unterliegt die Optimierung der Performance gewissen Grenzen. Daher ergibt es wenig Sinn, rechenintensive Anwendungen damit zu realisieren.<\/p>\n\n\n\n<p>F\u00fcr rechenintensive Anwendungen soll <a href=\"https:\/\/webassembly.org\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"WebAssembly (WASM)\">WebAssembly (WASM)<\/a> Abhilfe schaffen. Bei der Technologie handelt es sich um ein Bytecode-Format f\u00fcr eine entsprechende virtuelle Maschine (VM). WASM wurde so konzipiert, dass performante Sprachen wie z.B. <a href=\"https:\/\/github.com\/appcypher\/awesome-wasm-langs\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"C\/C++, Rust oder TinyGo\">C\/C++, Rust, AssemblyScript oder TinyGo<\/a> [19] f\u00fcr diese VM kompiliert werden k\u00f6nnen. Am Ende erh\u00e4lt man eine wasm-Datei, die den Bytecode enth\u00e4lt und in JavaScript dann \u00fcber die <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/WebAssembly\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"WebAssembly API\">WebAssembly API<\/a> des Browsers (bzw. der JS Engine) geladen und ausgef\u00fchrt werden kann. Das Minimalbeispiel im folgenden Kapitel soll den Workflow verdeutlichen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"668\" data-attachment-id=\"23128\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/lin-clark-compiler-target\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target.png\" data-orig-size=\"2965,1933\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"lin-clark-compiler-target\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-1024x668.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-1024x668.png\" alt=\"\" class=\"wp-image-23128\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-1024x668.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-300x196.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-768x501.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-1536x1001.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/lin-clark-compiler-target-2048x1335.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><em>Abb: Verschiedenste Sprachen k\u00f6nnen zu WebAssembly Bytecode kompiliert werden. Zeichnung von <a href=\"https:\/\/hacks.mozilla.org\/2017\/02\/creating-and-working-with-webassembly-modules\/\" target=\"_blank\" rel=\"noreferrer noopener\">Lin Clark<\/a> [18]<\/em><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1.2. Workflow \/ Beispielprojekt<\/h3>\n\n\n\n<p>Wir gehen von einem akademischen Beispiel aus, welches in der Quelltextdatei <code class=\"\" data-line=\"\">program.c<\/code> implementiert wurde:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">&lt;em&gt;\/\/ program.c&lt;\/em&gt;\n\nvoid external_number_printer(int number);\n\nint add(int a, int b) {\n    int result = a + b;\n    external_number_printer(result);\n    return result;\n}<\/code><\/pre>\n\n\n\n<p>Die Funktion <code class=\"\" data-line=\"\">add()<\/code> gibt das Ergebnis einer Addition zur\u00fcck. Zus\u00e4tzlich wird die Funktion <code class=\"\" data-line=\"\">external_number_printer()<\/code> mit dem Ergebnis aufgerufen. Diese wird erst zur Laufzeit durch JavaScript bereitgestellt und daher in C nur deklariert.<\/p>\n\n\n\n<p>\u00dcbersetzt wird der Quelltext mit einem Compiler, welcher WASM als Zielarchitektur unterst\u00fctzt. In diesem Beispiel mit <a href=\"https:\/\/clang.llvm.org\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Clang (LLVM)\">Clang (LLVM Projekt)<\/a> [1]:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">clang --target=wasm32 --no-standard-libraries -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -o program.wasm program.c<\/code><\/pre>\n\n\n\n<p>Ergebnis ist die Bytecode-Datei <code class=\"\" data-line=\"\">program.wasm<\/code>. Diese kann in JavaScript geladen werden, um die Funktion <code class=\"\" data-line=\"\">add()<\/code> auszuf\u00fchren. Die Funktion <code class=\"\" data-line=\"\">external_number_printer()<\/code> wird dabei per <code class=\"\" data-line=\"\">importObject<\/code> bereitgestellt.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">&lt;em&gt;\/\/ script.js&lt;\/em&gt;\nfunction js_number_printer(number) {\n    console.log(&#039;JS Number Printer: &#039; + number);\n}\n\nasync function main() {\n    const source = fetch(&#039;&lt;strong&gt;program.wasm&lt;\/strong&gt;&#039;);\n    const importObject = { env: { &lt;strong&gt;external_number_printer&lt;\/strong&gt;: js_number_printer } };\n    const { instance } = await WebAssembly.instantiateStreaming(source, importObject);\n\n    const result = instance.exports.&lt;strong&gt;add(40, 2)&lt;\/strong&gt;; &lt;em&gt;\/\/ call webassembly function&lt;\/em&gt;\n    console.log(&#039;Result: &#039; + result);\n}\nmain();<\/code><\/pre>\n\n\n\n<p>Die Konsolenausgabe von <code class=\"\" data-line=\"\">script.js<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">&gt; JS Number Printer: 42\n&gt; Result: 42<\/code><\/pre>\n\n\n\n<p>Die erste Zeile wird von der Funktion <code class=\"\" data-line=\"\">js_number_printer()<\/code> erzeugt, welche von WASM aus aufgerufen wurde. Man spricht hier auch von einer <em>Host-Funktion<\/em> oder einer <em>importierten Funktion<\/em>. [4]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.3. Weitere Eigenschaften &amp; Konzepte<\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-style-default\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"700\" data-attachment-id=\"23124\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/wasm-runtime-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1.png\" data-orig-size=\"1500,1025\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"wasm-runtime-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1-1024x700.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1-1024x700.png\" alt=\"\" class=\"wp-image-23124\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1-1024x700.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1-300x205.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1-768x525.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/wasm-runtime-1.png 1500w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><em>Abb: Zusammenh\u00e4nge der wichtigsten Konzepte<\/em><\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Guest &amp; Host:<\/strong> Im obigen Beispiel nimmt der Browser (bzw. die JS Engine) die Rolle des Hosts ein. Guest ist das WASM-Programm.<\/li>\n\n\n\n<li><strong>Sandboxing &amp; Security:<\/strong> WASM wird \u00fcblicherweise in einer isolierten Umgebung (Sandbox) ausgef\u00fchrt, was zu einer gesteigerten Sicherheit f\u00fchrt. [2]<\/li>\n\n\n\n<li><strong>Performance:<\/strong> Der Bytecode wird beim Laden in nativen Maschinencode \u00fcbersetzt [3], wodurch eine beinahe native Ausf\u00fchrungsgeschwindigkeit erreicht werden kann.<\/li>\n\n\n\n<li><strong>Import\/Export von Funktionen:<\/strong> In beide Richtungen k\u00f6nnen Funktionen exportiert werden. D.h., dass JavaScript-Funktionen auch aus der VM heraus aufgerufen werden k\u00f6nnen.<\/li>\n\n\n\n<li><strong>Datentypen:<\/strong> WASM unterst\u00fctzt die vier numerischen <a href=\"https:\/\/webassembly.github.io\/spec\/core\/syntax\/types.html#number-types\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Datentypen\">Datentypen<\/a> <code class=\"\" data-line=\"\">int32<\/code>, <code class=\"\" data-line=\"\">int64<\/code>, <code class=\"\" data-line=\"\">float32<\/code> und <code class=\"\" data-line=\"\">float64<\/code>. Dementsprechend sind die Funktionssignaturen bei importierten\/exportierten Funktionen auf diese Datentypen beschr\u00e4nkt. <\/li>\n\n\n\n<li><strong>Memory:<\/strong> Der komplette Speicher der VM kann von der Host-Seite aus <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/WebAssembly\/Memory\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"gelesen und geschrieben\">gelesen und geschrieben<\/a> werden. Dies erm\u00f6glicht das Arbeiten mit Pointern auf beiden Seiten. So k\u00f6nnen Strings und komplexere Datenstrukturen \u00fcbergeben werden.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">2. WebAssembly au\u00dferhalb des Browsers<\/h2>\n\n\n\n<p>WASM spezifiziert eine vergleichsweise schlanke VM. Daher ist es mit relativ geringem Aufwand m\u00f6glich, WASM auch in vielen andereren Sprachen auszuf\u00fchren. Man ben\u00f6tigt f\u00fcr die Sprache, die als WASM-Host agieren soll, lediglich eine WASM Runtime. Eine aktuelle \u00dcbersicht verf\u00fcgbarer Runtimes kann <a href=\"https:\/\/github.com\/appcypher\/awesome-wasm-runtimes\" target=\"_blank\" rel=\"noreferrer noopener\">hier<\/a> eingesehen werden.<\/p>\n\n\n\n<p>Im Folgenden Beispiel wird das Beispiel aus 1.2 mit Python als Host und der WASM-Runtime <a href=\"https:\/\/wasmer.io\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>wasmer<\/em><\/a> reproduziert. Zun\u00e4chst m\u00fcssen die entsprechenden Python-Pakete f\u00fcr <em>wasmer<\/em> installiert werden:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">pip install wasmer wasmer_compiler_cranelift<\/code><\/pre>\n\n\n\n<p>Folgendes Python-Script kann dann \u00e4hnlich zur JavaScript-Variante den Bytecode aus <code class=\"\" data-line=\"\">program.wasm<\/code> ausf\u00fchren. Es l\u00e4sst sich erkennen, dass die API von wasmer stark an die <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/WebAssembly\" target=\"_blank\" rel=\"noreferrer noopener\">WebAssembly API aus JavaScript<\/a> angelehnt ist.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">&lt;em&gt;# script.py&lt;\/em&gt;\nfrom wasmer import engine, Store, Module, ImportObject, \\\n                   Function, FunctionType, Type, Instance\n\ndef python_number_printer(number: int) -&gt; None:\n    print(&quot;Python Number Printer:&quot;, number)\n\n&lt;em&gt;# ----- compile the module ---------------------------&lt;\/em&gt;\nstore = Store()\nwith open(&quot;&lt;strong&gt;program.wasm&lt;\/strong&gt;&quot;, &quot;rb&quot;) as file:\n    module = Module(store, file.read())\n\n&lt;em&gt;# ----- instantiate with imports ---------------------&lt;\/em&gt;\nimport_object = ImportObject()\nimport_object.register(&quot;env&quot;, {\n    &quot;&lt;strong&gt;external_number_printer&lt;\/strong&gt;&quot;: Function(store, python_number_printer)\n})\ninstance = Instance(module, import_object)\n\n&lt;em&gt;# ----- call WASM function ---------------------------&lt;\/em&gt;\nresult = instance.exports.&lt;strong&gt;add(40, 2)&lt;\/strong&gt;\nprint(&quot;Result:&quot;, result)<\/code><\/pre>\n\n\n\n<p>Ergibt die Konsolenausgabe:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color has-background has-small-font-size\" style=\"background-color:#e5e9ed\"><code class=\"\" data-line=\"\">Python Number Printer: 42\nResult: 42<\/code><\/pre>\n\n\n\n<p>Das Beispiel verdeutlicht repr\u00e4sentativ die einfache Integration von WASM in verschiedensten Sprachen. Dies f\u00f6rdert auch die Entstehung von Anwendungsszenarien au\u00dferhalb des Browsers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Blockchain:<\/strong> Mit <a href=\"https:\/\/t3n.de\/news\/ethereum-webassembly-smart-contracts-programmieren-1421559\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ethereum WebAssembly (EWASM)<\/a> k\u00f6nnen f\u00fcr das Ethereum-Netzwerk sog. <em><a href=\"https:\/\/de.wikipedia.org\/wiki\/Ethereum#Smart_Contracts\" target=\"_blank\" rel=\"noreferrer noopener\">Smart Contracts<\/a><\/em> entwickelt werden.<\/li>\n\n\n\n<li><strong>Embedded \/ IoT:<\/strong> WASM kann hier zur Entkopplung von Applikationslogik und Hardware eingesetzt werden, womit die Portabilit\u00e4t gesteigert werden kann. Empfehlenswert hierzu sind die Talks von <a href=\"https:\/\/www.youtube.com\/watch?v=dKOKAHmdPsE\" target=\"_blank\" rel=\"noreferrer noopener\">Wallentowitz<\/a> und <a href=\"https:\/\/www.youtube.com\/watch?v=p6_XGf_mXz8\" target=\"_blank\" rel=\"noreferrer noopener\">Lauwaerts<\/a>.<\/li>\n\n\n\n<li><strong>Cloud:<\/strong> WASM bietet attraktive Eigenschaften f\u00fcr Cloud und DevOps. Darunter die Portabilit\u00e4t sowie die Isolationsm\u00f6glichkeiten.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Mit WASI in Richtung Containervirtualisierung<\/h2>\n\n\n\n<p>Das Beispiel aus 1.2 enth\u00e4lt ein wichtiges Detail: Der Compiler-Befehl enth\u00e4lt die Option <code class=\"\" data-line=\"\">--no-standard-libraries<\/code>. Das bedeutet, dass keine Funktionen aus der <a href=\"https:\/\/de.wikipedia.org\/wiki\/C-Standard-Bibliothek\" target=\"_blank\" rel=\"noreferrer noopener\">C-Standard-Bibliothek (libc)<\/a> verwendet werden k\u00f6nnen. Darunter fallen wichtige Funktionalit\u00e4ten wie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00d6ffnen, Lesen &amp; Schreiben von Dateien (<code class=\"\" data-line=\"\">stdio.h<\/code>)<\/li>\n\n\n\n<li>Reservierung &amp; Freigabe von Speicher (<code class=\"\" data-line=\"\">stdlib.h<\/code>)<\/li>\n\n\n\n<li>Datum und Uhrzeit (<code class=\"\" data-line=\"\">time.h<\/code>)<\/li>\n<\/ul>\n\n\n\n<p>Die aufgef\u00fchrten Beispiele werden in der normalen &#8220;C-Welt&#8221; \u00fcblicherweise durch sog. <a href=\"https:\/\/de.wikipedia.org\/wiki\/Systemaufruf\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Syscall<\/em>s (Systemaufrufe)<\/a> realisiert. Programme k\u00f6nnen mit Syscalls das Betriebssystem aufrufen, um auf bestimmte Funktionalit\u00e4ten zuzugreifen. Dies erm\u00f6glicht z.B. den einfachen Umgang mit Dateien, ohne dass das Programm selbst Funktionalit\u00e4ten wie Treiber f\u00fcr Festplatten und Dateisysteme mitbringen muss.<\/p>\n\n\n\n<p>Um WASM Programme mit solchen Funktionalit\u00e4ten auszustatten, wurde das <a href=\"https:\/\/github.com\/WebAssembly\/WASI\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>WebAssembly System Interface (WASI)<\/strong><\/a> ins Leben gerufen. WASI spezifiziert Schnittstellen f\u00fcr solche Funktionalit\u00e4ten, die \u00fcber das Number Crunching hinausgehen. Z.B. die Schnittstelle zum \u00d6ffnen von Dateien &#8220;<code class=\"\" data-line=\"\">&lt;a href=&quot;https:\/\/github.com\/WebAssembly\/wasi-filesystem\/blob\/bdbfecf90170a94f5bc4219fdb43839dd6953642\/wasi-filesystem.abi.md#-descriptoropen-at&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener&quot;&gt;open-at&lt;\/a&gt;<\/code>&#8220;. Damit ist es m\u00f6glich, mit <a href=\"https:\/\/github.com\/WebAssembly\/wasi-libc\" target=\"_blank\" rel=\"noreferrer noopener\">wasi-libc<\/a> die C-Standard-Bibliothek f\u00fcr WASM Projekte zu nutzen. [16]<\/p>\n\n\n\n<p>WASM-Programme, welche WASI nutzen, k\u00f6nnen ausgef\u00fchrt werden, indem die Runtime die entsprechenden spezifizierten Schnittstellen als importierte Funktionen bereitstellt. Ein Beispiel f\u00fcr eine WASI-kompatible Runtime ist <em><a href=\"https:\/\/github.com\/bytecodealliance\/wasmtime\" target=\"_blank\" rel=\"noreferrer noopener\">wasmtime<\/a><\/em>. Mit <em>wasmtime<\/em> k\u00f6nnen WASM-Programme direkt &#8220;standalone&#8221; ausgef\u00fchrt werden. Damit wird deutlich, dass hier weitere Arten von Isolation realisiert werden k\u00f6nnen. So kann einerseits vom WASM-Host festgelegt werden, welche Funktionalit\u00e4ten von WASI \u00fcberhaupt bereitgestellt werden. Des Weiteren k\u00f6nnen Systemschnitstellen wie z.B. das Dateisystem einfach virtualisiert werden, indem das Verhalten der Datei-Schnittstellen entsprechend angepasst wird. Z.B. k\u00f6nnte man das Dateisystem der VM in ein Verzeichnis des Hosts oder in eine Datenbank abbilden. [17]<\/p>\n\n\n\n<p>Damit stehen die Grundlagen f\u00fcr die Containervirtualisierung bereit. Dadurch wird auch nachvollziehbar, weshalb Solomon Hykes in seinem Tweet WASM\/WASI mit Docker in Zusammenhang brachte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. WASM in der Cloud<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Einsatz in Kubernetes durch Krustlet<\/h3>\n\n\n\n<p><em>&#8220;Kubernetes [&#8230;] ist ein Open-Source-System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung von Container-Anwendungen [&#8230;]. Es zielt darauf ab, eine &#8216;Plattform f\u00fcr das automatisierte Bespielen, Skalieren und Warten von Anwendungscontainern auf verteilten Hosts&#8217; zu liefern.&#8221; [5]<\/em><\/p>\n\n\n\n<p>Damit entwickelte sich Kubernetes zu einer Cloud-Technologie, die von vielen Plattformen wie Microsofts Azure, IBM Cloud, Red Hats OpenShift, Amazons EKS, Googles Kubernetes Engine und Oracles OCI unterst\u00fctzt wird. [5]<\/p>\n\n\n\n<p>Ausgehend von (Teil-)Anwendungen, welche isoliert als Container entwickelt wurden, wird bei Kubernetes der Ziel-Zustand (<em>desired state<\/em>) f\u00fcr den Betrieb der bereitgestellten Container beschrieben. Die Beschreibung erfolgt mittels YAML-Dateien, welche das sog. <em>&#8220;record of intent&#8221;<\/em> darstellen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png\"><img loading=\"lazy\" decoding=\"async\" width=\"914\" height=\"495\" data-attachment-id=\"23189\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/rancher_blog_01-rancher-k8s-node-components-architecture\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png\" data-orig-size=\"914,495\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"rancher_blog_01-rancher-k8s-node-components-architecture\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png\" alt=\"\" class=\"wp-image-23189\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture.png 914w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture-300x162.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/rancher_blog_01-rancher-k8s-node-components-architecture-768x416.png 768w\" sizes=\"auto, (max-width: 914px) 100vw, 914px\" \/><\/a><figcaption class=\"wp-element-caption\"><em>Abb: Komponenten eines Kubernetes-Clusters mit zwei Nodes. Quelle: [6]<\/em><\/figcaption><\/figure>\n\n\n\n<p>Das Kubernetes-Cluster (verteilte Hosts) besteht aus sog. Nodes. Nodes sind physikalische oder virtuelle Maschinen, auf denen letztlich die Container ausgef\u00fchrt werden. Um die Ausf\u00fchrung der Container auf einer Node k\u00fcmmert sich der Kubelet-Agent. Dieser nimmt entsprechende Befehle vom Master entgegen, die beschreiben, welche Container auf derselben Node betrieben werden sollen.<\/p>\n\n\n\n<p>An dieser Stelle kommt <strong><a href=\"https:\/\/github.com\/krustlet\/krustlet\" target=\"_blank\" rel=\"noreferrer noopener\">Krustlet<\/a><\/strong> ins Spiel: Krustlet ist eine spezielle Implementierung eines Kubelet-Agents, der es erm\u00f6glicht, auf WASM+WASI basierende Container auszuf\u00fchren. Hier zahlt sich u.a. die Plattformunabh\u00e4ngigkeit von WASM aus. So muss f\u00fcr den Betrieb auf einer Node lediglich Krustlet installiert sein. Umgekehrt, kann auch darauf verzichtet werden, in der YAML-Spezifikation f\u00fcr Kubernetes mehrere Container-Images derselben Anwendung anzugeben, um unabh\u00e4ngig von der Rechnerarchtitektur der Nodes lauff\u00e4hig zu sein. [8]<\/p>\n\n\n\n<p>Demo-Projekte sind unter [18] verf\u00fcgbar.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 wasmCloud<\/h3>\n\n\n\n<p><a href=\"https:\/\/wasmcloud.dev\/\" target=\"_blank\" rel=\"noreferrer noopener\">wasmCloud<\/a> erh\u00f6ht das Abstraktionslevel noch weiter. Als Grundidee kommt hier das <a href=\"https:\/\/en.wikipedia.org\/wiki\/Actor_model\" target=\"_blank\" rel=\"noreferrer noopener\">Aktormodell<\/a> zum Einsatz. Eine Anwendung besteht hier aus <em>Actors<\/em> und <em>Capabillity Providers<\/em>. Actors enthalten die Gesch\u00e4ftslogik und nutzen Capabillity Providers. Ein Capabillity Provider kann z.B. eine Datenbank, eine Message Queue oder ein Webserver sein. [10]<\/p>\n\n\n\n<p>Die Komunikation zwischen den Komponenten (Actors &amp; Capabillity Providers) wird \u00fcber den Message Broker <a href=\"https:\/\/nats.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">NATS<\/a> realisiert. [11] Um die reibungslose Verarbeitung komplexer Datenstrukturen zu erm\u00f6glichen, wurde das Protokoll <a href=\"https:\/\/wapc.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">waPC (WebAssembly Procedure Call)<\/a> [13] eingef\u00fchrt. Es erinnert an <a href=\"https:\/\/de.wikipedia.org\/wiki\/Protocol_Buffers\" target=\"_blank\" rel=\"noreferrer noopener\">Protocol Buffers<\/a> aus dem gRPC Umfeld. Bei waPC werden die Schnittstellen (Interfaces) und Datenstrukturen der Komponenten in der Sprache <a href=\"https:\/\/github.com\/wapc\/widl-spec\" target=\"_blank\" rel=\"noreferrer noopener\">WIDL (WebAssembly Interface Definition Language)<\/a> definiert. [12] [14]<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-default\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_.jpeg\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23218\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/30\/webassembly-das-neue-docker-und-noch-mehr\/cosmonic-epochs-of-tech-press_\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_.jpeg\" data-orig-size=\"1920,1080\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Cosmonic-epochs-of-tech.press_\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-1024x576.jpeg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-1024x576.jpeg\" alt=\"\" class=\"wp-image-23218\" width=\"840\" height=\"472\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-1024x576.jpeg 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-300x169.jpeg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-768x432.jpeg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_-1536x864.jpeg 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/Cosmonic-epochs-of-tech.press_.jpeg 1920w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\"><em>Abb: Entwicklung der Abstraktionsgrade im Kontext von Cloud-Technologien. Quelle: [10]<\/em><\/figcaption><\/figure>\n\n\n\n<p>Das Aktormodell erm\u00f6glicht eine starke Entkopplung der Gesch\u00e4ftslogik. Folglich kann dadurch sog. Boilerplate-Code vermieden werden. [9] [10] Dies kann einen positiven Beitrag f\u00fcr die Developer Experience und f\u00fcr die Wartbarkeit von Projekten bedeuten.<\/p>\n\n\n\n<p>Empfehlenswert hierzu ist der Talk [9] mit einer Live Demo einer Web API (Spring PetClinic Beispiel).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Fazit<\/h2>\n\n\n\n<p>Die in diesem Artikel vorgestellten Cloud-Technologien sind zu diesem Zeitpunkt noch sehr jung und sollten deshalb eher noch nicht produktiv f\u00fcr wichtige Systeme eingesetzt werden. Dennoch zeigt sich, dass WebAssembly au\u00dferhalb des Browsers verschiedenste Einsatzm\u00f6glichkeiten haben kann und diese auch von verschiedensten Entwicklern und Gruppierungen erkundet werden. Insofern ist das Ende des &#8220;Mythos WebAssembly&#8221; noch nicht in Sicht. Dies liegt u.a. darin begr\u00fcndet, dass WebAssembly eine vergleichsweise &#8220;demokratische&#8221; Technologie ist, was in Abschnitt 2 deutlich wurde. So k\u00f6nnen Interessierte ohne gro\u00dfen Aufwand WebAssembly in ihr Projekt integrieren und entsprechende Schnittstellen definieren. Es bleibt also spannend.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Forschungsideen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Developer Experience<\/strong> (DX)\n<ul class=\"wp-block-list\">\n<li>Zeichnet sich bei den existierenden Ans\u00e4tzen schon eine Verbesserung der DX ab?<\/li>\n\n\n\n<li>Welche weiteren M\u00f6glichkeiten bietet WASM in der Zukunft bez\u00fcgl. der DX?<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Cloud-Anbieter:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Welche Cloud-Produkte werden bereits angeboten?<\/li>\n\n\n\n<li>Vergleich bez\u00fcgl. Features, Effizienz und weiterer Eigenschaften.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Edge Computing:<\/strong> Die Portabilit\u00e4t von WASM l\u00e4sst die Grenzen zwischen Service Provider Edge und User Edge verschwimmen.\n<ul class=\"wp-block-list\">\n<li>Welche neue Anwendungsm\u00f6glichkeiten ergeben sich hieraus?<\/li>\n\n\n\n<li>Wie stark kann die Dezentralisierung in diesem Zusammenhang gesteigert werden?<\/li>\n\n\n\n<li>Vergleich mit anderen Technologien und Ans\u00e4tzen im Bereich Edge Computing.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Security:<\/strong> Aktueller Stand der Security in der Praxis?\n<ul class=\"wp-block-list\">\n<li> Paper: <a href=\"https:\/\/www.unibw.de\/patch\/papers\/usenixsecurity20-wasm.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Everything Old is New Again: Binary Security of WebAssembly<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Vergleich<\/strong> von Technologien mit \u00e4hnlichen F\u00e4higkeiten:\n<ul class=\"wp-block-list\">\n<li>Java Virtual Machine bzw. <a href=\"https:\/\/www.graalvm.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">GraalVM<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n\n\n\n<p>Sofern nicht anders erw\u00e4hnt, wurden alle Links in diesem Artikel am 28.03.2022 abgerufen.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[1] <a href=\"https:\/\/depth-first.com\/articles\/2019\/10\/16\/compiling-c-to-webassembly-and-running-it-without-emscripten\/\">https:\/\/depth-first.com\/articles\/2019\/10\/16\/compiling-c-to-webassembly-and-running-it-without-emscripten\/<\/a><\/li>\n\n\n\n<li>[2] <a href=\"https:\/\/webassembly.org\/docs\/security\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/webassembly.org\/docs\/security\/<\/a><\/li>\n\n\n\n<li>[3] <a href=\"https:\/\/github.com\/wasmerio\/wasmer-python#readme\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/wasmerio\/wasmer-python#readme<\/a><\/li>\n\n\n\n<li>[4] <a href=\"https:\/\/docs.wasmer.io\/integrations\/examples\/host-functions\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.wasmer.io\/integrations\/examples\/host-functions<\/a><\/li>\n\n\n\n<li>[5] <a href=\"https:\/\/de.wikipedia.org\/wiki\/Kubernetes\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"https:\/\/de.wikipedia.org\/wiki\/Kubernetes\">https:\/\/de.wikipedia.org\/wiki\/Kubernetes<\/a><\/li>\n\n\n\n<li>[6] <a href=\"https:\/\/www.suse.com\/c\/rancher_blog\/understanding-the-kubernetes-node\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.suse.com\/c\/rancher_blog\/understanding-the-kubernetes-node\/<\/a><\/li>\n\n\n\n<li>[7] <a href=\"https:\/\/kubernetes.io\/docs\/reference\/command-line-tools-reference\/kubelet\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/kubernetes.io\/docs\/reference\/command-line-tools-reference\/kubelet\/<\/a><\/li>\n\n\n\n<li>[8] <a href=\"https:\/\/www.youtube.com\/watch?v=OK_U1egpO6E\" target=\"_blank\" rel=\"noreferrer noopener\">Kubecon EU 2021 Keynote: WebAssembly &amp; Cloud Native: Better Together<\/a><\/li>\n\n\n\n<li>[9] <a href=\"https:\/\/www.youtube.com\/watch?v=np3BgbPWtoE\" target=\"_blank\" rel=\"noreferrer noopener\">wasmCloud: wasm Primer Discussion, wasmCloud on the Edge Demo<\/a><\/li>\n\n\n\n<li>[10] <a href=\"https:\/\/cosmonic.com\/blog\/cosmonic-donates-wasmcloud-to-the-cloud-native-computing-foundation\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><a href=\"https:\/\/cosmonic.com\/blog\/cosmonic-donates-wasmcloud-to-the-cloud-native-computing-foundation\/\">wasmCloud Joins Cloud Native Computing Foundation as Sandbox Project<\/a><\/li>\n\n\n\n<li>[11] <a href=\"https:\/\/github.com\/wasmCloud\/wasmcloud-otp\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/wasmCloud\/wasmcloud-otp<\/a><\/li>\n\n\n\n<li>[12] <a href=\"https:\/\/www.youtube.com\/watch?v=onr01cQ9xNU\" target=\"_blank\" rel=\"noreferrer noopener\">wasmCloud: waPC cli &#8211; 1\/13\/21 Community Call<\/a><\/li>\n\n\n\n<li>[13] <a href=\"https:\/\/wapc.io\/docs\/spec\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/wapc.io\/docs\/spec\/<\/a><\/li>\n\n\n\n<li>[14] <a href=\"https:\/\/github.com\/wapc\/widl-spec\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/wapc\/widl-spec<\/a><\/li>\n\n\n\n<li>[15] <a href=\"https:\/\/github.com\/krustlet\/krustlet\/tree\/main\/demos\/wasi\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/krustlet\/krustlet\/tree\/main\/demos\/wasi<\/a><\/li>\n\n\n\n<li>[16] <a href=\"https:\/\/github.com\/WebAssembly\/WASI\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/WebAssembly\/WASI<\/a><\/li>\n\n\n\n<li>[17] <a href=\"https:\/\/github.com\/bytecodealliance\/wasmtime\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/bytecodealliance\/wasmtime<\/a><\/li>\n\n\n\n<li>[18] <a href=\"https:\/\/hacks.mozilla.org\/2017\/02\/creating-and-working-with-webassembly-modules\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/hacks.mozilla.org\/2017\/02\/creating-and-working-with-webassembly-modules\/<\/a><\/li>\n\n\n\n<li>[19] <a href=\"https:\/\/github.com\/appcypher\/awesome-wasm-langs\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/appcypher\/awesome-wasm-langs<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If WASM+WASI existed in 2008, we wouldn&#8217;t have needed to created Docker. That&#8217;s how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let&#8217;s hope WASI is up to the task! Tweet, Solomon Hykes (Erfinder von Docker), 2019 Dieser Tweet \u00fcber WebAssembly (WASM) des [&hellip;]<\/p>\n","protected":false},"author":1089,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[120,262,650,223],"tags":[7,3,580,267,581,266],"ppma_author":[873],"class_list":["post-22623","post","type-post","status-publish","format-standard","hentry","category-cloud-technologies","category-rich-media-systems","category-scalable-systems","category-ultra-large-scale-systems","tag-cloud","tag-docker","tag-wasi","tag-wasm","tag-wasmcloud","tag-webassembly"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":6688,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2019\/08\/04\/javascript-performance-optimization-with-respect-to-the-upcoming-webassembly-standard\/","url_meta":{"origin":22623,"position":0},"title":"JavaScript Performance optimization with respect to the upcoming WebAssembly standard","author":"tt031","date":"4. August 2019","format":false,"excerpt":"Written by Tim Tenckhoff \u2013 tt031 | Computer Science and Media 1. Introduction Speed and performance of the (worldwide) web advanced considerably over the last decades. With the development of sites more heavily reliant on JavaScript (JS Optimization, 2018), the consideration of actions to optimize the speed and performance of\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2019\/07\/javascript1-1.jpg?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":28857,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/03\/01\/building-a-modern-c-project-zig-webassembly-and-visual-ci-cd\/","url_meta":{"origin":22623,"position":1},"title":"Building a Modern C Project: Zig, WebAssembly, and Visual CI\/CD","author":"Tilman Zorn","date":"1. March 2026","format":false,"excerpt":"How we used Zig as a build system, Emscripten for the web, and Python for automated visual regression testing on a C-based path tracer. 1. Introduction Writing a path tracer from scratch in C is a fantastic way to learn the physics of light simulation. But maintaining that project, ensuring\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/03\/Mitsuba-Reference-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":26208,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/02\/29\/die-meere-der-systemtechnik-navigieren-eine-reise-durch-die-bereitstellung-einer-aktien-webanwendung-in-der-cloud\/","url_meta":{"origin":22623,"position":2},"title":"Die Meere der Systemtechnik navigieren: Eine Reise durch die Bereitstellung einer Aktien-Webanwendung in der Cloud","author":"mk306","date":"29. February 2024","format":false,"excerpt":"Auf zu neuen Ufern: Einleitung Die Cloud-Computing-Technologie hat die Art und Weise, wie Unternehmen Anwendungen entwickeln, bereitstellen und skalieren, revolutioniert. In diesem Beitrag, der im Rahmen der Vorlesung \u201c143101a System Engineering und Management\u201d entstanden ist, werden wir uns darauf konzentrieren, wie eine bereits bestehende Webanwendung zur Visualisierung und Filterung von\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2024\/02\/Dashboard2-Kopie-1.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":26254,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2024\/03\/21\/docker-security-hands-on-guide\/","url_meta":{"origin":22623,"position":3},"title":"Docker security: Hands-on guide","author":"Maximilian Tellmann","date":"21. March 2024","format":false,"excerpt":"Absichern von Docker Containern, durch die Nutzung von Best Practices in DockerFiles und Docker Compose. Einf\u00fchrung Es ist sehr wahrscheinlich im Alltag mit containerisierten Anwendungen in Ber\u00fchrung zu kommen, ohne sich dessen bewusst zu sein. In einer Zeit, in der sich der Trend der Unternehmen weiterhin stark in Richtung Cloud\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":21064,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/11\/how-do-you-get-a-web-application-into-the-cloud\/","url_meta":{"origin":22623,"position":4},"title":"How do you get a web application into the cloud?","author":"af094","date":"11. September 2021","format":false,"excerpt":"by Dominik Ratzel (dr079) and Alischa Fritzsche (af094) For the lecture \"Software Development for Cloud Computing\", we set ourselves the goal of exploring new things and gaining experience. We focused on one topic: \"How do you get a web application into the cloud?\". In doing so, we took a closer\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/availableRunners-150x118.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":22187,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/02\/25\/software-dependencies-die-gefahr-aus-der-tiefe\/","url_meta":{"origin":22623,"position":5},"title":"Software Dependencies &#8211; Die Gefahr aus der Tiefe","author":"Eric Prytulla","date":"25. February 2022","format":false,"excerpt":"\"Unbekannte infiltrieren Paketmanager npm und verseuchen Tools mit Schadcode\" hei\u00dft es am 08.11.2021 auf heise online. Die Nutzeraccounts der Maintainer von coa und rc wurden gehackt und neue Versionen dieser Pakete hochgeladen (inklusive Malware). Zwar denken sich bestimmt viele bei coa und rc: \"Aha toll\", aber sp\u00e4testens bei React oder\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/03\/140321634-2a9eb717-7aee-4d6f-9e85-b0ad7fc9eb9f.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":873,"user_id":1089,"is_guest":0,"slug":"rw051","display_name":"Raphael Wettinger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f97aed580a14924b0c1bf48960ea3a57f90a772cc37aa04464ba778b930d8f77?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22623","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1089"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=22623"}],"version-history":[{"count":353,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22623\/revisions"}],"predecessor-version":[{"id":25334,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/22623\/revisions\/25334"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=22623"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=22623"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=22623"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=22623"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}