Why I'm not very excited about Go
lazypython.blogspot.com
lazypython.blogspot.com
See the paper by Hans Boehm from PLDI 2005, "Threads Cannot Be Implemented as a Library": http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf
The abstract explains the argument:
In many environments, multi-threaded code is written in a language that was originally designed without thread support (e.g. C), to which a library of threading primitives was subsequently added. There appears to be a general understanding that this is not the right approach. We provide specific arguments that a pure library approach, in which the compiler is designed independently of threading issues, cannot guarantee correctness of the resulting code.We first review why the approach almost works, and then examine some of the surprising behavior it may entail. We further illustrate that there are very simple cases in which a pure library-based approach seems incapable of expressing an efficient parallel algorithm.Our discussion takes place in the context of C with Pthreads, since it is commonly used, reasonably well specified, and does not attempt to ensure type-safety, which would entail even stronger constraints. The issues we raise are not specific to that context.
As far as I can tell, goroutines are similar to the block mechanisms and runtime system in Grand Central Dispatch, which is the same concept of concurrency in Cilk (http://supertech.csail.mit.edu/cilk/ and the paper "The Implementation of the Cilk-5 Multithreaded Language" in particular: http://supertech.csail.mit.edu/papers/cilk5.pdf).
Personally, I'm not that interested in the particulars of indentation/block delimiting. I'm much more interested in what one can do with blocks. This has much more bearing on the power of a programming language. If this is the 1st issue discussed, it's a poor portent for the rest of the article.
The next mistake is having a separate declaration and assignment operator.
Is this really so different from having a separate comparison and assignment operator? Or having 2 or 3 flavors of comparison?
The final mistake was not providing generics.
This is a work in progress.
C++'s templates is one of the things that make the language head and shoulders more useful for me than C...One of the things I've found makes me most productive in Python is that any time I need to perform a task I simply pick the data structure that does what I want
I think you can have completely generic collections in Go if you give up type safety for it.
In terms of features which I believe are overhyped the most important one is the "goroutine".
It's my understanding that one can use "goroutines" to implement your own rather powerful control structures. I'm not sure one really needs exceptions if you have goroutines, channels, and multiple return values. On the other hand, there are very compelling reasons for not having exceptions, given goroutines and channels.
Further, the handling of interfaces, though interesting, appears to be an implementation of C++0x's proposed concepts...I view this feature as something that is most useful in the context of generics
Thsi makes it seem as if you view programming somewhat through the lens of generics. This treatment of Interfaces gives you one of the best things about "Duck Typing" languages, but in a statically typed language: "emergent" interfaces.
I continually find exception handling to be a huge source of frustration; especially Java's checked exceptions. If I explicitly test for something in my method before calling another method, should I still have to catch, rethrow or declare that I throw its exception? If I don't check for the exceptional case first, then aren't I now using exceptions for flow control?
Unchecked exceptions seem a little more logical to me, but they still seem to cause disagreement on how they should be used.
The fact that they decided to put exception handling on hold here for now is really encouraging to me.
This confuses me I would have thought the opposite would be true. The goroutine/channel concept seems Erlang like to me. Erlang uses exceptions, if a process crashes an exception is thrown to its parent which can then act appropriately. How does Go handle this, i.e. if a goroutine crashes who gets informed and how?
The fact that Go is in early development here and I'd say this both could and will be improved in the future.
The "goroutines" are just threads. They're not useful for building control structures. Unless you have continuations/a reified control stack or program in a monadic style (which would essentially be CPS in this case), you cannot "fake" exceptions.
(For a good analysis of the overlap of co-routines and continuations, see "Revisiting Coroutines" by de Moura et. al. - http://www.inf.puc-rio.br/~roberto/docs/MCC15-04.pdf)
it's rare for me to watch long videos, because they are information-poor for the time investment, but i watched rob pike talk for an hour about go this evening. a lot of it is really interesting, but a lot of things about the syntax made me think: ow, that's going to be painful for me if it becomes successful.
rob's talk: http://www.youtube.com/watch?v=rKnDgT73v8s
I won't argue with the speed part, but I feel the concurrency support is a bit weak. Go routines, locks and channels don't seem enough to me for a language that was designed with concurrency in mind.
Hell, if thats all it takes, I would argue that Python 2.6, with its multiprocessing module, is designed for concurrency. Now, I do think that these features are an improvement over C and C++, but they seem to fall a bit short of more modern languages.
Regarding concurrency, I've been playing a lot with Clojure recently, whose agents are similar to actors.
I feel (never have written a line of code with it) Go is not particularly expressive - when you read someone else's code it's not obvious what is being done. What you see is how cleverly it's being done. The language has to hit the sweet spot between these two extremes - making the how obvious by hiding the what and showing the what by hiding the how. Python is in this sweet spot. Go doesn't seem so.
Perhaps this is a problem with Go programmers that will be ironed out eventually.
And as for concurrency having its own syntax, I am not sure. I would love (in Python) to have a concurrent list comprehension that spreads the work between as many processors as there are available. OTOH, it could be implemented as a method of generator expressions with semantics like "with this generator, do 10 values in advance".
Hmmm...
Too bad we are in a feature moratorium...
http://golang.org/doc/go_mem.html
So we're back to CSP. Welcome to the 1960s.
C. A. R. Hoare, ``Communicating Sequential Processes,'' Communications of the ACM 21(8) (August 1978), 666-677.
The 'point' of Go is to be a 'expressive, concurrent, garbage-collected' systems language. It's very early in it's lifecycle and of course immature at the moment... Let's just wait and see what happens in stead of writing it off, shall we?
Go is not very early in its lifecycle. Just look at the feature set - it's the very direct continuation of the work Pike and Thompson were doing on Plan9.
Someone should tell Ericsson!
...plan9...
Well... I don't know, I'd consider a language started around the mid nineties pretty early in it's life-cycle. But it's pretty clear to me that which it may be a 'continuation' it's definitely not just 'rebranded'. This is a new project and there's tons of talk all over the place about how "we're working on that". The garbage collector isn't even done yet!
Take a look at this if you don't believe that their approach hasn't changed: http://swtch.com/~rsc/thread/