Releases: goplus/llgo
v0.8.10
features:
libraries:
- c/math (float32) (#414)
- c/math/rand (#403 #414)
- c/raylib (#409 #410 #415 #423 #427)
- c/raylib: tetris demo (#423 #427)
- c/clang (#410 #416)
- c/clang: use llvm-config (#416)
- c/zlib (#404 #413)
- os: UserHomeDir/UserConfigDir/UserCacheDir (#420)
- os, syscall, io/fs: Errno, Stdin/out/err (#422)
- os.File (#426 #433)
- fmt, os, runtime, syscall, time (#429)
demos:
- cppmintf: implements multiple intefaces in c++ (#398)
- cmptest: sortdemo (#418)
- cmptest: iodemo, fmtdemo (#437)
changes:
- cl linkname: not exist method warning (#436)
- llgo/ssa: phi.AddIncoming fix: use checkExpr (#419)
- llgo/ssa: fix slice high (#428)
- llgo/ssa: makeSlice fit int size and check (#425)
- llgo/ssa: fix abiType && abiMethoOf (#392)
- llgo/ssa: fix abiType & abiNamedOf (#417)
- llgo/ssa: fix abi patch types.pointer (#434)
- runtime: global abi basic (#421)
- runtime: panic with any custom type (#399)
- runtime: type align (#405)
- build: fix link runtime (#438)
- c/llama2: rm precompiled *.ll files (#407)
- c/llama2: explicitly link libm to ensure compatibility with Linux (#408)
- xtool: utilize llvm-config to find LLVM executables (#424)
- update bytealg for pkg bytes/strings (#428)
v0.8.9
highlights:
- go syntax: support generics
- go libraries: syscall, strconv, sort, reflect, math/cmplx, os, sync, sync/atomic
- c libraries: c/os, c/math/cmplx, c/sync/atomic, c/pthread/sync
- cmd:
llgo cmptest [build flags] [packages]
(#391 #393)
features:
- patch library: llgo:skipall (#332 #343)
- patch library: call init (#352 #355)
- library: syscall (#366)
- library: strconv (#369)
- library: sort (#384 #385)
- library: reflect (#371 #379 #380 #381 #382)
- library: c/math/cmplx, math/cmplx (#368 #374)
- library: c/os, os, demo: getcwd (#364 #376)
- library: c/sync/atomic, sync/atomic (#326 #327 #328 #332 #333)
- library: c/pthread/sync, sync (#339 #343 #348 #350)
- library: c/cjson, c/sqlite README: how to install (#322 #365)
- library: c string library (#364)
- runtime: tracePanic (#363)
- cl: c.Func (llgo.funcAddr) (#387)
- cl: demo: cppintf (how to use c++ interface) (#387 #388 #389)
- llgo/ssa: complex op and print/panic (#373)
- builtin: real/imag/complex (#368)
- build: instantiate generics (#351)
- build: use -dead_strip to reduce app size (#325 #331)
- build: LLGoFiles (support to compile c files) (#335)
- build: overlayFiles for fix math on amd64 (#383)
- build: disable verbose info for deps (#386)
- cmd:
llgo cmptest [build flags] [packages]
(#391 #393)
changes:
- llgo/ssa: fix ssa.Index and indexType (#330)
- llgo/ssa: index/indexAddr check range (#346)
- llgo/ssa: abi.TypeName fix: error interface is public (#364)
- llgo/ssa: fix reentrant of ABI initialization (#377 #378)
- cl: check context.inCFunc (#347)
- cl: compileFuncDecl/funcName fix (#343)
- cl: fn.SetRecover (#352)
- patch library: fix (link dependencies) (#343)
- patch library: llgo/ssa/abi: PathOf fix - support trim PatchPathPrefix (#360)
- typepatch fix: don't change patch pkg (#360)
- typepatch fix (don't change types) (#333)
- typepatch: fix globalType (#348)
- build: explicitly link libpthread for compatibility with glibc versions before 2.34 (#334)
- build: set $GOPATH/bin as default GOBIN for Config.BinPath (#362)
- build: remove check for default GOPATH and GOROOT being identical (#375)
- library c: c.Int/Uint not alias C.int/uint (#349)
- README: update install instruction of LLGOROOT (#356)
- README: update python & install instructions (#357)
- ci,README: improve install instructions (#338)
- ci,README: add Dependencies section and update install instructions accordingly (#342)
v0.8.8
highlights:
- support panic & recover
- packages: c/bdwgc, c/math, math, math/bits
- patch a standard library (eg. internal/lib/math)
features:
- recover (#307 #309)
- patch a standard library (#321 #323 #324)
- package c/bdwgc (#319)
- package c/math (#320)
- package math (#320 #321)
- package math/bits (#304)
- link by pkg-config (#314)
changes:
- runtime: expand abi array (#315)
- runtime: rm internal/runtime/c (#319)
- llgo/ssa: float Const fix (#303)
- llgo/ssa: global use elem type (#313)
- internal/abi.Map: IndirectKey/IndirectElem (#318)
- testlibgo: mv math => mathbits (#304)
- cl: replace runtime => llgo/internal/runtime (#303)
- fix LLGO_LIB_PYTHON instruction (#308)
v0.8.7
highlights:
- support defer & panic
- support gc
features:
- defer & panic (#278 #279 #280 #283 #285 #286 #287 #288 #289 #290 #301 #302)
- gc & nogc (#284 #291 #292)
- llgo/ssa: typeAssert support interface (#272)
- llgo/ssa: interface equal (#298)
- cl: isVargs support defer/go (#299)
- build: build runtime local (#281 #282)
- libc compatible (#275 #276 #282)
changes:
v0.8.6
highlights:
- support goroutine
- support defer
features:
- goroutine (#254 #255 #256)
- defer (#261 #262 #263 #264 #273)
- cl/blocks (#273)
- llgo/ssa: memory (malloc/free) (#255)
- llgo/ssa: Do Call/Go/Defer (#251)
- llgo/ssa: Builtin (#257)
- llgo/ssa: IfThen/RunDefers/EndBuild (#261)
- llgo/ssa: DeferAlways/DeferInCond/DeferInLoop (#263)
- llgo/ssa: MakeInterface check abi.KindDirectIface (#258)
- build: support pkg-config and link args (#269)
changes:
v0.8.5
highlights:
- fully supports Go interface
- python libraries: builtins, matplotlib
features:
- refactor: eface (any) (#226 #228)
- refactor: phi (#235 #236)
- llgo/ssa: iface & abi types (#217 #227 #229 #231 #232 #233 #235 #238 #239 #240 #237 #249)
- llgo/ssa: prog.TypeSizes (#243 #244)
- llgo/ssa: string range; string convert bytes/rune (#224)
- llgo/ssa builtin: copy, unsafe.String, unsafe.Slice (#215 #217 #218 #226)
- llgo/ssa: AllocU (#217)
- llgo/ssa: MakeInterface (#217)
- llgo/ssa: Println (#242)
- llgo/ssa: BinOp EQL/LSS (#224)
- ssa/ssatest (#217)
- runtime: Struct (#219)
- runtime: print/println (#220 #221 #238)
- README: pysigfetch (#205)
- README: update Go packages support (#212)
- README: interface demo (#250)
python libraries:
- py/std: builtins (#206 #207)
- py/matplotlib, py/matplotlib/pyplot (#209 #210)
- pydemo: print, tensor, max (#206 #207)
changes:
- cl: funcOf fix: call pyfunc multiple times (#208)
- llgo/ssa: update linkname to go style (#246)
- llgo/ssa: TypeAssert bugfix (#229)
- llgo/ssa: AfterInit bugfix (#240 #241)
- llgo/ssa: fix slice type from *array (#247)
- llgo/ssa: fix type toNamed (#225)
- llgo/ssa: Builder add member Pkg (#213)
- llgo/ssa: pkg.PyLoadModSyms (source code stablility) (#210)
- llgo/ssa: {datstruct, interface}.go (#211)
- llgen.Gen fix: use imp (#207)
- remove runtime.NewString (#222)
- remove runtime NewSlice (use b.unsafeSlice) (#242)
- remove c2go support (#203 #204)
- mod: github.com/goplus/gogen v1.16.0
- mod: github.com/goplus/llvm v0.7.6
v0.8.3
v0.8.2
libraries:
- cjson (#164)
- sqlite (#181 #182)
- py/os (#168 #176)
- py/math (#169)
- py/json (#170)
- py/statistics (#170)
- py/sys (#171)
- py/inspect (#176)
- py/numpy (#172 #176 #177)
devtools:
features:
- llgo instr: pyList (#177)
- llgo: support pyVar (#179)
- cl: _testpy/pow (multiargs) (#173)
- cl: _testpy/gcd (python variadic function) (#175)
- ssa: builtin append (#174)
- build: support link packages out of llgo (#162)
- README (#178 #184)
changes:
- ssa: fix binop string cat ret type (#166)
C standard libary support
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.
The _demo
directory contains some C standard libary related demos (it start with _
to prevent the go
command from compiling it):
- hello: call C
printf
to printHello world
- concat: call C
fprintf
withstderr
- qsort: call C function with a callback (eg.
qsort
)
To run these demos (If you haven't installed llgo
yet, please refer to How to install):
export LLGOROOT=`pwd`
cd <demo-directory> # eg. cd _demo/hello
llgo run .
See github.com/goplus/llgo/c for more detials.
Python support
You can import a Python library in LLGo!
And you can import any Python library into llgo
through a program called llpyg
(see Development tools). The currently imported libraries include:
Here is an example using the Python math
library:
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.
Let's look at a slightly more complex example. For example, we use numpy
to calculate:
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/py"
"github.com/goplus/llgo/py/numpy"
)
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)
c.Printf(c.Str("a+b = %s\n"), x.Str().CStr())
}
Here we define two 3x3 matrices a and b, add them to get x, and then print the result.
The _pydemo
directory contains some python related demos:
- callpy: call Python standard library function
math.sqrt
- pi: print python constants
math.pi
- statistics: define a python list and call
statistics.mean
to get the mean - matrix: a basic
numpy
demo
To run these demos, you need to set the LLGO_LIB_PYTHON
environment variable first.
If Python is in the search path for clang
linking, then LLGO_LIB_PYTHON
only needs to be set to the name of the Python library. For example:
export LLGO_LIB_PYTHON=python3.12
You can also specify the path to tell llgo
where the Python library is located:
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 library location under macOS. So we should set it like this:
export LLGO_LIB_PYTHON=/opt/homebrew/Frameworks/Python.framework/Versions/3.12/python3.12
Note that the file name must be written in a platform-independent format, using python3.12
instead of libpython3.12.dylib
.
Then you can run the demos:
export LLGOROOT=`pwd`
cd <demo-directory> # eg. cd _pydemo/callpy
llgo run .
See github.com/goplus/llgo/py for more detials.
Other frequently used libraries
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.
The currently imported libraries include:
Here are some examples related to them:
- llama2-c: inference Llama 2 (It's the first llgo AI example)
- mkjson: create a json object and print it
- sqlitedemo: a basic sqlite demo
Go syntax support
The priority of llgo
feature iteration is:
- Popular C/Python libraries
- Full Go syntax
- Go standard libraries
- Popular Go packages
Common Go syntax is already supported. Except for the following, which needs to be improved:
- interface (Limited support)
- map (Very limited support)
- panic (Limited support)
- recover (Not supported yet)
- defer (Not supported yet)
- gc (Not supported yet)
- chan (Not supported yet)
- goroutine (Not supported yet)
- generics (Not supported yet)
Here are some examples related to Go syntax:
- concat: define a variadic function
- genints: various forms of closure usage (including C function, recv.method and anonymous function)
How to install
Follow these steps to generate the llgo
command (its usage is the same as the go
command):
on macOS
brew update # execute if needed
brew install llvm@17
go install -v ./...
on Linux
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 ./...
on Windows
TODO
Development tools
- pydump: It's the first program compiled by
llgo
(NOTgo
) 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 inllgo
. - llpyg: It is used to automatically convert Python libraries into Go packages that
llgo
can import. It depends onpydump
to accomplish the task. - llgen: It is used to compile Go packages into LLVM IR files (*.ll).
- ssadump: It is a Go SSA builder and interpreter.
How do I generate these tools?
go install -v ./... # compile all tools except pydump
cd chore/_xtool
llgo install ./... # compile pydump
Key modules
Below are the key modules for understanding the implementation principles of llgo
:
- llgo/ssa: It generates LLVM IR files (LLVM SSA) using the semantics (interfaces) of Go SSA. Although
LLVM SSA
andGo SSA
are both IR languages, they work at completely different levels.LLVM SSA
is closer to machine code, which abstracts different instruction sets. WhileGo SSA
is closer to a high-level language. We can think of it as the instruction set of theGo computer
.llgo/ssa
is not just limited to thellgo
compiler. If we view it as the high-level expressive power ofLLVM
, you'll find it very useful. Prior tollgo/ssa
, you had to operateLLVM
using machine code semantics. But now, with the advanced SSA form (in the semantics of Go SSA), you can conveniently utilizeLLVM
. - llgo/cl: It is the core of the llgo compiler. It converts a Go package into LLVM IR files. It depends on
llgo/ssa
. - llgo/internal/build: It strings together the entire compilation process of
llgo
. It depends onllgo/ssa
andllgo/cl
.
v0.8.1
highlights:
- Now you can import a Python library in llgo!
features:
- import python library (#140 #145 #146 #148 #149 #150 #151 #152 #154)
- py demo: hellpy, clpy, callpy (#140 #141 #142 #145 #148 #152 #153 #154)
- typeAssert: bool, float, string (#139)
changes:
- llgo/ssa: fix types named recursive (#147)
- mv
x/<tool>
=>xtool/<tool>
(#143) - nmindex: query auto add _ prefix (#144)
Python support
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 floating point number 2, and pass it to Python’s math.sqrt
to get x
. Then use x.Float64()
to convert the Python object to Go's float64
type, and finally we print the value through C printf
.
v0.7.0
highlights:
- Through llama2 and python, this version verifies the natural synergy between llgo and the C ecosystem.
libraries:
- llgo/c (github.com/goplus/llgo/c): (#122 #126 #127)
- llgo/x/llama2 (github.com/goplus/llgo/x/llama2) (#123)
- llgo/x/sqlite (github.com/goplus/llgo/x/sqlite) (#129 #131 #133)
- cpython/py (github.com/goplus/cpython/py) (#138)
demos:
- llama2-c: inference Llama 2 (It's the first llgo AI example) (#128)
- hellopy: link Python to Go and say
Hello world
(#138)
features:
- cl: PkgLinkIR, PkgLinkExtern (#126 #137)
- cl:
// llgo:link
as alias of//go:linkname
(#127) - llgo/ssa: UnOp (#125)
- llgo/ssa: Convert real numeric types (#132)
- llgo/ssa: Bitcast float => iface.data (#136)
- build: decodeLinkFile (support *.lla) (#130)
changes: