Програмирање

**Компјутерско програмирање** (често се користи за **програмирање**, **скриптирање **, или **кодирање**) е процес на дизајнирање, пишување, испробување, дебагирање и одржување на изворниот код на компјутерските програми. Овој код е напишана во еден или во повеќе програмски јазици (како што се Java, C + +, C #, Python итн.) Целта на програмирањето е да се создаде сет на инструкции дека компјутерите се користат  да извршуваат специфични операции или да ги извршуваат сакано однесување. Процесот на пишување код често бара експертизам  во многу различни теми, вклучително и познавање на апликацискиот домен, специјализирани алгоритми и формалната логика.
Во рамките на софтверското инженерство, програмирање (имплементација) се смета како една фаза во процесот на развивање.
Во тек е дебата за степенот  кој за пишување на програми е форма на уметност, занаетчиска дејност, или инженерска дисциплина. Дисциплина се разликува од многу други технички професии во кои програмерите, во принцип, не треба да бидат лиценцирани или да ги положат сите стандардизирани (или регулирани од надлежни) тестови за сертификација со цел да се нарекуваат себеси "програмери" или дури "софтверски инженери." Бидејќи дисциплината опфаќа многу области, кои може или не може да вклучуваат критични апликации, тоа е дискутабилно дали лиценцирање е потребно за професијата како целина. Во повеќето случаи, дисциплината е призната од страна на субјекти кои бараат програмери, а понекогаш и многу строги услови се дефинирани (пр. САД воздухопловната употреба на AdaCore и безбедносен сертификат). Сепак, претставувајќи се себеси како "професионален софтверски инженер" без дозвола од акредитирана институција е нелегална во многу делови на светот.

Друга дебата е степенот до кој програмскиот јазик се користи во пишувањето на компјутерски која влијае нафиналната програма. Оваа дебата е слична на онаа околу Сапир-Whorf хипотеза  во лингвистиката и когнитивните науки, кои постулираат дека посебно зборуван јазик дека природно го менува мислењето на неговите говорници. Различни јазични патенти даваат различни патенти на мисли. Оваа идеја претставува можност за претставување на светот совршено со јазикот, бидејќи признава дека механизмите на било кои услови на јазикот се мислите  на неговата заедница на говорници.

## Историја

Античките култури немаат концепт на сметачи надвор од едноставната аритметика. Единствениот  механички уред кој постои за бројчена пресметка на почетокот на човечката историја бил абакусот, измислен во Сумериа околу 2500 п.н.е.. Подоцна, механизмот Актикитера, измислен некаде околу 100 година во Стара Грција, беше првиот механички калкулатор кој користел брзини од различни големини и конфигурација за вршење на пресметки, кој го пронашла Метонов циклус уште се користи во месечевите календари, и што е во согласност за пресметување на датумите на олимпијадите. Курдиски средновековен научник Ал-Јазари изградена програмабилни автомати во 1206 година.

Еден систем вграден во овие уреди е употребата на клинови и камери поставени во дрвен тапан во одредени локации, кои секвенцијално ќе предизвика лост, претворен во ударен инструмент. Излезот на овој уред е мал тапанар кој свири различни ритми и миксови . Jacquard разбојот, која Џозеф Мари Жакард го развила во 1801 година, користејќи серија од картон картички со дупки во нив. Шемата на дупката претставува моделот дека разбојот мора да го следи во ткаење ткаенина. На разбојот би можел да произведе сосема различни ткаенини со користење на различни групи на карти. Чарлс Бабејџ усвоиl употребата на ударни картички околу 1830 да го контролира својот аналитички мотор. Првата компјутерска програма напишана за Аналитичка мотор била напишана од математичарката Ада Лавлејс и била за да пресмета низа на Бернули броеви. синтеза на бројчена пресметки, предодредена операција и излез, заедно со еден начин да се организираат и влезни инструкции на начин релативно лесен за луѓето да горазберат и произведат, доведува до модерен развој на компјутерското програмирање. Развој на компјутерско програмирање се забрзува преку индустриската револуција.
Во 1880-тите, Херман Холерит измислиле снимање на податоци на медиум кој потоа може да се чита од машина. Пред употреба на машински читлив медиуми, погоре, била листи на инструкции (не податоци) да се стартува програмирани машини како Жакард разбоите и механизирани музички инструменти. "По некои првични испитувања со хартииена лента, се поставиле на ударни картички ..."  За обработка на овие удирани со ударни картички, првиот познат како "Hollerith картички" тој го измислил keypunch, сортирач и табулатор единица рекорд машини.
Овие пронајдоци се темелат на податоци преработувачката индустрија. Во 1896 година го основал Сумирање Машинска компанијата (кој подоцна стана јадрото на IBM). Додавање на контролниот панел (plugboard) на неговиот 1906 Тип и табулатор дозволен тој да направи различни работни места, без да биде физички изградена. До крајот на 1940 година, имаше неколку единица рекорд калкулатори, како што се IBM 602 и IBM 604,на чиј контролни панели има наведена низа (листа) на работењето и на тој начин се програмабилни машини.
Пронаоѓањето на фон Нојман архитектура дозволува компјутерските програми да бидат зачувани во компјутерската меморија. Раните програми мораше да биде внимателно направена со користење на инструкции (основно работење) на одредена машина, често во бинарна нотација. Секој модел на компјутер, најверојатно, ќе користат различни инструкции (машински јазик) да ја изврши истата задача. Подоцна, собранието јазици се развиени кои му дозволуваат на програмерот наведените инструкции во текст формат, влегуваат кратенки за секоја операција наместо кодот.
Во 1954 година на бројот и специфицирање адреси во симболична форма (на пример, да додадете X, ВКУПНО). Внесување на Програмата во асемблерски јазик е обично полесно, побрзо, и помалку склон кон човечка грешка од користење на машински јазик, но бидејќи е асемблерскиот јазик е малку повеќе од една поинаква  нотација за машина јазик, било кои две машини со различни инструкции исто така имаат различни собрани јазици.
 Во 1954 година, FORTRAN бил измислен, тоа било првиот високо ниво на програмски јазик да има функционална имплементација, наспроти само дизајн на хартија 
(Високо ниво на  јазик во многу општи термини, било секој програмски јазик кој им овозможува на програмерот да пишуваат програми во смисла дека се повеќе апстрактно од асемблерски јазикчни инструкции, односно на ниво на "повисоко" од она на асемблер јазикот.) Тоа е дозволено на програмерите да наведете пресметки со внесување на формулата директно (на пример, Y = X * 2 + 5 * x + 9). Програмскиот текст, или извор, се претвора во машински инструкција со користење на посебна програма наречена компајлер, што значи на програмата FORTRAN во машински јазик. Всушност, името FORTRAN  значи "Формула  за превод". Многу други јазици се развиени, вклучувајќи и некои за комерцијално програмирање, како што COBOL. Програми уште најчесто се прават со  влезно користење на ударни  картички или лента од хартија. (Види компјутерско програмирање во перфокарта ера). До крајот на 1960-тите години, складирање на податоци во уред и компјутерски терминали станале евтини доволно така што програмита може да биде создадена со пишување директно во компјутери. Текст едитори се развиени така што е дозволено промени и исправки да се направат многу полесно отколку со картички. (Обично грешка во картичка значеше дека на картичката мораше да биде отфрлена и да биде заменета со друга картичка.)
Како што времето напредуваше, компјутери направиле гигантски  скокови во областа на моќ на обработка. Ова доведе до нови програмски јазици кои се повеќе апстрахирани од основните хардверски. Популарни програмски јазици на модерната ера вклучуваат C + +,C #, Objective-C, Visual Basic, SQL, HTML со PHP, ActionScript, perl, Java, JavaScript, Ruby, Python, Хаскел и многу други. Иако овие јазици на високо ниво обично прават  поголеми трошоци, зголемување на брзината на современите компјутери ја направи употребата на овие јазици многу повеќе попрактична  отколку во минатото. Овие се повеќе апстрахирани јазици обично се полесни  да се научат и да се овозможи на програмерот да развиваат апликации многу поефикасно и со помалку код. Сепак, на јазиците на високо ниво  сè уште се непрактични за неколку програми, како што се оние каде ниско ниво хардвер контрола е потребна или каде што максималната брзина на обработка е од витално значење. Компјутерско програмирање стана популарна кариера во развиениот свет, особено во САД, Европа, Скандинавија и Јапонија. Поради високата цена на трудот на програмерите во овие земји, некои форми на програмирање се повеќе предмет на надворешно изведување (увезена програмска опрема и услуги од  други земји, обично по пониска плата), што ја прави програмирачките кариерни  одлуки во развиените земји повеќе комплицирани, додека зголемување на економски можности за програмерите во помалку развиените области, особено Кина и Индија.
## Модерно програмирање
### Барања за квалитет
Без оглед на пристап кон развој на софтвер може да биде, конечната програма мора да ги задоволуваат некои основни својства. Следниве својства се меѓу најрелевантните:
***Сигурност**: колку често резултатите на програмата се точни. Ова зависи од концептуална исправноста на алгоритмите, и минимизирање на програмерските грешки, како што се грешки во управување со ресурси (на пример, buffer overflows и race conditions) и логика грешки (како што се поделба од нула или off-by-one errors).
***Робусноста **: колку добро програмата предвидува проблеми не се должи на програмерската грешка. Ова ги вклучува ситуации како што се неточни, несоодветна или корумпирани податоци, недостапноста на потребните ресурси како меморија, оперативен систем и мрежа на врски, и кориснички грешка.
***Употребливост**: на ергономијата на програмата: леснотијата со која една личност може да ја користат програмата за наменетата цел, или во некои случаи дури и непредвиден цели. Ваквите прашања можат да направат пауза или успехот дури и без оглед на други прашања. Ова вклучува широк спектар на текстуални, графички, а понекогаш и хардвер елементи кои подобрување на јасноста, , кохезијата и комплетноста на корисничкиот интерфејс на програмата.
***Преносливост**: опсег на компјутерски хардвер и оперативен систем ,платформи на кои изворниот код на програмата може да биде компајлиран/ толкуван и да ја стартувате. Ова зависи од разликите во програмираните објекти што се предвидени од страна на различни платформи, вклучувајќи хардвер и оперативен систем  на ресурси, се очекува однесувањето на хардверот и оперативниот систем и за достапноста на платформа специфични компајлери (а понекогаш и библиотеки) за јазикот на изворниот код.
***Одржливоста **: леснотијата со која програма може да биде изменета од страна на нејзините сегашни или идни програмери, со цел да се направат подобрувања или персонализации, фикс грешки и безбедносни дупки, или да ги адаптирате кон новите средини. Добри практики за време на првичниот развој да ја направи разликата во овој поглед. Овој квалитет не може да биде директно видливи за крајниот корисник, но тоа може значително да влијае на судбината на програма во текот на подолг рок.
***Ефикасноста / перформанси**: износот на системските ресурси кои програма ги троши (време за обработувачот, мемориски простор, бавени уреди како што се дискови, мрежниот пропусниот опсег и до одреден степен до корисничката интеракција): не помалку, толку подобро. Ова исто така вклучува правилно отстранување на некои ресурси, како што се чистење на привремени податотеки и недостаток на меморија протекување.
### Читливост на изворниот код
Во компјутерско програмирање, читливост се однесува на леснотијата со која човек (читателот)  може да го сфати целта, контрола на проток, и работењето на изворниот код. Тоа влијае на аспекти на квалитетот погоре, вклучувајќи преносливост, употребливоста и што е најважно одржливоста.
Читливост е важна затоа што програмерите поминуваат поголемиот дел од своето време за читање, се обидува да се разбере и изменување на постојните изворниот код, отколку пишување на нови изворниот код. Нечитливиот код често води до грешки, неефикасности, и дупликат код. Една студија  откри дека неколку едноставни читливи  трансформации направени на код пократко и драстично го намали времето да го разбере.
По доследниот програмски стил често им помага читливоста. Сепак, читливост е повеќе од само стилна програмирање . Многу фактори, кои имаат малку или никакви врски со способноста на компјутерот ефикасно да ги собере и изврши го кодот, да придонесе за читливост  Некои од овие фактори вклучуваат:
*Различни вовлекувачки стилови (празни места)
*коментари
*распаѓање
*Обраќањата за објекти (како што се променливи, класи, процедури, итн)
Различни визуелни програмски јазици, исто така се развиени со намера да го  реши проблеми со читливост со донесување на нетрадиционални пристапи кон структурата и дисплејот на кодот.
### Алгоритамскa комплексност
Академската област и инженерската практика на компјутерско програмирање и двете  во голема мера се занимава со откривање и спроведување на најефикасен алгоритми за дадена класа на проблем. За таа цел, алгоритми се класифицирани во нарачки со користење на т.н. Биг О нотација, кое ја изразува употреба на ресурси, како што се времето за исполнување или меморија на потрошувачка, во однос на големината на влезот. Експерт на програмерите се запознаени со различни етаблирани алгоритми и нивнита комплексности ви и користат  со ова знаење да изберете алгоритми кои најдобро одговараат на околностите
### Методологии
Првиот чекор во повеќето од формалните развоји на софтвер процеси е анализа на барањата, проследено со испробување за да утврдите вредност на моделирањето, имплементација, како и неуспешна  елиминација (за дебагирање). Постојат многу различни пристапи за секоја од овие задачи. Еден пристап популарen за барања анализа е користење на случај анализа. Денес многу програмери употреба форми на Агилниот развој на софтвер, каде што различните фази на формални развој на софтвер се повеќе интегрирани заедно во кратки циклуси кои траат неколку недели, наместо години. Постојат многу пристапи кон процесот на развивање.
Популарни техники за моделирање вклучуваат Објектно-ориентирана анализа и дизајн (OOAD) и модел-управувано архитектура (MDA). На Unified Modeling Language (UML) е нотација користи и за OOAD и MDA.
Слична техника се користи за базата на податоци за дизајн е ентитет Брачен Моделирање (ЕР моделирање).
Имплементациски техники вклучуваат императив јазици (објектно-ориентиран или процедурални), функционални јазици и логички јазици.
### Мерење на употребата на јазикот
Многу е тешко да се утврди кои се најпопуларните јазик од модерните програмски јазици. Некои јазици се многу популарни за одредени видови на апликации (на пример, COBOL е сè уште силен во корпоративни центри за податоци , FORTRAN во областа на инженерските апликации, Скриптирање на јазици во веб развивање, и C вградени апликации), додека некои јазици редовно се користат да се напише многу различни видови на апликации. Исто така, многу апликации се користи за мешавина на неколку јазици во нивната изградба и употреба. Нови јазици обично се дизајнирани околу синтаксата на претходниот јазик со новата функционалност (на пример C + + додава објектно-orientedness на C, Java и додава управување со меморијата и bytecode на C + +).
Методите за мерење на популарноста на програмските јазици вклучуваат: пребројување на бројот на огласи за вработување во кои се споменува јазикот, [16] бројот на продадени книги и  посетата на курсеви по тој јазик (ова јапреценува важноста на поновите јазици), и проценки на бројот на постојните линии на код напишан на јазикот (ова го проценува бројот на корисниците на деловни јазици како COBOL).

### Дебагирање

Дебагирањето  од 1947 година, кој е во потеклото на популарната (но неточна) етимологијата за заеднички термин за софтверски дефект.
Дебагирање, е многу важна задача во процесот на развивање, бидејќи дефекти во програмата може да имаат значителни последици за своите корисници. Некои јазици се повеќе склони кон некои видови на грешки, бидејќи нивната спецификација не бара компајлери да се проверат како во другите јазици. Употреба на статичка кодна анализа може да помогне во откривање на некои можни проблеми.
Дебагирање често е направено со идеите како Eclipse, KDevelop, NetBeans, , и Visual Studio. Самостојни дебагери како gdb исто така се користат, и овие често обезбедуваат помалку од визуелното опкружување, обично со користење на командната линија.

## Програмски јазици

Главни статии: Програмски јазик и Список на програмски јазици
Различни јазици за програмирање поддржуваат  различни стилови на програмирање (наречен парадигми на програмирање). Изборот на јазикот кој се користи е предмет на многу фактори, како што се политиката на компанијата, соодветноста на задача, достапност на јазикот, или изборот на поединецот. Идеално, програмски јазик кој најдобро ќе одговара за задачата која ќе е зададена. Размени од овој идеал вклучува изнаоѓање доволно програмери кои знаат да работат на јазикот со что да се  изгради тим, достапноста на компајлери за тој јазик, како и ефикасноста во кој програми ќе биде напишан кои  формираат приближен спектар од "ниско ниво" до "високо ниво", "ниско ниво" јазици кои се обично повеќе машински-ориентирана и побрзо да се изврши, додека "високо ниво" јазици се повеќе апстрактни и полесно да се користи, но да се извршат помалку брзо. Тоа е обично полесно да се во код на"високо ниво" јазици, отколку во "ниско ниво".

Ален Дауни, во својата книга ‘’Како да мислите како компјутерски научник’’, пишува:
Деталите изгледаат различно во различни јазици, но неколку основни инструкции се појавуваат во речиси секој јазик:
***внесување **: Соберете податоци од тастатура, податотека, или некој друг уред.
***излез**: Дисплеј на податоци на екранот или испрати податоци во податотека или друг уред.
***аритметички**: Изведување на основни аритметички операции како собирање и множење.
***условно извршување**: Проверка за одредени услови и да извршување на  соодветни низи на извештаи.
***повторување**: Изведување на некоја акција постојано, обично со некои варијации.
Многу компјутерски јазици обезбедуваат  механизам за да повикате  функциите предвидени од страна на библиотеки, како во. .с.о. Под услов функциите во библиотеката да ги  следат соодветните кандидирани временски конвенции (на пример, метод на донесување аргументи), а потоа овие функции може да се запишат  во било кој друг јазик.
## Програмери

Компјутерски програмер  се оние кои пишуваат компјутерски софтвер. Своите работни места обично вклучуваат:

* Кодирање
* Компилација
* Дебагирање
* Документација
* Интеграција
* Поддршка
* Барања за анализа
* Софтверска архитектура
* Испробувањето на програмска опремаот
* Спецификација

## Наводи

## Додатни врски

* 
*Programming Wikia
*How to Think Like a Computer Scientist - од Jeffrey Elkner, Allen B. Downey и Chris Meyers