Come ti attacchi a un ABI / API in una biblioteca commerciale?

2

In che modo un venditore di librerie commerciali riesce a mantenere lo stesso ABI per anni di sviluppo (o si tratta di una cattiva ipotesi da parte mia)?

Avrei pensato che nel tempo molte funzioni e interfacce di classe sarebbero state completamente riscritte. Hanno solo la lungimiranza di sapere quale impronta utilizzare sin dall'inizio?

È una cattiva idea non cambiare l'ABI? Come se tu finissi con un orribile pasticcio se non lo fai; che è più importante, ABI rimane lo stesso, o l'API ha senso per un principiante?

EDIT: potrei avere confuso ABI e API. A quanto ho capito, la modifica dell'API cambierebbe l'ABI?

    
posta NeomerArcana 15.10.2015 - 00:49
fonte

2 risposte

3

L'ABI e l'API sono cose diverse ma correlate. Un'API è un contratto che descrive la funzionalità. L'ABI descrive come i moduli comunicano a livello di codice macchina. I due possono cambiare in modo indipendente e uno non influisce (o non dovrebbe) sull'altro.

L'ABI descrive cose come il modo in cui i parametri vengono passati alle funzioni (in pila, nei registri, ecc.), come vengono fatte le chiamate di sistema, come si accede ai dati condivisi, ecc. Un ABI è specifico della macchina, specifico del sistema operativo, spesso specifico per la lingua e anche per le applicazioni specifiche.

Un'API, d'altra parte, è spesso indipendente dalla macchina, dal sistema operativo e dalla lingua.

Ci sono ampie parti dell'ABI a cui non devi spesso pensare, perché il compilatore e il linker della lingua lo gestiscono per te. Potresti doverlo preoccupare in alcuni casi, ad esempio la differenza tra cdecl e stdcall in C e C ++. Stare con lo stesso ABI per anni è piuttosto facile per queste parti. Ad esempio, il codice scritto per Win32 nel 1995 funzionerà ancora oggi. Anche le librerie compilate 20 anni fa possono essere collegate con il codice a 32 bit compilato oggi.

Qualunque API che stai usando dovrebbe essere costante tra le versioni. I fornitori fanno uno sforzo concertato per mantenere le API compatibili all'indietro in modo che il codice scritto per utilizzare la versione 1 della libreria possa ancora collegarsi con la versione 5. Oppure 17. Concesso, l'API potrebbe essere estesa, ma le funzioni che erano disponibili nella prima versione di solito esistono e funzionano allo stesso modo molte versioni dopo. L'implementazione interna potrebbe essere (molto spesso è) diversa, ma finché le funzioni soddisfano il contratto iniziale, non importa in che modo vengono implementate.

Ora, dove ci si può mettere nei guai è se si modifica una struttura dati che viene passata o restituita da una funzione API. Come è stato sottolineato nei commenti, una modifica a una struttura dati che non richiede una modifica del codice sorgente è considerata una modifica ABI. Potrebbe essere qualcosa di semplice come cambiare la struttura di imballaggio o riorganizzare l'ordine dei singoli membri della struttura. Per non parlare dell'aggiunta di un campo. In nessuno di questi casi, la dimensione della struttura dati potrebbe cambiare, ma la nuova versione potrebbe benissimo collegarsi con un modulo oggetto compilato per la versione precedente. Questo sicuramente romperebbe le cose.

Quelle sono interruzioni di modifiche che, sebbene non richiedano modifiche al codice sorgente, fanno richiedono una ricompilazione. E a mio parere se richiede una ricompilazione, allora dovrebbe essere considerata una modifica dell'API.

    
risposta data 15.10.2015 - 03:46
fonte
0

L'API è facile da rispettare, ma l'ABI è difficile. Ad esempio, ICU ha un'API per C e C ++:



Module Name 			C 		C++  

Basic Types and Constants 	utypes.h 	utypes.h  

Strings and Character Iteration 	ustring.h, utf8.h, utf16.h, UText, UCharIterator 	icu::UnicodeString, icu::CharacterIterator, icu::Appendable, icu::StringPiece,icu::ByteSink  

Unicode Character
Properties and Names uchar.h, uscript.h C API Sets of Unicode Code Points and Strings uset.h icu::UnicodeSet Maps from Strings to Integer Values (no C API) icu::BytesTrie, icu::UCharsTrie Codepage Conversion ucnv.h, ucnvsel.hb C API Codepage Detection ucsdet.h C API Unicode Text Compression ucnv.h
(encoding name "SCSU" or "BOCU-1") C API Locales uloc.h icu::Locale Resource Bundles ures.h icu::ResourceBundle Normalization unorm2.h icu::Normalizer2 Calendars ucal.h icu::Calendar Date and Time Formatting udat.h icu::DateFormat Message Formatting umsg.h icu::MessageFormat Number Formatting unumberformatter.h, unum.h icu::number::NumberFormatter (ICU 60+) or icu::NumberFormat (older versions) Number Spellout
(Rule Based Number Formatting) unum.h
(use UNUM_SPELLOUT) icu::RuleBasedNumberFormat Text Transformation
(Transliteration) utrans.h icu::Transliterator Bidirectional Algorithm ubidi.h, ubiditransform.h C API Arabic Shaping ushape.h C API Collation ucol.h icu::Collator String Searching usearch.h icu::StringSearch Index Characters/
Bucketing for Sorted Lists (no C API) icu::AlphabeticIndex Text Boundary Analysis
(Break Iteration) ubrk.h icu::BreakIterator Regular Expressions uregex.h icu::RegexPattern, icu::RegexMatcher StringPrep usprep.h C API International Domain Names in Applications:
UTS #46 in C/C++, IDNA2003 only via C API uidna.h idna.h Identifier Spoofing & Confusability uspoof.h C API Universal Time Scale utmscale.h C API Layout Engine/Complex Text Layout loengine.h icu::LayoutEngine,icu::ParagraphLayout ICU I/O ustdio.h ustream.h

Ma l'API C ++ non è esposta:

The version of ICU in Windows only exposes the C APIs. It does not expose any of the C++ APIs. Unfortunately, it is impossible to ever expose the C++ APIs due to the lack of a stable ABI in C++.

Riferimenti

risposta data 19.09.2018 - 18:26
fonte

Leggi altre domande sui tag