http://codingrelic.geekhold.com/2008/11/six-million-dollar-l...
By default. Unlike in Windows (from what I understand), in Unix-like OSes (Linux, the BSDs, probably others) it's entirely possible for user programs to talk directly to the kernel via a published API.
In Linux, C programs can use the syscall(2) function and x86 and x86-64 assembly language programs can use either the sysenter opcode or the int 0x80 interface, which is why linux-gate.so.1 exists and is mapped into every process: The kernel determines which method at boot and so userspace code (inclusive of libc) can't know in advance, so it uses the linux-gate.so.1 interface, instead.
http://www.trilithium.com/johan/2005/08/linux-gate/
http://articles.manugarg.com/systemcallinlinux2_6.html
http://stackoverflow.com/questions/9506353/how-to-invoke-a-s...
In fact, I think among popular languages, there are more of them with multiple competing implementations than there are with just one. Java, C, C++, Objective-C, C#, Fortran, JavaScript, Common Lisp, and Scheme all have multiple implementations, with their own implementations of the standard library.
The main exceptions are the collection of "scripting languages" which got popular in the late '90s and early 2000s like Perl, Python, Ruby, and PHP, which have mostly grown communities around a single implementation. But Ruby and Python at least (I'm not sure about the others, being less familiar with them) have been working towards multiple implementations and at least somewhat standardizing the core language and library to make multiple implementations more viable.
As for other languages with several standard libraries: a while ago that was a frequent criticism of D -- there were two competing standard libraries, which caused some division in the community.
It had a standard library, and a non-standard library that was more popular than the standard one, and they were not compatible at all.
The reason it caused the division at community is that the ones that you could not use both on the same project, this meant that for a while you had two "D" languages that were separate, libraries made with one did not worked with the other...
Although, not all of Tango (the non-standard one) is available in D2/Phobos already. For example, Phobos has XML [2,3] stuff, but Tango's is supposed to be better [0]. Port is ongoing [1].
[0] http://dotnot.org/blog/archives/2008/03/12/why-is-dtango-so-... [1] https://github.com/SiegeLord/Tango-D2 [2] http://dlang.org/phobos/std_xml.html [3] http://forum.dlang.org/thread/igmfgrfwzeqpwafeilfi@forum.dla...
As most OSs tend to be written mostly in C, it is natural that C ABI == OS ABI.
In the few cases where the OS was written in other languages, like the mainframe systems, the early 80's OS done in Pascal dialects (Mac OS), Modula-2 (Lillith), Assembly (MS-DOS/CP-M) and many others to list here, there was no C ABI to speak of.
This document was developed jointly by an informal
industry coalition consisting of (in alphabetical order)
CodeSourcery, Compaq, EDG, HP, IBM, Intel, Red Hat, and
SGI. Additional contributions were provided by a variety of
individuals.
...
In general, this document is written as a generic
specification, to be usable by C++ implementations on a
variety of architectures.
http://refspecs.linux-foundation.org/cxxabi-1.83.htmlThe obvious win was that I knew the standards backward and forward, especially which ones were thread safe when that became important. It also helped with the same sort of interviews where I'd write the function prototype and then work through the implementation with the candidate.
The other huge win for me was that I ended up developing an appreciation for automated test harnesses so I could implement without bias from the control.
I'm not sure I could recommend implementing your own c++11 library (other than as an embedded subset for resource-constrained systems) but it can be fun to go through and do K&R as a bit of kata.
This isn't all that rare in other languages. Python has a standard implementation, but there are others, e.g. http://pypy.org/
But as any developer that deployed applications across multiple JVMs will tell you, there are a few surprises along the way.
Conversely, the fact that the Apache library hadn’t been updated since 2008 probably means is that it’s not C++11 compliant at all, significantly behind most vendor libraries, and the effort for upgrading would be fairly significant.