News for hackers. Stuff that matters.
Re:Is Semantic Versioning an Anti-Pattern? by flukus on Wednesday January 11, 2017 @11:37PM (#13379863)
> Have you got an example where pure addition breaks the existing compatibility?

With c/c++ additions can break binary compatibility can't they? Adding a field to a struct for instance will mean existing code that does a malloc for that struct won't allocate coorectly. I think there are a million other cases to consider too.

Re:Is Semantic Versioning an Anti-Pattern? by viraptor on Thursday January 12, 2017 @12:09AM (#13379951)
Normally in a library you'd provide functions that allocate and free structures defined by that library. That's how successful C libraries do it.

I think semver covers this pretty well actually. The public API is not just the function signatures, but basically anything that makes your API - whether it's code or documentation. So either:

- your structs in the library are opaque and the library handles all the memory management itself - addition of fields is backwards compatible, or

- your structs are open and your functions expect the structs from outside - addition of fields is not backwards compatible

The second one is still falls under "Major version X (X.y.z | X > 0) MUST be incremented if any backwards incompatible changes are introduced to the public API."

To make a comparison in a dynamic language: you've got public function `f(d)` where `d` is some dictionary with elements `a` and `b`. Now in the next version you start to require `c` - same signature in the code, but it's not backwards compatible. It's still a public API, even if defined by the documentation.

Re:Is Semantic Versioning an Anti-Pattern? by caf on Thursday January 12, 2017 @12:22AM (#13380000)
your structs are open and your functions expect the structs from outside - addition of fields is not backwards compatible

Sometimes it's possible to handle this case (if you've planned ahead) by including unused space within the original struct defintion that you can then repurpose later.

Re:Is Semantic Versioning an Anti-Pattern? by flukus on Thursday January 12, 2017 @12:15AM (#13379972)
> That's how successful C libraries do it.

What about c++? Object allocation is always handled by new on the consumer side isn't it? Also in C, does the order of function declarations matter?

Re:Is Semantic Versioning an Anti-Pattern? by viraptor on Thursday January 12, 2017 @12:25AM (#13380005)
I don't do C++ normally, but the situation seems similar. There's http://wiki.c2.com/?PimplIdiom for opaque objects, so you don't have to make their members part of the public API. But for things you do want to make public it's the same solution - make it a your public API by documenting it. If you know it breaks compatibility, it requires major version bump.

And no, after compilation, I don't believe the symbol order matters.

Re:Is Semantic Versioning an Anti-Pattern? by flukus on Thursday January 12, 2017 @01:26AM (#13380204)
The pimpl method looks like it ads a level of indirection to every private member access. Is that an issue in practice?
Re:Is Semantic Versioning an Anti-Pattern? by slavik81 on Thursday January 12, 2017 @01:48AM (#13380287)
Qt uses it extensively. For big, complex objects like QTextEdit it's probably the least of your concerns, but they do avoid it for simple value types like QPoint.
Re:Is Semantic Versioning an Anti-Pattern? by flukus on Thursday January 12, 2017 @02:08AM (#13380387)
A good chunk of these questions I'm asking are because I half remember Qt's binary compatibility guidelines from when I did an internship at Trolltech many years ago :) A similar list is here: https://community.kde.org/Policies/Binary_Compatibility_Issu... . It looks like the virtual function restrictions are what I was talking about, that's where pure additions can break compatibility.
Re:Is Semantic Versioning an Anti-Pattern? by slavik81 on Thursday January 12, 2017 @03:56AM (#13380838)
If you worked at Trolltech, you almost certainly know more than me. I was just a user of Qt who peeked under the covers occasionally.
Re:Is Semantic Versioning an Anti-Pattern? by jstimpfle on Thursday January 12, 2017 @06:35AM (#13381465)
It's an issue if the methods on that object are short-lived enough that the overhead of indirection is significant.

It's also an issue if very performance-sensitive routines need to read data from the object. In which case they already know exactly what's in there, so "pimpl" hiding has no benefit in the first place.

Implementations should be hidden if they are likely to change. In other words, there are are non-obvious data or method members and/or it's likely that functionality will be added in the future. These are the high-level architectural situations, not the leaf level ones where you optimize out every cyle possible.

Re:Is Semantic Versioning an Anti-Pattern? by netheril96 on Friday January 13, 2017 @04:36AM (#13389597)
> Adding a field to a struct for instance will mean existing code that does a malloc for that struct won't allocate coorectly.

Really? Do you ever call `malloc(4)` instead of `malloc(sizeof(int))` or `malloc(sizeof(*ptr))`?

Re:Is Semantic Versioning an Anti-Pattern? by fjdlwlv on Thursday January 12, 2017 @12:10AM (#13379955)
C/C++ is hopeless for binary compatibility, under any version scheme
Re:Is Semantic Versioning an Anti-Pattern? by wahern on Thursday January 12, 2017 @02:52AM (#13380564)
Linux's support for ELF symbol versioning makes maintaining binary compatibility of C libraries easier than perhaps any other platform or language. It's patterned after Solaris' ELF symbol versioning, but more powerful.

glibc uses it extensively, but alas few other people know about it. Theoretically languages, like Rust, which compile to ELF executables could leverage the capability. But none do.

There are a series of posts from a libvirt developer which explain some of the mechanics:

  https://www.berrange.com/posts/2011/01/13/versioning-in-the-libvirt-library/
I personally don't bother with semantic versioning at all. Where ABI compatibility matters, I'll commit to maintaining backward ABI compatibility in perpetuity using symbol versioning.[1] And maintaining backwards API compatibility is something I try to commit to as a matter of course; if I can't then I make sure builds will break loudly.

I don't begrudge people using semantic versioning, I don't just don't think it's the best approach for most cases. It's just one of several crappy choices. But at least with C on Linux, ELF symbol versioning is a slam dunk when you're serious about the matter.

[1] I usually avoid depending on proprietary platform features. But this is the one area I'm comfortable and eager to lean on Linux.

Re:Is Semantic Versioning an Anti-Pattern? by slavik81 on Thursday January 12, 2017 @01:56AM (#13380330)
Qt is C++ and only breaks binary compatability on major version changes (~6 years apart).

It's hard, but certainly not hopeless.

Re:Is Semantic Versioning an Anti-Pattern? by viraptor on Wednesday January 11, 2017 @11:45PM (#13379879)
I don't think so. Have you got an example?
Re:Is Semantic Versioning an Anti-Pattern? by flukus on Wednesday January 11, 2017 @11:46PM (#13379885)
Just updated with one.