Введение
Неосязаемый исполняемый компонент компьютера.
Программное обеспечение — это набор программ и данных, которые сообщают компьютеру, как выполнять конкретные задачи. Программное обеспечение часто включает в себя сопутствующую документацию. Это отличается от аппаратного обеспечения, из которого построена система и которое фактически выполняет работу. На самом низком уровне программирования исполняемый код состоит из машинных инструкций, поддерживаемых отдельным процессором — обычно центральным процессором (CPU) или графическим процессором (GPU). Машинный язык состоит из групп двоичных значений, обозначающих инструкции процессора, которые изменяют состояние компьютера по сравнению с предыдущим состоянием. Например, инструкция может изменить значение, хранящееся в определенной ячейке памяти компьютера, — эффект, который непосредственно не виден пользователю. Инструкция также может вызвать одну из множества операций ввода-вывода, например, отображение текста на экране компьютера, вызывая изменения состояния, которые должны быть видимы пользователю. Процессор выполняет инструкции в том порядке, в котором они предоставлены, если только ему не дано указание «перейти» к другой инструкции или его не прервет операционная система. По состоянию на 2024 год большинство персональных компьютеров, смартфонов и серверов оснащены процессорами с несколькими вычислительными блоками или несколькими процессорами, работающими совместно, поэтому вычисления стали гораздо более параллельными, чем раньше. Большинство программ написано на языках программирования высокого уровня, таких как Python, JavaScript, Visual Basic, Delphi, Perl, PHP, ECMAScript, Ruby, C# и Java. Они проще и эффективнее для программистов, поскольку они ближе к естественным языкам, чем к машинному языку. Языки высокого уровня преобразуются в машинный язык с помощью компилятора, интерпретатора или их комбинации. Программное обеспечение также может быть написано на языке ассемблера низкого уровня, например C, C++, Assembly и Fortran. Языки ассемблера тесно связаны с машинными инструкциями компьютера и преобразуются в машинный язык с помощью ассемблера.
Инструменты программирования
Инструменты программирования также являются программным обеспечением в виде программ или приложений, которые разработчики используют для создания, отладки, сопровождения или иной поддержки программного обеспечения. Программное обеспечение пишется на одном или нескольких языках программирования; существует множество языков программирования, и каждый из них имеет как минимум одну реализацию, каждая из которых включает в себя собственный набор инструментов программирования. Эти инструменты могут представлять собой относительно независимые программы, такие как компиляторы, отладчики, интерпретаторы, компоновщики и текстовые редакторы, которые можно комбинировать для выполнения задачи; либо они могут формировать интегрированную среду разработки (IDE), объединяющую большую часть или всю функциональность таких независимых инструментов. IDE могут делать это либо путем вызова соответствующих отдельных инструментов, либо путем повторной реализации их функциональности новым способом. IDE может упростить выполнение определенных задач, например, поиск файлов в конкретном проекте. Многие реализации языков программирования предоставляют возможность использования как отдельных инструментов, так и IDE.
Архитектура
Люди, использующие современные компьютеры общего назначения (в отличие от встроенных систем, аналоговых компьютеров и суперкомпьютеров), обычно видят три уровня программного обеспечения, выполняющих различные задачи: платформу, приложения и пользовательское программное обеспечение. Платформа: Платформа включает в себя прошивку, драйверы устройств, операционную систему и, как правило, графический пользовательский интерфейс, которые в совокупности позволяют пользователю взаимодействовать с компьютером и его периферийными устройствами (сопутствующим оборудованием). Платформа часто поставляется в комплекте с компьютером. На ПК обычно есть возможность изменить платформенное программное обеспечение. Прикладное программное обеспечение: Прикладное программное обеспечение – это то, о чем большинство людей думает, когда речь заходит о программном обеспечении. Типичными примерами являются офисные пакеты и видеоигры. Прикладное программное обеспечение часто приобретается отдельно от компьютерного оборудования. Иногда приложения поставляются в комплекте с компьютером, но это не меняет того факта, что они работают как независимые приложения. Приложения обычно являются независимыми программами от операционной системы, хотя они часто адаптированы для конкретных платформ. Многие пользователи относят компиляторы, базы данных и другое "системное программное обеспечение" к прикладным программам. Пользовательское программное обеспечение: Разработка конечными пользователями позволяет адаптировать системы к конкретным потребностям пользователей. Пользовательское программное обеспечение включает в себя шаблоны электронных таблиц и шаблоны текстовых процессоров. Даже фильтры электронной почты – это разновидность пользовательского программного обеспечения. Пользователи создают это программное обеспечение самостоятельно и часто недооценивают его важность. В зависимости от того, насколько качественно пользовательское программное обеспечение было интегрировано в стандартные пакеты приложений, многие пользователи могут не осознавать разницу между исходными пакетами и тем, что было добавлено коллегами.
Исполнение
Компьютерное программное обеспечение должно быть "загружено" в память компьютера (например, на жесткий диск или в оперативную память). После загрузки программного обеспечения компьютер может его выполнить. Это включает передачу инструкций от прикладного программного обеспечения через системное программное обеспечение аппаратному обеспечению, которое в конечном итоге получает инструкцию в виде машинного кода. Каждая инструкция заставляет компьютер выполнить операцию – переместить данные, выполнить вычисление или изменить ход выполнения инструкций. Перемещение данных обычно происходит из одного участка памяти в другой. Иногда это включает перемещение данных между памятью и регистрами, обеспечивающими высокоскоростной доступ к данным в центральном процессоре. Перемещение данных, особенно больших объемов, может быть ресурсоемким; этого иногда удается избежать, используя вместо этого "указатели" на данные. Вычисления включают простые операции, такие как увеличение значения переменной. Более сложные вычисления могут включать множество операций и элементов данных.
Качество и надежность
Качество программного обеспечения очень важно, особенно для коммерческого и системного программного обеспечения. Если программное обеспечение содержит ошибки, оно может удалить данные пользователя, привести к сбою компьютера и вызвать другие непредвиденные последствия. Ошибки и дефекты называются "багами", которые часто выявляются в ходе альфа- и бета-тестирования. Программное обеспечение также подвержено так называемому старению программного обеспечения – постепенному снижению производительности, вызванному сочетанием скрытых ошибок. Многие ошибки обнаруживаются и устраняются посредством тестирования программного обеспечения. Однако тестирование программного обеспечения редко – если вообще когда-либо – позволяет устранить все ошибки; некоторые программисты утверждают, что "в каждой программе есть хотя бы одна ошибка" (закон Любарского). В каскадной модели разработки программного обеспечения обычно используются отдельные команды тестирования, но в более современных подходах, объединенных термином "гибкая разработка программного обеспечения" (agile), разработчики часто самостоятельно проводят все необходимые тесты и регулярно демонстрируют программное обеспечение пользователям/клиентам для получения обратной связи. Программное обеспечение можно тестировать с помощью модульного тестирования, регрессионного тестирования и других методов, которые выполняются вручную или, чаще всего, автоматически, поскольку объем тестируемого кода может быть значительным. Программы, включающие управляющее программное обеспечение, облегчают совместную работу аппаратной инженерии и системных операторов.
Патенты
Патенты на программное обеспечение, как и другие типы патентов, теоретически должны предоставлять изобретателю исключительную, ограниченную по времени лицензию на детальную идею (например, алгоритм) о том, как реализовать часть программного обеспечения или компонент программного обеспечения. Идеи полезных функций, которые может выполнять программное обеспечение, и требования пользователей не должны патентоваться, равно как и конкретные реализации (то есть фактические программные пакеты, реализующие патент) – последние уже защищены авторским правом, как правило, автоматически. Таким образом, патенты на программное обеспечение должны охватывать промежуточную область между требованиями и конкретной реализацией. В некоторых странах требование о том, чтобы заявленное изобретение оказывало влияние на физический мир, также может являться условием действительности патента на программное обеспечение, хотя, поскольку любое полезное программное обеспечение оказывает влияние на физический мир, это требование может быть предметом дискуссий. Между тем, американское законодательство об авторском праве применялось к различным аспектам написания программного кода. Патенты на программное обеспечение вызывают споры в индустрии программного обеспечения, и многие люди придерживаются различных точек зрения на этот счет. Один из источников противоречий заключается в том, что вышеупомянутое разграничение между первоначальными идеями и патентом, по-видимому, не соблюдается на практике патентными юристами – например, патент на аспекто-ориентированное программирование (AOP), который претендовал на права на любой инструмент программирования, реализующий идею AOP, независимо от способа реализации. Другой источник споров – влияние на инновации: многие авторитетные эксперты и компании утверждают, что программное обеспечение – это настолько динамично развивающаяся область, что патенты на программное обеспечение лишь создают значительные дополнительные судебные издержки и риски, и фактически тормозят инновации. В ходе дебатов о патентах на программное обеспечение за пределами Соединенных Штатов выдвигался аргумент, что основными бенефициарами разрешения или продолжения действия патентов на программное обеспечение, вероятно, будут крупные американские корпорации и патентные юристы.
Конструкция и реализация
Конструкция и реализация программного обеспечения варьируются в зависимости от его сложности. Например, проектирование и создание 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. Для создания программного обеспечения могут быть полезны структуры данных, такие как хеш-таблицы, массивы и двоичные деревья, а также алгоритмы, такие как быстрая сортировка. Компьютерное программное обеспечение обладает особыми экономическими характеристиками, которые отличают его разработку, создание и распространение от большинства других экономических товаров. Человека, создающего программное обеспечение, называют программистом, инженером программного обеспечения или разработчиком программного обеспечения – все эти термины имеют схожее значение. Существуют и более неформальные термины, такие как "кодер" и "хакер", хотя использование последнего может ввести в заблуждение, поскольку чаще всего оно относится к тем, кто незаконно взламывает компьютерные системы.