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)
[](https://github.com/goplus/gop)
2024-05-12 13:05:15 +08:00
This is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python. It's a subproject of [the Go+ project ](https://github.com/goplus/gop ).
2024-05-06 12:31:55 +08:00
2024-05-11 05:18:17 +08:00
## C standard libary support
2024-05-12 13:05:15 +08:00
```go
package main
import "github.com/goplus/llgo/c"
func main() {
c.Printf(c.Str("Hello world\n"))
}
```
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.
See [github.com/goplus/llgo/c ](https://pkg.go.dev/github.com/goplus/llgo/c ) for more detials.
2024-05-11 05:18:17 +08:00
## Python support
TODO
## Other frequently used libraries
TODO
2024-05-06 12:31:55 +08:00
## How to install
Follow these steps to generate the `llgo` command (its usage is the same as the `go` command):
### on macOS
```sh
brew update # execute if needed
brew install llvm@17
go install -v ./...
```
### on Linux
```sh
echo 'deb http://apt.llvm.org/focal/ llvm-toolchain-focal-17 main' | sudo tee /etc/apt/sources.list.d/llvm.list
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-get update # execute if needed
sudo apt-get install --no-install-recommends llvm-17-dev
go install -v ./...
```
2024-05-09 07:19:13 +08:00
### on Windows
TODO
2024-05-06 12:31:55 +08:00
## Demo
2024-05-06 12:35:38 +08:00
The `_demo` directory contains our demos (it start with `_` to prevent the `go` command from compiling it):
2024-05-06 12:31:55 +08:00
2024-05-06 22:31:33 +08:00
* [hello ](_demo/hello/hello.go ): call C printf to print `Hello world`
2024-05-06 23:13:20 +08:00
* [concat ](_demo/concat/concat.go ): call C fprintf with stderr, and Go variadic function
2024-05-06 22:31:33 +08:00
* [qsort ](_demo/qsort/qsort.go ): call C function with a callback (eg. qsort)
* [genints ](_demo/genints/genints.go ): various forms of closure usage (including C function, recv.method and anonymous function)
2024-05-07 18:44:51 +08:00
* [llama2-c ](_demo/llama2-c ): inference Llama 2 (It's the first llgo AI example)
2024-05-11 05:04:02 +08:00
2024-05-11 05:18:17 +08:00
And the `py/_demo` directory contains python related demos:
2024-05-11 05:04:02 +08:00
2024-05-11 05:18:17 +08:00
* [hellopy ](py/_demo/hellopy/hello.go ): link Python to Go and say `Hello world`
2024-05-11 15:07:50 +08:00
* [clpy ](py/_demo/clpy/cleval.go ): compile Python code and eval
* [callpy ](py/_demo/callpy/call.go ): call Python standard library function `math.sqrt`
2024-05-06 12:31:55 +08:00
### How to run demos
2024-05-11 05:04:02 +08:00
To run the demos in directory `_demo` :
2024-05-06 12:31:55 +08:00
```sh
cd <demo-directory> # eg. cd _demo/genints
llgo run .
```
2024-05-11 05:04:02 +08:00
2024-05-11 05:18:17 +08:00
To run the demos in directory `py/_demo` , you need to set the `LLGO_LIB_PYTHON` environment variable first. Assuming you use Python 3.12, and the `libpython3.12.so` (or `libpython3.12.dylib` or `python3.12.lib` ) file is in the /foo/bar directory, then you need to set `LLGO_LIB_PYTHON` to:
2024-05-11 05:04:02 +08:00
```sh
export LLGO_LIB_PYTHON=/foo/bar/python3.12
```
For example, `/opt/homebrew/Frameworks/Python.framework/Versions/3.12/libpython3.12.dylib` is a typical python lib location under macOS. So we should set it like this:
```sh
export LLGO_LIB_PYTHON=/opt/homebrew/Frameworks/Python.framework/Versions/3.12/python3.12
```
2024-05-11 05:18:17 +08:00
Then you can run the demos in directory `py/_demo` :
2024-05-11 05:04:02 +08:00
```sh
2024-05-11 05:18:17 +08:00
cd <demo-directory> # eg. cd py/_demo/hellopy
2024-05-11 05:04:02 +08:00
llgo run .
```