Ծրագրային ապահովում

Համակարգչային ծրագրային ապահովում կամ պարզապես ծրագրային ապահովում, համակարգչի մաս, որն ի տարբերություն ֆիզիկական սարքակազմի՝ որից կառուցված է համակարգը, բաղկացած է տվյալներից կամ համակարգչային ցուցումներից։ Ինֆորմատիկայում և ծրագրային ապահովման ճարտարագիտությունում ծրագրային ապահովումը այն ամբողջ ինֆորմացիան է, որը մշակվում է համակարգչի, ծրագրերի և տվյալների կողմից։ Ծրագրային ապահովումը ներառում է այնպիսի համակարգչային ծրագրեր, գրադարաններ և տվյալներ, ինչպիսիք են ծրագրերի օգտագործման գրավոր ցուցումները կամ ինֆորմացիայի կրիչները։ Համակարգչային սարքակազմը և ծրագրային ապահովումը գործում են փոխկապակցված և իրատեսորեն չեն կարող օգտագործվել իրարից անկախ։
Կատարվող կոդն ամենացածր մակարդակում բաղկացած է մեքենայական լեզվի ցուցումներից, որոնք բնորոշ են առանձին պրոցեսորի՝ հիմնականում կենտրոնական մշակիչ հանգույցը։ Մեքենայական լեզուն բաղկացած է երկուական համակարգի թվերից կազմված խմբերից։ Դրանցով արտահայտվում են պրոցեսորի ցուցումները, որոնք անցնում են համակարգչի նախորդ վիճակից հաջորդին։ Օրինակ, հրահանգը կարող է փոխել համակարգչի որոշակի պահեստային դիրքում գտնվող արժեքը, ինչն անմիջականորեն չի երևում օգտվողին։ Հրահանգը կարող է նաև անուղղակիորեն պատճառ հանդիսանալ, որպեսզի համակարգչի էկրանին ինչ-որ բան հայտնվի։ Սա վիճակի փոփոխություն է, որը տեսանելի է օգտվողին։ Պրոցեսորը կատարում է հրահանգները տրված հաջորդականությամբ, բացառությամբ այն դեպքերի, երբ հրահանգվում է «թռիչք կատարել» մեկ այլ հրահանգի կամ ընդհատվում է (մինչև հիմա բազմամիջուկային պրոցեսորները դոմինանտ են, դրանցից յուրաքանչյուր միջուկը կարող է աշխատեցնել հրահանգները հերթականությամբ, հետո յուրաքանչյուր կիրառական ծրագրային ապահովում թերասությամբ գործարկվում է միայն մեկ միջուկում, սակայն որոշ ծրագրային ապահովումներ ստեղծված են այնպես, որ աշխատեն մի քանի միջուկներում)։
Ծրագրային ապահովման մեծամասնությունը գրված է բարձր մակարդակի ծրագրավորման լեզուներով, որոնց օգտագործումն ավելի հեշտ և արդյունավետ է ծրագրավորողների համար, քանի որ դրանք ավելի մոտ են բնական լեզուներին, քան մեքենայական լեզուները։ Բարձր մակարդակի ծրագրավորման լեզուները թարգմանվում են մեքենայական լեզվի՝ օգտագործելով կոմպիլյատոր կամ ինտերպրետատոր կամ էլ երկուսի համադրումը։ Ծրագրային ապահովումը կարող է գրված լինել նաև ցածր մակարդակի ասեմբլեր լեզվով, որը մեծապես համապատասխանում է համակարգչի մեքենայական լեզվի ցուցումներին և թարգմանվում է մեքենայական լեզվի՝ օգտագործելով ասեմբլեր։


== Պատմություն ==
Ծրագրային ապահովման համար ստեղծված ալգորիթմի առաջին մասը գրել է Ադա Լավլեյսը 19-րդ դարում։ Այն նախատեսված էր Անալիտիկ մեքենայի համար։ Սակայն չստեղծվեց ո՛չ Անալիտիկ մեքենան, ո՛չ էլ դրա համար նախատեսված ծրագրային ապահովումը։
Ծրագրային ապահովման մասին առաջին թեորիան առաջադրել է Ալան Թյուրինգը՝ իր 1935 թվականին գրված «Հաշվարկելի թվեր» աշխատությունում։
Սա, ի վերջո, տարավ երկու ակադեմիական ուղղությունների ստեղծմանը։ Դրանք են ինֆորմատիկան և ծրագրային ապահովման ճարտարագիտությունը, որոնք ուսումնասիրում են ծրագրային ապահովումը և դրա ստեղծումը։ Ինֆորմատիկան ավելի տեսական է (Թյուրինգի աշխատությունը դրա օրինակն է), մինչդեռ ծրագրային ապահովման ճարտարագիտությունը հիմնականում կենտրոնանում է գործնական խնդիրների վրա։
Սակայն, մինչև 1946 թվականը ծրագրային ապահովումը՝ որը հասկանում ենք այսօր (թվային համակարգիչների հիշողության մեջ պահվող ծրագրեր), դեռ գոյություն չուներ։ Առաջին էլեկտրոնային հաշվողական սարքերը փոխարինվեցին, որպեսզի «վերածրագրավորեն» դրանք։


== Տեսակներ ==
Ըստ էության, բոլոր համակարգչային միջավայրերը և ծրագրային ապահովումը կարող են խմբավորվել մի քանի լայն կատեգորիաներում։


=== Նպատակ կամ օգտագործման բնագավառ ===
Կախված նպատակից՝ համակարգչային ծրագրային ապահովումը բաժանվում է հետևյալ խմբերի.

Կիրառական ծրագրային ապահովում – ծրագրային ապահովում է, որն օգտագործում է համակարգիչը, որպեսզի ցուցադրի հատուկ ֆունկցիաներ կամ համակարգչային խաղեր։ Կան կիրառական ծրագրային ապահովման բազմաթիվ տեսակներ։ Պատճառն այն է, որ ժամանակակից համակարգիչը կարող է կատարել մեծ թվով առաջադրանքներ։
Համակարգային ծրագրային ապահովում – ծրագրային ապահովում է, որն ուղղակիորեն աշխատեցնում է համակարգչի սարքակազմը, որպեսզի օգտվողների և այլ ծրագրային ապահովումների համար տրամադրի բազային ֆունկցիոնալություն։ Նաև ապահովում է հարթակ՝ կիրառական ծրագրային ապահովում աշխատեցնելու համար ։ Համակարգային ծրագրային ապահովումը ներառում է.
Օպերացիոն համակարգեր – ծրագրային ապահովման կարևորագույն հավաքածու, որը կարգավորում է ռեսուրսները և ապահովում սովորական ծառայություններ՝ նրանց «վրա» աշխատող ծրագրային ապահովման համար։ Վերստուգիչ ծրագրերը, օպերացիոն համակարգի բեռնավորիչը, շելը և պատուհանային ինտերֆեյսը կազմում են օպերացիոն համակարգի միջուկը։ Գործնականում օպերացիոն համակարգը միացվում է լրացուցիչ ծրագրային ապահովմամբ (ներառյալ լրացուցիչ ծրագրային ապահովումը)։ Հետևաբար, օգտվողը հավանականորեն կարող է կատարել որևէ աշխատանք միայն մեկ օպերացիոն համակարգ ունեցող համակարգչով։
Դրայվերներ – աշխատեցնում կամ կառավարում են որոշակի տիպի սարք, որը միացված է համակարգչին։ Յուրաքանչյուր սարքի անհրաժեշտ է համապատասխան սարքի դրայվեր։ Քանի որ համակարգիչը սովորաբար ունի առնվազն մեկ ներմուծման և առնվազն մեկ արտածման սարք, համակարգչին սովորաբար պետք է մեկից ավելի դրայվերներ։
Օժանդակ ծրագրեր – համակարգչային ծրագրեր են, որոնք նախատեսված են համակարգիչը լավ վիճակում պահելու համար։
Վնասակար ծրագրեր (անգլ.՝ malware) – ծրագրային ապահովում է, որը մշակվել է համակարգիչներին վնասելու և դրանց աշխատանքը խաթարելու համար։ Վնասակար ծրագրային ապահովումը սերտորեն կապված է համակարգչային հանցագործությունների հետ, չնայած որոշ վնասակար ծրագրեր ստեղծվել են որպես գործնական կատակ։


=== Բնույթ կամ կիրառման ոլորտ ===
Դեսկթոփ հավելվածներ, ինչպիսիք են դիտարկիչները (վեբ բրաուզեր) և Microsoft Office փաթեթը, ինչպես նաև Սմարթֆոնների և  պլանշետների համար նախատեսված բջջային հավելվածները։ (Ծրագրային ապահովման արտադրությունում կա միտում որոշ չափով  միացնել դեսկթոփ հավելվածները բջջային հավելվածների հետ։ Վինդոուզ 8-ը և, ավելի ուշ Ubuntu Touch-ը, փորձում էին հավելվածի օգտվողական ինտերֆեյսի նույն ոճը թույլատրել համակարգիչների, նոթբուքների և բջջայինների համար։)
Ջավասկրիպտի սկրիպտները ծրագրային ապահովման կտորներ են, որոնք սովորաբար ներդրված են վեբէջերում։ Երբ վեբէջը բեռնվում է, դրանք աշխատում են հենց դիտարկչի ներսում՝ առանց դիտարկչի փլագինի օգտագործման։ Այն ծրագրային ապահովումը, որը գրված է այլ ծրագրավորման լեզուներով, նույնպես կարող է աշխատել դիտարկչի ներսում, եթե ծրագրային ապահովումը կամ թարգմանվում է Ջավասկրիպտի կամ էլ եթե ներբեռնված է դիտարկչի փլագին, որն աջակցում է տվյալ լեզվին։ Վերջինիս ամենատարածված օրինակը  ActionScript-ն է, որն աջակցվում է Adobe Flash փլագինի կողմից։
Սերվերային ծրագրային ապահովումը ներառում է.
Վեբ հավելվածներ, որոնք սովորաբար աշխատում են վեբ սերվերներում և դինամիկ կերպով արտածում գեներացված էջերը վեբ դիտարկիչներին՝ օգտագործելով, օրինակ, PHP, Ջավա, ASP.NET և նույնիսկ Ջավասկրիպտ, որն աշխատում է սերվերի վրա (Node.js)։  Սրանք սովորաբար ներառում են Ջավասկրիպտ, որն աշխատում է դիտարկչում, ինչի դեպքում սովորաբար մի մասն աշխատում է սերվերում, իսկ մյուս մասը բրաուզերում։
Փլագինները և ընդլայնումները կազմում են ծրագրային ապահովում, որն ընդլայնում կամ փոփոխում է այլ ծրագրային ապահովման ֆունկցիոնալությունը։
Ներառված ծրագրային ապահովումը որպես ներկառուցված ծրագրաշար (համակարգչային ծրագիր, որն ապահովում է ցածր մակարդակի վերահսկողություն որոշակի սարքակազմի համար) տեղակայված է ներկառուցված համակարգերում և սարքերում։ Դրանք միտված են մեկ կամ մի քանի կիրառությունների համար՝ օրինակ ավտոմեքենաների կամ հեռուստատեսության (որոշ ներկառուցված սարքեր, ինչպիսիք են անլար միկրոսխեմաները, կարող են «ինքնուրույն» լինել սովորական, ոչ ներկառուցված համակարգի մաս՝ օրինակ անհատական համակարգչի կամ Սմարթֆոնի) ։ Ներկառուցված համակարգի կոնտեքստում երբեմն չկա ակնհայտ տարբերություն համակարգային ծրագրային ապահովման և կիրառական ծրագրային ապահովման միջև։ Այնուամենայնիվ, որոշ ներկառուցված համակարգեր աշխատեցնում են ներառված օպերացիոն համակարգեր, և այս համակարգերը պահպանում են այդ տարբերությունը։
Միկրոկոդը ներդրված ծրագրային ապահովման հատուկ, համեմատաբար չճանաչված տեսակ է, որն «ասում է» պրոցեսորին ինչպես կատարել մեքենայական կոդ, հետևաբար, սա ավելի ցածր մակարդակ է, քան մեքենայական կոդը։ Այն սովորաբար պատկանում է պրոցեսոր արտադրողին, և ցանկացած ուղղիչ միկրոկոդ ծրագրային ապահովման թարմացումները տրամադրվում են նրանց կողմից (ինչը շատ ավելի էժան է, քան փոխարինվող պրոցեսորի սարքակազմի առաքումը)։ Այսպիսով, սովորական ծրագրավորողը երբևէ կարիք չի ունենում գործ ունենալ սրա հետ։


=== Ծրագրավորման գործիքներ ===
Ծրագրավորման գործիքները ևս համարվում են ծրագրային ապահովում՝ ծրագրերի կամ հավելվածների տեսքով։ Ծրագրային ապահովման մշակողները (հայտնի որպես ծրագրավորողներ, կոդավորողներ, հաքերներ կամ ծրագրային ապահովման ճարտարագետներ) օգտագործում են դրանք, որպեսզի ստեղծեն, հայտնաբերեն և վերացնեն համակարգչային ծրագրի վրիպակները, սպասարկեն համակարգիչները (բարելավեն կամ ուղղեն առաջացած խնդիրները) կամ այլ կերպ ասած ապահովեն ծրագրային ապահովման տեխնիկական աջակցություն։
Ծրագրային ապահովումը գրվում է մեկ կամ մի քանի ծրագրավորման լեզուներով։ Գոյություն ունեն բազմաթիվ ծրագրավորման լեզուներ, որոնցից յուրաքանչյուրն ունի առնվազն մեկ իրագործում և որոնցից յուրաքանչյուրը բաղկացած է սեփական ծրագրավորման գործիքների շարքից։ Այս գործիքները կարող են լինել համեմատաբար անկախ ծրագրեր, ինչպիսիք են կոմպիլյատորները, խմբագրիչները (անգլ.՝  debugger), ինտերպրետատորները (բարձր մակարդակի լեզուն մեքենայական կոդի փոխարկիչներ), կապակցիչները (անգլ.՝ Linker) և տեքստային խմբագրիչները։ Դրանք իրար հետ միավորվելով կարող են իրագործել առաջադրանքներ, կամ կարող են ձևավորել ինտեգրված մշակման միջավայր (անգլ.՝ integrated development environment), որը խմբավորում է շատ կամ բոլոր այսպիսի անկախ գործիքները։ Ինտեգրված մշակման միջավայրերը կարող են անել դա կամ համապատասխան առանձին գործիքները կանչելով կամ նրանց ֆունկցիոնալությունը նոր ձևով վերագործարկելով։ Ինտեգրված մշակման միջավայրը կարող է հեշտացնել որոշակի առաջադրանքների իրագործումը, օրինակ, որոնումը որոշակի պրոյեկտի ֆայլերում։ Շատ ծրագրավորման լեզուներ հնարավորություն են տալիս օգտագործել առանձին գործիքներ կամ ինտեգրված մշակման միջավայր։


== Թեմաներ ==


=== Կառուցվածք ===
Օգտատերերը հաճախ ծրագրավորողներից տարբեր են տեսնում որոշ բաներ։ Ժամանակակից ընդհանուր նպատակային համակարգիչներ օգտագործող մարդիկ սովորաբար տեսնում են տարբեր առաջադրանքներ կատարող ծրագրային ապահովման երեք շերտ՝ պլատֆորմ, հավելված և օգտվողի ծրագրային ապահովում (ի տարբերություն նշված համակարգիչների, գոյություն ունեն ներկառուցված համակարգեր, անալոգային հաշվողական մեքենաներ և գերհամակարգիչներ)։

Պլատֆորմային ծրագրային ապահովումՀամակարգչային պլատֆորմը, ներառում է ներկառուցված ծրագրաշարեր, դրայվերներ, օպերացիոն համակարգ և,  սովորաբար, գրաֆիկական ինտերֆեյս, որն ընդհանուր առմամբ թույլ է տալիս օգտվողին փոխազդել համակարգչի և նրա օժանդակ սարքերի հետ։ Պլատֆորմային ծրագրային ապահովումը հաճախ վաճառվում է համակարգչի հետ միասին։ Սովորաբար անհատական համակարգիչներում հնարավոր է կատարել փոփոխություն պլատֆորմային ծրագրերում։ 

Կիրառական ծրագրային ապահովումԿիրառական ծրագրային ապահովումը կամ հավելվածներն այն է, ինչի մասին մտածում է մարդկանց մեծամասնությունը «ծրագրային ապահովում» ասելիս։ Տիպիկ օրինակներ են օֆիսային ծրագրային միջոցների փաթեթը և վիդեո խաղերը։ Հաճախ հավելվածները ձեռք են բերվում համակարգչային սարքակազմից առանձին։ Երբեմն հավելվածները վաճառվում են համակարգչի հետ միասին, սակայն դա չի փոխում այն հանգամանքը, որ դրանք աշխատում են որպես անկախ հավելվածներ։ Հավելվածներն օպերացիոն համակարգից անկախ ծրագրեր են, սակայն հաճախ հարմարեցվում են որոշակի պլատֆորմների համար։ Ծատ օգտվողներ կարծում են, որ կոմպիլյատորները, տվյալների բազաները և այլ «համակարգային ծրագրային ապահովումները» հավելվածներ են։

Օգտվողի կողմից գրված ծրագրային ապահովումՈչ պրոֆեսիոնալ ծրագրավորողների կողմից գրված ծրագրերը համապատասխանեցնում են համակարգը օգտվողի որոշակի կարիքներին։ Օգտվողի կողմից գրված ծրագրային ապահովումը ներառում է աղյուսակների կաղապարներ և տեքստային պրոցեսորի կաղապարներ։ Էլեկտրոնային փոստի ֆիլտրերը ևս համարվում են  օգտվողի կողմից գրված ծրագրային ապահովում։ Օգտվողները ստեղծում են այս ծրագրերը՝ հաճախ անտեսելով դրանց կարևորությունը։ Կախված նրանից, թե որքանով է իրավասու օգտվողի կողմից գրված ծրագրային ապահովման ներառումը լռելյայն ծրագրային փաթեթներում, շատ օգտվողներ չեն կարող տեղյակ լինել օրիգինալ փաթեթների միջև տարբերության մասին և ինչն է ավելացվել համահեղինակների կողմից։


=== Իրագործում ===
Համակարգչային ծրագրային ապահովումը պետք է «բեռնվի» համակարգչի պահեստ (օրինակ կոշտ սկավառակ կամ հիշողություն)։ Բեռնելուց հետո համակարգիչը կարող է իրագործել ծրագիրը։ Սա ներառում է համակարգային ծրագրային ապահովման միջոցով հրահանգների փոխանցումը կիրառական ծրագրային ապահովումից դեպի սարքակազմ, ինչն ի վերջո ստանում է հրահանգները որպես մեքենայական կոդ։ Յուրաքանչյուր հրահանգ պատճառ է հանդիսանում, որ համակարգիչը կատարի գործողություն՝ տեղափոխի տվյալներ, կատարի հաշվարկումներ կամ փոփոխի հրահանգների կատարման հերթականությունը։
Տվյալների փոփոխությունը սովորաբար կատարվում է հիշողության մի տեղից դեպի մյուսը։ Երբեմն այն ներառում է տվյալների փոխանցում հիշողության և ռեգիստորների միջև, ինչը պրոցեսորին հնարավորություն է տալիս արագ մուտք գործել տվյալներ։ Տվյալների տեղափոխումը՝ հատկապես մեծ քանակությամբ, կարող է թանկ արժենալ։ Սրանից խուսափելու համար երբեմն օգտագործվում են տվյալների ցուցիչներ։ Հաշվարկները ներառում են պարզ գործողություններ, օրինակ՝ փոփոխական տվյալների տարրի արժեքի ավելացում։ Ավելի բարդ հաշվարկները կարող են ներառել շատ գործողություններ և տվյալների տարրեր միասին։


=== Որակ և հուսալիություն ===
Ծրագրային ապահովման որակը շատ կարևոր է՝ հատկապես առևտրային և համակարգային ծրագրային ապահովումների համար, ինչպիսիք են Microsoft Office-ը, Մայքրոսոֆթ Վինդոուզը և Լինուքսը։ Եթե ծրագրային ապահովումը պարունակում է վրիպակներ, այն կարող է ջնջել մարդու աշխատանքը, խափանել համակարգիչը և կատարել այլ անսպասելի գործողություններ։ Թերություններն ու սխալները կոչվում են bug։ Դրանք հաճախ հայտնաբերվում են ալֆա և բետա թեստավորման ընթացքում։ Հաճախ ծրագրերը դառնում են այսպես կոչված «ծրագրային ապահովման հնացման» զոհ։ Այն առաջանում է չնկատված սխալների պատճառով և հանգեցնում է արտադրողականության աստիճանաբար նվազմանը։
Շատ բագեր հայտնաբերվում և հեռացվում են թեստավորման ընթացքում։ Այնուամենայնիվ, ծրագրային ապահովման թեստավորումը հազվադեպ կարող է հայտնաբերել բոլոր սխալները։ Որոշ ծրագրավորողներ ասում են, որ «յուրաքանչյուր ծրագիր ունի առնվազն մեկ այլ սխալ» (Լուբարսկիի օրենք)։ Ծրագրային ապահովման մշակման կասկադի մոդելը կիրառելիս սովորաբար աշխատում են առանձին թեստավորման թիմեր։ Սակայն ավելի նոր մոտեցումներ կիրառելիս, որոնք հավաքականորեն կոչվում են ճկուն ծրագրային ապահովման մշակում, ծրագրավորողները հաճախ կատարում են իրենց թեստավորման ամբողջ մասը, ապա ցույց տալիս ծրագրային ապահովումը օգտվողներին/պատվիրատուներին՝ կանոնավոր կերպով կարծիք ստանալու համար։ Թեստավորումը կատարվում է մոդուլային (միավոր) թեստավորման, հետահայաց թեստավորման (երբ ստուգվում է արդյո՞ք նախկինում թեստավորված ծրագրային ապահովումը գործում է նույն կերպ՝ փոփոխվելուց կամ այլ ծրագրային ապահովման հետ փոխկապակցվելուց հետո) և այլ մեթոդներով, որոնք կատարվում են ձեռքով, կամ շատ հաճախ ավտոմատ կերպով, քանի որ այն կոդը, որը պետք է թեստավորվի կարող է լինել բավականին երկար։ Օրինակ, ՆԱՍԱ-ն ունի չափազանց խիստ ծրագրային ապահովման փորձարկում՝ շատ օպերացիոն համակարգերի և հաղորդակցման ֆունկցիաների համար։ ՆԱՍԱ-յում օգտագործվող շատ գործողություններ միմյանց հետ փոխազդում և կապակցվում են command ծրագրերի միջոցով։ ՆԱՍԱ-յում աշխատող շատ մարդկանց սա թույլ է տալիս ստուգել և գնահատել ընդհանուր ֆունկցիոնալ համակարգերը։ Այն ծրագրերը, որոնք պարունակում են command ծրագրային ապահովում, թույլ են տալիս սարքակազմին և համակարգային գործողություններին միասին աշխատել շատ ավելի հեշտորեն։


=== Լիցենզիա ===
Ծրագրային ապահովման լիցենզիան իրավունք է տալիս օգտվողին օգտագործել այն արտոնագրված միջավայրում, իսկ ծրագրային ապահովման ազատ ծրագրային ապահովման արտոնագրերի դեպքում նաև երաշխավորում է այլ իրավունքներ՝ ինչպես օրինակ պատճեններ ստեղծելու իրավունքը։
Սեփականություն կազմող ծրագրային ապահովումը բաժանվում է երկու տիպի.

Անվճար ծրագրային ապահովում (անգլ.՝ Freeware), որը ներառում է անվճար փորձարկում ունեցող ծրագրային ապահովում կամ Freemium (գնային մարտավարություն, երբ ծրագիրն անվճար է, սակայն լրացուցիչ գործողությունների կամ ծառայությունների համար գանձվում է գումար) ծրագրային ապահովում։ Ինչպես նշում է անունը, freeware-ն օգտագործվում է անվճար, սակայն անվճար փորձարկում ունեցող կամ freemium ծրագրային ապահովման դեպքում սա տեղի ունի միայն սահմանափակ ժամանակահատվածի կամ սահմանափակ ֆունկցիոնալության պարագայում։
Ծրագրային ապահովում, որը հասանելի է վճարի դիմաց։ Այն հաճախ սխալ կերպով կոչում են առևտրային ծրագրային ապահովում, որն օրինական կերպով կարող է օգտագործվել միայն արտոնագիր ձեռք բերելու դեպքում։Մյուս կողմից, բաց կոդով ծրագրային ապահովումը տրվում է անվճար արտոնագրով՝ ստացողին երաշխավորելով այն փոփոխելու և վերաբաշխելու իրավունքները։


=== Արտոնագրեր ===
Ծրագրային ապահովման արտոնագրերը, ինչպես և արտոնագրերի այլ տեսակները, տեսականորեն պետք է ստեղծողին տան բացառիկ, սահմանափակ ժամանակահատվածով լիցենզիա՝ գաղափարի մանրամասն նկարագրության համար (օրինակ՝ ալգորիթմի)՝ թե ինչպես աշխատեցնել ծրագիրը կամ դրա որևէ բաղկացուցիչ մասը։ Օգտվողի պահանջները և այն օգտակար գաղափարները, որ ծրագրային ապահովումը կարող է կատարել, չպետք է լինեն արտոնագրելի, և կոնկրետ իմպլեմենտացիաները նույնպես չպետք է լինեն արտոնագրելի, քանի որ վերջիններս սովորաբար ավտոմատ կերպով ստանում են հեղինակային իրավունք։ Այսպիսով, ծրագրային ապահովման արտոնագիրը պետք է ծածկի պահանջների և կոնկրետ իմպլեմենտացիայի միջանկյալ մասը։ Միևնույն ժամանակ, ամերիկյան հեղինակային իրավունքի մասին օրենքը կիրառվում է ծրագրային ապահովման կոդը գրելու տարբեր ասպեկտներում։
Ծրագրային ապահովման արտոնագրերը հակասական են ծրագրերի արտադրությունում, քանի որ շատ մարդիկ տարբեր տեսակետներ ունեն դրանց վերաբերյալ։ Հակասության պատճառներից մեկն այն է, որ սկզբնական գաղափարների և արտոնագրի միջև վերոնշյալ խնդիրը գործնականում չի լուծվում արտոնագրային իրավաբանների կողմից։ Օրինակ, ասպեկտ կողմնորոշված ծրագրավորման (AOP) արտոնագիրը պահանջում է իրավունքներ ցանկացած ծրագրավորման գործիքի նկատմամբ, որն այս կամ այն ձևով իրականացնում է AOP—ի գաղափարը։ Հակասության մեկ այլ պատճառ է նորարարությունների վրա ազդեցությունը։ Շատ նշանավոր փորձագետներ և ընկերություններ վիճում են այն հարցի շուրջ, որ ծրագրային ապահովումն այնքան արագ զարգացող ոլորտ է, որ ծրագրային ապահովման արտոնագրերը պարզապես ստեղծում են հսկայական քանակով լրացուցիչ դատական ծախսեր և ռիսկեր ու, իրականում, կասեցնում են նորարարությունները։ Միացյալ Նահանգներից դուրս ծավալվող ծրագրային ապահովման արտոնագրերի մասին բանավեճերի դեպքում, մեծ ամերիկյան կորպորացիաները և արտոնագրային իրավաբանները հավանական է, որ լինեն հիմնական շահառուներն, ովքեր թույլ են տալիս ծրագրային ապահովման արտոնագրերը։


== Դիզայն և իրականացում ==
Ծրագրային ապահովման դիզայնն ու իրականացումը տարբերվում են՝ կախված դրա բարդությունից։ Օրինակ, Microsoft Office Word-ի դիզայնն ու ստեղծելը շատ ավելի երկար տևեց, քան Microsoft Notepad-ի ստեղծումը, քանի որ վերջինս ունի շատ ավելի պարզ ֆունկցիոնալություն։
Ծրագրային ապահովումը սովորաբար ձևավորվում և ստեղծվում (կոդավորվում/գրվում/ծրագրավորվում) է ինտեգրված մշակման միջավայրերում, ինչպիսիք են  Eclipse-ը, IntelliJ-ը և Microsoft Visual Studio-ն։ Սրանք կարող են պարզեցնել գործընթացը և հարկ եղած դեպքում կոմպիլացնել ծրագրային ապահովումը։ Ծրագրային ապահովումը սովորաբար ստեղծվում է արդեն իսկ գոյություն ունեցող ծրագրային ապահովման և դրա ապահոված հավելվածի ծրագրային ինտերֆեյսի հիման վրա։ Հավելվածի ծրագրային ինտերֆեյսի (անգլ.՝ API) օրինակներ են GTK+-ը, JavaBeans-ը և Swing-ը։ Գրադարանները (APIs) կարող են խմբավորվել ըստ նպատակի։ Օրինակ, Spring Framework-ն օգտագործվում է ձեռնարկատիրական հավելվածներ իրագործելու համար, Windows Forms library-ն օգտագործվում է գրաֆիկական օգտվողական ինտերֆեյսով հավելվածներ ստեղծելու համար, իսկ Windows Communication Foundation-ը կիրառվում է վեբ ծառայություններ նախագծելու համար։ Երբ ծրագիրը նախագծվում է, այն հիմնվում է API-ի վրա։ Օրինակ, եթե օգտվողը ստեղծում է Մայքրոսոֆթ Վինդոուզ դեսկթոփ հավելված, ապա կարող է օգտագործել .NET Windows Forms գրադարանը և կանչել դրա API-ները՝ օրինակ Form1.Close()-ը և Form1.Show()-ը, որպեսզի փակի կամ բացի հավելվածը և գրի այն լրացուցիչ գործողությունները, որը հավելվածը պետք է ունենա։ Առանց API-ների ծրագրավորողը ստիպված կլինի գրել դրանք ինքնուրույն։ Որոշ ընկերություններ՝ ինչպես օրինակ Օրաքլը և Մայքրոսոֆթը, ապահովում են իրենց սեփական API-ները։ Շատ հավելվածներ են գրվում՝ օգտագործելով նրանց ծրագրային ապահովման գրադարանները, որոնք ներառում են բազմաթիվ API-ներ։
Տվյալների կառուցվածքները, ինչպիսիք են հեշ աղյուսակները (հեշ քարտեզ), զանգվածները, երկուական ծառերը և արագ տեսակավորման ալգորիթմի նման ալգորիթմները, կարող են օգտակար լինել ծրագրային ապահովում ստեղծելու համար։
Համակարգչային ծրագրային ապահովումն ունի հատուկ տնտեսական հատկանիշներ, որոնք առանձնացնում են դրա դիզայնը, ստեղծումը և բաշխումը տնտեսական մյուս ապրանքներից ։
Ծրագրային ապահովում ստեղծողներին կոչում են «ծրագրավորող» կամ «ծրագրային ապահովման ճարտարագետ»։ Ավելի խոսակցական տերմիններով ծրագրավորողներին կոչում են «կոդավորողներ» կամ «հաքերներ»՝ չնայած վերջին բառի կիրառումը կարող է շփոթմունք առաջացնել, քանի որ այն ավելի հաճախ կիրառվում է բնորոշելու համար այն մարդկանց, ովքեր ոչ օրինական կերպով կոտրում են համակարգչային համակարգեր։


== Արդյունաբերություն և կազմակերպություններ ==
Աշխարհի բազմաթիվ ծրագրային ապահովման ընկերություններ և ծրագրավորողներ կազմում են ծրագրային ապահովման արդյունաբերությունը։ Ծրագրային ապահովումը կարող է լինել բավականին շահութաբեր։ Մայքրոսոֆթի համահիմնադիր Բիլ Գեյթսը համարվում է 2009 թվականի աշխարհի ամենահարուստ մարդը՝ շնորհիվ Մայքրոսոֆթի մի շարք բաժնետոմսերի սեփականության, որը պատասխանատու է Մայքրոսոֆթ Վինդոուզ և Microsoft Office ծրագրային ապահովման արտադրանքների համար։
Շահույթ չհետապնդող ծրագրային ապահովման կազմակերպություններից են Ազատ ծրագրային ապահովման հիմնադրամը, GNU նախագիծը և Mozilla հիմնադրամը։ Համացանցի կոնսորցիումի և IETF-ի նման ծրագրային ապահովման ստանդարտ կազմակերպությունները մշակել են առաջարկվող ծրագրային ստանդարտներ, ինչպիսիք են XML, HTTP և HTML, այնպես, որ ծրագրային ապահովումը կարող է փոխգործակցել այս չափանիշներով։
Այլ հայտնի ծրագրային ապահովման ընկերություններից են Օրաքլը, Novell-ը, SAP-ը, Symantec-ը, Adobe-ը, Sidetrade-ը և Corel-ը։ Իսկ փոքր ընկերությունները հաճախ նորարարություններ են տրամադրում։


== Տես նաև ==
Համակարգչային ծրագիր
Ծրագրային ապահովման արտոնագիր
Ազատ ծրագրային ապահովում


== Ծանոթագրություններ ==


== Արտաքին հղումներ ==
Ծրագրային ապահովում հոդվածը Curlie-ում (ըստ DMOZ-ի)