> blog // comparison

Ten languages, one window: what you install

October 23, 2026 · Neper binaries measured with emit-executable; every other number is cited below

Putting one window on screen on Windows, Linux and macOS takes very different amounts of software depending on the language. We read the official install guides for ten popular desktop languages and set them beside Neper. Neper wins on three things: one install builds programs for every desktop OS from a single machine, the user installs nothing to run them, and the window is 2.7 MiB with no runtime inside it.

5targets built from one Windows machine
2.7 MiBa real window, Windows x64
0things the user installs to run it
13.3 KiBprogram that imports 398 KiB of source
The same story in 1 minute 32 seconds, with the real build commands and sizes. Captioned, with a synthetic voice. Watch on YouTube.

Where Neper wins

One install, several targets

Windows, Linux and macOS executables, for x64 and arm64, came out of one Windows machine with one compiler and one command each. Most of the ten build each OS's package on that OS.

No second toolchain

The compiler writes the PE, ELF and Mach-O files itself, with its own linker. No SDK, no Visual Studio workload, no clang, no -dev packages, no IDE, no installer.

Nothing to install to run

No .NET or Java runtime, no VC++ redistributable, no Qt or GTK libraries, no bundled browser or interpreter. The program talks to the system directly.

Small, with everything in it

A window with the real renderer and widget runtime is 2.7 MiB on Windows and 2.8 MiB on Linux. Only code your program can reach is kept.

The scorecard

One row per stack. "C++ toolchain" means a C or C++ compiler or Visual Studio workload somewhere on the way to an executable. Details and sources for each language are further down.

StackInstall to buildC++ toolchainUser needsSmallest app
NeperThe compiler, one fileNo once, to bootstrapNothing2.7 MiB window, measured
C# / .NET.NET 10 SDK, 206 MBAOT only.NET runtime, or self-contained18 to 65 MB
C++ / QtMSVC or MinGW; Xcode on macOSYesVC++ runtime, Qt libraries42 to 50 MB
JavaJDK, 112 MB (+ WiX on Windows)NoJRE, or a bundled oneruntime about 40 MB
ElectronNode.jsNoNothing, ships Chromiumruntime 115 to 151 MB
TauriRust, MSVC tools, WebView2YesSystem webview3 to 5 MB
PythonPython 3.15, PyInstallerNoNothing, bundled8 to 120 MB
KotlinJDK 17+, GradleNoNothing, bundledabout 50 MB
Dart / FlutterSDK 1.8 GB, Visual Studio C++YesVC++ runtime DLLsabout 25 MB
Rustrustup, MSVC build toolsA linkerVC++ runtime, system GLTauri 3 to 5 MB
GoGo 63 MB (+ MinGW for Fyne)Fyne yesSystem GL or webviewWails 8 to 11 MB
SwiftXcode 3.1 GB; VS parts on WindowsWindows yesmacOS: nothingno sourced figure

Sizes for the ten others are reported or documented, for different kinds of app. Only the Neper figure is ours.

How big is the smallest app?

Electron, runtime zip alone
151 MB
Compose Multiplatform
about 50 MB
Qt
42 to 50 MB
Flutter
about 25 MB
Go + Wails
8 to 11 MB
Tauri
3 to 5 MB
Neper window
2.7 MiB, measured

Tauri's own documentation claims under 0.6 MB, without counting the system webview. Neper's number is the whole window stack: renderer and widget runtime included.

How we picked, and what we counted

No 2025 or 2026 survey measures which language people use for desktop. We took language usage from the Stack Overflow 2025 survey and desktop frameworks from its 2024 edition, the latest that asks: .NET 25.2%, Flutter 9.4%, Qt 7.3%, Electron 6.5%, SwiftUI 4.3%, Tauri 2.4%. Kotlin is the weakest pick, since Compose Multiplatform is not in that list. Delphi (2.5% usage) is the likely swap for someone ranking desktop only; we could not verify that, so we kept the list.

Three things counted per language

To build: what you install to get an executable, including a C++ workload or Xcode that the language's own installer does not cover. To run: what the user must have, or what the app must bundle. The smallest app: a hello window, when a source gives a number. Neper's numbers are ours; everyone else's are from official documentation, vendor download metadata, or third-party reports, which we mark "reported". We did not build a hello window in the other ten.

Each language in detail

Open a language for what it needs to build, what the user needs to run, and the sources behind the scorecard.

C# / .NET
  • Frameworks: WinForms, WPF, WinUI 3 (Windows); Avalonia (all three); MAUI (no Linux).
  • Build: .NET 10 SDK, 206 MB Windows, 229 MB Linux, 215 MB macOS (download sizes). Visual Studio is optional. Native AOT needs the C++ workload, clang on Linux or Command Line Tools on macOS, and WPF and WinForms cannot use it because they cannot be trimmed.
  • Run: the .NET runtime (57 MB desktop installer on Windows) unless self-contained or AOT. WinUI adds the Windows App SDK runtime.
  • Size: about 59 to 65 MB self-contained (a .NET 5 console app); about 18 MB for an Avalonia AOT template.
C++
  • Frameworks: Qt 6.12, Win32/MFC, GTK, AppKit.
  • Build: MSVC or MinGW-w64 on Windows; build-essential libgl1-mesa-dev on Linux; Qt requires full Xcode 16 on macOS. The online Qt installer wants a Qt account.
  • Run: the VC++ Redistributable unless linked with /MT; Qt or GTK shared libraries and plugins, collected with windeployqt.
  • Size: about 42 to 50 MB for a Qt app (Qt 5-era forum posts).
Java
  • Frameworks: Swing (in the JDK), JavaFX 27.
  • Build: JDK 25 or 27, 112 MB Windows, 136 MB Linux, 132 MB macOS. Packaging needs WiX on Windows and fakeroot or rpm-build on Linux; each OS builds its own package.
  • Run: a JRE, unless jpackage bundles a trimmed one.
  • Size: no sourced figure; a minimal jlink runtime is about 40 MB.
JavaScript / TypeScript (Electron, Tauri)
  • Build: Electron needs Node.js. Tauri adds Rust, MSVC C++ Build Tools and WebView2 on Windows, nine -dev packages including libwebkit2gtk-4.1-dev on Linux, Command Line Tools on macOS.
  • Run: Electron: nothing, it ships Chromium and Node. Tauri: WebView2 on Windows (in Windows 11), WebKitGTK on Linux, the system webview on macOS.
  • Size: Electron's runtime zip alone is 151 MB Windows, 118 MB Linux, 115 MB macOS (documented). Tauri: under 0.6 MB documented, 3 to 5 MB in a CI benchmark.
Python
  • Frameworks: Tkinter, PyQt / PySide6.
  • Build: Python 3.15; PyInstaller to package, on each OS. Tkinter is optional on Linux distributions (python3-tk).
  • Run: nothing if PyInstaller bundles the interpreter.
  • Size: Tkinter about 8 to 10 MB (a 2017 post); PyQt 30 to 120 MB.
Kotlin
  • Frameworks: Compose Multiplatform 1.12.
  • Build: JDK 17+ and Gradle; the plugin downloads WiX itself on Windows. Each OS builds its own package.
  • Run: nothing; the package includes a trimmed runtime.
  • Size: about 50 MB MSI, which a maintainer calls the baseline because Skia is large.
Dart / Flutter
  • Build: SDK archive 1.8 GB Windows, 2.2 GB macOS, 1.5 GB Linux. Windows: Git and Visual Studio with the C++ workload. macOS: Xcode and CocoaPods. Linux: clang cmake ninja-build pkg-config libgtk-3-dev.
  • Run: Windows: the VC++ runtime DLLs next to the exe. Linux: GTK 3.
  • Size: about 25 MB on Windows.
Rust
  • Frameworks: Tauri, egui, iced, Slint, gtk4-rs.
  • Build: rustup, then MSVC v143 build tools and a Windows SDK (or the GNU target); a linker on Linux and macOS; -dev packages for the GUI kit.
  • Run: the VC++ runtime unless built with +crt-static; system GL libraries or webview.
  • Size: Tauri 3 to 5 MB; egui and iced no sourced figure.
Go
  • Frameworks: Fyne 2.8, Wails 2.17.
  • Build: Go, 63 to 67 MB. Fyne needs a C compiler (MSYS2 MinGW-w64, Xcode, or gcc plus Mesa/X11/Wayland headers). Wails needs Node and WebView2 on Windows.
  • Run: one binary plus system GL (Fyne) or the system webview (Wails).
  • Size: Wails about 8 to 11 MB; Fyne no sourced figure.
Swift
  • Frameworks: SwiftUI, AppKit (macOS only); SwiftCrossUI. No first-party GUI on Windows or Linux.
  • Build: Xcode 27 on macOS (3.1 GB in the App Store). Windows: Visual Studio 2022 components plus a 2.0 GB toolchain.
  • Run: macOS: nothing, the runtime is part of the OS. Windows: the Swift runtime DLLs, ICU and the VC++ runtime.
  • Size: no sourced figure.

Two signing facts apply to every language. Distributing a Mac app outside the App Store means notarization, which needs a Developer ID certificate and the $99-a-year Apple Developer Program. Windows signing is optional, but unsigned apps trigger warnings.

What the ten have in common

A C++ toolchain, often

Seven of the ten reach one on at least one OS: C++ itself, Flutter, Rust, Fyne, Swift on Windows, Tauri and .NET Native AOT. On Windows that means Visual Studio or its Build Tools, listed at 2.3 to 60 GB.

Weight moves elsewhere

.NET and Java need a runtime unless you bundle one. Electron bundles a browser. PyInstaller bundles an interpreter.

Build each OS on that OS

jpackage, PyInstaller, Compose and Tauri's MSI all build their packages natively. Cross-compiling a desktop app is the exception.

The IDE is rarely required

Every language builds from a command line. In practice, Xcode for Swift on macOS and Visual Studio as a toolchain for Flutter and C++ on Windows are the exceptions.

Neper

Neper's compiler writes the executable itself, including the PE, ELF and Mach-O headers, the linker and the ad-hoc macOS code signature, so a program does not go through a C++ compiler, an SDK or a system linker. The compiler is written in Neper. Getting the first compiler means building from source, and that is the one place a C toolchain appears:

$ scripts/build-selfhost.sh   # Linux, macOS; scripts/build-selfhost.ps1 on Windows
# a throwaway C99 bootstrap (cl, or cc) builds the compiler once;
# the compiler then builds itself and prints its own path

After that the C compiler is not used again. We built the repository's smallest window program, ui_app (a 200 by 120 box, built with the real window, renderer and widget runtime), and a console hello, from one Windows machine with the self-hosted compiler:

$ neper-self emit-executable tests/selfhost/fixtures/link/ui_app/src/main.e . x64 windows hello-win.exe --release
$ neper-self emit-executable tests/selfhost/fixtures/link/ui_app/src/main.e . x64 linux   hello-linux --release
$ neper-self emit-executable tests/selfhost/fixtures/link/ui_app/src/main.e . aarch64 macos hello-macos --release
$ neper-self emit-executable examples/hello.e . x64 windows h.exe --release   # also: x64 linux, aarch64 linux, x64 macos, aarch64 macos
ProgramTargetSize
ui_app (a window)Windows x642.7 MiB
ui_app (a window)Linux x642.8 MiB
ui_app (a window)macOS arm642.3 MiB
hello (console)Windows x6412.3 KiB
hello (console)Linux x64 / arm649.5 KiB / 11.4 KiB
hello (console)macOS x64 / arm6464.7 KiB each

What that means for the build and the run:

The limits of those wins

Targets we plan next

What exists today is Windows, Linux and macOS on x64 and arm64. These are planned, and none of them exists yet:

Android

On x86_64 and AArch64, as a distinct target and not an alias for Linux. The aim is to write the APK itself (binary manifest, aligned native library, signature) with no Android Studio, SDK, NDK, Gradle or Java.

iOS

First step: compile to arm64 iOS Mach-O objects on Windows. The final link, app bundle, signing and upload stay in Apple's toolchain, because iOS has no unsigned path. So "nothing to install" would hold for compiling, not for the App Store. The language specification currently excludes iOS.

WebAssembly

Today Neper can run WebAssembly: e.wasm is an interpreter for the 2.0 core format. Compiling Neper programs to WebAssembly is a goal with no design document yet.

FreeBSD is evaluated as a candidate and not scheduled. Each of these is a distinct target with its own binary rules, not a relabelled Linux or macOS build, and we will report them here as we measure them, not before.

Sources

Versions and sizes were read on October 23, 2026 and drift. If a cell here is wrong or out of date, we want to know.