The ABI compatibility (including C, Delphi [but not sure about FPC] and C++ in HP-UX) was tested a number of times, IIRC by Nikolay, Vlad, me and Alex.
But unfortunately, I think we did the thing wrongly. Till now I don't know what's the better way to work with status vector. Who should initialize, caller or called function? What if a function is called with a marked as error status vector? The idea as I see was to create something like IDL (with macros or with a self-made compiler) and have C++ wrappers around the interfaces (with may be defined in C). But now even internally, we have manual checks of status vector everywhere, which is not C++. The inconsistencies with status vector initialization, and the way to report warnings, was a big factor for these problems we have, including guessing all ABIs would be compatible. Adriano Em 14-07-2014 10:29, Tony Whyman escreveu: > Yesterday I posted an appeal for help with suggestions on using the new > Firebird 3 API from a Free Pascal program, mainly to see if I had missed > something in my analysis of the new interface. I did get one pointer to > "UIB". However, that did nothing more than confirm my suspicions that > there are some serious problems with the API as presented in the alpha 2 > release. > > In summary, I have the following issues with the new Firebird 3 API: > > 1. It is a C++ Object Oriented API and needs to be understood as such. I > have no problem with it as a C++ API, but it is not a general purpose > API and does not provide platform/compiler/language independence. As > presented in 'firebird/interface.h', the API provides pointers to C++ > Classes and is always dependent on the vtable layout internal to each > C++ compiler. > > 2. There is no such thing as a standard ABI or even a standard C++ ABI > and you cannot rely on the output of one compiler being able to navigate > the vtable produced by another, or even by a different version of the > same compiler. > > 3. A regular feature on the Free Pascal wish lists is the ability to use > C++ shared objects from Pascal. If it were simply a matter of defining a > canonical class structure in Pascal and passing pointers to classes then > this would be easy. Unfortunately it is not. UIB contains such a > canonical set of classes, translating the C++ Firebird 3 API classes > into Pascal, getting a pointer to IMaster and taking it from there. This > may work if the C++ and Pascal compilers have the same ABI and this may > even be the case with some Windows compilers (the UIB code was specific > to Windows). However, I tried it out with FPC 2.6.4 on 64-bit Linux and, > as expected, it didn't work. The ABIs are not compatible enough. (Note: > For C++Builder to work, it has to come with Delphi and Borland C++ > compilers with compatible ABI - this is maybe why the UIB code appeared > to work on Windows). The current status of calling C++ from FPC is > summarised here > http://free-pascal-lazarus.989080.n3.nabble.com/Lazarus-How-to-access-C-and-C-libraries-td4036118.html. > > > 4. 'fb_get_master_interface' should be exported as a normal C++ function > and not extern 'C'. By exporting it as extern 'C' you lose the > protection offered by Name Mangling and which alerts the user to > potential ABI incompatibility - and which avoids lots of hard to find > "bugs". > > 5. If a C++ interface is provided by the Firebird Client then the number > of binaries available will need to multiply exponentially as different > versions of the client library should be provided for each > platform/compiler variation available including different versions of > the same compiler with a different ABI. > > 6. The Firebird 3 API is a low level C++ API in the sense that the > database data is passed in an unstructured buffer. It begs the question: > if a C++ API is offered then why not offer a higher level API at the > level of say, Oracle OCCI or Firebird's very own IBPP. Indeed, given > that IBPP is effectively the standard C++ interface to Firebird then why > not integrate it into the Firebird library? Note: the IBPP maintainers > recommend compiling IBPP into each project rather than making it > available as a standard library - this might have something to do with > ABI compatibility issues. Note: Oracle OCCI is only available/supported > on a strictly limited set of platforms. > > 7. The release notes present the current API as a "legacy API". If this > is true then reliable use of new Firebird features is restricted to C++ > - which is undesirable. > > 8. The release notes also criticise COM interfaces for performance > reasons. I will not necessary argue with this but do observe that COM is > an open, reliable and compiler independent API (for Windows) and there > may well be performance costs associated with this. > > 9. All APIs will have some ABI dependencies and to meet the criteria for > "open, reliable and compiler independent" these need to be minimised by > keeping to a very known and widely supported calling convention and > limited well defined data types. This is what COM does (on Windows). > This is what the existing 'C' interface to Firebird does. Firebird 3 > needs such an API. Unfortunately, an API based on pointers to C++ > classes does not meet that requirement. > > Tony Whyman > MWA > > > ------------------------------------------------------------------------------ > Want fast and easy access to all the code in your enterprise? Index and > search up to 200,000 lines of code with a free copy of Black Duck® > Code Sight™ - the same software that powers the world's largest code > search on Ohloh, the Black Duck Open Hub! Try it now. > http://p.sf.net/sfu/bds > Firebird-Devel mailing list, web interface at > https://lists.sourceforge.net/lists/listinfo/firebird-devel > ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck® Code Sight™ - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel