{"id":13480242,"url":"https://github.com/shinh/elvm","last_synced_at":"2025-04-08T00:38:23.950Z","repository":{"id":41478904,"uuid":"68355989","full_name":"shinh/elvm","owner":"shinh","description":"EsoLangVM Compiler Infrastructure","archived":false,"fork":false,"pushed_at":"2024-07-26T03:11:43.000Z","size":895,"stargazers_count":1177,"open_issues_count":17,"forks_count":143,"subscribers_count":34,"default_branch":"master","last_synced_at":"2025-03-31T23:35:44.607Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shinh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-16T05:45:46.000Z","updated_at":"2025-03-26T22:21:32.000Z","dependencies_parsed_at":"2022-08-27T06:51:53.391Z","dependency_job_id":"a1be14f0-911c-45a7-be7e-bf0401adfbb2","html_url":"https://github.com/shinh/elvm","commit_stats":{"total_commits":627,"total_committers":44,"mean_commits":14.25,"dds":0.3811802232854864,"last_synced_commit":"2b315d3197247cf5dc603d1d9bd8af4c94db1b68"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinh%2Felvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinh%2Felvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinh%2Felvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinh%2Felvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shinh","download_url":"https://codeload.github.com/shinh/elvm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247755560,"owners_count":20990620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T17:00:36.215Z","updated_at":"2025-04-08T00:38:23.930Z","avatar_url":"https://github.com/shinh.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"# ELVM Compiler Infrastructure\n\n[![Build Status](https://travis-ci.org/shinh/elvm.svg?branch=master)](http://travis-ci.org/shinh/elvm)\n\nELVM is similar to LLVM but dedicated to [Esoteric\nLanguages](https://esolangs.org/wiki/Main_Page). This project consists\nof two components - frontend and backend. Currently, the only frontend\nwe have is a modified version of\n[8cc](https://github.com/rui314/8cc). The modified 8cc translates C\ncode to an internal representation format called\n[ELVM IR (EIR)](https://github.com/shinh/elvm/blob/master/ELVM.md).\nUnlike LLVM bitcode, EIR is designed to be extremely simple, so\nthere's more chance we can write a translator from EIR to an esoteric\nlanguage.\n\nCurrently, there are 60 backends:\n\n1. *Acc!!*\n1. Aheui\n1. Awk (by [@dubek](https://github.com/dubek/))\n1. Bash\n1. Befunge\n1. Binary Lambda Calculus (by [@woodrush](https://github.com/woodrush/))\n1. Brainfuck\n1. C\n1. C++14 constexpr (compile-time) (by [@kw-udon](https://github.com/kw-udon/))\n1. C++ Template Metaprogramming (compile-time) (by [@kw-udon](https://github.com/kw-udon/)) (WIP)\n1. C# (by [@masaedw](https://github.com/masaedw/))\n1. C-INTERCAL\n1. CMake (by [@ooxi](https://github.com/ooxi/))\n1. CommonLisp (by [@youz](https://github.com/youz/))\n1. Conway's Game of Life (via QFTASM) (by [@woodrush](https://github.com/woodrush/))\n1. Crystal (compile-time) (by [@MakeNowJust](https://github.com/MakeNowJust/))\n1. Emacs Lisp\n1. F# (by [@masaedw](https://github.com/masaedw/))\n1. Forth (by [@dubek](https://github.com/dubek/))\n1. Fortran (by [@samcoppini](https://github.com/samcoppini/))\n1. Go (by [@shogo82148](https://github.com/shogo82148/))\n1. Go text/template (Gomplate) (by [@Syuparn](https://github.com/syuparn/))\n1. Grass (by [@woodrush](https://github.com/woodrush/))\n1. HeLL (by [@esoteric-programmer](https://github.com/esoteric-programmer/))\n1. J (by [@dubek](https://github.com/dubek/))\n1. Java\n1. JavaScript\n1. Kinx (by [@Kray-G](https://github.com/Kray-G/))\n1. Lambda calculus (by [@woodrush](https://github.com/woodrush/))\n1. Lazy K (by [@woodrush](https://github.com/woodrush/))\n1. LLVM IR (by [@retrage](https://github.com/retrage/))\n1. LOLCODE (by [@gamerk](https://github.com/gamerk))\n1. Lua (by [@retrage](https://github.com/retrage/))\n1. Octave (by [@inaniwa3](https://github.com/inaniwa3/))\n1. Perl5 (by [@mackee](https://github.com/mackee/))\n1. PHP (by [@zonuexe](https://github.com/zonuexe/))\n1. Piet\n1. Python\n1. Ruby\n1. Scheme syntax-rules (by [@zeptometer](https://github.com/zeptometer/))\n1. Scratch3.0 (by [@algon-320](https://github.com/algon-320/))\n1. SQLite3 (by [@youz](https://github.com/youz/))\n1. SUBLEQ (by [@gamerk](https://github.com/gamerk))\n1. Swift (by [@kwakasa](https://github.com/kwakasa/))\n1. Tcl (by [@dubek](https://github.com/dubek/))\n1. TeX (by [@hak7a3](https://github.com/hak7a3/))\n1. TensorFlow (WIP)\n1. Turing machine (by [@ND-CSE-30151](https://github.com/ND-CSE-30151/))\n1. Unlambda (by [@irori](https://github.com/irori/))\n1. Universal Lambda (by [@woodrush](https://github.com/woodrush/))\n1. Vim script (by [@rhysd](https://github.com/rhysd/))\n1. WebAssembly (by [@dubek](https://github.com/dubek/))\n1. WebAssembly System Interface (by [@sanemat](https://github.com/sanemat/))\n1. Whirl by ([@samcoppini](https://github.com/samcoppini/))\n1. W-Machine by ([@jcande](https://github.com/jcande/))\n1. Whitespace\n1. arm-linux (by [@irori](https://github.com/irori/))\n1. i386-linux\n1. sed\n\nThe above list contains languages which are known to be difficult to\nprogram in, but with ELVM, you can create programs in such\nlanguages. You can easily create Brainfuck programs by writing C code\nfor example. One of interesting testcases ELVM has is [a tiny Lisp\ninterpreter](https://github.com/shinh/elvm/blob/master/test/lisp.c). The\nall above language backends are passing the test, which means you can\nrun Lisp on the above languages.\n\nMoreover, 8cc and ELVM themselves are written in C. So we can run a C\ncompiler written in the above languages to compile the ELVM's compiler\ntoolchain itself, though such compilation takes long time in some\nesoteric languages.\n\n## A demo site\n\nhttp://shinh.skr.jp/elvm/8cc.js.html\n\nAs written, ELVM toolchain itself runs on all supported language\nbackends. The above demo runs ELVM toolchain on JavaScript (thus slow).\n\n## Example big programs\n\n* [8cc in JavaScript](http://shinh.skr.jp/elvm/8cc.c.eir.js)\n* [8cc in Brainfuck](http://shinh.skr.jp/elvm/8cc.c.eir.bf)\n* [8cc in Unlambda](http://shinh.skr.jp/elvm/8cc.c.eir.unl)\n* [Lisp in Piet](http://shinh.skr.jp/elvm/lisp.png)\n* [Lisp in C-INTERCAL](http://shinh.skr.jp/elvm/8cc.c.eir.i)\n* [8cc in Befunge](http://shinh.skr.jp/elvm/8cc.c.eir.bef)\n* [8cc in Whitespace](http://shinh.skr.jp/elvm/8cc.c.eir.ws)\n\n## ELVM internals\n\n### ELVM IR\n\n* Harvard architecture, not Neumann (allowing self-modifying code is hard)\n* 6 registers: A, B, C, D, SP, and BP\n* Ops: mov, add, sub, load, store, setcc, jcc, putc, getc, and exit\n* Psuedo ops: .text, .data, .long, and .string\n* mul/div/mod are implemented by __builtin_*\n* No bit operations\n* No floating point arithmetic\n* sizeof(char) == sizeof(int) == sizeof(void*) == 1\n* The word-size is backend dependent, but most backend uses 24bit words\n* A single programming counter may contain multiple operations\n\nSee [ELVM.md](https://github.com/shinh/elvm/blob/master/ELVM.md) for\nmore detail.\n\n### Directories\n\n[shinh/8cc's eir branch](https://github.com/shinh/8cc/tree/eir) is the\nfrontend C compiler.\n\n[ir/](https://github.com/shinh/elvm/tree/master/ir) directory has a\nparser and an interpreter of ELVM IR. ELVM IR has\n\n[target/](https://github.com/shinh/elvm/tree/master/target) directory\nhas backend implementations. Code in this directory uses the IR parser\nto generate backend code.\n\n[libc/](https://github.com/shinh/elvm/tree/master/target) directory\nhas an incomplete libc implementation which is necessary to run\ntests.\n\n## Notes on language backends\n\n### Brainfuck\n\nRunning a Lisp interpreter on Brainfuck was the first motivation of\nthis project ([bflisp](https://github.com/shinh/bflisp)). ELVM IR is\ndesigned for Brainfuck but it turned out such a simple IR could be\nsuitable for other esoteric languages.\n\nAs Brainfuck is slow, this project contains a Brainfuck\ninterpreter/compiler in\n[tools/bfopt.cc](https://github.com/shinh/elvm/blob/master/tools/bfopt.cc).\nYou can also use other optimized Brainfuck implementations such as\n[tritium](https://github.com/rdebath/Brainfuck/tree/master/tritium).\nNote you need implementations with 8bit cells. For tritium, you need\nto specify `-b' flag.\n\n### Unlambda\n\nThis backend was contributed by [@irori](https://github.com/irori/).\nSee also [8cc.unl](https://github.com/irori/8cc.unl).\n\nThis backend is tested with [@irori's\ninterpreter](https://github.com/irori/unlambda). tools/rununl.sh\nautomatically downloads it.\n\n### C-INTERCAL\n\nThis backend uses 16bit registers and address space, though ELVM's\nstandard is 24bit. Due to the lack of address space, you cannot\ncompile large C programs using 8cc on C-INTERCAL.\n\nThis backend won't be tested by default because C-INTERCAL is slow. Use\n\n    $ CINT=1 make i\n\nto run them. Note you may need to adjust tools/runi.sh.\n\nYou can make faster executables by doing something like\n\n    $ cp out/fizzbuzz.c.eir.i fizzbuzz.i \u0026\u0026 ick fizzbuzz.i\n    $ ./fizzbuzz\n\nBut compilation takes much more time as it uses gcc instead of tcc.\n\n### Piet\n\nThis backend also has 16bit address space. There's the same limitation\nas C-INTERCAL's.\n\nThis backend won't be tested by default because npiet is slow. Use\n\n    $ PIET=1 make piet\n\nto run them.\n\n### Befunge\n\n[BefLisp](https://github.com/shinh/beflisp), which translates LLVM\nbitcode to Befunge, has very similar code. The interpreter,\ntools/befunge.cc is mostly Befunge-93, but its address space is\nextended to make Befunge-93 Turing-complete.\n\n### Whitespace\n\nThis backend is tested with [@koturn](https://github.com/koturn/)'s [Whitespace\nimplementation](https://github.com/koturn/Whitespace/).\n\n### Emacs Lisp\n\nThis backend is somewhat more interesting than other non-esoteric\nbackends. You can run a C compiler on Emacs:\n\n* M-x load-file tools/elvm.el\n* open test/putchar.c (or write C code without #include)\n* M-x 8cc\n* Now you'll see ELVM IR. You need to prepend a backend name (`el' for\n  example) as the first line.\n* M-x elc\n* M-x eval-buffer\n* M-x elvm-main\n\n### Vim script\n\nThis backend was contributed by [@rhysd](https://github.com/rhysd/). You can run a C compiler on\nVim:\n\n* Open test/hello.c (or write your C code)\n* `:source /path/to/out/8cc.vim`\n* Now you can see ELVM IR in the buffer\n* Please prepend a backend name (`vim` for Vim) to the first line\n* `:source /path/to/out/elc.vim`\n* You can see Vim script code as the compilation result in current buffer\n* You can `:source` to run the code\n\nYou can find more descriptions and released vim script in\n[8cc.vim](https://github.com/rhysd/8cc.vim).\n\n### TeX\n\nThis backend was contributed by [@hak7a3](https://github.com/hak7a3/). See\nalso [8cc.tex](https://github.com/hak7a3/8cc.tex).\n\n### C++14 constexpr (compile-time)\n\nThis backend was contributed by [@kw-udon](https://github.com/kw-udon/). You can find more\ndescriptions in\n[constexpr-8cc](https://github.com/kw-udon/constexpr-8cc).\n\n### sed\n\nThis backend is very slow so only limited tests run by default. You\ncan run them by\n\n    $ FULL=1 make sed\n\nbut it could take years to run all tests. I believe C compiler in sed\nworks, but I haven't confirmed it's working yet. You can try Lisp\ninterpreter instead:\n\n    $ FULL=1 make out/lisp.c.eir.sed.out.diff\n    $ echo '(+ 4 3)' | time sed -n -f out/lisp.c.eir.sed\n\nThis backend should support both GNU sed and BSD sed, so this backend\nis more portable than [sedlisp](https://github.com/shinh/sedlisp),\nthough much slower. Also note, due to limitation of BSD sed, programs\ncannot output non-ASCII characters and NUL.\n\n### HeLL\n\nThis backend was contributed by [@esoteric-programmer](https://github.com/esoteric-programmer/).\nHeLL is an assembly language for Malbolge and Malbolge Unshackled.\nUse [LMFAO](https://github.com/esoteric-programmer/LMFAO) to build the Malbolge Unshackled program from HeLL.\nThis backend won't be tested by default because Malbolge Unshackled is extremely slow. Use\n\n    $ HELL=1 make hell\n\nto run them. Note you may need to adjust tools/runhell.sh.\n\nThis backend does not support all 8-bit characters on I/O, because I/O of Malbolge Unshackled\nuses Unicode codepoints instead of single bytes in getc/putc calls.\nFurther, the Malbolge Unshackled interpreter automatically converts newlines read from stdin,\nwhich cannot be revert in a platform independent way.\nThe backend reverts/converts newlines from input to Linux encoding and\napplies modulo 256 operations to all input and output,\nbut it cannot compensate the issues this way.\nYou should limit I/O to ASCII characters in order to avoid unexpected behaviour or crashes.\n\nThis backend may be replaced by a Malbolge Unshackled backend in the future.\n\n### TensorFlow\n\nThanks to control flow operations such as tf.while_loop and tf.cond,\na TensorFlow's graph is Turing complete. This backend translates EIR\nto a Python code which constructs a graph which is equivalent to the\nsource EIR. This backend is very slow and uses a huge amount of\nmemory. I've never seen 8cc.c.eir.tf works, but lisp.c.eir.tf does\nwork. You can test this backend by\n\n    $ TF=1 make tf\n\nTODO: Reduce the size of the graph and run 8cc\n\n### Scratch 3.0\n\n[Scratch](https://scratch.mit.edu/) is a visual programming language.\n\nInternally, a Scratch program consists of a JSON that represent the program and some resources such as \nimages or sounds.\nThey are zip-archived and you can import/export them from project page (Create new one from [here](https://scratch.mit.edu/projects/editor/)).\n\nYou can use `tools/gen_scratch_sb3.sh` to generate complete project files from output of this backend,\nand `tools/run_scratch.js` to execute programs from command line (npm 'scratch-vm' package is required).\n\nYou can try \"fizzbuzz_fast\" sample from [here](https://scratch.mit.edu/projects/383294522/).\n\n#### Example (for `test/basic.eir`)\nFirst, generate scratch project.\n```sh\n$ ./out/elc -scratch3 test/basic.eir \u003e basic.scratch3\n$ ./tools/gen_scratch_sb3.sh basic.scratch3\n$ ls basic.scratch3.sb3\nbasic.scratch3.sb3\n```\n\n##### Execute it from Web browser\n1. Visit [https://scratch.mit.edu/projects/editor](https://scratch.mit.edu/projects/editor).\n2. Click a menu item: \"File\".\n3. Click \"Load from your computer\".\n4. Select and upload the generated project file: `basic.scratch3.sb3`.\n5. Wait until the project is loaded. (It takes a long time for a hevy project.)\n6. Click the \"Green Flag\"\n\nFrom the Web editor, to input special characters (LF, EOF, etc.) you have to input them explicitly by following:\n|special character|representation|\n|-----------------|--------------|\n| LF              |`＼n`         |\n| EOF             |`＼0`         |\n| other character with codepoint XXX (decimal) |`＼dXXX`|\n\nNote that: the escape character is `＼` (U+FF3C) not `\\`.\n\nFor normal ASCII characters, you can just put them into the input field.\n\n##### Execute it from command line\n1. First install the npm package [\"scratch-vm\"](https://github.com/LLK/scratch-vm) under the `tools` directory :\n```sh\n$ cd tools\n$ npm install scratch-vm\n```\n2. Run it with `tools/run_scratch.js`:\n```\n$ echo -n '' | nodejs ./run_scratch.js ../basic.scratch3.sb3\n!!@X\n```\n\n### Conway's Game of Life\n\nThis backend was contributed by [@woodrush](https://github.com/woodrush/) based on [QFTASM](https://github.com/QuestForTetris/QFT).\nSee [tools/qftasm/README.md](tools/qftasm/README.md) for its details.\nFurther implementation details are described in the [Lisp in Life](https://github.com/woodrush/lisp-in-life) project.\n\n### Binary Lambda Calculus\nThis backend was contributed by [@woodrush](https://github.com/woodrush/).\nImplementation details are described in the [LambdaVM](https://github.com/woodrush/lambdavm) and [lambda-8cc](https://github.com/woodrush/lambda-8cc) repositories.\n\nThe output of this backend is an untyped lambda calculus term written in [binary lambda calculus](https://tromp.github.io/cl/Binary_lambda_calculus.html) notation.\nThe output program runs on the [IOCCC](https://www.ioccc.org/) 2012 [\"Most Functional\"](https://www.ioccc.org/2012/tromp/hint.html) interpreter written by [@tromp](https://github.com/tromp).\nThe program runs on the byte-oriented mode which is the default mode.\n\nThis backend outputs a sequence of 0/1s written in ASCII.\nThis bit stream must be packed into a byte stream before passing it to the interpreter,\nwhich can be done using tools/packbits.c. Please see tools/runblc.sh for usage details.\n\nThis backend is tested with the interpreter [uni](https://github.com/melvinzhang/binary-lambda-calculus),\na fast implementation of the \"Most Functional\" interpreter written in C++ by [@melvinzhang](https://github.com/melvinzhang).\nThis interpreter significantly speeds up the running time of large programs such as 8cc.c.\ntools/runblc.sh automatically clones and builds uni via tools/runblc.sh when the tests are run.\n\n### Lambda Calculus\nThis backend was contributed by [@woodrush](https://github.com/woodrush/).\nThis backend outputs an untyped lambda calculus term written in plain text, such as `\\x.(x x)`.\n\nThe I/O model used in this backend is identical to the one used in the [Binary Lambda Calculus backend](#binary-lambda-calculus).\nThe backend's output program is a lambda calculus term that takes a string as an input and returns a string.\nHere, strings are encoded into lambda calculus terms using Scott encoding and Church encoding,\nso the entire computation only consists of the beta-reduction of lambda calculus terms.\nFurther implementation details are described in the [LambdaVM](https://github.com/woodrush/lambdavm) and [lambda-8cc](https://github.com/woodrush/lambda-8cc) repositories.\nNote that the backend's output program is assumed to be evaluated using a lazy evaluation strategy.\n\nThis backend is tested with the interpreter [uni](https://github.com/melvinzhang/binary-lambda-calculus),\nwritten by [@melvinzhang](https://github.com/melvinzhang).\nThe [blc](https://github.com/tromp/AIT) tool written by [@tromp](https://github.com/tromp) is also used to convert plain text lambdas into binary lambda calculus notation, the format accepted by `uni`.\nBoth tools are automatically cloned and built via tools/runlam.sh when the tests are run.\n\n\n### Lazy K\nThe [Lazy K](https://tromp.github.io/cl/lazy-k.html) backend was contributed by [@woodrush](https://github.com/woodrush/).\nImplementation details are described in the [LambdaVM](https://github.com/woodrush/lambdavm) and [lambda-8cc](https://github.com/woodrush/lambda-8cc) repositories.\n\nThis backend is tested with the Lazy K interpreter [lazyk](https://github.com/irori/lazyk) written by [@irori](https://github.com/irori).\nInteractive programs require the `-u` option which disables standard output buffering, used as `lazyk -u [input file]`.\nThe interpreter is automatically cloned and built via tools/runlazy.sh when the tests are run.\n\n### Universal Lambda\nThe [Universal Lambda](http://www.golfscript.com/lam/) backend was contributed by [@woodrush](https://github.com/woodrush/).\nImplementation details are described in the [LambdaVM](https://github.com/woodrush/lambdavm) repository.\n\nThis backend is tested with the Universal Lambda interpreter [clamb](https://github.com/irori/clamb) written by [@irori](https://github.com/irori).\nInteractive programs require the `-u` option which disables standard output buffering, used as `clamb -u [input file]`.\nThe interpreter is automatically cloned and built via tools/runulamb.sh when the tests are run.\n\nThe output of this backend is an untyped lambda calculus term written in the [binary lambda calculus](https://tromp.github.io/cl/Binary_lambda_calculus.html) notation.\nThe output program is written as a sequence of 0/1s in ASCII.\nThe bit stream must be packed into a byte stream before passing it to the interpreter.\nThis can be done using tools/packbits.c. Please see tools/runulamb.sh for usage details.\n\n### Grass\nThe [Grass](http://www.blue.sky.or.jp/grass/) backend was contributed by [@woodrush](https://github.com/woodrush/).\nImplementation details are described in the [GrassVM](https://github.com/woodrush/grassvm) and [LambdaVM](https://github.com/woodrush/lambdavm) repositories.\n\nThis backend is tested with the Grass interpreter [grass.ml](https://gist.github.com/woodrush/3d85a6569ef3c85b63bfaf9211881af6), originally written by [@ytomino](https://github.com/ytomino) and modified by [@youz](https://github.com/youz) and [@woodrush](https://github.com/woodrush).\nThe modifications are described in the [GrassVM](https://github.com/woodrush/grassvm) repository.\n\n\n## Future works\n\nI'm interested in\n\n* adding more backends (e.g., 16bit CPU, Malbolge Unshackled, ...)\n* running more programs (e.g., lua.bf or mruby.bf?)\n* supporting more C features (e.g., bit operations)\n* eliminating unnecessary code in 8cc\n\nAdding a backend shouldn't be extremely difficult. PRs are welcomed!\n\n## See also\n\nThis project is a sequel of [bflisp](https://github.com/shinh/bflisp).\n\n* [Lisp in sed](https://github.com/shinh/sedlisp)\n* [Lisp in Befunge](https://github.com/shinh/beflisp)\n* [Lisp in GNU make](https://github.com/shinh/makelisp)\n* [Slide deck in Japanese](http://shinh.skr.jp/slide/elvm/000.html)\n\n## Acknowledgement\n\nI'd like to thank [Rui Ueyama](https://github.com/rui314/) for his\neasy-to-hack compiler and suggesting the basic idea which made this\npossible.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinh%2Felvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshinh%2Felvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinh%2Felvm/lists"}