Surely these issues already exist in gogo-protobuf? How are they handled there?
On Thu, Feb 1, 2018, 08:28 'Jisi Liu' via golang-nuts < golang-nuts@googlegroups.com> wrote: > This is not Java specific. I just used Java as an example. For most > protobuf implementations, there is a contract between the runtime and > generated code which is not meant to be public. e.g. In go-protobuf, > runtime expects the generated classes define some internal fields, like > XXX_unrecognized, and XXX_sizecache. > > If we are moving from table-driven to codegen, then I guess there will be > more contracts between the runtime and generated code, and potentially > introduce contracts also between the containing message and embedded > message fields - you probably want to extract duplicate methods into > runtime to save code size, and the generate code needs to deal with > submessages itself. This is my primary concern. > > In a single repo development model, someone can change such contract as > long as they change the protoc-gen and the runtime library at the same > time. However, in open source, such change can cause dependency-hell > <https://en.wikipedia.org/wiki/Dependency_hell>issues as the different > versions of generated protobufs are no-longer compatible with each other > and/or with the runtime. With a more tightly coupled model, we are more > prone to such issue. > > One way to solve this is to make the runtime support all the previous > versions of the contract indefinitely and be always backward compatible. > Then users can switch to the newest runtime to support all the old > libraries. We are following this approach in protobuf-java 3.x, which > causes lots of dev overhead. I'm a bit worried that we would need to do the > same for Go, if we go with the code-gen approach. > > > On Wed, Jan 31, 2018 at 10:25 PM Walter Schulze <awalterschu...@gmail.com> > wrote: > >> Could we perhaps get a code snippet example that non java programmers can >> follow. >> >> PS >> >> When I previously referred to java programmers as real software >> developers, I didn't add some much needed context. >> >> Sometimes in this java dominated world I personally don't feel like a >> real software developer. >> >> On Wed, 31 Jan 2018, 21:44 liujisi via golang-nuts, < >> golang-nuts@googlegroups.com> wrote: >> >>> >>> >>> On Wednesday, January 31, 2018 at 11:20:31 AM UTC-8, Walter Schulze >>> wrote: >>> >>>> Hi JT please see my inline replies. >>>> >>>> On Wed, 31 Jan 2018 at 19:05 <thebroke...@gmail.com> wrote: >>>> >>>>> Thank you, Walter, for your support. >>>>> >>>>> > gogo/protobuf is disappointed that golang/protobuf still thinks that >>>>> runtime reflection is an efficient way of serializing structures. >>>>> >>>>> The table-driven implementation avoids reflect in the fast and common >>>>> path. Instead, are you referring to the fact that we don't perform >>>>> full-code generation of Marshal/Unmarshal like what gogo/protobuf does? We >>>>> are aware that full-code generation will often out-perform the >>>>> table-driven >>>>> approach we took. However, full code-generation drastically bloats the >>>>> binary size when you have many proto messages linked in. Keeping the >>>>> binary >>>>> size smaller was an important design decision for us and seemed to be a >>>>> better default. >>>>> >>>> >>>> Yes, I was referring to the speed of code generation over runtime >>>> reflection. >>>> What I struggle to understand is why the optimize_for file option that >>>> is part of proto 2 and 3 is not considered by golang/protobuf as a way to >>>> specify when code generation should be used over runtime reflection. >>>> This seems to work for most other languages, including Java, which I >>>> heard is quite popular among real software developers. >>>> >>> >>> Note that the code-generation approach used by other languages (mostly >>> C++/Java) has its own problem. Mostly because of the tight coupling among >>> generated code, runtime and embedded sub messages (generated by a different >>> party using a different version of protoc). These problem don't exist >>> inside of google as we use a single repo build system, but it cause >>> significant issues in opensource. For instance, Hadoop is still shipping >>> protobuf v2.5 generated code which is incompatible with later version of >>> protobufs. All the projects using Hadoop are then version locked to v2.5, >>> as an upgrade in any project (including Hadoop itself) will break the >>> build. Version upgrade can only happen when all the transitive dependency >>> closure upgrade together atomically. >>> >>> We solve this problem in protobuf-java v3.0+ by introducing ABI >>> backward/forward compatibility guarantees on generated code and runtime. >>> However, this introduced lots of overhead on code maintenance, reduced >>> development velocity and limited the change we could do. We are now >>> solving the issue by introduce table driven to Java. The recent benchmark >>> result showed performance on par for android platforms, and hopefully we >>> can release the new implementation in a few months. >>> >>> For Go, if we are going to introduce full generated code, I'd strongly >>> recommend considering those complications. Major version bump is also >>> expensive for protobufs as all the dependency libraries would have to bump >>> their major version too. >>> >>> >>>> >>>> >>>>> >>>>> We are open to considering an option that allows user to specify >>>>> full-code generation for select messages. >>>>> >>>> >>>> This is exactly what gogo/protobuf allows users to do. >>>> Using protobuf extensions gogo/protobuf allows the user to specify per >>>> message or file whether they want to generate marshalers, unmarshalers, >>>> etc. >>>> A user can also create a vanity binary to generate these methods if you >>>> do not wish to use extensions and want to enforce a specific style across >>>> and organization. >>>> >>>> >>>>> >>>>> > gogo/protobuf is still open to being merged back into >>>>> golang/protobuf and has been since its inception 5 years ago. >>>>> >>>>> That is good to hear. I have not yet gone through all of gogo/protobuf >>>>> to determine what it would to merge, or what should be merged. This will >>>>> be >>>>> future work. >>>>> >>>> >>>> gogo/protobuf is also be open to only being partly merged. >>>> >>>> One other major advantage of gogo/protobuf is generating the structures >>>> you want to use, by allowing you to modify the generated structure using >>>> protobuf extensions like customtype. >>>> This way you can avoid copying between the protobuf generated structure >>>> and a user defined go structure that you actually want to use. >>>> This is a huge speed and safety gain and probably the most important >>>> feature of gogo/protobuf. >>>> proto3 has addressed the biggest concern by allowing the generation of >>>> fields without pointers, but there are other cases as well, including >>>> casttype, customname for generating more lintable code and even not >>>> generating the structure at all, for ultimate customization. >>>> I would hope that merging some of these ideas will also be on the table. >>>> >>>> Looking forward to working together for a change >>>> Please let me know how I can help >>>> >>>> Skeptically hopeful about a new era for protobufs in Go >>>> Walter Schulze >>>> >>>> >>> >>>>> JT >>>>> >>>>> On Wednesday, January 31, 2018 at 7:13:38 AM UTC-8, Walter Schulze >>>>> wrote: >>>>>> >>>>>> gogo/protobuf is happy to be acknowledged by Google as an entity in >>>>>> the golang protobuf space. >>>>>> gogo/protobuf welcomes golang/protobuf to the community and is >>>>>> extremely happy to see this kind of transparency. >>>>>> >>>>>> gogo/protobuf will also merge these changes and as usual try to stay >>>>>> as close as possible to golang/protobuf, >>>>>> including also following the same version tagging. >>>>>> >>>>>> gogo/protobuf is disappointed that golang/protobuf still thinks that >>>>>> runtime reflection is an efficient way of serializing structures. >>>>>> >>>>>> go Green go GoGoProtobuf >>>>>> >>>>>> PS >>>>>> >>>>>> gogo/protobuf is still open to being merged back into golang/protobuf >>>>>> and has been since its inception 5 years ago. >>>>>> gogo/protobuf feels for its users, especially those that are not >>>>>> acknowledged by grpc-gateway and grpc-go, >>>>>> and forced to employ work arounds, to preserve their missions of >>>>>> safety and efficiency. >>>>>> It knows that its existence is not something that anyone prefers, and >>>>>> it welcomes death, >>>>>> but only if it can preserve its legacy of fast serailization and >>>>>> generating the structures you want to use. >>>>>> >>>>>> >>>>>> On Tuesday, 30 January 2018 23:44:37 UTC+1, joe...@google.com wrote: >>>>>>> >>>>>>> Done. I tagged v1.0.0. When we perform the merge in the future, it >>>>>>> will be tagged as v1.1.0. >>>>>>> >>>>>>> On Tuesday, January 30, 2018 at 9:37:23 AM UTC-8, Alexey >>>>>>> Palazhchenko wrote: >>>>>>>> >>>>>>>> Hi, >>>>>>>> >>>>>>>> Can you please add tags to the repository before that? SemVer or >>>>>>>> even tags with _any_ semantic would greatly help to rollback to the >>>>>>>> latest >>>>>>>> working version when things break. >>>>>>>> >>>>>>>> –-– >>>>>>>> Alexey «AlekSi» Palazhchenko >>>>>>>> >>>>>>>> -- >>>>> You received this message because you are subscribed to a topic in the >>>>> Google Groups "golang-nuts" group. >>>>> To unsubscribe from this topic, visit >>>>> https://groups.google.com/d/topic/golang-nuts/F5xFHTfwRnY/unsubscribe. >>>>> >>>> To unsubscribe from this group and all its topics, send an email to >>>>> golang-nuts...@googlegroups.com. >>>> >>>> >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "golang-nuts" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/golang-nuts/F5xFHTfwRnY/unsubscribe. >>> >> To unsubscribe from this group and all its topics, 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. > -- 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.