it-swarm.dev

Framework vs. Toolkit vs. Library

Was ist der Unterschied zwischen einem Framework, einem Toolkit und einer Bibliothek?

287
user364846

Der wichtigste Unterschied und tatsächlich der definierende Unterschied zwischen einer Bibliothek und einem Framework ist Inversion of Control .

Was bedeutet das? Nun, es bedeutet, dass Sie beim Aufrufen einer Bibliothek die Kontrolle haben . Bei einem Framework ist die Steuerung jedoch umgekehrt: Das Framework ruft Sie auf. (Dies nennt man das Hollywood-Prinzip: Rufen Sie uns nicht an, wir rufen Sie an.) Dies ist so ziemlich die Definition eines Frameworks. Wenn es keine Inversion of Control gibt, ist es kein Framework. (Ich sehe dich an, .NET!)

Grundsätzlich befindet sich der gesamte Kontrollfluss bereits im Framework und es gibt nur eine Reihe vordefinierter weißer Flecken, die Sie mit Ihrem Code ausfüllen können.

Eine Bibliothek hingegen ist eine Sammlung von Funktionen, die Sie aufrufen können .

Ich weiß nicht, ob der Begriff Toolkit wirklich gut definiert ist. Lediglich das Wort "Kit" scheint eine Art Modularität nahezulegen, d. H. Eine Reihe unabhängiger Bibliotheken, aus denen Sie auswählen können. Was unterscheidet ein Toolkit von nur einer Reihe unabhängiger Bibliotheken? Integration: Wenn Sie nur eine Reihe unabhängiger Bibliotheken haben, gibt es keine Garantie dafür, dass diese gut zusammenarbeiten, während die Bibliotheken in einem Toolkit so konzipiert wurden, dass sie gut zusammenarbeiten - Sie müssen nur nicht alle von ihnen.

Aber das ist wirklich nur meine Interpretation des Begriffs. Im Gegensatz zu Bibliothek und Framework, die genau definiert sind , glaube ich nicht, dass es gibt eine allgemein akzeptierte Definition von Toolkit .

443
Jörg W Mittag

Martin Fowler diskutiert den Unterschied zwischen einer Bibliothek und einem Rahmen in seinem Artikel über Inversion of Control :

Inversion der Kontrolle ist ein wesentlicher Bestandteil von Was unterscheidet ein Framework von einem Bibliothek. Eine Bibliothek ist im Wesentlichen eine Funktionssatz, den Sie aufrufen können, heutzutage normalerweise organisiert in Klassen. Jeder Anruf erledigt und __. gibt die Kontrolle an den Client zurück.

Ein Framework beinhaltet etwas Abstraktes Design, mit mehr Verhalten in . Um es verwenden zu können, müssen Sie einfügen Ihr Verhalten an verschiedenen Orten in das Framework entweder durch Unterklassen oder durch Einstecken eigener Klassen. Das Der Code des Frameworks ruft dann Ihren Code auf an diesen Stellen.

Zusammenfassend: Ihr Code ruft eine Bibliothek auf, aber ein Framework ruft Ihren Code auf.

120
Pascal Thivent

Einführung

Es gibt verschiedene Begriffe, die sich auf Sammlungen verwandter Codes beziehen, die sowohl historische (vor 1994/5 für die Zwecke dieser Antwort) als auch aktuelle Auswirkungen haben, und der Leser sollte sich beider bewusst sein, insbesondere beim Lesen klassischer Texte zu Computing/Programmierung aus der historischen zeit.

Bibliothek

Sowohl historisch als auch aktuell ist eine Bibliothek eine Sammlung von Code, der sich auf eine bestimmte Aufgabe bezieht, oder eine Reihe eng verwandter Aufgaben, die etwa auf derselben Abstraktionsebene arbeiten. Es hat im Allgemeinen keinen eigenen Zweck oder Zweck und ist dazu bestimmt, von Clientcode verwendet (konsumiert) und integriert zu werden, um Clientcode bei der Ausführung seiner Aufgaben zu unterstützen.

Toolkit

Historisch gesehen ist ein Toolkit eine stärker fokussierte Bibliothek mit einem definierten und spezifischen Zweck. Derzeit ist dieser Begriff in Ungnade gefallen und wird fast ausschließlich (nach Wissen dieses Autors) für grafische Widgets und GUI-Komponenten in der aktuellen Ära verwendet. Ein Toolkit arbeitet meistens auf einer höheren Abstraktionsebene als eine Bibliothek und verbraucht und verwendet oft selbst Bibliotheken. Im Gegensatz zu Bibliotheken wird häufig Toolkit-Code verwendet, um die Aufgabe des Client-Codes auszuführen, z. B. das Erstellen eines Fensters, das Ändern der Fenstergröße usw. Die unteren Abstraktionsebenen innerhalb eines Toolkits sind entweder festgelegt oder können vom Client selbst bearbeitet werden Code auf eine verbotene Weise. (Think Window-Stil, der entweder fixiert werden kann oder zuvor durch Clientcode geändert werden konnte.)

Rahmen

In der Vergangenheit bestand ein Framework aus einer Reihe miteinander verbundener Bibliotheken und Module, die in die Kategorien "Allgemein" oder "Spezifisch" unterteilt wurden. Allgemeine Frameworks sollten eine umfassende und integrierte Plattform zum Erstellen von Anwendungen bieten, indem allgemeine Funktionen wie plattformübergreifendes Speichermanagement, Multithreading-Abstraktionen, dynamische Strukturen (und generische Strukturen im Allgemeinen) bereitgestellt werden. Historische allgemeine Rahmenbedingungen (ohne Abhängigkeitsinjektion, siehe unten) wurden fast überall durch polymorphe (parametrisierte) Sprachpakete in OO -Sprachen ersetzt, beispielsweise in der STL für C++ oder in Paketbibliotheken für nicht-OO-Sprachen ( garantierte Solaris C-Header). Allgemeine Frameworks arbeiteten auf unterschiedlichen Abstraktionsebenen, waren jedoch auf untergeordneter Ebene und wie Bibliotheken darauf angewiesen, dass der Clientcode seine speziellen Aufgaben mit ihrer Hilfe ausführte.

"Spezifische" Frameworks wurden in der Vergangenheit für einzelne (aber oftmals weitläufige) Aufgaben entwickelt, beispielsweise "Command and Control" -Systeme für industrielle Systeme und frühe Netzwerkstacks. Sie wurden auf einem hohen Abstraktionsniveau betrieben und zur Durchführung der Ausführung wurden ähnliche Toolkits verwendet der Client-Code-Aufgaben. 

Derzeit wird die Definition eines Rahmens stärker fokussiert und nach dem an anderer Stelle als Leitprinzip genannten Prinzip "Inversion of Control" umgesetzt, so dass der Programmablauf sowie die Ausführung durch das Rahmenwerk ausgeführt wird. Die Rahmenbedingungen sind jedoch entweder auf einen bestimmten Output ausgerichtet; B. eine Anwendung für ein bestimmtes Betriebssystem (z. B. MFC für MS Windows) oder für allgemeine Aufgaben (beispielsweise Spring Framework).

SDK: "Software Development Kit"

Ein SDK ist eine Sammlung von Tools, die den Programmierer bei der Erstellung und Bereitstellung von Code/Inhalten unterstützen, die sehr spezifisch darauf ausgerichtet sind, entweder auf einer bestimmten Plattform oder auf eine bestimmte Weise ausgeführt zu werden. Ein SDK kann einfach aus einer Reihe von Bibliotheken bestehen, die nur vom Clientcode auf bestimmte Weise verwendet werden müssen und die wie üblich kompiliert werden können, bis hin zu einer Reihe von binären Tools, die binäre Assets erstellen oder anpassen, um ihre (die SDKs) zu erzeugen ) Ausgabe. 

Motor

Eine Engine (In Code Collection Termini) ist eine Binärdatei, die in irgendeiner Weise kundenspezifische Inhalte abarbeitet oder Eingabedaten verarbeitet. Game- und Graphics-Engines sind vielleicht die am weitesten verbreiteten Benutzer dieses Begriffs und werden fast überall mit einem SDK verwendet, um auf das Engine selbst zu zielen, wie beispielsweise das UDK (Unreal Development Kit), es gibt aber auch andere Engines wie Suchmaschinen und RDBMS-Engines . 

Eine Engine lässt oft, aber nicht immer zu, dass nur wenige interne Komponenten für ihre Kunden zugänglich sind. Meistens, um entweder auf eine andere Architektur zu zielen, die Darstellung der Ausgabe der Engine zu ändern oder für Abstimmungszwecke. Open Source Engines sind per Definition für Kunden offen und können nach Bedarf geändert und geändert werden. Einige proprietäre Engines sind vollständig repariert. Die am häufigsten verwendeten Motoren der Welt sind jedoch fast sicher Javascript Engines. Überall in jeden Browser eingebettet, gibt es eine ganze Reihe von JavaScript-Engines, die Javascript als Eingabe verwenden, verarbeiten und dann zum Rendern ausgeben.API: "Anwendungsprogrammierschnittstelle".

Der letzte Begriff, den ich beantworte, ist ein persönlicher Fehler: API wurde früher verwendet, um die externe Schnittstelle einer Anwendung oder Umgebung zu beschreiben, die selbst in der Lage war, unabhängig zu laufen oder zumindest ihre Aufgaben auszuführen, ohne dass der Kunde eingreifen musste nach der ersten Ausführung. Anwendungen wie Datenbanken, Textverarbeitungsprogramme und Windows-Systeme würden einen festen Satz interner Hooks oder Objekte für die externe Schnittstelle verfügbar machen, die ein Client dann aufrufen/ändern/verwenden usw. kann, um Funktionen auszuführen, die die ursprüngliche Anwendung ausführen könnte. Die APIs variierten zwischen der Menge der verfügbaren Funktionalität durch die API und der Menge der Kernanwendung, die vom Clientcode (erneut) verwendet wurde. (Eine Word-Verarbeitungs-API kann z. B. erfordern, dass die vollständige Anwendung im Hintergrund geladen wird, wenn jede Instanz des Client-Codes oder nur eine der verknüpften Bibliotheken ausgeführt wird), während ein ausgeführtes Fenstersystem interne Objekte erstellt, die von ihm selbst verwaltet werden Passback-Handles an den Client-Code übergeben, um stattdessen verwendet zu werden.

Derzeit ist der Begriff API viel breiter und wird oft verwendet, um fast alle anderen Begriffe in dieser Antwort zu beschreiben. In der Tat ist die gebräuchlichste Definition für diesen Begriff, dass eine API eine vertraglich vereinbarte externe Schnittstelle für eine andere Software (Client-Code für die API) anbietet. In der Praxis bedeutet dies, dass eine API sprachabhängig ist und über eine konkrete Implementierung verfügt, die von einer der oben genannten Codesammlungen bereitgestellt wird, z. B. einer Bibliothek, einem Toolkit oder einem Framework. Um einen bestimmten Bereich, beispielsweise Protokolle, zu betrachten, unterscheidet sich eine API von einem Protokoll, bei dem es sich um einen allgemeineren Begriff handelt, der einen Satz von Regeln darstellt, jedoch eine einzelne Implementierung einer bestimmten Protokoll-/Protokoll-Suite, die eine externe Schnittstelle verfügbar macht Für andere Software wird meistens eine API genannt.

Anmerkung.

Wie oben erwähnt, haben sich die historischen und aktuellen Definitionen der obigen Begriffe verschoben, und dies kann auf Fortschritte beim wissenschaftlichen Verständnis der zugrunde liegenden Computerprinzipien und -paradigmen sowie auf die Entstehung bestimmter Softwaremuster zurückgeführt werden. Insbesondere die GUI- und Windowing-Systeme der frühen neunziger Jahre trugen dazu bei, viele dieser Begriffe zu definieren, aber seit der effektiven Hybridisierung des OS-Kernel- und Windowing-Systems für Massen-Betriebssysteme (bar vielleicht Linux) und der Massenanwendung von Abhängigkeitsinjektion/Umkehrung der Kontrolle als Mechanismus zum Konsumieren von Bibliotheken und Frameworks, mussten diese Begriffe ihre jeweilige Bedeutung ändern.

.


P.S. (Ein Jahr später)

Nachdem ich über ein Jahr lang sorgfältig über dieses Thema nachgedacht habe, lehne ich das IoC-Prinzip als den entscheidenden Unterschied zwischen einem Framework und einer Bibliothek ab. Es gibt eine große Anzahl populärer Autoren, die sagen, dass es ist, aber es gibt fast ebenso viele Leute, die sagen, dass dies nicht der Fall ist. Es gibt einfach zu viele 'Frameworks', die NICHT mit IoC sprechen, um zu sagen, dass dies das bestimmende Prinzip ist. Eine Suche nach Embedded- oder Micro-Controller-Frameworks zeigt eine ganze Fülle, die IoC NICHT verwendet, und ich glaube jetzt, dass die .Net-Sprache und die CLR ein akzeptabler Nachkomme des "allgemeinen" Frameworks sind. Zu sagen, dass IoC das bestimmende Merkmal ist, ist für mich einfach zu starr, um es zu akzeptieren, und lehnt alles ab, was sich als Rahmen vorstellt, der der oben genannten historischen Darstellung entspricht.

Weitere Informationen zu Nicht-IoC-Frameworks finden Sie, wie oben erwähnt, bei vielen Embedded- und Micro-Frameworks sowie bei allen historischen Frameworks in einer Sprache, die keinen Rückruf über die Sprache bereitstellt (OK. Rückrufe können für jedes moderne Gerät gehackt werden Registersystem, aber nicht vom durchschnittlichen Programmierer) und natürlich das .net-Framework.

For details of non-IoC frameworks, see, as mentioned above, many embedded and micro frameworks, as well as any historical framework in a language that does not provide callback through the language (OK. Callbacks can be hacked for any device with a modern register system, but not by the average programmer), and obviously, the .net framework.

55
user2654834

Diagramm

Wenn Sie ein eher visueller Lernender sind, finden Sie hier ein Diagramm, das es klarer macht:

 

(Credits: http://tom.lokhorst.eu/2010/09/why-libraries-are-better-than-frameworks )

54

Das Antwort von Menzani und Barrass ist wahrscheinlich das vollständigste. Die Erklärung könnte jedoch klarer formuliert werden. Die meisten Leute vermissen die Tatsache, dass dies alles verschachtelte Konzepte sind. Also lass mich das für dich auslegen.

Beim Schreiben von Code:

  • schließlich entdecken Sie Codeabschnitte, die Sie in Ihrem Programm wiederholen, sodass Sie diese in Functions/Methods umwandeln.
  • nachdem Sie ein paar Programme geschrieben haben, kopieren Sie bereits erstellte Funktionen in neue Programme. Um sich Zeit zu sparen, bündeln Sie diese Funktionen in Libraries.
  • schließlich stellen Sie fest, dass Sie jedes Mal die gleiche Art von Benutzeroberflächen erstellen, wenn Sie bestimmte Bibliotheken verwenden. Sie ändern also Ihre Arbeit um und erstellen ein Toolkit, mit dem Sie Ihre Benutzeroberflächen einfacher mit generischen Methodenaufrufen erstellen können.
  • schließlich haben Sie so viele Apps geschrieben, die dieselben Toolkits und Bibliotheken verwenden, dass Sie ein Framework erstellen, für das bereits eine generische Version dieses Boilerplate-Codes bereitgestellt wird. Sie müssen also lediglich das Aussehen der Benutzeroberfläche und designt Behandeln Sie die Ereignisse, die sich aus der Benutzerinteraktion ergeben.

Im Allgemeinen werden die Unterschiede zwischen den Begriffen vollständig erklärt.

50
Arkain

Eine Bibliothek ist einfach eine Sammlung von Methoden/Funktionen, die in einem Paket zusammengefasst sind und in ein Code-Projekt importiert und erneut verwendet werden können.

Ein Framework ist eine robuste Bibliothek oder Sammlung von Bibliotheken, die eine "Grundlage" für Ihren Code bildet. Ein Framework folgt dem Inversion of Control-Muster. Zum Beispiel ist das .NET-Framework eine große Sammlung zusammenhängender Bibliotheken, in denen Sie Ihre Anwendung auf erstellen. Man kann argumentieren, dass es keinen großen Unterschied zwischen einem Framework und einer Bibliothek gibt, aber wenn die Leute "Framework" sagen, impliziert dies in der Regel eine größere, robustere Bibliothek von Bibliotheken, die einen integralen Bestandteil einer Anwendung bilden.

Ich denke an ein Toolkit genauso wie an ein SDK. Es wird mit Dokumentation, Beispielen, Bibliotheken, Wrappern usw. geliefert. Auch hier können Sie sagen, dass es sich um ein Framework handelt, und Sie wären wahrscheinlich richtig.

Sie können fast alle austauschbar verwendet werden.

13
Jordan Parmer

sehr, sehr ähnlich ist ein Framework normalerweise etwas weiter entwickelt und vollständiger als eine Bibliothek, und ein Toolkit kann einfach eine Sammlung ähnlicher Bibliotheken und Frameworks sein.

eine wirklich gute Frage, die vielleicht sogar das kleinste subjektiv ist, aber ich glaube, es geht um die beste Antwort, die ich geben kann.

5
Jake Kalstad

Bibliothek

Ich denke, es ist sich einig, dass eine Bibliothek bereits codierter Code ist, den Sie verwenden können, um sie nicht erneut codieren zu müssen. Der Code muss so organisiert sein, dass Sie die gewünschte Funktionalität nachschlagen und aus Ihrem eigenen Code heraus verwenden können.

Die meisten Programmiersprachen werden mit Standardbibliotheken geliefert, insbesondere mit etwas Code, der eine Art Sammlung implementiert. Dies dient immer der Bequemlichkeit, dass Sie diese Dinge nicht selbst programmieren müssen. In ähnlicher Weise verfügen die meisten Programmiersprachen über ein Konstrukt, mit dem Sie die Funktionalität von Bibliotheken nachschlagen können, z. B. dynamische Verknüpfungen, Namespaces usw.

Daher ist Code, der häufig wiederverwendet werden muss, großartiger Code, um in eine Bibliothek eingefügt zu werden.

Toolkit

Eine Reihe von Tools, die für einen bestimmten Zweck verwendet werden. Das ist einstimmig. Die Frage ist, was als Werkzeug betrachtet wird und was nicht. Ich würde sagen, dass es keine feste Definition gibt, es hängt vom Kontext ab, in dem sich das Ding als Toolkit bezeichnet. Beispiele für Werkzeuge können Bibliotheken, Widgets, Skripts, Programme, Editoren, Dokumentation, Server, Debugger usw. sein.

Eine andere Sache, die zu beachten ist, ist der "besondere Zweck". Dies ist immer wahr, aber der Umfang des Zwecks kann sich leicht ändern, je nachdem, wer das Toolkit erstellt hat. So kann es sich leicht um das Toolkit eines Programmierers oder um ein String-Parsing-Toolkit handeln. Eines ist so breit, dass es ein Werkzeug haben könnte, das alles berührt, was mit der Programmierung zusammenhängt, während das andere genauer ist.

SDKs sind im Allgemeinen Toolkits, da sie versuchen, eine Reihe von Tools (häufig mehrerer) in einem einzigen Paket zusammenzufassen.

Ich denke, der gemeinsame Thread ist, dass ein Werkzeug entweder etwas für Sie tut oder es Ihnen hilft. Ein Toolkit besteht einfach aus einer Reihe von Tools, die alle bestimmte Aktivitäten ausführen oder unterstützen.

Framework

Frameworks sind nicht ganz so einstimmig definiert. Es scheint ein wenig pauschal für alles zu sein, was Ihren Code einrahmt. Was bedeutet: jede Struktur, die Ihrem Code zugrunde liegt oder diese unterstützt.

Dies bedeutet, dass Sie Ihren Code anhand eines Frameworks erstellen, während Sie eine Bibliothek für Ihren Code erstellen.

Es scheint jedoch, dass das Word-Framework manchmal in demselben Sinn wie Toolkit oder sogar Bibliothek verwendet wird. Das .Net Framework ist hauptsächlich ein Toolkit, da es aus der FCL (Bibliothek) und der CLR (Virtuelle Maschine) besteht. Sie würden es also als Toolkit für die C # -Entwicklung unter Windows betrachten. Mono als Toolkit für die C # -Entwicklung unter Linux. Dennoch nannten sie es einen Rahmen. Es ist sinnvoll, dies auch so zu sehen, da es Ihren Code so einrahmt, dass ein Frame jedoch mehr Unterstützung und Zusammenhalt bietet und dann alle Arten von Arbeit erledigt. Meine Meinung ist, dass dies nicht die Art ist, auf die Sie den Code verwenden sollten Wort.

Ich denke, dass die Industrie versucht, ein bereits geschriebenes Programm mit fehlenden Teilen, die Sie bereitstellen oder anpassen müssen, als Rahmen zu bezeichnen. Was ich für eine gute Sache halte, da Toolkit und Bibliothek sehr präzise Ausdrücke für andere Verwendungen von "Framework" sind.

3
Didier A.

Framework: auf Ihrem Computer installiert und damit Sie mit ihm interagieren können. Ohne das Framework können Sie keine Programmierbefehle an Ihre Maschine senden

Bibliothek: zielt darauf ab, ein bestimmtes Problem (oder mehrere Probleme derselben Kategorie) zu lösen

Toolkit: Eine Sammlung vieler Codeteile, die mehrere Probleme bei mehreren Problemen lösen können (genau wie bei einer Toolbox)

2
ymz

Ich denke, es ist ein bisschen subjektiv. Das Toolkit ist das einfachste. Es sind nur ein paar Methoden, Klassen, die verwendet werden können.
Die Bibliothek gegenüber der Rahmenfrage, die ich durch die Art und Weise, wie ich sie benutze, ausmacht. Ich habe irgendwo die perfekte Antwort vor langer Zeit gelesen. Das Framework ruft Ihren Code auf, andererseits ruft Ihr Code die Bibliothek auf.

2
Péter

Andere haben bemerkt, dass .net sowohl ein Framework als auch eine Bibliothek und ein Toolkit sein kann, abhängig davon, welchen Teil Sie verwenden, aber vielleicht hilft ein Beispiel. Entity Framework für den Umgang mit Datenbanken ist ein Teil von .net, der die Umkehrung des Kontrollmusters verwendet. Sie lassen es wissen, dass Ihre Modelle wissen, was mit ihnen zu tun ist. Als Programmierer müssen Sie "den Verstand des Frameworks" oder realistischer den Verstand des Designers verstehen und wissen, was er mit Ihren Eingaben tun wird. Datenbereich und verwandte Aufrufe sind dagegen lediglich ein Hilfsmittel, um Daten abrufen und von und zu Tabellen/Ansichten bringen und Ihnen zur Verfügung stellen zu können. Es würde niemals verstehen, wie eine übergeordnete untergeordnete Beziehung von einem Objekt in ein relationales Verhältnis umgesetzt wird. Dafür würden Sie mehrere Tools verwenden. Sie hätten jedoch viel mehr Kontrolle darüber, wie diese Daten gespeichert wurden, wann, Transaktionen usw.

0
billpennock

In Bezug auf die richtige Antwort von Mittag:

ein einfaches Beispiel. Angenommen, Sie implementieren die ISerializable-Schnittstelle (.Net) in einer Ihrer Klassen. Sie verwenden dann das Framework qualitäten von .Net statt dessen Bibliotheksqualitäten. Sie füllen die "weißen Flecken" aus (wie mittag sagte) und Sie haben das Skelett abgeschlossen. Sie müssen im Voraus wissen, wie das Framework mit Ihrem Code "reagiert". Eigentlich .net IS ein Framework, und hier widerspreche ich der Ansicht von Mittag.

Das vollständige, vollständige Antwort Ihrer Frage wird sehr klar in Kapitel 19 (das ganze Kapitel, das nur diesem Thema gewidmet ist) von diesem Buch gegeben, das ein sehr gutes Buchist. Übrigens (überhaupt nicht "nur für Smalltalk").

0
Dimi_Pel