Компьютерное программное обеспечение, или просто программное обеспечение, представляет собой набор команд данных или компьютер, которые сообщают компьютеру, как работать. В этом отличие от физического оборудования, из которого система построена и фактически выполняет работу. В информатике и программной инженерии компьютерное программное обеспечение - это вся информация, обрабатываемая компьютерными системами, программами и данные. Компьютерное программное обеспечение включает компьютерные программы, библиотеки и связанные с ними неисполняемые данные, такие как онлайн-документация или цифровые носители. Компьютерное оборудование и программное обеспечение требуют друг друга, и ни одно из них не может быть реально использовано в отдельности.
На самом низком уровне программирования исполняемый код состоит из инструкций машинного языка, поддерживаемых отдельным процессором - обычно центральной обработкой блок (ЦП) или блок обработки графики (ГП). Машинный язык состоит из групп двоичных значений, обозначающих инструкции процессора, которые изменяют состояние компьютера по сравнению с его предыдущим состоянием. Например, инструкция может изменить значение, хранящееся в конкретном месте хранения в компьютере, - эффект, который напрямую не наблюдается для пользователя. Инструкция может также вызывать одну из многих операций ввода или вывода, например, отображение некоторого текста на экране компьютера; вызывающие изменения состояния, которые должны быть видны пользователю. Процессор выполняет инструкции в том порядке, в котором они предоставлены, если только ему не дана инструкция "перейти" к другой инструкции или прервана операционной системой.. По состоянию на 2015 год большинство персональных компьютеров, смартфонов устройств и серверов имели процессоры с несколькими исполнительными модулями или несколькими процессорами, выполняющими вычисления вместе, и вычисления стали гораздо более параллельной деятельностью, чем в прошлом.
Большая часть программного обеспечения написана на языках программирования высокого уровня. Они проще и эффективнее для программистов, потому что они ближе к естественным языкам, чем к машинным языкам. Языки высокого уровня переводятся на машинный язык с использованием компилятора или интерпретатора или их комбинации. Программное обеспечение также может быть написано на низкоуровневом ассемблере, который строго соответствует машинным инструкциям компьютера и переводится на машинный язык с помощью ассемблера.
Схема (алгоритм ) того, что было бы первой частью программного обеспечения, была написана Адой Лавлейс в 19 веке для запланированных Аналитическая машина. Она создала доказательств, чтобы показать, как двигатель будет вычислять числа Бернулли. Из-за доказательств и алгоритма она считается первым программистом.
Первую теорию о программном обеспечении - до создания компьютеров, какими мы их знаем сегодня - предложил Алан Тьюринг в его эссе 1935 года «О вычислимых числах» в приложении к Entscheidungsproblem (проблеме решения).
Это в конечном итоге привело к созданию академических областей информатики и программной инженерии ; Оба направления изучают программное обеспечение и его создание. Информатика - это теоретическое исследование компьютеров и программного обеспечения (эссе Тьюринга является примером информатики), тогда как программная инженерия - это применение инженерии и разработки программного обеспечения.
Однако до 1946 года программное обеспечение еще не было программами, хранящимися в памяти цифровых компьютеров с сохраненными программами, как мы это понимаем сейчас. Вместо этого первые электронные вычислительные устройства были переделаны, чтобы «перепрограммировать» их.
В 2000 году Фред Шапиро, библиотекарь Йельской школы права, опубликовал письмо, в котором говорилось, что статья Джона Уайлдера Тьюки 1958 года «Преподавание конкретной математики» содержала самое раннее известное использование термина «программное обеспечение», найденного при поиске в электронных архивах JSTOR, на два года раньше, чем OED. Это привело к тому, что многие приписали создание этого термина Тьюки, особенно в некрологах, опубликованных в том же году, хотя Тьюки никогда не претендовал на право чеканки таких монет. В 1995 году Поль Никетт утверждал, что первоначально он ввел термин в обращение в октябре 1953 года, хотя он не смог найти никаких документов, подтверждающих его утверждение. Самая ранняя известная публикация термина «программное обеспечение» в инженерном контексте была опубликована в августе 1953 года Ричардом Кархартом в исследовательском меморандуме Rand Corporation.
Практически на всех компьютерных платформах программное обеспечение можно сгруппировать в несколько широких категорий.
В зависимости от цели компьютерное программное обеспечение можно разделить на:
Инструменты программирования - это также программное обеспечение в форме программ или приложений, которые разработчики программного обеспечения (также известные как программисты, программисты, хакеры или инженеры ПО) используют для создания, отладки, обслуживания (т. е. улучшения или исправления) или иного поддержки программного обеспечения.
Программное обеспечение написано на одном или нескольких языках программирования; существует множество языков программирования, и у каждого есть по крайней мере одна реализация, каждая из которых состоит из своего собственного набора инструментов программирования. Эти инструменты могут быть относительно автономными программами, такими как компиляторы, отладчики, интерпретаторы, компоновщики и, которые могут быть объединены вместе. выполнить задачу; или они могут образовывать интегрированную среду разработки (IDE), которая объединяет большую часть или всю функциональность таких автономных инструментов. IDE могут делать это либо путем вызова соответствующих отдельных инструментов, либо путем повторной реализации их функциональных возможностей по-новому. IDE может упростить выполнение определенных задач, таких как поиск файлов в конкретном проекте. Многие реализации языков программирования предоставляют возможность использования как отдельных инструментов, так и IDE.
Пользователи часто видят вещи иначе, чем программисты. Люди, использующие современные компьютеры общего назначения (в отличие от встроенных систем, аналоговых компьютеров и суперкомпьютеров ), обычно видят три уровня программного обеспечения, выполняющего различные задачи: платформа, приложение и программное обеспечение пользователя.
Компьютерное программное обеспечение должно быть «загружено» в компьютерное хранилище (например, жесткий диск или память ). После загрузки программного обеспечения компьютер может запускать его. Это включает передачу инструкций из прикладного программного обеспечения через системное программное обеспечение к аппаратному обеспечению, которое в конечном итоге принимает инструкцию как машинный код. Каждая инструкция заставляет компьютер выполнять операцию - перемещение данных, выполнение вычисления или изменение потока управления инструкций.
Данные обычно перемещаются из одного места в памяти в другое. Иногда это связано с перемещением данных между памятью и регистрами, что обеспечивает высокоскоростной доступ к данным в ЦП. Перемещение данных, особенно больших их объемов, может быть дорогостоящим. Таким образом, этого иногда удается избежать, используя вместо этого «указатели» на данные. Вычисления включают простые операции, такие как увеличение значения переменного элемента данных. Более сложные вычисления могут включать в себя множество операций и элементов данных вместе.
Качество программного обеспечения очень важно, особенно для коммерческого и системного программного обеспечения, такого как Microsoft Office, Microsoft Windows и Linux. Если программное обеспечение неисправно (содержит ошибки), оно может удалить работу человека, вывести компьютер из строя и сделать другие неожиданные вещи. Неисправности и ошибки называются «ошибками », которые часто обнаруживаются во время альфа- и бета-тестирования. Программное обеспечение также часто становится жертвой так называемого старения программного обеспечения, прогрессирующего снижения производительности в результате комбинации невидимых ошибок.
Многие ошибки обнаруживаются и устраняются (отлаживаются) посредством тестирования программного обеспечения. Однако тестирование программного обеспечения редко - если вообще когда-либо - устраняет каждую ошибку; некоторые программисты говорят, что «в каждой программе есть еще хотя бы одна ошибка» (закон Любарского). В методе разработки программного обеспечения водопад обычно используются отдельные группы тестирования, но в новых подходах, которые собирательно называются гибкой разработкой программного обеспечения, разработчики часто проводят все свое собственное тестирование и демонстрируют программное обеспечение. пользователям / клиентам регулярно для получения обратной связи. Программное обеспечение можно протестировать с помощью модульного тестирования, регрессионного тестирования и других методов, которые выполняются вручную или, как правило, автоматически, поскольку объем кода, который нужно протестировать, может быть довольно большим. Например, НАСА имеет чрезвычайно строгие процедуры тестирования программного обеспечения для многих операционных систем и функций связи. Многие операции НАСА взаимодействуют и идентифицируют друг друга с помощью командных программ. Это позволяет многим людям, работающим в НАСА, проверять и оценивать функциональные системы в целом. Программы, содержащие командное программное обеспечение, значительно упрощают совместную работу аппаратной инженерии и системных операций.
Лицензия на программное обеспечение дает пользователю право использовать программное обеспечение в лицензированной среде, а в случае лицензий на бесплатное программное обеспечение также предоставляет другие права, такие как как право делать копии.
Проприетарное программное обеспечение можно разделить на два типа:
Программное обеспечение с открытым исходным кодом, с другой стороны, поставляется с бесплатно лицензия на программное обеспечение, дающая получателю право изменять и распространять программное обеспечение.
Патенты на программы, как и другие типы патентов, теоретически должны давать изобретателю исключительную, ограниченную по времени лицензию на детальную идею (например, алгоритм) о том, как реализовать часть программного обеспечения или компонент программного обеспечения. Предполагается, что идеи относительно полезных вещей, которые может выполнять программное обеспечение, и требования пользователей не подлежат патентованию, а конкретные реализации (т.е. фактические программные пакеты, реализующие патент) также не должны быть патентоспособными - последние уже защищены авторским правом, как правило автоматически. Таким образом, патенты на программы должны охватывать среднюю область между требованиями и конкретной реализацией. В некоторых странах требование о том, чтобы заявленное изобретение оказало влияние на физический мир, также может быть частью требований к действию патента на программное обеспечение, хотя, поскольку все полезное программное обеспечение оказывает влияние на физический мир, это требование может быть открыт для обсуждения. Между тем, американский закон об авторском праве применялся к различным аспектам написания программного кода.
Патенты на программы вызывают споры в индустрии программного обеспечения, и многие люди придерживаются разных взглядов на них. Одним из источников разногласий является то, что вышеупомянутое разделение между первоначальными идеями и патентом, похоже, не соблюдается на практике патентными юристами - например, патент на аспектно-ориентированное программирование (АОП), который имел целью претендовать на права на любой инструмент программирования, реализующий идею АОП, как бы он ни реализован. Другой источник разногласий - это влияние на инновации: многие известные эксперты и компании утверждают, что программное обеспечение - это настолько быстро развивающаяся область, что патенты на программное обеспечение просто создают огромные дополнительные судебные издержки и риски и фактически тормозят инновации. В случае дебатов о патентах на программы за пределами Соединенных Штатов был выдвинут аргумент о том, что крупные американские корпорации и патентные юристы, вероятно, будут основными бенефициарами разрешения или продолжения разрешения патентов на программы.
Дизайн и реализация программного обеспечения различаются в зависимости от сложности программного обеспечения. Например, проектирование и создание Microsoft Word заняло гораздо больше времени, чем проектирование и разработка Microsoft Notepad, потому что последний имеет гораздо больше базовых функций.
Программное обеспечение обычно разрабатывается и создается (иначе кодируется / пишется / программируется) в интегрированных средах разработки (IDE), таких как Eclipse, IntelliJ и Microsoft Visual Studio, которая может упростить процесс и скомпилировать программное обеспечение (если применимо). Как отмечено в другом разделе, программное обеспечение обычно создается поверх существующего программного обеспечения и интерфейса прикладного программирования (API), который предоставляет базовое программное обеспечение, например GTK +, JavaBeans или Swing.. Библиотеки (API) можно классифицировать по их назначению. Например, Spring Framework используется для реализации корпоративных приложений, библиотека Windows Forms используется для разработки приложений с графическим интерфейсом пользователя (GUI), таких как Microsoft Word и Windows Communication Foundation используются для разработки веб-сервисов. Когда программа разрабатывается, она полагается на API. Например, настольное приложение Microsoft Windows может вызывать функции API в библиотеке .NET Windows Forms, такие как Form1.Close () и Form1.Show (), чтобы закрыть или открыть приложение. Без этих API-интерфейсов программист должен полностью написать эти функции. Такие компании, как Oracle и Microsoft, предоставляют свои собственные API-интерфейсы, поэтому многие приложения пишутся с использованием их программных библиотек, которые обычно содержат множество API-интерфейсов.
Структуры данных, такие как хеш-таблицы, массивы и двоичные деревья, и алгоритмы, такие как quicksort, может быть полезно для создания программного обеспечения.
Компьютерное программное обеспечение имеет особые экономические характеристики, которые отличают его дизайн, создание и распространение от большинства других экономических товаров.
Человека, создающего программное обеспечение, называют программистом, инженер-программист или разработчик программного обеспечения, термины имеют одинаковое значение. Существуют также более неформальные термины для программистов, такие как «кодировщик» и «хакер » - хотя использование последнего слова может вызвать путаницу, поскольку оно чаще используется для обозначения кого-то, кто незаконно взламывает компьютер. системы.
Большое количество компаний-разработчиков программного обеспечения и программистов в мире составляют индустрию программного обеспечения. Программное обеспечение может быть довольно прибыльной отраслью: Билл Гейтс, соучредитель Microsoft, был самым богатым человеком в мире в 2009 году, во многом благодаря тому, что ему принадлежало значительное количество акций. в Microsoft, компании, ответственной за программные продукты Microsoft Windows и Microsoft Office - оба лидера рынка в своих соответствующих категориях продуктов.
Некоммерческие организации по разработке программного обеспечения включают Free Software Foundation, GNU Project и Mozilla Foundation. Организации по стандартизации программного обеспечения, такие как W3C, IETF, разрабатывают рекомендуемые стандарты программного обеспечения, такие как XML, HTTP и HTML, чтобы программное обеспечение могло взаимодействовать через эти стандарты.
Другие известные крупные компании-производители программного обеспечения: Google, IBM, TCS, Infosys, Wipro, HCL Technologies, Oracle, Novell, SAP, Symantec, Adobe Systems и Corel, а небольшие компании часто предлагают инновации.