Probably a weird and orthogonal suggestion : transpile go-->rust and 
eliminate the gc overhead without dealing with the horrible syntax, if that 
is even feasible..

>
> On Friday, March 24, 2017 at 8:32:20 PM UTC-7, Brad 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.

Reply via email to