thrift-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Duru Can Celasun (Jira)" <j...@apache.org>
Subject [jira] [Commented] (THRIFT-5209) WIP: Support TinyGo
Date Thu, 14 May 2020 06:54:00 GMT

    [ https://issues.apache.org/jira/browse/THRIFT-5209?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17106975#comment-17106975
] 

Duru Can Celasun commented on THRIFT-5209:
------------------------------------------

I'm generally open to this sort of addition to Thrift's Go support and the diff so far seems
small enough to not create any maintenance headaches.

That said, I do have a few concerns:

- The transports and protocols supported for Go with the gc compiler is listed [here|https://github.com/apache/thrift/blob/26e6c84cde490a22d39c43ba3903dd94bbb8497f/LANGUAGES.md].
Since TinyGo can't support all of them, it will need a separate entry on that table.

- Tests. There are tests that use encoding/json. These will either have to be updated, or
have separate TinyGo versions guarded by build tags.

- Continuous Integration. TinyGo must be added to the Travis CI config and must support [cross
tests|https://github.com/apache/thrift/tree/master/test#apache-thrift---integration-test-suite]
which tests every language against every other language.

- Server support. Are you planning to support servers or just clients? Servers implement [TServerTransport|https://github.com/apache/thrift/blob/26e6c84cde490a22d39c43ba3903dd94bbb8497f/lib/go/thrift/server_transport.go#L23-L34]
and usually depend on net.

> Personally I think I would lean toward using the "Android" model I described above with
a single generator/library using a compiler option and build flags, respectively. 

I agree.

> WIP: Support TinyGo
> -------------------
>
>                 Key: THRIFT-5209
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5209
>             Project: Thrift
>          Issue Type: New Feature
>          Components: Go - Compiler, Go - Library
>            Reporter: Benjamin Gould
>            Priority: Minor
>
> TinyGo ([https://tinygo.org/)] provides a compiler for the Go programming language that
is an alternative to the standard Go compiler and is based on LLVM.  It uses the standard
Go toolchain to compile programs to Go's SSA format, and then translates the SSA to LLVM IR
that can subsequently be compiled for various microcontrollers, wasm, or Linux.  The important
takeaway from that explanation is that since TinyGo programs use the standard Go compiler
for the compiler frontend, is not is a subset of the Go language - it is the same language,
with some small caveats.
> The main caveat as far as Thrift support is concerned is that not all packages in the
standard library are supported yet, including the {{net}} and {{encoding/json}} packages. 
This presents an obvious problem for using Thrift, since these packages are imported by the
Thrift Go library.  Additionally, some small tweaks to the code from the compiler are necessary
to work around limited support for the {{reflect}} and {{database/sql packages}}.
> In general, Thrift can work with TinyGo, but until TinyGo gains more complete support
for the standard library it does require a compiler flag and excluding a number of features
of the Thrift Go library.
> Initial support for TinyGo is found here: [https://github.com/bgould/thrift/tree/fc2f380a2a390860160df851e9a9698f8e3c66f4]
> However I have the following questions about the best way to proceed:
>  # Should TinyGo support be implemented in the compiler via a flag on the Go generator
that eliminates references to packages unsupported by TinyGo such as reflect and database/sql
from the generated code?  This would be similar in concept I think to the -android option
to the Java generator. Alternatively, should a separate generator altogether be added, in
the same way that Java and JavaME are separate generators in Thrift?  For reference, the
scope of the changes to the Go generator for supporting TinyGo are roughly this - [https://github.com/bgould/thrift/commit/f1a57bf94731a262b68d5a519bcbbb4c8c303a23#diff-36ef31e670e3df20e286373dfb7ecc23]
>  # Similarly, the changes in the Thrift library can mostly be implemented by adding build
tags to exclude unsupported transports etc when compiling for TinyGo (the TinyGo compiler
sets a {{tinygo}} build tag automatically for all TinyGo builds).  It would also be feasible
to maintain a separate library that is explicitly compatible with TinyGo.  Again, the analogy
of the distinction between Java/Android and Java/JavaME applies here I think.  The sorts
of changes necessary are like this: https://github.com/bgould/thrift/commit/f1a57bf94731a262b68d5a519bcbbb4c8c303a23#diff-90f0f50bdfa55c6a4a1d53580c103ae0
> The main reason I am asking these questions is that I would really like to land this
feature, and the same time want to make sure it does not create undue burden on Thrift maintainers
working on supporting the standard Go implementation.  Personally I think I would lean toward
using the "Android" model I described above with a single generator/library using a compiler
option and build flags, respectively.  You opinion and feedback are of course greatly appreciated.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Mime
View raw message