В чем разница между фреймворком и библиотекой?

866

В чем разница между фреймворком и библиотекой ?

Я всегда думал о библиотеке как о наборе объектов и функций, которые фокусируются на решении конкретной проблемы или конкретной области разработки приложений (например, доступа к базе данных); и, с другой стороны, структура как набор библиотек, ориентированных на конкретную методологию (например, MVC) и охватывающих все области разработки приложений.

anbanm
источник
18
@ vba4all: Как это может быть дубликатом, когда его спросили первым?
Нуб Сайбот
5
Тот факт,
3
@tuple_cat на самом деле ваша ссылка кажется дубликатом: ее спросили после этого
chharvey
1
Нам нужна некоторая функциональность, мы называем библиотеку. Нам нужна некоторая функциональность, мы воспользуемся фреймворком, а Framework вызывает наш код (например, UIKit).
Камлешвар

Ответы:

350

На самом деле эти термины могут означать много разных вещей в зависимости от контекста, который они используют.

Например, в Mac OS X фреймворки - это просто библиотеки, упакованные в пакет. В комплекте вы найдете актуальную динамическую библиотеку (libWhwhat.dylib). Разница между пустой библиотекой и фреймворком на Mac заключается в том, что фреймворк может содержать несколько разных версий библиотеки. Он может содержать дополнительные ресурсы (изображения, локализованные строки, файлы данных XML, объекты пользовательского интерфейса и т. Д.), И если инфраструктура не является общедоступной, она обычно содержит необходимые файлы .h, необходимые для использования библиотеки.

Таким образом, в одном пакете есть все, что вам нужно, чтобы использовать библиотеку в своем приложении (библиотека C / C ++ / Objective-C без файлов .h довольно бесполезна, если вы не пишете их самостоятельно в соответствии с документацией библиотеки), а не куча файлов для перемещения (пакет Mac - это просто каталог на уровне Unix, но пользовательский интерфейс рассматривает его как один файл, почти как у вас есть файлы JAR в Java, и когда вы щелкаете по нему, вы обычно не видите что внутри, если вы явно не выбрали, чтобы показать содержимое).

Википедия называет фреймворк "модным словом". Он определяет структуру программного обеспечения как

Программная структура - это повторно используемая конструкция для программной системы (или подсистемы). Программная структура может включать в себя программы поддержки, библиотеки кодов, язык сценариев или другое программное обеспечение, помогающее разрабатывать и склеивать различные компоненты программного проекта. Различные части платформы могут быть представлены через API.

Так что я бы сказал, что библиотека - это просто библиотека. Это набор объектов / функций / методов (в зависимости от вашего языка), и ваше приложение «ссылается» на него и, таким образом, может использовать объекты / функции / методы. В основном это файл, содержащий код многократного использования, который обычно может использоваться несколькими приложениями (вам не нужно писать один и тот же код снова и снова).

Фреймворк может быть всем, что вы используете в разработке приложений. Это может быть библиотека, набор из множества библиотек, набор сценариев или любое программное обеспечение, необходимое для создания приложения. Рамки это просто очень расплывчатый термин.

Вот статья о каком-то парне на тему « Библиотека против фреймворка ». Я лично считаю , что эта статья является весьма спорной. Это не неправильно, что он говорит там, однако, он просто выбирает одно из множества определений фреймворка и сравнивает его с классическим определением библиотеки. Например, он говорит, что вам нужна структура для подклассов. В самом деле? Я могу иметь объект, определенный в библиотеке, я могу ссылаться на него и подкласс его в моем коде. Я не понимаю, как мне нужна «основа» для этого. В некотором смысле он скорее объясняет, как термин используется сегодня. Это просто раскрученное слово, как я уже говорил. Некоторые компании выпускают просто обычную библиотеку (в любом смысле классической библиотеки) и называют ее «структурой», потому что это звучит более навороченно.

Mecki
источник
2
Интересно, что еще в 2008 году статья в Википедии описывала «фреймворк» как «модное слово».
Зебрафиш
2
ИМО, фреймворк - это «пустая» среда проекта.
Кульвар
514

Библиотека выполняет конкретные, четко определенные операции.

Структура представляет собой каркас , где приложение определяет «мясо» операции, заполнив скелет. У скелета все еще есть код для соединения частей, но самая важная работа выполняется приложением.

Примеры библиотек: сетевые протоколы, сжатие, манипулирование изображениями, строковые утилиты, оценка регулярных выражений, математика. Операции являются автономными.

Примеры фреймворков: система веб-приложений, менеджер плагинов, система графического интерфейса. Фреймворк определяет концепцию, но приложение определяет фундаментальную функциональность, о которой заботятся конечные пользователи.

Джейсон Коэн
источник
10
+1 за реальные примеры. Кстати, вы не возражаете уточнить, что вы подразумеваете под "системой веб-приложений"?
Pacerier
3
@Pacerier, вероятно, что-то, что позволяет вам создавать полноценное веб-приложение, такое как Rails для Ruby или Sails для Node.js.
густавогенке
Хороший ответ. Можете ли вы привести еще несколько примеров, связанных с фреймворками и библиотеками iOS?
NSPratik
или Django, веб-фреймворк для перфекционистов с установленными сроками.
авиаудар
2
Я бы подумал о заполнении скелета «мышцами», а не «мясом». Я думаю, что это более точная аналогия, потому что «мышцы» приводят скелет в движение.
altgov3en
290

Я думаю, что главное отличие состоит в том, что фреймворки следуют « голливудскому принципу », то есть «не звоните нам, мы вам позвоним».

По словам Мартина Фаулера :

Библиотека является в основном набором функций , которые вы можете позвонить, в эти дни , как правило , организованы в классы. Каждый звонок выполняет некоторую работу и возвращает управление клиенту.

Структура воплощает в себе некоторые абстрактные конструкции, с большим количеством поведения , построенным в. Для того , чтобы использовать его нужно вставить свое поведение в различные места в рамках либо по подклассам или пути подключения собственных классов. Код фреймворка затем вызывает ваш код в этих точках.

Панос
источник
2
@Panos Спасибо за объяснение, но не могли бы вы уточнить. Например, я использую инфраструктуру FacebookSDK и вызываю методы класса из этой платформы. Фреймворк FacebookSDK ничего не вызывает в моем коде, что противоречит вашему определению, т.е. «не звоните нам, мы вам позвоним».
Чарльз Робертсон
4
@CharlesRobertson AFAIK FacebookSDK - это клиентская библиотека. Его нельзя классифицировать как структуру, и причина очевидна (как вы уже заметили): FacebookSDK ничего не вызывает в коде клиента. Кроме того, Facebook определяет SDK следующим образом: «Богатый набор клиентских функций для добавления социальных плагинов, вызовов Facebook и вызовов API API». Нет указаний для рамок ...
Panos
1
@ Панос Спасибо. Я думаю, что значок чемодана, который представляет FacebookSDK, немного вводит в заблуждение. И имя «FacebookSDK.framework». Facebook должен переименовать его в что-то вроде «FacebookSDK.dylib»? Но спасибо за разъяснение этого. Хорошо знать, каково правильное определение ...
Чарльз Робертсон,
Это интересное определение. Недавно я начал использовать d3.js и заметил, что он обычно рассматривается в качестве основы. Но какой бы код d3 я ни написал, он находится внутри обычного кода javascript, поэтому я не могу расширить это определение до d3.
Дилип Кумар Патчиголла
1
@Dileep Домашняя страница d3.js в первом предложении гласит: «D3.js - это библиотека JavaScript для работы с документами на основе данных». Я думаю, что это неправильно, чтобы рассматриваться в качестве основы.
Panos
244

Вы звоните в библиотеку.

Фреймворк зовет вас.


図 書館 助 け
足 場 が 痛 い
多 く の 涙

Ян Бойд
источник
12
Не могли бы вы реорганизовать это как хайку?
Дерек Томес
18
@DerekTomes Кстати: я добавил форму хайку .
Ян Бойд
56
Ваш ответ обсуждается в META . Не могли бы вы перевести хайку? Я думаю, что многие из нас задаются вопросом, действительно ли это означает « Помогите библиотеке», леса повредили, много слез, как переводчик Google с любовью говорит об этом :)
Ошибки
27
Приятно видеть, что мод восстановил первые два комментария. Теперь имеет смысл, почему был добавлен японский текст (он был запрошен в шутку), и что это была просто попытка перевести, а не настоящая популярная японская поэма.
Занон
9
В Советской России рамки зовут тебя.
Роберт Мур
242

Библиотека:

Это просто коллекция из подпрограмм (функциональное программирование) или определение классов (объектно - ориентированное программирование). Причиной этого является простое повторное использование кода , то есть получение кода, который уже был написан другими разработчиками. Классы или подпрограммы обычно определяют конкретные операции в конкретной области домена . Например, есть несколько библиотек математики, которые могут позволить разработчику просто вызвать функцию без повторения реализации алгоритма.

Фреймворк:

В фреймворке весь поток управления уже существует, и есть множество предопределенных белых пятен, которые мы должны заполнить нашим кодом . Фреймворк обычно более сложный. Он определяет скелет, где приложение определяет свои собственные функции, чтобы заполнить скелет. Таким образом, ваш код будет вызываться фреймворком, когда это необходимо. Преимущество заключается в том, что разработчикам не нужно беспокоиться о том, хорош дизайн или нет, а нужно только реализовать специфичные для предмета функции.

Библиотека, Framework и представление вашего кода:

Библиотека, Framework и ваш код изображения отношения

KeyDifference:

Ключевым отличием библиотеки от фреймворка является «инверсия контроля» . Когда вы вызываете метод из библиотеки, вы находитесь под контролем. Но с фреймворком управление перевернуто: фреймворк зовет вас . Источник.

Связь:

Оба они определили API, который используется программистами для использования. Чтобы сложить их вместе, мы можем представить библиотеку как определенную функцию приложения, каркас как скелет приложения, а API - это соединитель для их объединения. Типичный процесс разработки обычно начинается с фреймворка и заполняет функции, определенные в библиотеках, через API.

Durai Amuthan.H
источник
14
Инверсия управления Большое подробное объяснение!
Патриция
3
Как и на картинке, она подытоживает и показывает, почему иногда люди путаются, потому что фреймворки также часто объединяют библиотеки.
Дидье А.
1
@didibus Если вы думаете, что ответ дает хорошее объяснение, вы можете выразить ему ответ, чтобы зрители постов могли легко найти полезный ответ.
Durai Amuthan.H
Таким образом, FFmpeg (не программа, а в основном LibAVUtil из проекта) - это фреймворк, а libavcodec и т. Д. - библиотеки?
MarcusJ
1
@MarcusJ - и LibAVUtil, и libavcodec являются библиотеками
Durai Amuthan.H
110

Как я всегда описывал это:

Библиотека - это инструмент.

Фреймворк - это образ жизни.

Библиотека, в которой вы можете использовать любую маленькую часть, которая вам поможет. Фреймворк, которому вы должны посвятить весь свой проект.

Джеймс Керран
источник
9
Этот ответ имеет гораздо больше смысла после полного понимания обоих терминов.
еще
45

С точки зрения веб-разработчика:

  1. Библиотека может быть легко заменена другой библиотекой. Но рамки не могут.

    Если вам не нравится библиотека выбора даты jquery, вы можете заменить ее на другую программу выбора даты, такую ​​как загрузчик даты начальной загрузки или указатель.

    Если вам не нравится AngularJS, на котором вы создали свой продукт, вы не можете просто заменить его какими-либо другими фреймворками. Вы должны переписать всю свою базу кода.

  2. В основном библиотека требует гораздо меньшего обучения по сравнению с Frameworks. Например: underscore.js - это библиотека, Ember.js - это фреймворк.

Физер Хан
источник
Лучший ответ. Просто, прямо и понятно.
Фелипе Сантьяго
41

Мне нравится ответ Коэнса, но более техническое определение таково: ваш код вызывает библиотеку. Фреймворк вызывает ваш код . Например, графический интерфейс вызывает ваш код через обработчики событий. Веб-фреймворк вызывает ваш код через некоторую модель запрос-ответ.

Это также называется инверсией управления - внезапно среда решает, когда и как выполнять ваш код, а не наоборот, как в случае с библиотеками. Это означает, что фреймворк также оказывает гораздо большее влияние на то, как вы должны структурировать свой код.

JacquesB
источник
30

Я забыл, где я видел это определение, но я думаю, что это довольно мило.

Библиотека - это модуль, который вы вызываете из своего кода, а фреймворк - это модуль, который вызывает ваш код.

Моу
источник
6
Но libc включает в себя qsort (), который вызывает ваш код. Я не думаю, что это делает libc фреймворком.
Марк Бейкер
Что подразумевается под модулем?
NattyC
18

Фреймворк может быть сделан из разных библиотек. Давайте возьмем пример.

Допустим, вы хотите приготовить рыбное карри. Тогда вам понадобятся такие ингредиенты, как масло , специи и другие полезности . Вам также нужна рыба, на которой вы будете готовить блюдо (это данные вашего заявления). все ингредиенты вместе называются рамками . Теперь вы будете использовать их один за другим или в комбинации, чтобы сделать рыбу карри, которая является вашим конечным продуктом . Сравните это с веб-фреймворком, который состоит из underscore.js , bootstrap.css , bootstrap.js , fontawesome , AngularJS и т. Д. Например, Twitter Bootstrap v.35,

Теперь, если вы рассматриваете только один ингредиент, как, скажем, масло . Вы не можете использовать любое масло, которое хотите, потому что тогда оно разрушит вашу рыбу (данные). Вы можете использовать только оливковое масло . Сравните это с underscore.js . Теперь, какую марку масла вы хотите использовать, зависит от вас. Некоторые блюда были приготовлены с использованием американского оливкового масла (underscore.js) или индийского оливкового масла (lodash.js). Это только изменит вкус вашего приложения. Поскольку они служат практически одной цели, их использование зависит от предпочтений разработчика, и их легко заменить.

введите описание изображения здесь


Framework : Коллекция библиотек, которые предоставляют уникальные свойства и поведение для вашего приложения. (Все ингредиенты)

Библиотека : четко определенный набор инструкций, которые обеспечивают уникальные свойства и поведение ваших данных. (Масло на рыбе)

Плагин : сборка утилиты для библиотеки (ui-router -> AngularJS) или множества библиотек в комбинации (date-picker -> bootstrap.css + jQuery), без которой ваш плагин мог бы теперь работать должным образом.


PS AngularJS - это фреймворк MVC, но библиотека JavaScript. Потому что я считаю, что библиотека расширяет стандартное поведение нативных технологий (в данном случае JavaScript).

Uday Hiwarale
источник
Хорошее объяснение :)
Мано
14

Вот как я думаю об этом (и видел, как другие рационализировали):

Библиотека - это то, что содержится в вашем коде. А фреймворк - это контейнер для вашего приложения.

Kon
источник
8

Библиотека реализует функциональные возможности для узкопрофильной цели, в то время как инфраструктура, как правило, представляет собой набор библиотек, обеспечивающих поддержку более широкого диапазона функций. Например, библиотека System.Drawing.dll обрабатывает функции рисования, но является только одной частью общей платформы .NET.

Джефф Йейтс
источник
3
Хороший момент, что фреймворк может содержать библиотеки . Таким образом, это может быть как фреймворк в первом, так и библиотека во втором. Так как это имеет место для многих веб-фреймворков, таких как Apache Wicket , которые определяют цикл обработки, но также предоставляют большой набор классов, которые реализуют конкретные компоненты пользовательского интерфейса.
OneWorld,
Я считаю .NET очень большая библиотека. Библиотека слишком большая, чтобы называться библиотекой, но все же библиотека. Фреймворки навязывают определенный дизайн, решают поток управления и т. Д. С небольшим пространством для работы. .NET как таковой не делает этого. Я считаю, что .NET - это библиотека, а ASP.NET MVC - это фреймворк. Но MS нужны хорошие слова для выхода на рынок.
Nawfal
6

Библиотека. Любой набор классов или компонентов, которые могут использоваться клиентом для выполнения определенной задачи.
Framework - требует от вас определенных рекомендаций по «подключению» к чему-то большему, чем вы. Вы просто предоставляете материалы, специфичные для вашего приложения / требований, в соответствии с требованиями публикации, так что «работа с фреймами может облегчить вашу жизнь»

Gishu
источник
6

Библиотеки предназначены для простоты использования и эффективности. Например, вы можете сказать, что библиотека Zend помогает нам решать различные задачи с ее четко определенными классами и функциями. В то время как инфраструктура обычно требует определенного способа реализации решения, такого как MVC (Model -view-controller) (ссылка) . Это четко определенная система для распределения задач, как в MVC. Модель содержит сторону базы данных, представления предназначены для интерфейса пользовательского интерфейса, а контроллеры предназначены для бизнес-логики.

Рави Шах
источник
5

Ваша интерпретация звучит довольно хорошо для меня ... Библиотека может быть чем угодно, которая компилируется и самодостаточна для повторного использования в другом коде, в ее содержании буквально нет ограничений.

С другой стороны, ожидается, что фреймворк будет иметь ряд возможностей для использования в какой-то конкретной области разработки приложений, как, например, в вашем примере, MVC.

Адам Беллер
источник
5

Я думаю, что вы хорошо заметили разницу: фреймворк обеспечивает фрейм, в котором мы выполняем нашу работу ... Каким-то образом, он более «сдерживающий», чем простая библиотека.
Фреймворк также должен добавить согласованности в набор библиотек.

PhiLho
источник
5

Я думаю, что библиотека - это набор утилит для достижения цели (например, сокеты, криптография и т. Д.). Фреймворк библиотека + БЕЗОПАСНОЕ ОБЪЕДИНЕНИЕ. Например, ASP.NET - это фреймворк: он принимает HTTP-запросы, создает объект страницы, вызывает события lyfe cicle и т. Д. Фреймворк делает все это, вы пишете немного кода, который будет выполняться в определенное время жизненного цикла. текущий запрос!

Во всяком случае, очень интересный вопрос!

Стефано м
источник
5

Я не помню источник этого ответа (я думаю, я нашел его в .ppt в Интернете), но ответ довольно прост.

Библиотека и Framework - это набор классов, модулей и / или кода (в зависимости от языка программирования), которые могут использоваться в ваших приложениях и помогают вам решить конкретную «проблему».

Эта проблема может заключаться в регистрации или отладке информации в приложении, рисовании диаграмм, создании определенного формата файла (html, pdf, xls), подключении к базе данных, создании части приложения или полного приложения или кода, примененного к Шаблон дизайна .

У вас может быть Фреймворк или Библиотека для решения всех этих проблем, и многие другие, обычно фреймворки, помогают вам решать более сложные или большие проблемы, но это является следствием их основного различия, а не основного определения для обоих.

Основное различие между библиотекой и платформой - это зависимость между их собственным кодом. Другими словами, чтобы использовать платформу, вам нужно использовать почти все классы, модули или код в FW, но для использования библиотеки вы можете использовать один или несколько классов, модулей или кода в lib в вашем собственном приложении

Это означает, что если, например, Framework имеет 50 классов, чтобы использовать Framework в приложении, которое вам нужно использовать, скажем, 10-15 или более классов в вашем коде, потому что именно так разработана Framework, некоторые классы (объекты этих классов) являются входными данными / параметрами для методов в других классах в рамках. Смотрите .NET Framework, Spring или любой MVC-фреймворк.

Но, например, библиотека журналов, вы можете просто использовать класс Log в своем коде и помочь вам решить «проблему журналирования», это не означает, что библиотека журнала не имеет больше классов в своем коде, как классы обрабатывать файлы, обрабатывать вывод на экран или даже базы данных, но вы никогда не трогаете / не используете эти классы в своем коде, и именно поэтому библиотека, а не фреймворк.

И также есть больше категорий, чем Frameworks и Библиотеки, но это не по теме.

Джуниор Гарза
источник