You don’t use CGo; you just translate all the libraries you depend on as well. 
:-P

But you’re definitely right about pthreads; that would be a nightmare.

Andy

> On Jan 3, 2019, at 10:01 AM, Robert Engels <reng...@ix.netcom.com> wrote:
> 
> I am pretty sure the other task is impossible, unless the generated code used 
> CGo for all of its work. 
> 
> It gets really difficult for multithreaded apps, pthread does not translate 
> to Go routines, no TLS, etc.
> 
> I think correcting the converted Go would be more daunting that just 
> rewriting it in Go to begin with. 
> 
> On Jan 3, 2019, at 11:33 AM, Andy Balholm <andybalh...@gmail.com 
> <mailto:andybalh...@gmail.com>> wrote:
> 
>> I’ve been working on a tool (called leaven) to convert LLVM IR (intermediate 
>> representation) to Go. So you can compile C to LLVM with clang, and then 
>> convert the result to Go. It’s actually pretty easy, because LLVM 
>> instructions are such simple operations. But it’s not very readable; given 
>> this:
>> 
>> int strcmp(const char *l, const char *r)
>> {
>>      for (; *l==*r && *l; l++, r++);
>>      return *(unsigned char *)l - *(unsigned char *)r;
>> }
>> 
>> It produces this:
>> 
>> func strcmp(v0 *byte, v1 *byte) int32 {
>>      var v10, v11, v12, v13 *byte
>>      var v5, v6, v7, v16, v17, v18 bool
>>      var v3, v4, v14, v15, v21, v22 byte
>>      var v23, v24, v25 int32
>> 
>>      _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ = v3, v4, v5, 
>> v6, v7, v10, v11, v12, v13, v14, v15, v16, v17, v18, v21, v22, v23, v24, v25
>> 
>>      v3 = *v0
>>      v4 = *v1
>>      v5 = v3 != v4
>>      v6 = v3 == 0
>>      v7 = v6 || v5
>>      if v7 {
>>              v21, v22 = v3, v4
>>              goto block20
>>      } else {
>>              goto block8
>>      }
>> 
>> block8:
>>      v10, v11 = v1, v0
>>      goto block9
>> 
>> block9:
>>      v12 = (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(v11)) + 
>> 1*unsafe.Sizeof(*(*byte)(nil))))
>>      v13 = (*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(v10)) + 
>> 1*unsafe.Sizeof(*(*byte)(nil))))
>>      v14 = *v12
>>      v15 = *v13
>>      v16 = v14 != v15
>>      v17 = v14 == 0
>>      v18 = v17 || v16
>>      if v18 {
>>              goto block19
>>      } else {
>>              v10, v11 = v13, v12
>>              goto block9
>>      }
>> 
>> block19:
>>      v21, v22 = v14, v15
>>      goto block20
>> 
>> block20:
>>      v23 = int32(uint32(v21))
>>      v24 = int32(uint32(v22))
>>      v25 = v23 - v24
>>      return v25
>> }
>> 
>> But it works! 
>> 
>> I’ve never tried it with a C++ program, but once it’s compiled down to LLVM, 
>> there shouldn’t be much difference.
>> 
>> Whether it is anything like what you are looking for depends on your goals 
>> for the translation. (Though it’s almost certainly not complete enough yet.)
>> 
>> If your goal is to produce maintainable Go source that maintains the general 
>> appearance of the C++ original, you will need to build a custom tool that 
>> recognizes the idioms of your codebase and converts them to equivalent Go 
>> idioms, like Russ Cox did for translating the Go compiler. But keep in mind 
>> that he had the unfair advantage that he was translating C written by Go 
>> programmers.
>> 
>> I don’t think a general-purpose tool to convert C or C++ into maintainable 
>> Go is possible. As you handle more of the odd corner cases of C, the output 
>> looks more and more like machine code. Leaven skips that painful journey and 
>> produces asm.go (by analogy with asm.js) from day 1.
>> 
>> Leaven isn’t really ready for general use, but I decided to throw it on 
>> GitHub in response to your question. It’s at 
>> https://github.com/andybalholm/leaven 
>> <https://github.com/andybalholm/leaven>, for whatever it’s worth. I haven’t 
>> gotten around to adding a README or a license, but I’m planning to use the 
>> MIT license.
>> 
>> Andy
>> 
>>> On Jan 2, 2019, at 8:03 PM, Ian Lance Taylor <i...@golang.org 
>>> <mailto:i...@golang.org>> wrote:
>>> 
>>> On Wed, Jan 2, 2019 at 7:37 PM <aureallm2...@gmail.com 
>>> <mailto:aureallm2...@gmail.com>> wrote:
>>>> 
>>>> I have C++ 11 source files which I need to convert to Go language code
>>>> Is there any converter  tool for this.
>>>> I google quite a few tools, none seems powerful and complete enough to do 
>>>> the job.for me.
>>> 
>>> C++ 11 is a much more complex language than Go.  I think that if you
>>> want to support all the features of C++11 this would essentially
>>> require writing a C++11 compiler that generates Go code as its output.
>>> I don't know of any such tool.
>>> 
>>> Ian
>>> 
>>> -- 
>>> 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 
>>> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <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 
>> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
>> For more options, visit https://groups.google.com/d/optout 
>> <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