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.
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 for more detials.
You can import a Python library in llgo! For example:
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/py"
"github.com/goplus/llgo/py/math"
)
func main() {
x := math.Sqrt(py.Float(2))
c.Printf(c.Str("sqrt(2) = %f\n"), x.Float64())
}
Here, We call py.Float(2)
to create a Python number 2, and pass it to Python’s math.sqrt
to get x
. Then use x.Float64()
to convert x to Go's float64
type, and print the value through the C printf
function.
See github.com/goplus/llgo/py for more detials.
TODO
Follow these steps to generate the llgo
command (its usage is the same as the go
command):
brew update # execute if needed
brew install llvm@17
go install -v ./...
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 ./...
TODO
The _demo
directory contains our demos (it start with _
to prevent the go
command from compiling it):
- hello: call C printf to print
Hello world
- concat: call C fprintf with stderr, and Go variadic function
- qsort: call C function with a callback (eg. qsort)
- genints: various forms of closure usage (including C function, recv.method and anonymous function)
- llama2-c: inference Llama 2 (It's the first llgo AI example)
And the _pydemo
directory contains python related demos:
- callpy: call Python standard library function
math.sqrt
To run the demos in directory _demo
:
cd <demo-directory> # eg. cd _demo/genints
llgo run .
To run the demos in directory _pydemo
, 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:
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:
export LLGO_LIB_PYTHON=/opt/homebrew/Frameworks/Python.framework/Versions/3.12/python3.12
Then you can run the demos in directory _pydemo
:
cd <demo-directory> # eg. cd _pydemo/callpy
llgo run .