go get github.com/raff/walkngo 

If you use --lang=c it will actually generate c++ code.

It's not perfect but it does the bulk of the conversion. Unfortunately working 
with only the ast has it's limits (and I wrote this before the ssa stuff was 
available)

-- Raffaele

> On Mar 24, 2017, at 6:22 PM, Brad <bradgar...@gmail.com> wrote:
> 
> Interested in any feedback about the idea of making a Go -> C++ transpiler.  
> Here's the rationale:
> 
> * Go as a language has lots of awesome things that make it highly productive. 
>  Lots of Gophers would love to use Go for more projects but some common 
> issues include:
> * Trying to convince your team or management to adopt Go over a "more 
> traditional" language can be a tough sell: Your PHB is likely to tell you 
> it's not worth the risk, because the next developer he hires may not like Go 
> and he'll be screwed, whereas he knows he can find someone who will write C++ 
> or Java.
> * And there is also the issue of the environments in which Go will run.  On 
> embedded platforms (e.g. Parallax Propeller, Arduino) you can write C++, but 
> you're not going to get a Go compiler for it.
> * There's also the fact in a scenario where Go co-exists with C or C++, Go 
> has to have the main function and has to build the executable. Unless you 
> build a shared library, you can't just start implementing parts of your 
> project in Go and gradually phase things over.
> 
> It's also worth noting that some of these scenarios just will never support 
> all the features of the Go language, and so full support will not happen.  
> You probably won't get goroutines on an Arduino, for example. But, that 
> doesn't mean it wouldn't be useful to be able to write Go code in these cases 
> that doesn't use that feature and is otherwise 100% correct Go.
> 
> So, what if the following existed:
> 
> * Tool that converts Go to C++:
> * Comments and formatting are preserved - the resulting C++ is readable.  You 
> can tell your boss "there's no loss here - if this doesn't work, we'll throw 
> away the Go code and keep working on the C++", even though you know you will 
> burn in hell for doing that ;)
> * Language constructs which have an obvious simple mapping are just directly 
> converted (byte -> uint8_t, structs are structs, etc.)
> * Things that can be done with C++ code but are just ugly (e.g. defer, 
> implemented with goto) would be done like that - the transpiler would just 
> emit that code.
> * Features that are syntactic sugar around runtime implementations are emits 
> as calls to a stripped down version of the runtime that just does the bare 
> minimum to support what's needed: e.g. maps and slices are implemented with a 
> C++ template - the template is the same one that is just dropped in the 
> output as "map.h" and the transpiler emits code that uses it.
> * Heap allocations are mapped to a GC lib implemented in C++ - same as maps 
> above, just more complicated.  Same with channels.
> * Reflection could be done by emitting a bunch of type info and making all 
> that work, but probably wouldn't get around to doing this in a first version.
> * "go" gets mapped to pthread_create(), cognew() or whatever.
> * As much as possible this things are kept as some sort of simple template of 
> the corresponding C++ code to output, so you can easily adjust how 
> allocations or "go" or whatever are emitted for a particular environment.
> * The standard library would probably need to be forked, the things that are 
> heavily intertwined with the Go runtime ("runtime", "reflection", etc.) would 
> probably just not be available initially, and the ones that can be patched 
> and transpiled would be, and then some would probably just need a separate 
> implementation in C++ (e.g. "sync").  There would be an obvious way to do 
> this and it would be a normal thing in this scenario to say: "let's drop in 
> an implementation of fmt that supports only the barebones formatting for use 
> on embedded systems", etc.
> * Features/packages that are not supported would result in a transpiler 
> error.  I.e. some things "you just can't do" with this tool and that's okay.
> 
> Assuming this actually worked, it might considerably lower the bar for 
> adopting Go, and allow it to be used to develop in environments where we're 
> not likely to see a port of the compiler any time soon.  (Or where it's 
> literally impossible because there are things in the language that the 
> platform just can't do.)
> 
> I could potentially devote some time to building this out, but I wanted to 
> see if anyone had feedback on the concept.  I realize it's not a simple 
> project, but with the above setup it could be implemented incrementally.
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to