Всяка електронноизчислителна машина (компютри, телефони и т.н) функционира благодарение на софтуера. Всички компютърни програми се наричат софтуер. Има два вида: системен софтуер и приложен (потребителски). Софтуерът е неизменна част от всички компютри. Всичко което правите на вашия компютър е чрез използването на софтуер, независимо дали гледате филм през видео плеър, слушате музика, сърфирате в интернет, обработвате документи или играете игри и др., всичко това е софтуер. Софтуерът е противоположност на хардуера. Хардуера е физическия компонент на компютъра. Софтуерът се използва за управлението на хардуера. Те двете са пряко свързани. Ако едното го няма, то няма да има и компютри.
Софтуерът включва всички компютърни програми, без значение дали ние потребителите ги ползваме или компютърната система. Това включва изпълними файлове, библиотеки, скриптове и така нататък. Най-общо казано, софтуерът е комбинация от кодове, които са един вид инструкции. Когато една инструкция се задейства, тя казва на хардуера какво да прави. Софтуерът се съхранява в компютърната памет. Това е просто илюстрация, 3д модел или нещо подобно, което ни помага да работим с компютъра.
На най-ниското ниво, софтуера е комбинация от машинен език, който инструктира хардуера на вашия компютър. Най-вече става на въпрос за процесора. Машинния език включва бинарни стойности, процесорни инструкции и т.н. Те променят състоянието на компютъра по време на работа. Например една инструкция може да промени стойността на определена локация в твърдия диск на компютъра. Ефектът не е директно достъпен за нас. Процесорът обработва инструкцията и я изпраща до хард диска. Той върши нещата в реда, по който му се подават. Може да му се нареди да прескочи някоя стъпка.
Софтуерът, който ние използваме се написва на програмни езици от високо ниво. Те са по-лесни и по-ефективни за използване от хората. Техния език е по-близък до естествения от колкото до машинния. Езиците от високо ниво се компилират или имплементират до машинен език. Софтуер може да се напише на език от ниско ниво за асемблиране. По същество това е представяне на машинни език по начин, който наподобява азбука. Езиците за асемблиране се превръщат в обектен код посредством асемблери.