From 9654dd0c3e85236309e38fb84c9759e70b53be01 Mon Sep 17 00:00:00 2001 From: Arman Date: Sat, 20 Jun 2026 13:33:27 +0530 Subject: [PATCH 1/2] docs: add blog post evaluating GHC WASM for browser-based execution and supporting architecture diagrams --- ...asm-for-browser-based-haskell-execution.md | 173 ++++++++++++++++++ .../1.Understanding Ghc browser diagram.png | Bin 0 -> 17269 bytes images/2.traditional vs native diag.png | Bin 0 -> 2771 bytes images/3.native diag.png | Bin 0 -> 3161 bytes images/4.architecure diag.png | Bin 0 -> 21719 bytes images/5.webassembly diag.png | Bin 0 -> 11352 bytes images/6.wasi working.png | Bin 0 -> 3892 bytes images/7.execution flow.png | Bin 0 -> 46928 bytes images/8.working module.png | Bin 0 -> 16522 bytes 9 files changed, 173 insertions(+) create mode 100644 _posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md create mode 100644 images/1.Understanding Ghc browser diagram.png create mode 100644 images/2.traditional vs native diag.png create mode 100644 images/3.native diag.png create mode 100644 images/4.architecure diag.png create mode 100644 images/5.webassembly diag.png create mode 100644 images/6.wasi working.png create mode 100644 images/7.execution flow.png create mode 100644 images/8.working module.png diff --git a/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md b/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md new file mode 100644 index 0000000..6d479ae --- /dev/null +++ b/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md @@ -0,0 +1,173 @@ +--- +layout: post +title: "Evaluating GHC WASM for Browser-Based Haskell Execution" +date: 2026-06-20 12:56:00 +0530 +categories: blog +--- + + + +**GHC in the Browser** + +*How WebAssembly makes a full Haskell compiler run client-side* + +Arman Sanjay Choudhary · GSoC 2026 · Haskell.org + +# **Introduction: Exploring GHC in the Browser** + +As part of my Google Summer of Code 2026 project with Haskell.org, I am working on integrating a GHC/WebAssembly backend into **xeus-haskell** — a Jupyter kernel for Haskell that currently runs on MicroHs. My task is to implement a Wasm-based GHC kernel so that xeus-haskell can support the full GHC language and a broader set of Hackage packages inside JupyterLite. + +Before building it, I studied **GHC in Browser** — an existing project that already runs GHC entirely in the browser using WebAssembly. Understanding how it works is the most direct preparation for the implementation work ahead. + +This article documents what I learned: how the major components connect, how code moves through the system, and which design choices make browser-native GHC execution possible. It is not a deep implementation guide — it is a system-level walkthrough written to inform the xeus-haskell integration. + +## **Motivation** + +The main motivation is to make Haskell easier to access. Today, using Haskell interactively usually requires either a server running in the background or a local GHC installation. Both can make it harder for new users to get started. + +Running Haskell directly in the browser changes that. A student can open a URL and start writing code immediately without installing anything. This makes Haskell easier to use in classrooms, tutorials, online playgrounds, and browser-based notebooks. + +It also has some practical benefits: + +* Easier for beginners to get started. +* Useful for education and interactive learning. +* Works well with browser-based notebooks such as JupyterLite. +* Reduces the need for dedicated server infrastructure. +* Benefits from the browser's built-in security sandbox. +* Can continue working offline after the initial download. + +These are some of the reasons why browser-native Haskell is interesting and why understanding projects like **GHC in Browser** is useful for future work on **xeus-haskell**. + +**1\. Understanding GHC in Browser** + +Before examining implementation details, it is useful to understand the system from a high level. + +From a user's perspective, the workflow is straightforward: + +1. Open the web application. +2. Write Haskell code. +3. Press Run. +4. Receive the result. + +Internally, several components cooperate to make this possible. + +![Understanding GHC in Browser](/images/1.Understanding%20Ghc%20browser%20diagram.png) + +The browser hosts both the user interface and the compiler runtime. Supporting infrastructure such as a virtual filesystem and WebAssembly runtime provides the environment that GHC expects during compilation and execution. + +**1.1 Traditional vs Browser-Native Execution** + +Historically, most online programming environments followed a server-based architecture. + +![Traditional vs native execution](/images/2.traditional%20vs%20native%20diag.png) + +The browser acted primarily as a client while compilation and execution occurred on remote infrastructure. + +In contrast, GHC in Browser moves the execution environment into the browser itself. + +![Browser-native execution](/images/3.native%20diag.png) + +After the application has loaded, code compilation and execution occur locally within the user's browser session. + +This architectural shift changes where computation occurs, reduces dependence on remote infrastructure, and provides a useful foundation for browser-native development tools. + +# **1.2 Architectural Questions** + +While exploring the project, I focused on four questions: + +1. How is GHC compiled to WebAssembly? +2. How does the browser provide the environment expected by GHC? +3. How are compiled artifacts loaded and executed? +4. How does the system remain responsive during compilation? + +The remainder of this article examines the components involved in answering these questions. + +**2\. Architecture Overview** + +The system can be viewed as four major layers. + +![Architecture overview](/images/4.architecure%20diag.png) + +Each layer has a distinct responsibility: + +| Layer | Responsibility | +| :---- | :---- | +| **User Interface** | Code editing and result presentation | +| **JavaScript Runtime** | Loading modules and coordinating execution | +| **GHC WebAssembly Runtime** | Interpreted and program execution | +| **Browser Platform** | WebAssembly execution and browser APIs | + +**2.1 The Role of WebAssembly** + +At the core of the system is WebAssembly (Wasm), a portable binary format designed to run efficiently across different platforms. Instead of interpreting GHC for a traditional operating system, the interpreter is built for the WebAssembly target and executed inside the browser. + +This allows the browser to host a complete Haskell toolchain without requiring a remote server. Once the required resources have been downloaded, execution happens locally on the user's machine. + +![WebAssembly execution model](/images/5.webassembly%20diag.png) + +WebAssembly provides the execution environment, while JavaScript supplies the browser-specific functionality needed by the interpreter. + +**2.3 The Role of WASI** + +GHC expects access to features normally provided by an operating system, including files, directories, and standard input/output streams. Browsers do not provide these interfaces directly. + +To bridge this gap, GHC in Browser relies on the WebAssembly System Interface (WASI). WASI provides a standard set of APIs that allow WebAssembly programs to interact with their environment in a controlled and portable manner. + +![WASI working diagram](/images/6.wasi%20working.png) + +Using WASI, the browser can provide many of the services that GHC expects while still maintaining the browser's security model. + +**3\. Execution Flow** + +Once the environment has been initialized, the execution process follows a predictable sequence. + +## **3.1 From Code to Result** + +When a user presses **Run**, the browser sends the source code to the GHC runtime for compilation and evaluation. + +![Execution flow](/images/7.execution%20flow.png) + +From the user's perspective, this appears as a simple request-and-response workflow. Internally, however, the code passes through several compilation stages before the final result is produced. + +# + +# **3.2 Why a Virtual Filesystem is Needed** + +A traditional GHC installation relies heavily on files stored on disk. Standard libraries, package metadata, and temporary compilation artifacts are all accessed through the filesystem. + +Because browsers do not provide a traditional filesystem, GHC in Browser creates a virtual filesystem that mimics the structure expected by the compiler. + +The virtual filesystem contains: + +* GHC runtime resources +* Standard Haskell libraries +* Package information +* Temporary files used during compilation + +From the compiler's perspective, this environment behaves similarly to a normal local installation. + +# **4\. Relevance to xeus-haskell** + +The ideas explored in GHC in Browser are particularly relevant to the ongoing work on xeus-haskell. A browser-compatible GHC runtime could eventually allow notebook environments to execute Haskell code locally without depending on a remote execution service. + +![Working module diagram](/images/8.working%20module.png) + +While the implementation details will differ, many of the same architectural concepts—WebAssembly execution, filesystem virtualization, and browser-based runtime management—are directly applicable. + +### **5\. Key Takeaways** + +* GHC in Browser demonstrates that a full GHC toolchain can run inside a web browser using WebAssembly. +* The system combines multiple components, including a browser interface, JavaScript runtime, GHC WebAssembly runtime, and a virtual filesystem. +* WebAssembly provides the execution environment, while WASI and browser APIs help supply the services that GHC normally expects from an operating system. +* After the initial application loads, compilation and execution take place locally in the user's browser rather than on a remote server. +* The architecture provides useful ideas for future browser-based Haskell tools, including notebook environments built on xeus-haskell and JupyterLite. + +# + +# **6\. Conclusion** + +GHC in Browser is an interesting example of how modern WebAssembly technology can move traditionally server-side development tools into the browser. By combining a WebAssembly-compiled version of GHC with supporting runtime infrastructure, the project makes it possible to compile and run Haskell code locally within a browser session. + +For my GSoC project, this exploration served as a foundation for understanding how a browser-native Haskell environment can be built. Many of the ideas used in GHC in Browser—such as WebAssembly execution, virtual filesystem support, and browser-based runtime management—are directly relevant to the planned integration of a GHC/WebAssembly backend into xeus-haskell. + +While the implementation details will differ, studying GHC in Browser provided valuable insight into the architectural challenges and design decisions involved in bringing the Haskell ecosystem closer to browser-based notebooks and interactive computing environments. As WebAssembly continues to mature, projects like these may help make Haskell tooling more accessible to students, educators, and developers without requiring complex local installations or dedicated server infrastructure. diff --git a/images/1.Understanding Ghc browser diagram.png b/images/1.Understanding Ghc browser diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..77e2e9f337b943ac4cb0ac7803a35c7c9cb541cc GIT binary patch literal 17269 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 literal 0 HcmV?d00001 diff --git a/images/2.traditional vs native diag.png b/images/2.traditional vs native diag.png new file mode 100644 index 0000000000000000000000000000000000000000..be82207a13c34501fa0731b6e8b64318df41ae1c GIT binary patch literal 2771 zcmds2dpHwp8~0Y;l2qQeno~BCNG7F3vK)qql`~_T^C71&haBdRLv8cUF|!DBSj=f= z4wGq)sbNUrmFn{@WD;_C5#Rdv`>Vgd`?{Xr^Lwt}@4m0+zOMUvo=11!rV@u`4vUD0 zNWjdDtwluk0fZcPXulA_uB1WX_FI^>si8>ipxnIhaKOjF(m+InP88p96BWAgcPwn7 zQc_Y85fRPJ&Gq&5OeWLX+Bz~avZ<-b+}u1iHkL}I>gnkf78cq&IA~tFl$n)PR8(YZ zXGbEDDk>^0;qbDuvb?-JGZ+jA0^#v^GMQ{*YMPamMWImiA&{ctVj7L+;^HzoIvN%h z#%8k#1j2<27o?@7&!0c9tE&rx!R+nr-Q3*#{r#h(qvPY_lai8>lao_YQsUy`f`fy- zyu1(ygoTBLqobp$sw#)WdHndXtgI{;3^p`0w6nAG_4Q3nO-)Ehc<|uCqeqW$I9ys< zT0lU6tE;Plfx)FqmlPEhTU%R)hli`Ht35nCOiWCmP$-c|OiWD7&dx3`FYoW~Z)s`C z&(9AE3i9#sad&q|qtQqt(%ISB&(AM3H1y%ahrPYMjg5`>@89q1>+|;ZhCm=085yOe zrNza?>FMd7o}La44o*%^;o;#`RaG4w9i5$>0|Ntu^z_==S~whj>+1u7Kx1R$k&%(-&!6K7gs!fxy1KfYoSbXdt_=7){4@)T(6A&9EdfbR zAgidT(5kTv2E)k6h+IuRbLI?MMQoVz>E!Sqfm?Q zx6wA?a(&AoCpD0ky5lN(AI}=^6MJqYCY2#wR-6O|DcN4-MTnioeourVZYU?W6kl(KyUd5QX$3n$`73iL z)%xr#)d^LoH5bdk_c`R1tuYVTQv|1m3Qe8+f!QiJ_Zi(T7HK2aEpBj2;ucxviFU2J zBU82XYVay|K%L2FAk><)`Wl&emgDAUn0A)N0Jm?QP2&|gViFSNe@6-mY73xQ9sZF& z4EQi>R@gv1V~LYI`T(5cRcpGrP;ZB-ePs zj1}PqoHF!<(8ZGa+^Cv@k%Xmn#P;)~ws(_5Z9HAi0}*cYb#eW@7^?5TrG~m~<68qb z`tp}~4DZ7#rlXF{{4$Z^T9VCuCviKHI2z7EAHNWXYJ&UA!-l}Ak1t01PA1;?zWw6h zkEHgY1lPg=wc5_&j@x>p=Btl96bI7Hrrh)(>{&li4)-$ z()pMP73VD@$a_j$Sv^MK2WND)Jj^8D`k)|k%e+{8@n@lcwHfEMMl)UH)uIod^;bWc zqK>Hp1L$S1PqDOI`Ok)%#m_$o^b#~YDva<83roIe?a0dTreijy-iS(^m^0kYkQ^5s zQ(rRthQS8>De(F6z3K1yEYt}L-ppv5IQe2dbrn3dzv#&KBbI+)ly0<1#m1M6q_i{q z>wos)4QS$cY1W4{EI7=&#$pe??>%rs|7{Od+Ai>wPAat$|3Z=5c3kj1KXpCR5g@kg z)t7TjUvCY(&p~=8<%B12Sl?4A!fokm=F#lGZbefKH1IFT^BA32tnSv3mK@r;pt5{( z^`v`a=wF{IBR`dBcOPvU7W-=R09ntdiBk&eOnm!K7iIie>^GsTpe}W4enxDaZ8ITi z$7Q(&&oYln`yqMj?`9>mKuGGy;v1c~=s!0x#Pv-ZB!{S>s_CU4w_v2xd#|Fu>kuZU*J0(gXZV<{>nR3Wu*V3j*EsOt_i1`x>b*FFp zPhM@^q^=ajmju1pkc=bwugjNYn&Xr!b|&S+0-d0?{S{kGsm?;OS=3feHcz4J%r z6*)OESL%s!JF7f&`Pmu|#$g$*L{E<>V*^z;!JfIf%QF)`h;z|prLC|T?;u-11tx6U zp6~IY^AJlaanA^#Jeu2)>oJvNg(O+D%G4DMLmlUKTi?E%-)gmQDHfN;a7um=q^DCj z5a5&?0+OWa8d!k-ef{`b7TMM1b$@n-W0KUInKzQw4cHWf&B0Tx;l>^k2)c BtFZt8 literal 0 HcmV?d00001 diff --git a/images/3.native diag.png b/images/3.native diag.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d279cb4819845fe9d79b7ec8052d1dc2bc38cf GIT binary patch literal 3161 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 literal 0 HcmV?d00001 diff --git a/images/6.wasi working.png b/images/6.wasi working.png new file mode 100644 index 0000000000000000000000000000000000000000..d759284bcc1d40fb045b6ee755938ccdb284a1fc GIT binary patch literal 3892 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 Q>HoN2uyKIZTV1>PKb1*%OaK4? literal 0 HcmV?d00001 diff --git a/images/7.execution flow.png b/images/7.execution flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbf2f433c5af18ea1fd75c6c37c93d9f4b8f346 GIT binary patch literal 46928 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�<}}~VmuH9MObQ+?*X!-zrG-Vyt2*D$ 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 literal 0 HcmV?d00001 diff --git a/images/8.working module.png b/images/8.working module.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fae2a99c51188491df2c7eac9b6fdd7173a552 GIT binary patch literal 16522 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 literal 0 HcmV?d00001 From 4440ccc34637f0bc07c7c999d4e52009f3d0e1e1 Mon Sep 17 00:00:00 2001 From: Arman Date: Thu, 25 Jun 2026 20:09:41 +0530 Subject: [PATCH 2/2] feat: add blog post evaluating GHC WASM for browser-based Haskell execution --- ...asm-for-browser-based-haskell-execution.md | 193 +++++++++--------- 1 file changed, 101 insertions(+), 92 deletions(-) diff --git a/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md b/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md index 6d479ae..8bf7867 100644 --- a/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md +++ b/_posts/2026-06-20-evaluating-ghc-wasm-for-browser-based-haskell-execution.md @@ -1,173 +1,182 @@ --- layout: post -title: "Evaluating GHC WASM for Browser-Based Haskell Execution" +title: "What I Learned Studying GHC WASM for Browser-Based Haskell" date: 2026-06-20 12:56:00 +0530 categories: blog --- +# What I Learned Studying GHC WASM for Browser-Based Haskell +*Pulling apart the architecture of GHC in Browser to prepare for a WebAssembly-backed Jupyter kernel* -**GHC in the Browser** -*How WebAssembly makes a full Haskell compiler run client-side* +## Why This Matters -Arman Sanjay Choudhary · GSoC 2026 · Haskell.org +My Google Summer of Code 2026 project with Haskell.org is to bring a GHC/WebAssembly backend to **xeus-haskell** — a Jupyter kernel for Haskell that currently runs on MicroHs. The goal: let people write real GHC Haskell inside JupyterLite, with the full language and a broad slice of Hackage, without needing a server. -# **Introduction: Exploring GHC in the Browser** +Before building that, I needed to understand how someone has already made GHC run entirely in a browser. **GHC in Browser** is exactly that project, and studying it gave me the clearest picture of what's involved. -As part of my Google Summer of Code 2026 project with Haskell.org, I am working on integrating a GHC/WebAssembly backend into **xeus-haskell** — a Jupyter kernel for Haskell that currently runs on MicroHs. My task is to implement a Wasm-based GHC kernel so that xeus-haskell can support the full GHC language and a broader set of Hackage packages inside JupyterLite. +Honestly, going in, I expected the main challenge to be getting the GHC codebase to compile to WebAssembly at all. What I found was different — and more interesting — than what I anticipated. Here's what I came away with: -Before building it, I studied **GHC in Browser** — an existing project that already runs GHC entirely in the browser using WebAssembly. Understanding how it works is the most direct preparation for the implementation work ahead. +- **GHC can genuinely run client-side.** The compiler, the RTS, the package database — all of it can live inside a browser tab once you compile GHC to WebAssembly. +- **The hard problems aren't compilation — they're environment.** Before looking at the project, I assumed getting GHC itself into WebAssembly would be the hardest part. What surprised me was that many of the difficult problems appear after compilation: providing filesystem access, I/O, and enough operating-system functionality for the compiler to feel at home. +- **WASI is the bridge that makes it practical.** The WebAssembly System Interface gives GHC the POSIX-like surface it expects without breaking the browser's security sandbox. I hadn't appreciated how much of the heavy lifting WASI does until I traced through the actual call paths. +- **The architecture appears to map well onto xeus-haskell.** At a high level, the same layered approach — Wasm execution, virtual filesystem, JavaScript glue — should apply to building a notebook kernel, although I expect additional challenges to surface once notebook execution semantics enter the picture. -This article documents what I learned: how the major components connect, how code moves through the system, and which design choices make browser-native GHC execution possible. It is not a deep implementation guide — it is a system-level walkthrough written to inform the xeus-haskell integration. +The rest of this post walks through the architecture in detail. If you're interested in GHC WASM, browser-native dev tools, or just want to understand how a 30-year-old compiler ends up running in a browser tab, read on. -## **Motivation** +## The Case for Browser-Native Haskell -The main motivation is to make Haskell easier to access. Today, using Haskell interactively usually requires either a server running in the background or a local GHC installation. Both can make it harder for new users to get started. +Today, using Haskell interactively usually means one of two things: install GHC locally, or connect to a server that runs it for you. Both create friction. A student in a classroom has to fight with toolchain setup before writing a single line of code. A tutorial author has to maintain infrastructure or hope readers will figure out the install themselves. -Running Haskell directly in the browser changes that. A student can open a URL and start writing code immediately without installing anything. This makes Haskell easier to use in classrooms, tutorials, online playgrounds, and browser-based notebooks. +Running Haskell directly in the browser changes that equation: -It also has some practical benefits: +* A student can open a URL and start coding immediately — no install, no setup. +* Educators can embed live Haskell environments in course materials. +* Browser-based notebooks like JupyterLite can execute Haskell without a remote kernel. +* Once the initial download finishes, everything works offline. +* The browser's security sandbox provides isolation for free. -* Easier for beginners to get started. -* Useful for education and interactive learning. -* Works well with browser-based notebooks such as JupyterLite. -* Reduces the need for dedicated server infrastructure. -* Benefits from the browser's built-in security sandbox. -* Can continue working offline after the initial download. +These are the reasons I care about GHC WASM specifically — not as a curiosity, but as the foundation for making xeus-haskell work without server infrastructure. When I first started reading about WebAssembly in the context of compilers, I wasn't sure how far the technology had actually come. Seeing GHC in Browser work end-to-end was the moment it clicked for me that this was a real path forward, not just an interesting proof of concept. -These are some of the reasons why browser-native Haskell is interesting and why understanding projects like **GHC in Browser** is useful for future work on **xeus-haskell**. +## How GHC in Browser Works -**1\. Understanding GHC in Browser** +With that context in mind, let's look at how the existing GHC in Browser project actually pulls this off. From a user's perspective, the workflow is dead simple: -Before examining implementation details, it is useful to understand the system from a high level. +1. Open the web app. +2. Write some Haskell. +3. Hit Run. +4. See the result. -From a user's perspective, the workflow is straightforward: - -1. Open the web application. -2. Write Haskell code. -3. Press Run. -4. Receive the result. - -Internally, several components cooperate to make this possible. +Behind that simplicity, several components cooperate to create an environment where GHC can do its thing. ![Understanding GHC in Browser](/images/1.Understanding%20Ghc%20browser%20diagram.png) -The browser hosts both the user interface and the compiler runtime. Supporting infrastructure such as a virtual filesystem and WebAssembly runtime provides the environment that GHC expects during compilation and execution. +The browser hosts both the UI and the compiler runtime. A virtual filesystem, a WebAssembly runtime, and JavaScript glue code provide the environment that GHC expects during compilation and execution. -**1.1 Traditional vs Browser-Native Execution** +### Traditional vs Browser-Native Execution -Historically, most online programming environments followed a server-based architecture. +Most online programming environments follow a familiar pattern: the browser is a thin client, and compilation happens on a remote server. ![Traditional vs native execution](/images/2.traditional%20vs%20native%20diag.png) -The browser acted primarily as a client while compilation and execution occurred on remote infrastructure. - -In contrast, GHC in Browser moves the execution environment into the browser itself. +GHC in Browser flips this around. After the initial load, all compilation and execution happens locally in the user's browser session. ![Browser-native execution](/images/3.native%20diag.png) -After the application has loaded, code compilation and execution occur locally within the user's browser session. - -This architectural shift changes where computation occurs, reduces dependence on remote infrastructure, and provides a useful foundation for browser-native development tools. +This isn't just a deployment detail — it changes the fundamental assumptions. There's no round-trip latency for compilation, no server to maintain, and no scaling concerns when more users show up. I'll admit that when I first heard "GHC runs in the browser," I half-expected there to be a server hiding behind the scenes. There isn't. Once the Wasm module loads, the browser is doing all the work. -# **1.2 Architectural Questions** +### The Questions I Focused On -While exploring the project, I focused on four questions: +While studying the project, I kept coming back to four questions: -1. How is GHC compiled to WebAssembly? -2. How does the browser provide the environment expected by GHC? -3. How are compiled artifacts loaded and executed? -4. How does the system remain responsive during compilation? +1. How is GHC compiled to WebAssembly in the first place? +2. How does the browser provide the environment GHC expects (files, I/O, etc.)? +3. How are compiled artifacts loaded and executed? +4. How does the system stay responsive while GHC is compiling? -The remainder of this article examines the components involved in answering these questions. +The rest of this post works through the components that answer each of these. -**2\. Architecture Overview** +## Architecture: Four Layers -The system can be viewed as four major layers. +To answer the questions above, it helps to view the system as a set of cooperating layers. ![Architecture overview](/images/4.architecure%20diag.png) -Each layer has a distinct responsibility: - -| Layer | Responsibility | +| Layer | What It Does | | :---- | :---- | -| **User Interface** | Code editing and result presentation | -| **JavaScript Runtime** | Loading modules and coordinating execution | -| **GHC WebAssembly Runtime** | Interpreted and program execution | -| **Browser Platform** | WebAssembly execution and browser APIs | +| **User Interface** | Code editing and result display | +| **JavaScript Runtime** | Module loading and execution coordination | +| **GHC WebAssembly Runtime** | The compiler and interpreter, compiled to Wasm | +| **Browser Platform** | WebAssembly execution engine and browser APIs | -**2.1 The Role of WebAssembly** +### The Role of WebAssembly -At the core of the system is WebAssembly (Wasm), a portable binary format designed to run efficiently across different platforms. Instead of interpreting GHC for a traditional operating system, the interpreter is built for the WebAssembly target and executed inside the browser. +At the core of the whole thing is WebAssembly. Instead of running GHC as a native binary, the compiler is built targeting the Wasm instruction set and executed inside the browser's Wasm runtime. -This allows the browser to host a complete Haskell toolchain without requiring a remote server. Once the required resources have been downloaded, execution happens locally on the user's machine. +This is what makes "GHC in the browser" possible at all. Once the Wasm module has been downloaded and instantiated, you have what is effectively a full Haskell toolchain running on the client. No server involved. Seeing this for the first time was a bit surreal — the same compiler I'd been installing through GHCup was now sitting inside a browser tab. ![WebAssembly execution model](/images/5.webassembly%20diag.png) -WebAssembly provides the execution environment, while JavaScript supplies the browser-specific functionality needed by the interpreter. +WebAssembly handles the heavy lifting of execution, while JavaScript acts as the bridge to browser-specific functionality — things like DOM interaction, async scheduling, and network access. + +### Bridging JavaScript and GHC + +One thing that wasn't immediately obvious to me is how much work the JavaScript layer does. I initially assumed JavaScript was just there to load the page and kick off the Wasm module. In reality, GHC compiled to Wasm is just a binary — it doesn't know how to talk to the browser. The JavaScript runtime handles: -**2.3 The Role of WASI** +- **Loading the Wasm module** and instantiating it with the right imports. +- **Providing callback functions** that GHC calls when it needs to interact with the outside world (printing output, reading input, accessing files). +- **Managing async coordination** so that long-running compilations don't freeze the browser tab. -GHC expects access to features normally provided by an operating system, including files, directories, and standard input/output streams. Browsers do not provide these interfaces directly. +This JavaScript glue is the connective tissue between "GHC as a Wasm binary" and "GHC as a usable browser application." It's also the layer where I expect most of the xeus-haskell integration work will happen — the Jupyter protocol messages will need to flow through this same boundary. -To bridge this gap, GHC in Browser relies on the WebAssembly System Interface (WASI). WASI provides a standard set of APIs that allow WebAssembly programs to interact with their environment in a controlled and portable manner. +### The Role of WASI + +GHC assumes it's running on something like a Unix system. It wants to open files, read directories, write to stdout, and access environment variables. Browsers don't offer any of that. + +The WebAssembly System Interface (WASI) fills this gap. It defines a standardised set of APIs that Wasm programs can call to interact with their host environment in a controlled way. ![WASI working diagram](/images/6.wasi%20working.png) -Using WASI, the browser can provide many of the services that GHC expects while still maintaining the browser's security model. +In practice, WASI lets GHC call functions like `fd_read` and `fd_write` as if it were making normal system calls. The browser-side WASI implementation translates those calls into operations on an in-memory virtual filesystem or JavaScript-managed I/O streams. -**3\. Execution Flow** +This turned out to be one of the cleanest parts of the architecture, and the part that shifted my thinking the most. GHC doesn't need any browser-specific modifications — it just talks to WASI, and the host environment figures out the rest. Before studying this, I had vaguely assumed that running GHC in a browser would require patching the compiler itself. The fact that WASI lets it work largely unmodified was a genuine surprise. -Once the environment has been initialized, the execution process follows a predictable sequence. +### Why a Virtual Filesystem Is Needed -## **3.1 From Code to Result** +A traditional GHC installation relies heavily on the filesystem. Base libraries, package databases, interface files, temporary compilation artifacts — GHC reads and writes files constantly during compilation. -When a user presses **Run**, the browser sends the source code to the GHC runtime for compilation and evaluation. +Browsers don't have a filesystem. So GHC in Browser creates one in memory, pre-populated with everything the compiler needs: -![Execution flow](/images/7.execution%20flow.png) +* GHC's runtime resources and configuration +* The standard Haskell libraries (base, containers, text, etc.) +* Package registration files +* A writable area for temporary files generated during compilation -From the user's perspective, this appears as a simple request-and-response workflow. Internally, however, the code passes through several compilation stages before the final result is produced. +From the compiler's point of view, it's just reading and writing files as usual. It has no idea those "files" are backed by JavaScript arrays in memory rather than an actual disk. -# +This is the kind of detail that's easy to overlook until you try to build something similar. When I first thought about what xeus-haskell would need, I was focused on the compiler and the Jupyter protocol. The virtual filesystem didn't even occur to me as a major piece of work. Now I think it might be one of the more involved parts — the notebook kernel will need the same kind of pre-populated environment, likely with additional packages depending on what users want to import, and managing that package set at runtime could get complicated. -# **3.2 Why a Virtual Filesystem is Needed** +## Execution Flow -A traditional GHC installation relies heavily on files stored on disk. Standard libraries, package metadata, and temporary compilation artifacts are all accessed through the filesystem. +With the environment set up, here's what actually happens when you press Run. -Because browsers do not provide a traditional filesystem, GHC in Browser creates a virtual filesystem that mimics the structure expected by the compiler. +### From Source Code to Result -The virtual filesystem contains: +The user's code goes through the full GHC pipeline: parsing, type checking, desugaring, simplification, code generation, and finally execution of the compiled output. -* GHC runtime resources -* Standard Haskell libraries -* Package information -* Temporary files used during compilation +![Execution flow](/images/7.execution%20flow.png) + +From the user's perspective this looks like a simple request-response cycle, but internally it's the same multi-stage compilation process that happens on a desktop GHC installation. The difference is that every stage runs inside the Wasm sandbox. -From the compiler's perspective, this environment behaves similarly to a normal local installation. +## What This Means for xeus-haskell -# **4\. Relevance to xeus-haskell** +At a high level, the architecture of GHC in Browser appears to map surprisingly well onto the xeus-haskell problem. Both need: -The ideas explored in GHC in Browser are particularly relevant to the ongoing work on xeus-haskell. A browser-compatible GHC runtime could eventually allow notebook environments to execute Haskell code locally without depending on a remote execution service. +- A GHC runtime compiled to WebAssembly +- A virtual filesystem with the standard libraries and package database +- JavaScript glue to bridge browser APIs and the Wasm runtime +- Async handling so the UI stays responsive during compilation ![Working module diagram](/images/8.working%20module.png) -While the implementation details will differ, many of the same architectural concepts—WebAssembly execution, filesystem virtualization, and browser-based runtime management—are directly applicable. +The most obvious difference is the communication protocol. GHC in Browser talks directly to a web UI, while xeus-haskell needs to speak the Jupyter messaging protocol so it can plug into JupyterLite as a proper kernel. But I suspect there are less obvious differences too — notebook kernels need to manage persistent state across cells, handle interrupts gracefully, and deal with richer output types than plain text. Those are problems GHC in Browser doesn't have to solve, and I don't yet know how cleanly the current architecture will accommodate them. + +That said, studying GHC in Browser gave me a much more concrete understanding of each layer — what it does, why it's needed, and where I should expect friction. Before this investigation, my mental model of "GHC in a browser" was fairly hand-wavy. Now I have a clearer sense of which pieces I can likely reuse and which ones I'll need to build or adapt from scratch. That's the foundation I'm working from as I start the xeus-haskell implementation this summer. -### **5\. Key Takeaways** +## Next Steps -* GHC in Browser demonstrates that a full GHC toolchain can run inside a web browser using WebAssembly. -* The system combines multiple components, including a browser interface, JavaScript runtime, GHC WebAssembly runtime, and a virtual filesystem. -* WebAssembly provides the execution environment, while WASI and browser APIs help supply the services that GHC normally expects from an operating system. -* After the initial application loads, compilation and execution take place locally in the user's browser rather than on a remote server. -* The architecture provides useful ideas for future browser-based Haskell tools, including notebook environments built on xeus-haskell and JupyterLite. +If this kind of work interests you, here's where to look: -# +- **[GHC in Browser](https://petertrsko.github.io/ghc-wasm-haskell-playground/)** — try it yourself, compile some Haskell in your browser tab. +- **[xeus-haskell](https://github.com/IHaskell/xeus-haskell)** — the Jupyter kernel this work feeds into. Contributions welcome. +- **[GHC WASM backend](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/wasm.html)** — the GHC documentation on the WebAssembly backend. +- **[WASI specification](https://wasi.dev/)** — if you want to understand the system interface layer in depth. -# **6\. Conclusion** +## Conclusion -GHC in Browser is an interesting example of how modern WebAssembly technology can move traditionally server-side development tools into the browser. By combining a WebAssembly-compiled version of GHC with supporting runtime infrastructure, the project makes it possible to compile and run Haskell code locally within a browser session. +This exploration gave me a much clearer picture of what is required to bring full GHC support to browser-based notebook environments — and an honest sense of which parts I still don't fully understand. The next step is applying these lessons to xeus-haskell and finding out how much of this architecture can actually be reused within a JupyterLite kernel versus how much will need to be rethought. -For my GSoC project, this exploration served as a foundation for understanding how a browser-native Haskell environment can be built. Many of the ideas used in GHC in Browser—such as WebAssembly execution, virtual filesystem support, and browser-based runtime management—are directly relevant to the planned integration of a GHC/WebAssembly backend into xeus-haskell. +I'll be posting updates as the GSoC project progresses. If you've worked with GHC WASM, WASI, or browser-based compiler tooling and have thoughts, I'd genuinely appreciate hearing from you. -While the implementation details will differ, studying GHC in Browser provided valuable insight into the architectural challenges and design decisions involved in bringing the Haskell ecosystem closer to browser-based notebooks and interactive computing environments. As WebAssembly continues to mature, projects like these may help make Haskell tooling more accessible to students, educators, and developers without requiring complex local installations or dedicated server infrastructure. +*Arman Sanjay Choudhary*