Why IBM Now Views LLVM As Being Critical Software
phoronix.com
phoronix.com
It goes to show the value in competition and a fresh perspective. Error messages, modularity, and licensing could unseat GCC, which is pretty amazing.
(I know GCC still has many advantages, but clang/llvm clearly have made a lot of progress.)
The current compiler known as "GCC" is a direct descendant of an earlier GCC fork named EGCS:
http://en.wikipedia.org/wiki/GNU_Compiler_Collection#EGCS_fo...
So GCC was already "unseated" once, the difference being by a direct descendant instead of by a fully different compiler.
- Everyone now seems to be using LLVM for language prototyping instead of JVM/.NET, clearly positive for native compilation and to show people without compiler knowledge that managed != VM
- The compiler as a library implementation of clang allows C, C++ and Objective-C to enjoy tooling support similar to JVM and .NET languages
- As someone with a sweet spot for the strong typing found in the Pascal family, the integrated static analysis are just great
When I looked at it some time ago, it appeared that I'd have to understand and write a lot of C++ code ... which I very much don't want to do.
In my opinion, you're usually better off just doing conservative-on-the-stack GC if you're using LLVM. (This is what Rust does.)
The basic problem is that LLVM loses the distinction between pointers and integers as soon as it drops into SelectionDAG and later passes. Fixing this would be a lot of work.
Of course you've now destroyed the stack, so either you have to copy the stack before this process starts and later restore it, or you introduce stack restoring functions as a source to source transformation. The former is probably simpler and faster, but the latter is neat because it doesn't use any hacks like copying the stack, and because it allows you to restore only part of the stack and keep part of it in the heap and restore it lazily, which is important for GC pause times if you have very deep stacks.
The disadvantage of this approach compared to the ideal is that now all function returns get slower, because they have to check the flag. However it's probably better than spilling everything, especially if you inline enough so that function calls are infrequent.
Example:
def f(...):
var x;
var y;
...
z = g(...)
...
becomes: def f(...):
var x;
var y;
...
z = g(...)
if STACKSCAN:
register_gc_root(x)
register_gc_root(y)
return // scan parent stack frame
....[0] https://code.google.com/p/epoch-language/
[1] https://code.google.com/p/epoch-language/wiki/GarbageCollect...
[2] http://www.reddit.com/r/programming/comments/1c5jz6/realisti...
That said, it doesn't (i think) use any of the llvm hooks. Instead the gc machinery is baked into the relevant primops. The hand written primops can be found here https://github.com/ghc/ghc/blob/master/rts/PrimOps.cmm#L51 (the low level primops that aren't compiler generated are written in cmm, a ghc specific dialect of c minus minus. )
Joking aside, I'm glad for the competition, and for the options. It's always nice to have another automated way to audit code: throw another compiler with maximum warnings at it.
LLVM/clang is a rather different thing, for both good and bad reasons.
EDIT: Can't believe I used "it's" instead of "its".
There already is a project to build a go compiler on top of llvm (https://github.com/axw/llgo).
> We also considered using LLVM for gc but we felt it was too large and slow to meet our performance goals.
Does this mean compilation speed, performance speed, or both? Or is this a hand-wavy excuse to use gcc instead due to Ian's expertise?
That being said, there is a project that builds Go on top of LLVM:
IIRC that remark related to using LLVM or GCC as the backends for the Go compiler, basically they found both backends to be too large and slow for their liking so they wrote their own full compiler from scratch.
I believe the GccGo project is mainly about leveraging all the architectures which GCC supports, many of which Go isn't ported to and possibly won't be ported to (as in maintained by the Go developers).
The other interesting thing is that this is only really an issue due to difficulty in properly parsing/semantically analyzing languages like C++.
For languages like Java, it simply isn't necessary, or in some cases, desirable.
Why would it not be desirable? Also, if I have an idea for a great tool, why should I have to write my own parser? I have more faith the actual compiler will have bugs fixed quicker in this regard.
In general, most languages are stable enough that you don't really get parsing/semantics bugs, so you wouldn't really need to worry about your last concern.
C++ is simply so complicated that the implementations end up with a bugs due to necessary complexity of implementation, but this is not generally true of languages.
With CLANG, same is true, but the license requirementa are fewer.
http://docs.python.org/2/library/ast.html
http://golang.org/pkg/go/parser/
(See also gofmt: http://golang.org/cmd/gofmt/
and gofix: http://golang.org/cmd/fix/ )The need and desire was very clear, and it was clear LLVM would meet that.
IBM supports multiple compiler toolchains: XL C/C++/FORTRAN, GCC, Java, COBOL, etc...
So, when a customer comes by with a codebase and wants to run it on their System x/System p/System z big iron, IBM's response needs to be a simple "Yes" when it comes to support.
Customer A has used XL since the epoch of computing, cool, that's supported.
Customer B has codebase tuned and littered with GCC attributes, cool, that's supported as well.
Customer C wants Clang/LLVM because devs find it easier to debug and it's growing in features, cool, that will be supported as well.