Oprogramowanie (ang.software) – ogół informacji w postaci zestawuinstrukcji, zaimplementowanychinterfejsów i zintegrowanych danych przeznaczonych dlakomputera do realizacji wyznaczonych celów. Celem oprogramowania jest przetwarzaniedanych w wyznaczonym przeztwórcę zakresie. Określenie „oprogramowanie” może funkcjonować jako synonim terminów „program komputerowy” oraz „aplikacja”, przy czym stosuje się je zazwyczaj na oznaczenie większych programów oraz ich zbiorów.
Oprogramowanie tworząprogramiści w procesieprogramowania. Oprogramowanie jako przejaw twórczości jest chronioneprawem autorskim, twórcy zezwalają na korzystanie z niego na warunkach określanych wlicencji.
Zarys (algorytm) tego, co byłoby pierwszym oprogramowaniem, napisałaAda Lovelace w XIX wieku dla planowanejmaszyny analitycznej. Jednak ani kompletna maszyna analityczna, ani oprogramowanie do niej nie zostały opracowane[1].
Pierwsza teoria na temat oprogramowania (przed stworzeniem dzisiejszych komputerów) została zaproponowana przezAlana Turinga w jego eseju opublikowanym w roku 1936[2]. Doprowadziło to ostatecznie do powstania bliźniaczych akademickich dziedzin informatyki iinżynierii oprogramowania, które zarówno badają oprogramowanie, jak i jego tworzenie.Informatyka jest bardziej teoretyczna (esej Turinga jest przykładem informatyki), natomiast inżynieria oprogramowania koncentruje się na bardziej praktycznych zagadnieniach.
Przed rokiem 1946 oprogramowanie jakie teraz znamy, czyli programy przechowywane w pamięci komputerów cyfrowych – jeszcze nie istniało.
Narzędzie programistyczne to również oprogramowanie w postaci programów lubaplikacji internetowych, które twórcy oprogramowania (zwani również programistami lub inżynierami oprogramowania) używają do tworzenia, debugowania, utrzymywania (tj. ulepszania lub naprawiania). Oprogramowanie jest napisane w jednym lub kilku językach programowania. Istnieje wiele języków programowania i każdy ma przynajmniej jednąimplementację, z których każda składa się z własnego zestawu narzędzi programistycznych. Narzędzia te mogą być względnie samodzielnymi programami, takimi jakkompilatory,debuggery,interpretery, łączniki i edytory tekstu, które można łączyć w celu wykonania zadania. Mogą one również tworzyćzintegrowane środowisko programistyczne (IDE), które łączy w sobie wiele funkcji takich samodzielnych narzędzi.
Użytkownicy często postrzegają istotę oprogramowania inaczej niż programiści. Osoby korzystające z nowoczesnych komputerów ogólnego przeznaczenia (w przeciwieństwie dosystemów wbudowanych, komputerów analogowych i superkomputerów) zazwyczaj widzą trzy warstwy oprogramowania wykonującego różnorodne zadania: platformę, aplikację i oprogramowanie użytkownika.
Systemy do projektowania dostosowane do specyficznych potrzeb użytkowników. Oprogramowanie użytkownika obejmuje szablonyarkuszy kalkulacyjnych i szablony edytorów tekstów. Nawet filtry poczty e-mail są rodzajem oprogramowania użytkownika. Użytkownicy tworzą to oprogramowanie samodzielnie. W zależności od tego, w jakim stopniu oprogramowanie napisane przez użytkownika zostało zintegrowane z domyślnymi pakietami aplikacji, wielu użytkowników może nie być świadomych rozróżnienia między oryginalnymi pakietami a tym, co zostało dodane przez współpracowników.
Oprogramowanie komputerowe musi zostać „załadowane” do pamięci komputera (np.dysku twardego lub pamięci). Proces ten obejmuje przekazywanie instrukcji z oprogramowania aplikacyjnego, poprzezoprogramowanie systemowe, do sprzętu, który ostatecznie otrzymuje instrukcję jakokod maszynowy. Każda instrukcja powoduje, że komputer przeprowadza operację przesuwając dane, wykonując obliczenia lub zmieniając sterowanie instrukcjami.
Przesyłanie danych odbywa się zwykle z jednego miejsca w pamięci do drugiego. Czasami obejmuje to przenoszenie danych między pamięcią a rejestrami, które umożliwiają szybki dostęp do danych wCPU. Przenoszenie danych, zwłaszcza dużych ich ilości, może być kosztowne. Czasami unika się tego, wykorzystując zamiast tego „wskaźniki” do danych. Obliczenia obejmują proste operacje, takie jak zwiększanie wartości zmiennego elementu danych. Bardziej skomplikowane obliczenia mogą obejmować wiele operacji.
Jakość oprogramowania jest bardzo istotna, szczególnie w przypadku oprogramowania komercyjnego i systemowego, takiego jakMicrosoft Office,Microsoft Windows iLinux. Wadliwość oprogramowania może na przykład doprowadzić do awarii komputerowej.
Oprogramowanie często jest również ofiarą tak zwanego starzenia się, postępującej degradacji wydajności wynikającej z kombinacji niewidocznych błędów. Wiele błędów jest odkrywanych i eliminowanych (debugowanych) podczastestowania oprogramowania. Jednak testowanie oprogramowania rzadko – jeśli w ogóle – eliminuje każdy błąd. Niektórzy programiści mówią, że „każdy przetestowany program ma co najmniej jeszcze jeden błąd” (prawo Lubarskiego).
Oprogramowanie można testować za pomocątestów jednostkowych, testówregresji i innych metod, które są wykonywane ręcznie lub najczęściej automatycznie, ponieważ ilość kodu do przetestowania może być dość duża. Na przykładNASA ma wyjątkowo rygorystyczne procedury testowania oprogramowania dla wielu systemów operacyjnych i funkcji komunikacyjnych. Wiele operacji opartych na NASA wchodzi w interakcje i identyfikuje się nawzajem za pomocą programów sterujących. Dzięki temu wiele osób pracujących w NASA może sprawdzać i oceniać ogólnie systemy funkcjonalne. Programy zawierające oprogramowanie sterujące pozwalają na łatwiejsze współdziałanie inżynierii sprzętowej i operacji systemowych.
oprogramowanie użytkowe – mające bezpośredni kontakt z użytkownikiem i realizujące usługi dla tego użytkownika za pomocą aplikacji. Z technicznego punktu widzenia jest to oprogramowanie korzystające z usług m.in. systemu operacyjnego (oprogramowania systemowego). Pojęcie "oprogramowanie systemowe" jest znacznie szersze niż "system operacyjny". W jego skład wchodzi też oprogramowanieserwerowe oraz inne oprogramowania z którymi użytkownik nie ma bezpośredniej styczności. Przykłady oprogramowania użytkowego: