Ich habe nie genau verstanden, was ein ABI ist. Bitte verweisen Sie mich nicht auf einen Wikipedia-Artikel. Wenn ich es verstehen würde, wäre ich nicht hier und würde einen so langen Beitrag schreiben.
Das ist meine Einstellung zu verschiedenen Schnittstellen:
Eine TV-Fernbedienung ist eine Schnittstelle zwischen dem Benutzer und dem Fernsehgerät. Sie ist eine existierende Einheit, die aber an sich nutzlos ist (sie bietet keine Funktionen). Die gesamte Funktionalität für jede dieser Tasten auf der Fernbedienung ist im Fernsehgerät implementiert.
Schnittstelle: Es handelt sich um eine "existierende Entitätsebene" zwischen der
functionality
yconsumer
dieser Funktionalität. Eine Schnittstelle an sich tut nichts. Sie ruft lediglich die dahinter liegende Funktionalität auf.Je nachdem, wer der Nutzer ist, gibt es verschiedene Arten von Schnittstellen.
Befehlszeilenschnittstelle (CLI) Die Befehle sind die vorhandenen Einheiten, der Verbraucher ist der Nutzer und die Funktionalität liegt dahinter.
functionality:
meine Softwarefunktionalität, die einen Zweck erfüllt Zweck, für den wir diese Schnittstelle beschreiben.
existing entities:
Befehle
consumer:
BenutzerGrafische Benutzeroberfläche (GUI) Fenster, Schaltflächen, etc. sind die bestehenden Entitäten, und auch hier ist der Verbraucher der Benutzer, und die Funktionalität liegt dahinter.
functionality:
meine Softwarefunktionalität, die ein Problem löst, für das wir diese Schnittstelle beschreiben.
existing entities:
Fenster, Schaltflächen usw..
consumer:
BenutzerAnwendungsprogrammierschnittstelle (API) Funktionen (oder zu sein Schnittstellen (in der schnittstellenbasierten Programmierung) sind die bestehenden Entitäten, der Verbraucher ist hier ein anderes Programm, kein Benutzer, und wieder Funktionalität liegt hinter dieser Schicht.
functionality:
meine Softwarefunktionalität, die einige Probleme löst Problem löst, für das wir diese Schnittstelle beschreiben.
existing entities:
Funktionen, Schnittstellen (Array von Funktionen).
consumer:
ein anderes Programm/eine andere Anwendung.Anwendungsbinäre Schnittstelle (ABI) Genau hier beginnt mein Problem.
functionality:
???
existing entities:
???
consumer:
???
- Ich habe Software in verschiedenen Sprachen geschrieben und verschiedene Arten von Schnittstellen bereitgestellt (CLI, GUI und API), aber ich bin nicht sicher, ob ich jemals eine ABI bereitgestellt habe.
ABIs umfassen Details wie
- Datentyp, Größe und Ausrichtung;
- die Aufrufkonvention, die steuert, wie die Argumente der Funktionen übergeben und Rückgabewerte abgerufen werden;
- die Nummern der Systemaufrufe und wie eine Anwendung Systemaufrufe tätigen sollte an das Betriebssystem richten soll;
Andere ABIs standardisieren Details wie
- die Verstümmelung von C++-Namen,
- die Ausbreitung von Ausnahmen, und
- Aufrufkonvention zwischen Compilern auf der gleichen Plattform, aber nicht keine plattformübergreifende Kompatibilität erfordern.
-
Wer braucht diese Details? Bitte sagen Sie nicht das Betriebssystem. Ich kenne Assembler-Programmierung. Ich weiß, wie Binden und Laden funktioniert. Ich weiß genau, was darin passiert.
-
Warum wurde die C++-Namensvermischung eingeführt? Ich dachte, wir sprechen auf der binären Ebene. Warum kommen Sprachen ins Spiel?
Wie auch immer, ich habe die [PDF] System V Anwendung Binäre Schnittstelle Ausgabe 4.1 (1997-03-18) um zu sehen, was genau er enthält. Nun, das meiste ergab keinen Sinn.
-
Warum enthält sie zwei Kapitel (4. und 5.), die die ELF Dateiformat? Tatsächlich sind dies die einzigen beiden wichtigen Kapitel dieser Spezifikation. Der Rest der Kapitel ist "prozessorspezifisch". Wie auch immer, ich denke, das ist ein völlig anderes Thema. Bitte sagen Sie nicht, dass die Spezifikationen des ELF-Dateiformats sind die ABI. Es qualifiziert sich nicht als ein Schnittstelle gemäß der Definition.
-
Ich weiß, da wir auf einer so niedrigen Ebene sprechen, muss es sehr spezifisch sein. Aber ich bin mir nicht sicher, wie spezifisch die "Befehlssatzarchitektur (ISA)" ist.
-
Wo kann ich das ABI von Microsoft Windows finden?
Das sind also die wichtigsten Fragen, die mich beschäftigen.
10 Stimmen
"Bitte sagen Sie nicht OS" Compiler müssen die ABI kennen. Linker müssen die ABI kennen. Der Kernel muss die ABI kennen, um das Programm im RAM einrichten zu können, damit es ordnungsgemäß läuft. Was C++ betrifft, siehe unten, so werden Bezeichnungen absichtlich in Kauderwelsch umgewandelt, weil Überladungen und private Methoden vorhanden sind, und der Linker und jeder andere Compiler müssen über eine kompatible Namensumwandlung verfügen, um damit arbeiten zu können, mit anderen Worten, über dieselbe ABI.
1 Stimmen
"Sie können eine x86-Datei nicht auf einem ARM-Prozessor ausführen, Punkt. Die auf einem x86-System verwendete ABI kann also nicht dieselbe sein, die auf einem ARM-System verwendet wird.
20 Stimmen
Ich denke, die Frage ist so klar; sie beschreibt genau, welches Antwortformat erwartet wird, und dennoch gibt es keine einzige zufriedenstellende Antwort, die akzeptiert werden kann.
0 Stimmen
Sie verwenden eine sehr seltsame Definition von "Schnittstelle". Betrachten Sie eine Schnittstelle lediglich als den Punkt oder Mechanismus, durch den zwei oder mehr Einheiten interagieren. Eine ABI ist lediglich eine Beschreibung des Zusammenspiels der Komponenten eines Softwaresystems auf niedriger Ebene (d.h. Bit-Tricksen), die es z.B. einem in C geschriebenen Code ermöglicht, einen in Fortran geschriebenen Code durch entsprechende Übersetzung der Datentypen und Auswahl der Aufrufkonventionen aufzurufen. Kein Grund, philosphisch zu werden. Eine Befehlszeilenschnittstelle (CLI) und eine Programmierschnittstelle (API) gehören nicht sinnvollerweise zur selben Klasse von Einheiten, und der Versuch, einen solchen Rahmen zu finden, ist fruchtlos.
5 Stimmen
@legends2k Ich gehe davon aus, dass OP zwar weiß, was ein ABI ist, sich dessen aber nicht bewusst ist. Die große Mehrheit der Programmierer wird niemals eine ABI entwerfen oder bereitstellen, denn das ist die Aufgabe der Betriebssystem-/Plattformentwickler.
5 Stimmen
@JesperE: Ich stimme deinem Punkt zu. Aber wahrscheinlich will der Auftraggeber es klar wissen, in dem Format, das er für richtig hält, auch wenn er vielleicht keine ABI bereitstellen muss.
0 Stimmen
Ich denke, die Antwort sollte ungefähr so lauten
Consumer: Compiler (Writer)
,Provider: OS (Maker)
,Functionality: Defining protocol on how to pass data
... (ich gebe hier nur Beispiele).0 Stimmen
Ich denke, dass diese Vorlage fehlerhaft ist, daher werde ich meine Antwort nicht damit geben. Fühlen Sie sich frei, mich dafür herabzustufen.
0 Stimmen
@JesperE: In der Tat, das habe ich nicht :)
1 Stimmen
Ich bin keineswegs überzeugt, dass meine Vorlage fehlerhaft ist. Denn überall trifft diese Vorlage für die Schnittstelle zu. Also, ja, ich möchte, dass ich erwarte, dass ABI auch in diese Vorlage passt, aber das ist es nicht. Das WICHTIGSTE ist, dass ich es immer noch nicht verstehe. Ich weiß nicht, ob ich so dumm bin oder etwas anderes, aber es geht einfach nicht in meinen Kopf. Ich bin nicht in der Lage, die Antworten und den Wiki-Artikel zu realisieren.
2 Stimmen
Ich war unwissend. Kürzlich, als ich mit all diesen Dingen arbeitete. habe ich erkannt, was ABI eigentlich ist. Ja, ich stimme zu, dass meine Vorlage fehlerhaft ist. Es ist nicht angemessen, ABI in meine Vorlage zu integrieren. Danke @ JasperE. Es brauchte nur etwas Berufserfahrung, um Ihre Antwort zu verstehen.
0 Stimmen
@claws, Diese Erklärung könnte helfen: stackoverflow.com/questions/3784389/
0 Stimmen
Am einfachsten kann man sich eine Schnittstelle im Allgemeinen als einen Vertrag zwischen einem Framework, einer Bibliothek, einer Plattform usw. vorstellen. Wenn Sie dieses System nutzen wollen, wird von Ihnen erwartet, dass Sie sich an die in der Schnittstelle festgelegten Regeln halten. Es ist ein Hinweis auf die "Rules of engagement".