2024-04-15 04:24:36 +08:00
llgo - A Go compiler based on LLVM
=====
[](https://github.com/goplus/llgo/actions/workflows/go.yml)
[](https://goreportcard.com/report/github.com/goplus/llgo)
2024-04-22 01:04:38 +08:00
[](https://github.com/goplus/llgo/releases)
2024-04-15 04:24:36 +08:00
[](https://codecov.io/gh/goplus/llgo)
2024-04-25 07:29:45 +08:00
[](https://pkg.go.dev/github.com/goplus/llgo)
2025-06-12 18:53:08 +08:00
[](https://github.com/goplus/gop)
2024-04-25 07:29:45 +08:00
2025-07-08 16:09:22 +08:00
LLGo is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python and JavaScript. It's a subproject of [the XGo project ](https://github.com/goplus/gop ).
2024-05-16 00:02:10 +08:00
2025-06-12 18:53:08 +08:00
LLGo aims to expand the boundaries of Go/XGo, providing limitless possibilities such as:
2024-07-07 15:12:20 +08:00
* Game development
* AI and data science
* WebAssembly
* Embedded development
* ...
How can these be achieved?
```
2025-07-15 12:30:41 +08:00
LLGo := Go * C ecosystem
2024-07-07 15:12:20 +08:00
```
2025-07-15 12:30:41 +08:00
LLGo is compatible with C ecosystem through the language's **Application Binary Interface (ABI) ** , while LLGo is compatible with Go through its **syntax (source code) ** . C ecosystem includes all languages that are ABI compatible with C (eg. C/C++, Python, JavaScript, Objective-C, Swift, etc).
2024-07-07 15:12:20 +08:00
2024-05-06 12:31:55 +08:00
2024-07-14 01:38:31 +08:00
## C/C++ standard libary support
2024-05-11 05:18:17 +08:00
2024-07-14 01:38:31 +08:00
You can import a C/C++ standard library in LLGo!
2024-07-02 23:08:57 +08:00
2025-04-03 15:52:18 +08:00
* [c ](https://pkg.go.dev/github.com/goplus/lib/c )
* [c/syscall ](https://pkg.go.dev/github.com/goplus/lib/c/syscall )
* [c/sys ](https://pkg.go.dev/github.com/goplus/lib/c/sys )
* [c/os ](https://pkg.go.dev/github.com/goplus/lib/c/os )
* [c/math ](https://pkg.go.dev/github.com/goplus/lib/c/math )
* [c/math/cmplx ](https://pkg.go.dev/github.com/goplus/lib/c/math/cmplx )
* [c/math/rand ](https://pkg.go.dev/github.com/goplus/lib/c/math/rand )
* [c/pthread ](https://pkg.go.dev/github.com/goplus/lib/c/pthread )
* [c/pthread/sync ](https://pkg.go.dev/github.com/goplus/lib/c/pthread/sync )
* [c/sync/atomic ](https://pkg.go.dev/github.com/goplus/lib/c/sync/atomic )
* [c/time ](https://pkg.go.dev/github.com/goplus/lib/c/time )
* [c/net ](https://pkg.go.dev/github.com/goplus/lib/c/net )
* [cpp/std ](https://pkg.go.dev/github.com/goplus/lib/cpp/std )
2024-07-02 23:08:57 +08:00
Here is a simple example:
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_simple/simple.go -->
2024-05-12 13:05:15 +08:00
```go
package main
2025-04-03 15:52:18 +08:00
import "github.com/goplus/lib/c"
2024-05-12 13:05:15 +08:00
func main() {
c.Printf(c.Str("Hello world\n"))
}
```
2024-05-16 00:02:10 +08:00
This is a simple example of calling the C `printf` function to print `Hello world` . Here, `c.Str` is not a function for converting a Go string to a C string, but a built-in instruction supported by `llgo` for generating a C string constant.
The `_demo` directory contains some C standard libary related demos (it start with `_` to prevent the `go` command from compiling it):
2025-09-09 15:06:55 +08:00
* [hello ](_demo/c/hello/hello.go ): call C `printf` to print `Hello world`
* [concat ](_demo/c/concat/concat.go ): call C `fprintf` with `stderr`
* [qsort ](_demo/c/qsort/qsort.go ): call C function with a callback (eg. `qsort` )
2024-05-16 00:02:10 +08:00
To run these demos (If you haven't installed `llgo` yet, please refer to [How to install ](#how-to-install )):
```sh
2025-09-09 15:06:55 +08:00
cd <demo-directory> # eg. cd _demo/c/hello
2024-05-16 00:02:10 +08:00
llgo run .
```
2024-05-12 13:05:15 +08:00
2024-05-11 05:18:17 +08:00
2025-02-01 21:00:01 +08:00
## How to support C/C++ and Python
2024-07-14 11:01:08 +08:00
LLGo use `go:linkname` to link an extern symbol througth its ABI:
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_call_c/call_c.go#L3 -L6 -->
2024-07-14 11:01:08 +08:00
```go
import _ "unsafe" // for go:linkname
//go:linkname Sqrt C.sqrt
func Sqrt(x float64) float64
```
2025-09-09 15:06:55 +08:00
You can directly integrate it into [your own code ](_demo/c/linkname/linkname.go ):
2024-07-14 11:01:08 +08:00
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_call_c/call_c.go -->
2024-07-14 11:01:08 +08:00
```go
package main
import _ "unsafe" // for go:linkname
//go:linkname Sqrt C.sqrt
func Sqrt(x float64) float64
func main() {
println("sqrt(2) =", Sqrt(2))
}
```
2025-04-03 17:08:13 +08:00
Or put it into a package (see [c/math ](https://github.com/goplus/lib/tree/main/c/math/math.go )):
2024-07-14 11:01:08 +08:00
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_call_cmath/call_cmath.go -->
2024-07-14 11:01:08 +08:00
```go
package main
2025-04-03 15:52:18 +08:00
import "github.com/goplus/lib/c/math"
2024-07-14 11:01:08 +08:00
func main() {
println("sqrt(2) =", math.Sqrt(2))
}
```
2024-05-11 05:18:17 +08:00
## Python support
2024-05-16 00:02:10 +08:00
You can import a Python library in LLGo!
2024-05-15 16:04:20 +08:00
2024-05-19 16:42:22 +08:00
And you can import any Python library into `llgo` through a program called `llpyg` (see [Development tools ](#development-tools )). The following libraries have been included in `llgo` :
2024-05-15 16:04:20 +08:00
2025-04-03 15:52:18 +08:00
* [py ](https://pkg.go.dev/github.com/goplus/lib/py ) (abi)
* [py/std ](https://pkg.go.dev/github.com/goplus/lib/py/std ) (builtins)
* [py/sys ](https://pkg.go.dev/github.com/goplus/lib/py/sys )
* [py/os ](https://pkg.go.dev/github.com/goplus/lib/py/os )
* [py/math ](https://pkg.go.dev/github.com/goplus/lib/py/math )
* [py/json ](https://pkg.go.dev/github.com/goplus/lib/py/json )
* [py/inspect ](https://pkg.go.dev/github.com/goplus/lib/py/inspect )
* [py/statistics ](https://pkg.go.dev/github.com/goplus/lib/py/statistics )
* [py/numpy ](https://pkg.go.dev/github.com/goplus/lib/py/numpy )
* [py/pandas ](https://pkg.go.dev/github.com/goplus/lib/py/pandas )
* [py/torch ](https://pkg.go.dev/github.com/goplus/lib/py/torch )
* [py/matplotlib ](https://pkg.go.dev/github.com/goplus/lib/py/matplotlib )
2024-05-15 16:04:20 +08:00
2024-06-18 23:18:25 +08:00
Note: For third-party libraries (such as pandas and pytorch), you still need to install the library files.
2024-07-04 18:34:00 +08:00
Here is an example:
2024-05-12 23:59:24 +08:00
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_call_py/call_py.go -->
2024-05-12 23:59:24 +08:00
```go
package main
import (
2025-04-03 15:52:18 +08:00
"github.com/goplus/lib/py"
"github.com/goplus/lib/py/math"
"github.com/goplus/lib/py/std"
2024-05-12 23:59:24 +08:00
)
func main() {
2024-07-04 18:34:00 +08:00
x := math.Sqrt(py.Float(2)) // x = sqrt(2)
std.Print(py.Str("sqrt(2) ="), x) // print("sqrt(2) =", x)
2024-05-12 23:59:24 +08:00
}
```
2024-07-04 18:34:00 +08:00
It is equivalent to the following Python code:
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_call_py/call_math.py -->
2024-07-04 18:34:00 +08:00
```py
import math
x = math.sqrt(2)
print("sqrt =", x)
```
Here, We call `py.Float(2)` to create a Python number 2, and pass it to Python’ s `math.sqrt` to get `x` . Then we call `std.Print` to print the result.
2024-05-13 01:27:02 +08:00
2024-05-15 16:04:20 +08:00
Let's look at a slightly more complex example. For example, we use `numpy` to calculate:
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/llgo_py_list/py_list.go -->
2024-05-15 16:04:20 +08:00
```go
package main
import (
2025-04-03 15:52:18 +08:00
"github.com/goplus/lib/py"
"github.com/goplus/lib/py/numpy"
"github.com/goplus/lib/py/std"
2024-05-15 16:04:20 +08:00
)
func main() {
a := py.List(
py.List(1.0, 2.0, 3.0),
py.List(4.0, 5.0, 6.0),
py.List(7.0, 8.0, 9.0),
)
b := py.List(
py.List(9.0, 8.0, 7.0),
py.List(6.0, 5.0, 4.0),
py.List(3.0, 2.0, 1.0),
)
x := numpy.Add(a, b)
2024-07-04 18:34:00 +08:00
std.Print(py.Str("a+b ="), x)
2024-05-15 16:04:20 +08:00
}
```
Here we define two 3x3 matrices a and b, add them to get x, and then print the result.
2025-09-09 15:06:55 +08:00
The `_demo/py/` directory contains some python related demos:
2024-05-11 05:18:17 +08:00
2025-09-09 15:06:55 +08:00
* [callpy ](_demo/py/callpy/callpy.go ): call Python standard library function `math.sqrt`
* [pi ](_demo/py/pi/pi.go ): print python constants `math.pi`
* [statistics ](_demo/py/statistics/statistics.go ): define a python list and call `statistics.mean` to get the mean
* [matrix ](_demo/py/matrix/matrix.go ): a basic `numpy` demo
2024-05-11 05:18:17 +08:00
2024-07-07 19:04:10 +08:00
To run these demos (If you haven't installed `llgo` yet, please refer to [How to install ](#how-to-install )):
2024-05-06 12:31:55 +08:00
```sh
2025-09-09 15:06:55 +08:00
cd <demo-directory> # eg. cd _demo/py/callpy
2024-05-16 00:02:10 +08:00
llgo run .
2024-05-06 12:31:55 +08:00
```
2024-05-09 07:19:13 +08:00
2024-05-16 00:02:10 +08:00
## Other frequently used libraries
2024-05-09 07:19:13 +08:00
2024-05-16 00:02:10 +08:00
LLGo can easily import any libraries from the C ecosystem. Currently, this import process is still manual, but in the future, it will be automated similar to Python library imports.
2024-05-06 12:31:55 +08:00
2024-05-20 08:46:39 +08:00
The currently supported libraries include:
2024-05-16 00:02:10 +08:00
2025-04-03 15:52:18 +08:00
* [c/bdwgc ](https://pkg.go.dev/github.com/goplus/lib/c/bdwgc )
* [c/cjson ](https://pkg.go.dev/github.com/goplus/lib/c/cjson )
* [c/clang ](https://pkg.go.dev/github.com/goplus/lib/c/clang )
* [c/ffi ](https://pkg.go.dev/github.com/goplus/lib/c/ffi )
* [c/libuv ](https://pkg.go.dev/github.com/goplus/lib/c/libuv )
* [c/llama2 ](https://pkg.go.dev/github.com/goplus/lib/c/llama2 )
* [c/lua ](https://pkg.go.dev/github.com/goplus/lib/c/lua )
* [c/neco ](https://pkg.go.dev/github.com/goplus/lib/c/neco )
* [c/openssl ](https://pkg.go.dev/github.com/goplus/lib/c/openssl )
* [c/raylib ](https://pkg.go.dev/github.com/goplus/lib/c/raylib )
* [c/sqlite ](https://pkg.go.dev/github.com/goplus/lib/c/sqlite )
* [c/zlib ](https://pkg.go.dev/github.com/goplus/lib/c/zlib )
* [cpp/inih ](https://pkg.go.dev/github.com/goplus/lib/cpp/inih )
* [cpp/llvm ](https://pkg.go.dev/github.com/goplus/lib/cpp/llvm )
2024-05-16 00:02:10 +08:00
Here are some examples related to them:
2024-05-06 12:31:55 +08:00
2025-09-09 15:06:55 +08:00
* [llama2-c ](_demo/c/llama2-c ): inference Llama 2 (It's the first llgo AI example)
2025-04-03 17:08:13 +08:00
* [mkjson ](https://github.com/goplus/lib/tree/main/c/cjson/_demo/mkjson/mkjson.go ): create a json object and print it
* [sqlitedemo ](https://github.com/goplus/lib/tree/main/c/sqlite/_demo/sqlitedemo/demo.go ): a basic sqlite demo
* [tetris ](https://github.com/goplus/lib/tree/main/c/raylib/_demo/tetris/tetris.go ): a tetris game based on raylib
2024-05-11 05:04:02 +08:00
2024-05-12 23:59:24 +08:00
2024-05-16 00:02:10 +08:00
## Go syntax support
2024-05-11 05:04:02 +08:00
2024-12-14 08:15:08 +08:00
All Go syntax (including `cgo` ) is already supported. Here are some examples:
2024-05-11 05:04:02 +08:00
2025-09-09 15:06:55 +08:00
* [concat ](_demo/c/concat/concat.go ): define a variadic function
* [genints ](_demo/c/genints/genints.go ): various forms of closure usage (including C function, recv.method and anonymous function)
2024-06-23 00:48:20 +08:00
* [errors ](_cmptest/errors/errors.go ): demo to implement error interface
* [defer ](_cmptest/defer/defer.go ): defer demo
2025-09-09 15:06:55 +08:00
* [goroutine ](_demo/go/goroutine/goroutine.go ): goroutine demo
2024-05-16 00:02:10 +08:00
2024-07-28 09:29:08 +08:00
### Defer
2024-06-12 23:27:54 +08:00
2025-10-15 13:36:52 +08:00
LLGo now supports `defer` within loops, matching Go's semantics of executing defers in LIFO order for every iteration. The usual caveat from Go still applies: be mindful of loop-heavy defer usage because it allocates per iteration.
2024-06-12 23:27:54 +08:00
2024-06-08 23:06:55 +08:00
### Garbage Collection (GC)
2024-06-11 10:35:27 +08:00
By default, LLGo implements `gc` based on [bdwgc ](https://www.hboehm.info/gc/ ) (also known as [libgc ](https://www.hboehm.info/gc/ )).
2024-06-08 23:06:55 +08:00
However, you can disable gc by specifying the `nogc` tag. For example:
```sh
llgo run -tags nogc .
```
2024-05-19 00:15:23 +08:00
## Go packages support
Here are the Go packages that can be imported correctly:
* [unsafe ](https://pkg.go.dev/unsafe )
2024-05-19 12:38:22 +08:00
* [unicode ](https://pkg.go.dev/unicode )
2024-05-19 00:15:23 +08:00
* [unicode/utf8 ](https://pkg.go.dev/unicode/utf8 )
2024-05-19 12:38:22 +08:00
* [unicode/utf16 ](https://pkg.go.dev/unicode/utf16 )
2024-06-15 15:58:22 +08:00
* [math ](https://pkg.go.dev/math )
2024-08-01 08:46:37 +08:00
* [math/big ](https://pkg.go.dev/math/big ) (partially)
2024-06-20 10:00:47 +08:00
* [math/bits ](https://pkg.go.dev/math/bits )
* [math/cmplx ](https://pkg.go.dev/math/cmplx )
2024-07-30 21:41:26 +08:00
* [math/rand ](https://pkg.go.dev/math/rand )
2024-08-05 17:26:36 +08:00
* [net/url ](https://pkg.go.dev/net/url )
2024-07-14 01:38:31 +08:00
* [errors ](https://pkg.go.dev/errors )
* [context ](https://pkg.go.dev/context )
* [io ](https://pkg.go.dev/io )
* [io/fs ](https://pkg.go.dev/io/fs )
2024-08-02 14:27:10 +08:00
* [io/ioutil ](https://pkg.go.dev/io/ioutil )
2024-07-14 01:38:31 +08:00
* [log ](https://pkg.go.dev/log )
2024-07-16 22:36:38 +08:00
* [flag ](https://pkg.go.dev/flag )
2024-06-21 11:02:28 +08:00
* [sort ](https://pkg.go.dev/sort )
2024-07-29 16:31:59 +08:00
* [bytes ](https://pkg.go.dev/bytes )
2024-07-30 00:44:03 +08:00
* [bufio ](https://pkg.go.dev/bufio )
2024-07-16 22:36:38 +08:00
* [strings ](https://pkg.go.dev/strings )
2024-07-29 16:31:59 +08:00
* [strconv ](https://pkg.go.dev/strconv )
2024-07-29 08:38:56 +08:00
* [path ](https://pkg.go.dev/path )
* [path/filepath ](https://pkg.go.dev/path/filepath )
2024-06-19 22:36:55 +08:00
* [sync/atomic ](https://pkg.go.dev/sync/atomic )
2024-06-20 19:55:37 +08:00
* [sync ](https://pkg.go.dev/sync ) (partially)
* [syscall ](https://pkg.go.dev/syscall ) (partially)
2024-07-14 01:54:29 +08:00
* [runtime ](https://pkg.go.dev/runtime ) (partially)
2024-06-20 19:55:37 +08:00
* [os ](https://pkg.go.dev/os ) (partially)
2024-07-14 01:38:31 +08:00
* [os/exec ](https://pkg.go.dev/os/exec ) (partially)
2024-07-02 16:00:43 +08:00
* [fmt ](https://pkg.go.dev/fmt ) (partially)
2024-06-20 22:24:03 +08:00
* [reflect ](https://pkg.go.dev/reflect ) (partially)
2024-06-27 02:28:18 +08:00
* [time ](https://pkg.go.dev/time ) (partially)
2024-07-31 11:33:15 +08:00
* [encoding ](https://pkg.go.dev/encoding )
2024-07-30 00:28:04 +08:00
* [encoding/binary ](https://pkg.go.dev/encoding/binary )
2024-07-30 00:33:44 +08:00
* [encoding/hex ](https://pkg.go.dev/encoding/hex )
2024-07-30 00:30:58 +08:00
* [encoding/base32 ](https://pkg.go.dev/encoding/base32 )
2024-07-30 00:28:04 +08:00
* [encoding/base64 ](https://pkg.go.dev/encoding/base64 )
2024-07-30 00:44:03 +08:00
* [encoding/csv ](https://pkg.go.dev/encoding/csv )
2024-08-15 22:08:21 +08:00
* [net/textproto ](https://pkg.go.dev/net/textproto )
2024-07-30 18:26:33 +08:00
* [hash ](https://pkg.go.dev/hash )
2024-07-30 19:36:36 +08:00
* [hash/adler32 ](https://pkg.go.dev/hash/adler32 )
* [hash/crc32 ](https://pkg.go.dev/hash/crc32 ) (partially)
2024-07-30 18:26:33 +08:00
* [hash/crc64 ](https://pkg.go.dev/hash/crc64 )
2025-10-15 02:23:46 +00:00
* [hash/maphash ](https://pkg.go.dev/hash/maphash ) (partially)
2024-07-31 18:59:25 +08:00
* [crypto ](https://pkg.go.dev/crypto )
2024-07-30 02:07:19 +08:00
* [crypto/md5 ](https://pkg.go.dev/crypto/md5 )
2024-07-31 18:55:46 +08:00
* [crypto/sha1 ](https://pkg.go.dev/crypto/sha1 )
* [crypto/sha256 ](https://pkg.go.dev/crypto/sha256 )
* [crypto/sha512 ](https://pkg.go.dev/crypto/sha512 ) (partially)
2024-08-06 17:19:31 +08:00
* [crypto/hmac ](https://pkg.go.dev/crypto/hmac ) (partially)
2024-07-31 10:30:04 +08:00
* [crypto/rand ](https://pkg.go.dev/crypto/rand ) (partially)
2024-08-06 17:19:31 +08:00
* [crypto/subtle ](https://pkg.go.dev/crypto/subtle ) (partially)
2024-07-29 16:31:59 +08:00
* [regexp ](https://pkg.go.dev/regexp )
* [regexp/syntax ](https://pkg.go.dev/regexp/syntax )
2024-07-31 11:33:15 +08:00
* [go/token ](https://pkg.go.dev/go/token )
* [go/scanner ](https://pkg.go.dev/go/scanner )
2025-04-28 00:37:11 +08:00
* [go/parser ](https://pkg.go.dev/go/parser )
2024-05-19 00:15:23 +08:00
2024-06-17 16:38:55 +08:00
## Dependencies
2025-04-03 15:52:18 +08:00
- [Go 1.21+ ](https://go.dev )
2024-07-07 14:58:34 +08:00
- [LLVM 18 ](https://llvm.org )
- [Clang 18 ](https://clang.llvm.org )
2024-12-14 18:06:16 +08:00
- [LLD 18 ](https://lld.llvm.org )
2024-06-17 16:38:55 +08:00
- [pkg-config 0.29+ ](https://www.freedesktop.org/wiki/Software/pkg-config/ )
- [bdwgc/libgc 8.0+ ](https://www.hboehm.info/gc/ )
2024-07-30 14:10:56 +08:00
- [OpenSSL 3.0+ ](https://www.openssl.org/ )
2024-07-31 08:56:03 +08:00
- [zlib 1.2+ ](https://www.zlib.net )
2025-04-03 15:52:18 +08:00
- [Python 3.12+ ](https://www.python.org ) (optional, for [github.com/goplus/lib/py ](https://pkg.go.dev/github.com/goplus/lib/py ))
2024-06-17 16:38:55 +08:00
2024-05-16 00:02:10 +08:00
## How to install
Follow these steps to generate the `llgo` command (its usage is the same as the `go` command):
2024-05-11 05:04:02 +08:00
2024-05-16 00:02:10 +08:00
### on macOS
2024-05-11 05:04:02 +08:00
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/scripts/install_macos.sh#L2 -L1000 -->
2024-05-11 05:04:02 +08:00
```sh
2024-07-31 08:56:03 +08:00
brew update
2025-04-02 23:27:40 +08:00
brew install llvm@19 lld@19 bdw-gc openssl cjson libffi libuv pkg-config
2024-07-31 08:56:03 +08:00
brew install python@3 .12 # optional
2025-04-08 09:36:48 +08:00
brew link --overwrite llvm@19 lld@19 libffi
2025-04-03 16:00:52 +08:00
# curl https://raw.githubusercontent.com/goplus/llgo/refs/heads/main/install.sh | bash
./install.sh
2024-05-11 05:04:02 +08:00
```
2024-12-14 18:06:16 +08:00
### on Linux
#### Debian/Ubuntu
2024-05-11 05:04:02 +08:00
2024-11-06 10:28:08 +08:00
<!-- embedme doc/_readme/scripts/install_ubuntu.sh#L2 -L1000 -->
2024-05-11 05:04:02 +08:00
```sh
2025-04-02 20:08:05 +08:00
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-19 main" | sudo tee /etc/apt/sources.list.d/llvm.list
2024-05-16 00:02:10 +08:00
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
2024-07-31 08:56:03 +08:00
sudo apt-get update
2025-06-12 14:14:33 +08:00
sudo apt-get install -y llvm-19-dev clang-19 libclang-19-dev lld-19 libunwind-19-dev libc++-19-dev pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libuv1-dev
2024-07-31 08:56:03 +08:00
sudo apt-get install -y python3.12-dev # optional
2025-04-03 16:00:52 +08:00
#curl https://raw.githubusercontent.com/goplus/llgo/refs/heads/main/install.sh | bash
./install.sh
2024-05-11 05:04:02 +08:00
```
2024-05-16 00:02:10 +08:00
2024-12-14 18:06:16 +08:00
#### Alpine Linux
```sh
2025-08-21 12:11:09 +08:00
apk add go llvm19-dev clang19-dev lld19 pkgconf gc-dev libunwind-dev openssl-dev zlib-dev
2024-12-14 18:06:16 +08:00
apk add python3-dev # optional
apk add g++ # build only
2025-08-21 12:11:09 +08:00
export LLVM_CONFIG=/usr/lib/llvm19/bin/llvm-config
2024-12-14 18:06:16 +08:00
export CGO_CPPFLAGS="$($LLVM_CONFIG --cppflags)"
export CGO_CXXFLAGS=-std=c++17
export CGO_LDFLAGS="$($LLVM_CONFIG --ldflags) $($LLVM_CONFIG --libs all)"
2025-02-13 15:52:11 +08:00
curl https://raw.githubusercontent.com/goplus/llgo/refs/heads/main/install.sh | bash
2024-12-14 18:06:16 +08:00
```
2025-08-21 12:11:09 +08:00
docker alpine 386 llgo environment
```
export GCC_ROOT_DIR=$(gcc -print-search-dirs | grep 'install:' | awk -F': ' '{print $2}')
export LDFLAGS="-L$GCC_ROOT_DIR -B$GCC_ROOT_DIR -Wl,-dynamic-linker,/lib/ld-musl-i386.so.1"
llgo run .
```
2024-05-16 00:02:10 +08:00
### on Windows
TODO
2024-05-16 06:34:18 +08:00
2025-02-13 16:13:50 +08:00
### Install from source
<!-- embedme doc/_readme/scripts/install_llgo.sh#L2 -L1000 -->
```sh
git clone https://github.com/goplus/llgo.git
cd llgo
./install.sh
```
2024-05-16 06:34:18 +08:00
## Development tools
2025-02-03 18:26:41 +08:00
* [pydump ](_xtool/pydump ): It's the first program compiled by `llgo` (NOT `go` ) in a production environment. It outputs symbol information (functions, variables, and constants) from a Python library in JSON format, preparing for the generation of corresponding packages in `llgo` .
2024-05-18 20:07:41 +08:00
* [pysigfetch ](https://github.com/goplus/hdq/tree/main/chore/pysigfetch ): It generates symbol information by extracting information from Python's documentation site. This tool is not part of the `llgo` project, but we depend on it.
2025-04-03 15:52:18 +08:00
* [llpyg ](chore/llpyg ): It is used to automatically convert Python libraries into Go packages that `llgo` can import. It depends on `pydump` and `pysigfetch` to accomplish the task.
* [llgen ](chore/llgen ): It is used to compile Go packages into LLVM IR files (*.ll).
* [ssadump ](chore/ssadump ): It is a Go SSA builder and interpreter.
2024-05-16 06:34:18 +08:00
How do I generate these tools?
2025-02-13 16:13:50 +08:00
<!-- embedme doc/_readme/scripts/install_full.sh#L2 -L1000 -->
2024-11-06 10:28:08 +08:00
2024-05-16 06:34:18 +08:00
```sh
2024-07-09 16:18:30 +08:00
git clone https://github.com/goplus/llgo.git
2025-04-03 15:52:18 +08:00
cd llgo
2024-11-06 10:28:08 +08:00
go install -v ./cmd/...
2024-07-09 16:18:30 +08:00
go install -v ./chore/... # compile all tools except pydump
2025-04-03 15:52:18 +08:00
export LLGO_ROOT=$PWD
2025-04-03 16:00:52 +08:00
cd _xtool
2024-05-16 06:34:18 +08:00
llgo install ./... # compile pydump
2024-05-18 20:07:41 +08:00
go install github.com/goplus/hdq/chore/pysigfetch@v0 .8.1 # compile pysigfetch
2025-04-03 16:00:52 +08:00
2024-05-16 06:34:18 +08:00
```
2024-05-16 07:08:10 +08:00
## Key modules
Below are the key modules for understanding the implementation principles of `llgo` :
2025-04-03 15:52:18 +08:00
* [ssa ](https://pkg.go.dev/github.com/goplus/llgo/ssa ): It generates LLVM IR files (LLVM SSA) using the semantics (interfaces) of Go SSA. Although `LLVM SSA` and `Go SSA` are both IR languages, they work at completely different levels. `LLVM SSA` is closer to machine code, which abstracts different instruction sets. While `Go SSA` is closer to a high-level language. We can think of it as the instruction set of the `Go computer` . `llgo/ssa` is not just limited to the `llgo` compiler. If we view it as the high-level expressive power of `LLVM` , you'll find it very useful. Prior to `llgo/ssa` , you had to operate `LLVM` using machine code semantics. But now, with the advanced SSA form (in the semantics of Go SSA), you can conveniently utilize `LLVM` .
* [cl ](https://pkg.go.dev/github.com/goplus/llgo/cl ): It is the core of the llgo compiler. It converts a Go package into LLVM IR files. It depends on `llgo/ssa` .
* [internal/build ](https://pkg.go.dev/github.com/goplus/llgo/internal/build ): It strings together the entire compilation process of `llgo` . It depends on `llgo/ssa` and `llgo/cl` .