Lumen - A new compiler and runtime for BEAM languages

In order to build Lumen, or make changes to it, you'll need the following installed:

Machine Vendor Operating System Host Subgroup Status
wasm32 unknown unknown macOS N/A
wasm32 unknown unknown Linux N/A
x86_64 apple darwin macOS compiler
x86_64 apple darwin macOS libraries
x86_64 apple darwin macOS lumen/otp
x86_64 apple darwin macOS runtime full
x86_64 unknown linux-gnu Linux libraries
x86_64 unknown linux-gnu Linux lumen/otp
x86_64 unknown linux-gnu Linux runtime full
  • Contributing
    • Tools
    • Building Lumen
    • Project Structure
    • Making Changes
  • About Lumen
  • Goals
  • Non-Goals
  • Architecture



First, you will need to install rustup. Follow the instructions at that link.

Once you have installed rustup, you will need to install the nightly version of Rust (currently our CI builds against the 2021-01-29 nightly). We require nightly due to a large number of nightly features we use, as well as some dependencies for the WebAssembly targets that we make use of.

# to use the latest nightly
rustup default nightly

# or, in case of issues, install the 2021-01-29 nightly to match our CI
rustup default nightly-2021-01-29

In order to run various build tasks in the project, you'll need the cargo-make plugin for Cargo. You can install it with:

cargo install cargo-make

You can see what tasks are available with cargo make --print-steps.

You may also want to install the following tools for editor support (rustfmt will be required on all pull requests!):

rustup component add rls rustfmt clippy

Next, you will need to install the wasm32 targets for the toolchain:

rustup target add wasm32-unknown-unknown --toolchain <name of nightly you chose in the previous step>


LLVM (with our modifications) is used by Lumen's code generation backend. It is needed to build the compiler. Typically, you'd need to build this yourself, which we have instructions for below; but we also provide prebuilt distributions that have everything needed.

Installing Prebuilt Distributions (Recommended)

The instructions below reference $XDG_DATA_HOME as an environment variable, it is recommended to export XDG variables in general, but if you have not, just replace the usages of $XDG_DATA_HOME below with $HOME/.local/share, which is the usual default for this XDG variable.

mkdir -p $XDG_DATA_HOME/llvm/
cd $XDG_DATA_HOME/llvm/
tar -xz --strip-components 1 -f clang+llvm-12.0.0-x86_64-linux-gnu.tar.gz
rm clang+llvm-12.0.0-x86_64-linux-gnu.tar.gz
cd -
mkdir -p $XDG_DATA_HOME/llvm/
cd $XDG_DATA_HOME/llvm/
tar -xzf clang+llvm-12.0.0-x86_64-apple-darwin19.5.0.tar.gz
rm clang+llvm-12.0.0-x86_64-apple-darwin19.5.0.tar.gz
mv clang+llvm-12.0.0-x86_64-apple-darwin19.5.0 lumen
cd -

We don't yet provide prebuilt packages for other operating systems, you'll need to build from source following the directions below.

Building From Source

LLVM requires CMake, a C/C++ compiler, and Python. It is highly recommended that you also install Ninja and CCache to make the build significantly faster, especially on subsequent rebuilds. You can find all of these dependencies in your system package manager, including Homebrew on macOS.

We have the build more or less fully automated, just three simple steps:

git clone
cd llvm-project
make llvm-shared

This will install LLVM to $XDG_DATA_HOME/llvm/lumen, or $HOME/.local/share/llvm/lumen, if $XDG_DATA_HOME is not set. It assumes that Ninja and CCache are installed, but you can customize the llvm target in the Makefile to use make instead by removing -G Ninja from the invocation of cmake, likewise you can change the setting to use CCache by removing that option as well.

NOTE: Building LLVM the first time will take a long time, so grab a coffee, smoke 'em if you got 'em, etc.

Building Lumen

Once LLVM is installed/built, you can build the lumen executable:

LLVM_PREFIX=$XDG_DATA_HOME/llvm/lumen cargo make

This will create the compiler executable and associated toolchain for the host machine under bin in the root of the project. You can invoke lumen via the symlink bin/lumen, e.g.:

bin/lumen --help

You can compile an Erlang file to an executable (on x86_64 only, currently):

bin/lumen compile --output-dir _build <path/to/source> [<more paths>..]

This will produce an executable with the same name as the source file in the current working directory with the .out or .exe extension, depending on your platform.

NOTE: The compiler/runtime are still in experimental stages, so stability is not guaranteed, and you may need to provide additional compiler flags if the linker warns about missing symbols, e.g. -lpthread.

Project Structure

Lumen is currently divided into a few major components:

  • Compiler
  • Interpreter
  • Runtime(s)

Lumen's frontend and diagnostics libraries were moved into the EIR Project, which includes both the Erlang parser and the high-level intermediate representation EIR, short for Erlang Intermediate Representation. Lumen depends on the EIR libraries for those components.


The Lumen compiler is composed of the following sub-libraries/components:

  • liblumen_target, contains target platform metadata and configuration
  • liblumen_session, contains state and configuration for a single instantiation of the compiler, or "session". This is where you can find the bulk of option processing, input/output generation, and related items.
  • liblumen_compiler, contains the core of the compiler driver and incremental compilation engine (built on salsa), as well as all of the higher level queries for generating artifacts from parsed sources.
  • liblumen_codegen, contains the code generation backend, which is divided into two primary phases: the first handles translation from EIR to our own dialect of MLIR (or, in some cases, LLVM IR directly). This translation mostly aims to preserve the level of abstraction found in EIR, while preparing for conversion to LLVM IR. The second phase is conversion of our MLIR dialect to LLVM, which is where the bulk of the codegen work occurs.
  • liblumen_term, contains the essential parts of our term encoding scheme, and is shared with the runtime libraries. The compiler requires this in order to handle encoding constant terms during compilation.


The runtime is broken up into multiple libraries:

  • liblumen_core, contains the essential APIs for interacting with the system, performing allocations, as well as various common types used throughout Lumen.
  • liblumen_alloc, contains the bulk of the Erlang Runtime System core data types and APIs
  • liblumen_crt, acts as the core runtime entry point for executables, handles bootstrapping the runtime system. This is linked in to all compiler-generated executables
  • lumen_rt_core, (wip) the core runtime library used across all target-specific runtimes
  • lumen_rt_minimal (wip) an experimental runtime library built on top of lumen_rt_core, designed for x86_64 platforms. Currently used as the runtime for executables generated by the compiler.
  • lumen_web, original WebAssembly runtime, builds on lumen_rt_full
  • lumen_rt_full, original runtime library for all targets. This is slowly being broken up into smaller pieces, either merged into lumen_rt_core, or new more target-specific runtime crates. Currently used by the interpreter, and contains all of the BIF functions implemented so far.

The above collection of libraries correspond to ERTS in the BEAM virtual machine.

Making Changes

Before making any major changes, please open an issue tagged "RFC" with the problem you need to solve, your proposed solution, and any outstanding questions you have in terms of implementation. The core team (and you) will use that issue to talk through the changes and either green light the proposal, or request changes. In some cases, a proposal may request changes that are either incompatible with the project's goals, or impose too high of a maintenance or complexity burden, and will be turned down. The importance of having the RFC discussion first is that it prevents someone from doing a bunch of work that will ultimately not be upstreamed, and allows the core team or the community to provide feedback that may make the work simpler, or better in the end.

For smaller changes/bug fixes, feel free to open an issue first if you are new to the project and want some guidance on working through the fix. Otherwise, it is acceptable to just open a PR directly with your fix, and let the review happen there.

Always feel free to open issues for bugs, and even perceived issues or questions, as they can be a useful resource for others; but please do make sure to use the search function to avoid duplication!

If you plan to participate in discussions, or contribute to the project, be aware that this project will not tolerate abuse of any kind against other members of the community; if you feel that someone is being abusive or inappropriate, please contact one of the core team members directly (or all of us). We want to foster an environment where people both new and experienced feel welcomed, can have their questions answered, and hopefully work together to make this project better!

About Lumen

Lumen is not only a compiler, but a runtime as well. It consists of two parts:

  • A compiler for Erlang to native code for a given target (x86, ARM, WebAssembly)
  • An Erlang runtime, implemented in Rust, which provides the core functionality needed to implement OTP

The primary motivator for Lumen's development was the ability to compile Elixir applications that could target WebAssembly, enabling use of Elixir as a language for frontend development. It is also possible to use Lumen to target other platforms as well, by producing self-contained executables on platforms such as x86.

Lumen is different than BEAM in the following ways:

  • It is an ahead-of-time compiler, rather than a virtual machine that operates on bytecode
  • It has some additional restrictions to allow more powerful optimizations to take place, in particular hot code reloading is not supported
  • The runtime library provided by Lumen is written in Rust, and while very similar, differs in mostly transparent ways. One of the goals is to provide a better foundation for learning how the runtime is implemented, and to take advantage of Rust's more powerful static analysis to catch bugs early.
  • It has support for targeting WebAssembly, as well as other targets.

The result of compiling a BEAM application via Lumen is a static executable. This differs significantly from how deployment on the BEAM works today (i.e. via OTP releases). While we sacrifice the ability to perform hot upgrades/downgrades, we make huge gains in cross-platform compatibility, and ease of use. Simply drop the executable on a compatible platform, and run it, no tools required, or special considerations during builds. This works the same way that building Rust or Go applications works today.


  • Support WebAssembly as a build target
  • Produce easy-to-deploy static executables as build artifacts
  • Integrate with tooling provided by BEAM languages
  • More efficient execution by removing the need for an interpreter at runtime
  • Feature parity with mainline OTP (with exception of the non-goals listed below)


  • Support for hot upgrades/downgrades
  • Support for dynamic code loading

Lumen is an alternative implementation of Erlang/OTP, so as a result it is not as battle tested, or necessarily as performant as the BEAM itself. Until we have a chance to run some benchmarks, it is hard to know what the difference between the two in terms of performance actually is.

Lumen is not intended to replace BEAM at this point in time. At a minimum, the stated non-goals of this project mean that for at least some percentage of projects, some required functionality would be missing. However, it is meant to be a drop-in replacement for applications which are better served by its feature set.



The compiler frontend accepts Erlang source files. This is parsed into an abstract syntax tree, lowered into EIR (Erlang Intermediate Representation), then finally lowered to LLVM IR where codegen is performed.

Internally, the compiler represents Erlang/Elixir code in a form very similar to continuation-passing style. Continuations are a powerful construct that enable straightforward implementations of non-local returns/exceptions, green threading, and more. Optimizations are primarily performed on this representation, prior to lowering to LLVM IR. See eirproject/eir for more information on the compiler frontend and EIR itself.

During lowering to LLVM IR, the continuation representation is stripped away, and platform-specific methods for implementing various constructs are generated. For example, on x86_64, hand-written assembly is used to perform extremely cheap stack switching by the scheduler, and to provide dynamic function application facilities for the implementation of apply. Currently, the C++-style zero-cost exception model is used for implementing exceptions. There are some future proposals in progress for WebAssembly that may allow us to use continuations for exceptions, but that is not yet stabilized or implemented in browsers.

The compiler produces object files, and handles linking objects together into an executable. It can also dump all of the intermediate artifacts, such as the AST, EIR, MLIR in various forms, LLVM IR, LLVM bitcode, and plain assembly.


The runtime design is mostly the same as OTP, but we are not running an interpreter, instead the code is ahead-of-time compiled:

  • The entry point sets up the environment, and starts the scheduler
  • The scheduler is composed of one scheduler per thread
  • Each scheduler can steal work from other schedulers if it is short on work
  • Processes are spawned on the same scheduler as the process they are spawned from, but a scheduler is able to steal them away to load balance
  • I/O is asynchronous, with dedicated threads and an event loop for dispatch

The initial version will be quite spartan, but this is so we can focus on getting the runtime behavior rock solid before we circle back to add in more capabilities.


NIFs will be able to be defined in any language with C FFI, and will need to be compiled to object files and then passed via linker flags to the compiler. The compiler will then ensure that the NIFs are linked into the executable.

The design of the FFI is still up in the air - we will likely have a compatibility layer which will mimic the existing erl_nif.h interface, but since the runtime is different, there may be opportunities to provide more direct hooks to parts of the system.


Apache 2.0


Collection of the latest Issues




Looking at the logs, all activity ceased on Mar 26, 2021.




Krustlet acts as a Kubelet by listening on the event stream for new pods that the scheduler assigns to it based on specific Kubernetes tolerations. The default implementation of Krustlet listens for the architecture wasm32-wasi and schedules those workloads to run in a wasmtime-based runtime instead of a container runtime.

I would like to know if it is possible to use Lumem as a Provider for Krustlet, that way it would be possible to compile elixir programs for Wasm and run these applications on Kubernetes without containers.

What would it take for this to be possible?



help wanted

Implementing ETS

Erlang Term Storage (ETS) is built on top of two data structures (depending on the options passed to ets:new/2) - an AVL tree in the general case (based on the paper by Adelson-Velski and Landis), and a CA tree [1][2] for ordered sets with write concurrency enabled. For our purposes, we aim to build our ETS implementation on top of WAVL trees [3]. Some interesting references are included below [4][5][6]. Work on the compiler has kept us from building this yet, so this is a great way to get involved with the project!


  • Implement ETS as a library in Rust that can be plugged in to our runtime by writing BIFs that interact with the implementation. Ideally the implementation shouldn't be dependent on runtime specifics like the scheduler, processes, or term representation. If it turns out that such specifics are critical to the implementation though, we can revisit
  • Should make use of safe Rust abstractions where possible
  • Should provide futures-based APIs for long-running functions (e.g. ets:insert/2 with a list of objects to insert). Functions which are "short enough" don't need to be written as futures, but if implementation is easier that way, it's fine. NOTE: It is essential that these futures do not attempt to hold locks across yield points, if Rust will even allow that in its type system.
  • ETS tables should be reference counted, and likely the values they contain as well, so that access by multiple processes is safe, and garbage collection of the tables and their contents can happen naturally.
  • While correctness is the most important property, attempts should be made to keep the implementation as performance-sensitive as possible, since ETS is so heavily relied upon.


  1. A Contention Adapting Approach to Concurrent Ordered Sets, 2018
  2. More Scalable Ordered Set for ETS Using Adaptation, 2014
  3. WAVL Trees
  4. Immutable AVL Trees
  5. ERTS AVL Tree
  6. ERTS CA Tree



The offset_of macro at is not quite correct... it avoids creating dangling pointers, but it does create a reference to the uninitialized struct via &*u.as_ptr(). To avoid this, ptr::addr_of! should be used instead of &.

The memoffset crate provides a version of this macro that avoids UB (on older versions of rustc, this is not always possible, so it falls back to the 'least incorrect' version when needed).





Currently CI runs on OSX and Linux, and there's plans to add #292 .

It would be great to see Windows added to this list! It's an extremely popular OS and GitHub actions has free Windows support.

Traditionally Erlang neglects Windows support so it would be great to have it as a first class citizen of Lumen, taking full advantage of the cross-platform strengths of Rust and LLVM.

Thanks, Louis




I'm not sure this affects all usage, it appears most commonly after fun in the errors, but it does show up for the following files in OTP:

  • lib/inets/src/http_server/httpd_logger.erl
  • lib/kernel/src/erpc.erl
  • lib/kernel/src/global_search.erl
  • lib/kernel/src/inet_tcp_dist.erl
  • lib/kernel/src/logger_proxy.erl



EIR parser does not support -type module attribute if it uses parentheses like

vs the more common

Affects the following files in OTP:

  • lib/eunit/src/eunit_surefire.erl
  • lib/kernel/src/application.erl
  • lib/stdlib/src/erl_eval.erl
  • lib/stdlib/src/file_sorter.erl
  • lib/stdlib/src/qlc.erl
  • lib/stdlib/src/sofs.erl



Affects the following files in OTP

  • erts/preloaded/src/atomics.erl
  • lib/et/src/et.erl
  • lib/inets/src/http_server/httpd_acceptor.erl
  • lib/tftp/src/tftp_engine.erl



There are invalid escapes sequences according to EIR in the following files in OTP, which Erlang/BEAM deems valid, so EIR's rules need to updated to match:

  • ib/dialyzer/src/typer.erl
  • lib/common_test/src/unix_telnet.erl
  • lib/compiler/src/cerl.erl
  • lib/compiler/src/core_scan.erl
  • lib/edoc/src/edoc_extract.erl
  • lib/edoc/src/edoc_layout.erl
  • lib/edoc/src/edoc_lib.erl
  • lib/edoc/src/edoc_macros.erl
  • lib/edoc/src/edoc_scanner.erl
  • lib/edoc/src/edoc_specs.erl
  • lib/edoc/src/edoc_tags.erl
  • lib/inets/src/http_server/httpd_request.erl
  • lib/inets/src/http_server/mod_esi.erl
  • lib/inets/src/http_server/mod_range.erl
  • lib/kernel/src/group.erl
  • lib/kernel/src/os.erl
  • lib/kernel/src/user_drv.erl
  • lib/megaco/src/engine/megaco_sdp.erl
  • lib/observer/src/cdv_bin_cb.erl
  • lib/observer/src/cdv_term_cb.erl
  • lib/observer/src/crashdump_viewer.erl
  • lib/os_mon/src/disksup.erl
  • lib/reltool/src/reltool.hrl
  • lib/sasl/src/systools_make.erl
  • lib/stdlib/src/edlin.erl
  • lib/stdlib/src/erl_scan.erl
  • lib/stdlib/src/escript.erl
  • lib/stdlib/src/io_lib.erl
  • lib/stdlib/src/io_lib.erl
  • lib/stdlib/src/io_lib_format.erl
  • lib/stdlib/src/io_lib_pretty.erl
  • lib/tools/src/tags.erl
  • lib/xmerl/src/xmerl_regexp.erl



If several fields are to be assigned the same value, the following construction can be used:

stderr: Compiling /Users/runner/work/lumen/otp/lib/common_test/src/ct_config.erl error: unrecognized token ┌─ /Users/runner/work/lumen/otp/lib/common_test/src/ct_config.erl:301:19 │ 301 │ config=File,=''}), │ ^ expected: "atom"

error: parsing failed

  Failed /Users/runner/work/lumen/otp/lib/common_test/src/ct_config.erl

Affects the following files in OTP: 
  • lib/common_test/src/ct_config.erl
  • lib/common_test/src/ct_util.erl
  • lib/common_test/src/ct_util.erl


  • lib/asn1/src/asn1ct_name.erl
  • lib/asn1/src/asn1rtt_ext.erl
  • lib/compiler/src/beam_digraph.erl
  • lib/compiler/src/beam_ssa_recv.erl
  • lib/compiler/src/beam_ssa_dead.erl
  • lib/compiler/src/beam_utils.erl
  • lib/compiler/src/cerl_sets.erl
  • lib/debugger/src/dbg_wx_mon.erl
  • lib/inets/src/http_server/httpd_socket.erl
  • lib/kernel/src/application_master.erl
  • lib/kernel/src/kernel_config.erl
  • lib/mnesia/src/mnesia_registry.erl
  • lib/stdlib/src/erl_expand_records.erl
  • lib/stdlib/src/maps.erl
  • lib/stdlib/src/proplists.erl
  • lib/stdlib/src/timer.erl



Affects the following files in OTP:

  • erts/preloaded/src/prim_buffer.erl
  • lib/common_test/src/ct_repeat.erl
  • lib/common_test/src/ct_telnet_client.erl
  • lib/compiler/src/beam_ssa_pp.erl
  • lib/kernel/src/raw_file_io_compressed.erl



Errors of the form type mismatch for argument #N of success #M for some N and M.

Affects the following files in OTP:

  • erts/preloaded/src/erts_literal_area_collector.erl
  • lib/asn1/src/asn1ct_gen_per.erl
  • lib/asn1/src/asn1ct_pretty_format.erl
  • lib/asn1/src/asn1ct_table.erl
  • lib/asn1/src/prepare_templates.erl
  • lib/common_test/src/ct_slave.erl
  • lib/compiler/src/beam_listing.erl
  • lib/compiler/src/beam_peep.erl
  • lib/compiler/src/beam_ssa_lint.erl
  • lib/compiler/src/cerl_clauses.erl
  • lib/compiler/src/beam_trim.erl
  • lib/debugger/src/dbg_wx_break.erl
  • lib/debugger/src/debugger.erl
  • lib/dialyzer/src/dialyzer_clean_core.erl
  • lib/dialyzer/src/dialyzer_worker.erl
  • lib/erl_docgen/src/docgen_xmerl_xml_cb.erl
  • lib/edoc/src/edoc_wiki.erl
  • lib/eunit/src/eunit_autoexport.erl
  • lib/inets/src/http_server/httpd_manager.erl
  • lib/inets/src/http_server/mod_auth_mnesia.erl
  • lib/kernel/src/erl_compile_server.erl
  • lib/kernel/src/inet6_tcp.erl
  • lib/kernel/src/inet6_tcp_dist.erl
  • lib/kernel/src/inet_hosts.erl
  • lib/kernel/src/inet_tcp.erl
  • lib/kernel/src/local_udp.erl
  • lib/kernel/src/local_tcp.erl
  • lib/megaco/src/engine/megaco_digit_map.erl
  • lib/sasl/src/sasl_report_tty_h.erl
  • lib/sasl/src/sasl_report_file_h.erl
  • lib/sasl/src/systools_relup.erl
  • lib/stdlib/src/erl_abstract_code.erl
  • lib/stdlib/src/error_logger_tty_h.erl
  • otp/lib/stdlib/src/gb_sets.erl
  • otp/lib/stdlib/src/io_lib_fread.erl
  • lib/stdlib/src/sets.erl



416 files in lumen/otp fail to compile because of Source spans cannot start and end in different files.

Affects the following files in OTP:

  • erts/preloaded/src/atomics.erl
  • erts/preloaded/src/atomics.erl
  • erts/preloaded/src/prim_file.erl
  • erts/preloaded/src/prim_zip.erl
  • lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl
  • lib/common_test/src/ct.erl
  • lib/common_test/src/ct_framework.erl
  • lib/common_test/src/ct_master.erl
  • lib/common_test/src/ct_logs.erl
  • lib/common_test/src/ct_master.erl
  • lib/common_test/src/ct_master_logs.erl
  • lib/common_test/src/ct_netconfc.erl
  • lib/common_test/src/ct_run.erl
  • lib/common_test/src/ct_snmp.erl
  • lib/common_test/src/ct_telnet.erl
  • lib/common_test/src/cth_conn_log.erl
  • lib/common_test/src/cth_log_redirect.erl
  • lib/common_test/src/test_server_ctrl.erl
  • lib/common_test/src/test_server_sup.erl
  • lib/compiler/src/beam_kernel_to_ssa.erl
  • lib/compiler/src/beam_ssa_codegen.erl
  • lib/compiler/src/beam_ssa_opt.erl
  • lib/compiler/src/beam_ssa_pre_codegen.erl
  • lib/debugger/src/dbg_ieval.erl
  • lib/debugger/src/dbg_wx_break_win.erl
  • lib/debugger/src/dbg_wx_code.erl
  • lib/debugger/src/dbg_wx_filedialog_win.erl
  • lib/debugger/src/dbg_wx_interpret.erl
  • lib/debugger/src/dbg_wx_mon_win.erl
  • lib/debugger/src/dbg_wx_settings.erl
  • lib/debugger/src/dbg_wx_trace_win.erl
  • lib/debugger/src/dbg_wx_win.erl
  • lib/dialyzer/src/dialyzer.erl
  • lib/dialyzer/src/dialyzer_analysis_callgraph.erl
  • lib/dialyzer/src/dialyzer_behaviours.erl
  • lib/dialyzer/src/dialyzer_cl.erl
  • lib/dialyzer/src/dialyzer_dataflow.erl
  • lib/dialyzer/src/dialyzer_gui_wx.erl
  • lib/dialyzer/src/dialyzer_succ_typings.erl
  • lib/diameter/src/base/diameter_capx.erl
  • lib/diameter/src/base/diameter_codec.erl
  • lib/diameter/src/base/diameter_config.erl
  • lib/diameter/src/base/diameter_peer.erl
  • lib/diameter/src/base/diameter_peer_fsm.erl
  • lib/diameter/src/base/diameter_service.erl
  • lib/diameter/src/base/diameter_stats.erl
  • lib/diameter/src/base/diameter_sync.erl
  • lib/diameter/src/base/diameter_traffic.erl
  • lib/diameter/src/base/diameter_watchdog.erl
  • lib/diameter/src/compiler/diameter_codegen.erl
  • lib/diameter/src/compiler/diameter_exprecs.erl
  • lib/diameter/src/compiler/diameter_make.erl
  • lib/edoc/src/edoc.erl
  • lib/edoc/src/edoc_doclet.erl
  • lib/edoc/src/edoc_types.erl
  • lib/et/src/et.erl
  • lib/et/src/et_collector.erl
  • lib/et/src/et_wx_contents_viewer.erl
  • lib/et/src/et_wx_viewer.erl
  • lib/eunit/src/eunit_lib.erl
  • lib/eunit/src/eunit_data.erl
  • lib/eunit/src/eunit_proc.erl
  • lib/eunit/src/eunit_server.erl
  • lib/eunit/src/eunit_test.erl
  • lib/eunit/src/eunit_tests.erl
  • lib/inets/src/http_client/httpc_request.erl
  • lib/inets/src/http_client/httpc_response.erl
  • lib/inets/src/http_lib/http_chunk.erl
  • lib/inets/src/http_lib/http_request.erl
  • lib/inets/src/http_server/httpd_acceptor.erl
  • lib/inets/src/http_server/httpd_conf.erl
  • lib/inets/src/http_server/httpd_custom.erl
  • lib/inets/src/http_server/httpd_file.erl
  • lib/inets/src/http_server/mod_auth.erl
  • lib/inets/src/http_server/mod_auth_dets.erl
  • lib/inets/src/http_server/mod_auth_plain.erl
  • lib/inets/src/http_server/mod_cgi.erl
  • lib/inets/src/http_server/mod_dir.erl
  • lib/inets/src/http_server/mod_disk_log.erl
  • lib/inets/src/http_server/mod_log.erl
  • lib/inets/src/http_server/mod_security.erl
  • lib/kernel/src/code_server.erl
  • lib/kernel/src/disk_log.erl
  • lib/kernel/src/disk_log_1.erl
  • lib/kernel/src/dist_util.erl
  • lib/kernel/src/erl_boot_server.erl
  • lib/kernel/src/erl_epmd.erl
  • lib/kernel/src/erl_reply.erl
  • lib/kernel/src/error_logger.erl
  • lib/kernel/src/file_io_server.erl
  • lib/kernel/src/heart.erl
  • lib/kernel/src/inet6_udp.erl
  • lib/kernel/src/inet_db.erl
  • lib/kernel/src/inet_res.erl
  • lib/kernel/src/inet_tcp_dist.erl
  • lib/kernel/src/inet_udp.erl
  • lib/kernel/src/logger.erl
  • lib/kernel/src/logger_backend.erl
  • lib/kernel/src/logger_config.erl
  • lib/kernel/src/logger_filters.erl
  • lib/kernel/src/logger_disk_log_h.erl
  • lib/kernel/src/logger_h_common.erl
  • lib/kernel/src/logger_formatter.erl
  • lib/kernel/src/logger_olp.erl
  • lib/kernel/src/logger_proxy.erl
  • lib/kernel/src/logger_server.erl
  • lib/kernel/src/logger_simple_h.erl
  • lib/kernel/src/logger_std_h.erl
  • lib/kernel/src/ram_file.erl
  • lib/kernel/src/raw_file_io_deflate.erl
  • lib/kernel/src/raw_file_io_delayed.erl
  • lib/kernel/src/raw_file_io_inflate.erl
  • lib/kernel/src/raw_file_io_list.erl
  • lib/kernel/src/raw_file_io_raw.erl
  • lib/kernel/src/rpc.erl
  • lib/megaco/src/binary/megaco_binary_term_id.erl
  • lib/megaco/src/binary/megaco_binary_term_id_gen.erl
  • lib/megaco/src/engine/megaco_config.erl
  • lib/megaco/src/engine/megaco_filter.erl
  • lib/megaco/src/engine/megaco_messenger_misc.erl
  • lib/megaco/src/engine/megaco_monitor.erl
  • lib/megaco/src/engine/megaco_trans_sender.erl
  • lib/megaco/src/engine/megaco_user_default.erl
  • lib/megaco/src/tcp/megaco_tcp.erl
  • lib/megaco/src/tcp/megaco_tcp_connection.erl
  • lib/megaco/src/text/megaco_compact_text_encoder_v1.erl
  • lib/megaco/src/text/megaco_compact_text_encoder_v2.erl
  • lib/megaco/src/text/megaco_compact_text_encoder_v3.erl
  • lib/megaco/src/text/megaco_pretty_text_encoder.erl
  • lib/megaco/src/text/megaco_pretty_text_encoder_v1.erl
  • lib/megaco/src/text/megaco_pretty_text_encoder_v2.erl
  • lib/megaco/src/text/megaco_pretty_text_encoder_v3.erl
  • lib/megaco/src/text/megaco_text_scanner.erl
  • lib/megaco/src/text/megaco_text_mini_decoder.erl
  • lib/megaco/src/udp/megaco_udp_server.erl
  • lib/mnesia/src/mnesia_bup.erl
  • lib/mnesia/src/mnesia_checkpoint.erl
  • lib/mnesia/src/mnesia_controller.erl
  • lib/mnesia/src/mnesia_dumper.erl
  • lib/mnesia/src/mnesia_frag.erl
  • lib/mnesia/src/mnesia_index.erl
  • lib/mnesia/src/mnesia_late_loader.erl
  • lib/mnesia/src/mnesia_lib.erl
  • lib/mnesia/src/mnesia_loader.erl
  • lib/mnesia/src/mnesia_locker.erl
  • lib/mnesia/src/mnesia_monitor.erl
  • lib/mnesia/src/mnesia_recover.erl
  • lib/mnesia/src/mnesia_rpc.erl
  • lib/mnesia/src/mnesia_schema.erl
  • lib/mnesia/src/mnesia_subscr.erl
  • lib/mnesia/src/mnesia_tm.erl
  • lib/observer/src/cdv_detail_wx.erl
  • lib/observer/src/cdv_info_wx.erl
  • lib/observer/src/cdv_multi_wx.erl
  • lib/observer/src/cdv_table_wx.erl
  • lib/observer/src/cdv_virtual_list_wx.erl
  • lib/observer/src/cdv_wx.erl
  • lib/observer/src/observer_alloc_wx.erl
  • lib/observer/src/observer_app_wx.erl
  • lib/observer/src/observer_lib.erl
  • lib/observer/src/observer_perf_wx.erl
  • lib/observer/src/observer_port_wx.erl
  • lib/observer/src/observer_pro_wx.erl
  • lib/observer/src/observer_procinfo.erl
  • lib/observer/src/observer_sys_wx.erl
  • lib/observer/src/observer_trace_wx.erl
  • lib/observer/src/observer_tv_table.erl
  • lib/observer/src/observer_traceoptions_wx.erl
  • lib/observer/src/ttb.erl
  • lib/observer/src/observer_tv_wx.erl
  • lib/observer/src/observer_wx.erl
  • lib/reltool/src/reltool_fgraph.erl
  • lib/snmp/src/compile/snmpc.erl
  • lib/snmp/src/compile/snmpc_mib_to_hrl.erl
  • lib/snmp/src/compile/snmpc_misc.erl
  • lib/snmp/src/compile/snmpc_lib.erl
  • lib/stdlib/src/c.erl
  • lib/stdlib/src/dets.erl
  • lib/stdlib/src/dets_utils.erl
  • lib/stdlib/src/dets_v9.erl
  • lib/stdlib/src/erl_tar.erl
  • lib/stdlib/src/gen_event.erl
  • lib/stdlib/src/proc_lib.erl
  • lib/stdlib/src/shell.erl
  • lib/stdlib/src/supervisor.erl
  • lib/stdlib/src/supervisor_bridge.erl
  • lib/syntax_tools/src/merl_tests.erl
  • lib/syntax_tools/src/merl_transform.erl
  • lib/tftp/src/tftp_engine.erl
  • lib/tftp/src/tftp_lib.erl
  • lib/tools/src/cover.erl
  • lib/tools/src/cprof.erl
  • lib/tools/src/eprof.erl
  • lib/tools/src/fprof.erl
  • lib/wx/src/gen/wxAcceleratorEntry.erl
  • lib/wx/src/gen/wxAcceleratorTable.erl
  • lib/wx/src/gen/wxActivateEvent.erl
  • lib/wx/src/gen/wxArtProvider.erl
  • lib/wx/src/gen/wxAuiDockArt.erl
  • lib/wx/src/gen/wxAuiManager.erl
  • lib/wx/src/gen/wxAuiManagerEvent.erl
  • lib/wx/src/gen/wxAuiNotebook.erl
  • lib/wx/src/gen/wxAuiNotebookEvent.erl
  • lib/wx/src/gen/wxAuiPaneInfo.erl
  • lib/wx/src/gen/wxAuiSimpleTabArt.erl
  • lib/wx/src/gen/wxAuiTabArt.erl
  • lib/wx/src/gen/wxBitmap.erl
  • lib/wx/src/gen/wxBitmapButton.erl
  • lib/wx/src/gen/wxBitmapDataObject.erl
  • lib/wx/src/gen/wxBoxSizer.erl
  • lib/wx/src/gen/wxBrush.erl
  • lib/wx/src/gen/wxBufferedDC.erl
  • lib/wx/src/gen/wxBufferedPaintDC.erl
  • lib/wx/src/gen/wxButton.erl
  • lib/wx/src/gen/wxCalendarDateAttr.erl
  • lib/wx/src/gen/wxCalendarEvent.erl
  • lib/wx/src/gen/wxCaret.erl
  • lib/wx/src/gen/wxCheckListBox.erl
  • lib/wx/src/gen/wxChildFocusEvent.erl
  • lib/wx/src/gen/wxCheckBox.erl
  • lib/wx/src/gen/wxChoice.erl
  • lib/wx/src/gen/wxChoicebook.erl
  • lib/wx/src/gen/wxClipboard.erl
  • lib/wx/src/gen/wxCloseEvent.erl
  • lib/wx/src/gen/wxColourData.erl
  • lib/wx/src/gen/wxColourDialog.erl
  • lib/wx/src/gen/wxColourPickerCtrl.erl
  • lib/wx/src/gen/wxColourPickerEvent.erl
  • lib/wx/src/gen/wxCommandEvent.erl
  • lib/wx/src/gen/wxComboBox.erl
  • lib/wx/src/gen/wxContextMenuEvent.erl
  • lib/wx/src/gen/wxControl.erl
  • lib/wx/src/gen/wxControlWithItems.erl
  • lib/wx/src/gen/wxDCOverlay.erl
  • lib/wx/src/gen/wxDateEvent.erl
  • lib/wx/src/gen/wxDatePickerCtrl.erl
  • lib/wx/src/gen/wxDialog.erl
  • lib/wx/src/gen/wxDirDialog.erl
  • lib/wx/src/gen/wxDirPickerCtrl.erl
  • lib/wx/src/gen/wxDisplay.erl
  • lib/wx/src/gen/wxEraseEvent.erl
  • lib/wx/src/gen/wxDropFilesEvent.erl
  • lib/wx/src/gen/wxEvent.erl
  • lib/wx/src/gen/wxFileDataObject.erl
  • lib/wx/src/gen/wxFileDialog.erl
  • lib/wx/src/gen/wxFileDirPickerEvent.erl
  • lib/wx/src/gen/wxFilePickerCtrl.erl
  • lib/wx/src/gen/wxEvtHandler.erl
  • lib/wx/src/gen/wxFindReplaceData.erl
  • lib/wx/src/gen/wxFindReplaceDialog.erl
  • lib/wx/src/gen/wxFlexGridSizer.erl
  • lib/wx/src/gen/wxFocusEvent.erl
  • lib/wx/src/gen/wxFont.erl
  • lib/wx/src/gen/wxFontData.erl
  • lib/wx/src/gen/wxFontDialog.erl
  • lib/wx/src/gen/wxFontPickerEvent.erl
  • lib/wx/src/gen/wxFontPickerCtrl.erl
  • lib/wx/src/gen/wxFrame.erl
  • lib/wx/src/gen/wxGCDC.erl
  • lib/wx/src/gen/wxGLCanvas.erl
  • lib/wx/src/gen/wxGauge.erl
  • lib/wx/src/gen/wxGraphicsContext.erl
  • lib/wx/src/gen/wxGenericDirCtrl.erl
  • lib/wx/src/gen/wxGraphicsMatrix.erl
  • lib/wx/src/gen/wxGraphicsObject.erl
  • lib/wx/src/gen/wxGraphicsPath.erl
  • lib/wx/src/gen/wxGridBagSizer.erl
  • lib/wx/src/gen/wxGrid.erl
  • lib/wx/src/gen/wxGridCellAttr.erl
  • lib/wx/src/gen/wxGridCellBoolEditor.erl
  • lib/wx/src/gen/wxGridCellBoolRenderer.erl
  • lib/wx/src/gen/wxGridCellChoiceEditor.erl
  • lib/wx/src/gen/wxGridCellFloatEditor.erl
  • lib/wx/src/gen/wxGridCellFloatRenderer.erl
  • lib/wx/src/gen/wxGridCellNumberEditor.erl
  • lib/wx/src/gen/wxGridCellNumberRenderer.erl
  • lib/wx/src/gen/wxGridCellRenderer.erl
  • lib/wx/src/gen/wxGridCellStringRenderer.erl
  • lib/wx/src/gen/wxGridCellTextEditor.erl
  • lib/wx/src/gen/wxGridEvent.erl
  • lib/wx/src/gen/wxGridSizer.erl
  • lib/wx/src/gen/wxHelpEvent.erl
  • lib/wx/src/gen/wxHtmlEasyPrinting.erl
  • lib/wx/src/gen/wxHtmlLinkEvent.erl
  • lib/wx/src/gen/wxHtmlWindow.erl
  • lib/wx/src/gen/wxIcon.erl
  • lib/wx/src/gen/wxIconBundle.erl
  • lib/wx/src/gen/wxIconizeEvent.erl
  • lib/wx/src/gen/wxImage.erl
  • lib/wx/src/gen/wxImageList.erl
  • lib/wx/src/gen/wxJoystickEvent.erl
  • lib/wx/src/gen/wxKeyEvent.erl
  • lib/wx/src/gen/wxLayoutAlgorithm.erl
  • lib/wx/src/gen/wxListBox.erl
  • lib/wx/src/gen/wxListEvent.erl
  • lib/wx/src/gen/wxListCtrl.erl
  • lib/wx/src/gen/wxListItem.erl
  • lib/wx/src/gen/wxListItemAttr.erl
  • lib/wx/src/gen/wxListView.erl
  • lib/wx/src/gen/wxListbook.erl
  • lib/wx/src/gen/wxLocale.erl
  • lib/wx/src/gen/wxLogNull.erl
  • lib/wx/src/gen/wxMDIChildFrame.erl
  • lib/wx/src/gen/wxMDIParentFrame.erl
  • lib/wx/src/gen/wxMask.erl
  • lib/wx/src/gen/wxMemoryDC.erl
  • lib/wx/src/gen/wxMenu.erl
  • lib/wx/src/gen/wxMenuBar.erl
  • lib/wx/src/gen/wxMenuEvent.erl
  • lib/wx/src/gen/wxMenuItem.erl
  • lib/wx/src/gen/wxMessageDialog.erl
  • lib/wx/src/gen/wxMiniFrame.erl
  • lib/wx/src/gen/wxMirrorDC.erl
  • lib/wx/src/gen/wxMouseCaptureChangedEvent.erl
  • lib/wx/src/gen/wxMouseEvent.erl
  • lib/wx/src/gen/wxMoveEvent.erl
  • lib/wx/src/gen/wxMultiChoiceDialog.erl
  • lib/wx/src/gen/wxNavigationKeyEvent.erl
  • lib/wx/src/gen/wxNotebook.erl
  • lib/wx/src/gen/wxNotebookEvent.erl
  • lib/wx/src/gen/wxNotifyEvent.erl
  • lib/wx/src/gen/wxOverlay.erl
  • lib/wx/src/gen/wxPageSetupDialog.erl
  • lib/wx/src/gen/wxPageSetupDialogData.erl
  • lib/wx/src/gen/wxPalette.erl
  • lib/wx/src/gen/wxPaletteChangedEvent.erl
  • lib/wx/src/gen/wxPanel.erl
  • lib/wx/src/gen/wxPasswordEntryDialog.erl
  • lib/wx/src/gen/wxPen.erl
  • lib/wx/src/gen/wxPickerBase.erl
  • lib/wx/src/gen/wxPopupTransientWindow.erl
  • lib/wx/src/gen/wxPopupWindow.erl
  • lib/wx/src/gen/wxPreviewControlBar.erl
  • lib/wx/src/gen/wxPreviewFrame.erl
  • lib/wx/src/gen/wxPrintData.erl
  • lib/wx/src/gen/wxPrintDialog.erl
  • lib/wx/src/gen/wxPrintDialogData.erl
  • lib/wx/src/gen/wxPrintPreview.erl
  • lib/wx/src/gen/wxPrinter.erl
  • lib/wx/src/gen/wxPrintout.erl
  • lib/wx/src/gen/wxProgressDialog.erl
  • lib/wx/src/gen/wxQueryNewPaletteEvent.erl
  • lib/wx/src/gen/wxRadioBox.erl
  • lib/wx/src/gen/wxRadioButton.erl
  • lib/wx/src/gen/wxRegion.erl
  • lib/wx/src/gen/wxSashEvent.erl
  • lib/wx/src/gen/wxSashLayoutWindow.erl
  • lib/wx/src/gen/wxSashWindow.erl
  • lib/wx/src/gen/wxScreenDC.erl
  • lib/wx/src/gen/wxScrollBar.erl
  • lib/wx/src/gen/wxScrollEvent.erl
  • lib/wx/src/gen/wxScrollWinEvent.erl
  • lib/wx/src/gen/wxSetCursorEvent.erl
  • lib/wx/src/gen/wxScrolledWindow.erl
  • lib/wx/src/gen/wxShowEvent.erl
  • lib/wx/src/gen/wxSingleChoiceDialog.erl
  • lib/wx/src/gen/wxSizeEvent.erl
  • lib/wx/src/gen/wxSizer.erl
  • lib/wx/src/gen/wxSizerFlags.erl
  • lib/wx/src/gen/wxSizerItem.erl
  • lib/wx/src/gen/wxSlider.erl
  • lib/wx/src/gen/wxSpinButton.erl
  • lib/wx/src/gen/wxSpinCtrl.erl
  • lib/wx/src/gen/wxSpinEvent.erl
  • lib/wx/src/gen/wxSplitterEvent.erl
  • lib/wx/src/gen/wxSplashScreen.erl
  • lib/wx/src/gen/wxSplitterWindow.erl
  • lib/wx/src/gen/wxStaticBitmap.erl
  • lib/wx/src/gen/wxStaticBox.erl
  • lib/wx/src/gen/wxStaticBoxSizer.erl
  • lib/wx/src/gen/wxStaticLine.erl
  • lib/wx/src/gen/wxStaticText.erl
  • lib/wx/src/gen/wxStatusBar.erl
  • lib/wx/src/gen/wxStdDialogButtonSizer.erl
  • lib/wx/src/gen/wxStyledTextCtrl.erl
  • lib/wx/src/gen/wxStyledTextEvent.erl
  • lib/wx/src/gen/wxSystemOptions.erl
  • lib/wx/src/gen/wxSystemSettings.erl
  • lib/wx/src/gen/wxTaskBarIcon.erl
  • lib/wx/src/gen/wxTextAttr.erl
  • lib/wx/src/gen/wxTextDataObject.erl
  • lib/wx/src/gen/wxTextCtrl.erl
  • lib/wx/src/gen/wxTextEntryDialog.erl
  • lib/wx/src/gen/wxToggleButton.erl
  • lib/wx/src/gen/wxToolTip.erl
  • lib/wx/src/gen/wxToolBar.erl
  • lib/wx/src/gen/wxToolbook.erl
  • lib/wx/src/gen/wxTopLevelWindow.erl
  • lib/wx/src/gen/wxTreeEvent.erl
  • lib/wx/src/gen/wxTreeCtrl.erl
  • lib/wx/src/gen/wxUpdateUIEvent.erl
  • lib/wx/src/gen/wxTreebook.erl
  • lib/wx/src/gen/wxWindow.erl
  • lib/wx/src/gen/wxXmlResource.erl
  • lib/wx/src/gen/wx_misc.erl
  • lib/wx/src/wxe_util.erl
  • lib/xmerl/src/xmerl_eventp.erl
  • lib/xmerl/src/xmerl_sax_parser.erl
  • lib/xmerl/src/xmerl_scan.erl
  • lib/xmerl/src/xmerl_validate.erl
  • lib/xmerl/src/xmerl_xpath_pred.erl
  • lib/xmerl/src/xmerl_xpath_scan.erl
  • lib/xmerl/src/xmerl_xsd_type.erl
  • lib/xmerl/src/xmerl_xsd.erl



Howdy! Really happy to see an early version of the compiler out there for us to play with!

I just tried to compile an Erlang hello world and got a segfault. Here's the code:


Here's my system info:

And here's my output:

Any other debug logs or something I can generate to help provide more info?


Find the latest versions by id

0.1.0-nightly-2020-09-02 - Sep 03, 2020

This release provides a package of the Lumen compiler and runtime for x86_64, on both macOS and Linux (x86_64-unknown-linux-gnu) to go with the upcoming talk at ElixirConf 2020!

This is an alpha release and will have bugs, and is likely to fail to compile a fairly large subset of programs as we close out some outstanding issues on the tracker, but within the next few days the majority of those programs that would fail to compile should no longer be a blocker, and we'll just be left with finding all the hard-to-find bugs :P

If you are interesting in lending us a hand, have a look at the issue tracker, or reach out to myself (@bitwalker), Luke (@KronicDeth) or Hans (@hansihe)! Most of all, just play with Lumen and let us know what goes wrong :)

NOTE: Windows support is not provided at this point, simply because we have not yet had time to build some of the runtime support for the native Windows calling convention, however it should work within the Windows Subsystem for Linux environment, let us know if that is not the case.

Installation Steps

  • Download the tarball for your platform
  • Extract the tarball to /opt or wherever you install programs on your system. If you extract it under /opt, it will expand to /opt/lumen, if you extract to ~/ it will expand to ~/lumen, and so on.
  • Run the compiler! If you installed under /opt for example, you'd run /opt/lumen/bin/lumen help to print the usage instructions.

Uninstall Steps

  • rm -rf <lumen directory>
Facebook Instagram Twitter GitHub Dribbble