Разлика между версии на „Програмиране“

+2 ш; см. картинка;форматиране: 4x нов ред, 4x тире, 2x заглавие-стил, 2 интервала (ползвайки Advisor)
Етикети: Редакция чрез мобилно устройство Редакция чрез мобилно приложение Разширена мобилна редакция
(+2 ш; см. картинка;форматиране: 4x нов ред, 4x тире, 2x заглавие-стил, 2 интервала (ползвайки Advisor))
 
{{обработка|премахване на вътр. препратки към английската У}}
[[Файл:Java source2.svg|thumb|350px|right|Програма за кол центрове[[Колцентър|колцентрове]], писана на [[Java]]]]
 
'''Програмирането''' е [[компютърна наука]] и дял от [[математика]]та-[[информатика]]та, която се занимава с методите и средствата за създаване на [[Компютърна програма|компютърни програми]]. Компютърната програма представлява [[алгоритъм]], който може да бъде „разбран“ и изпълнен от [[компютър]]а. При програмирането се използват [[език за програмиране|езици за програмиране]], на които се записват изходните текстове на програмата.<ref>Желязко Желязков (и други колектив), Информатика, Учебници за ВУЗ</ref>
 
Процесът по създаването на програма включва писането, [[Тестване на софтуер|тестването]] и поддържането на нейния [[сорс код]] (изходен код). Програмнвият код, който се пише на [[език за програмиране]], може да бъде и модификация на съществуващ вече код или да бъде нов, с цел решаването на даден математически проблем или програмно изискване.<ref>Информатика, Учебници за ВУЗ, ИУ - – Варна, 2013</ref>
 
В сферата на [[софтуерното инженерство]], програмирането е част от процеса на [[разработка на софтуер]].
{{Основна|Софтуерен инженер}}
 
Софтуерният инженер (програмист) е математик / софтуерен инженер, който пише [[Компютърна програма|компютърни програми]]. РаботаРаботата на програмиста обикновено включва:
 
* [[Анализ на изискванията]]
 
== История на програмирането ==
[[Файл:HollerithMachine.CHM.jpg|мини|Табулаторът на Холерит от 1890]]
Най-старата машина за програмиране (това е машина, чието поведение може да се контролира от промените на програма) е програмният хуманоиден робот на [[Ал Джазари]] през 1206 г. Външният вид на робота на Ал Джазари е механизирана лодка с четирима автоматични музиканти, която се носи по езерото и забавлява гостите по време на кралските балове. Неговият механизъм включва програмируеми барабани с ключе, захванати на малка ръчка, които отмерват ритъма. Барабанистът е можел да изпълнява различни ритми в зависимост от положението на ключето.
 
Често за образец на ранното изкуство е считан [[Жакардов стан|жакардовият стан]], създаден през 1801 г. В тази машина се използвали картонени карти с дупки по тях, като дупките показват извивките на дрехата. Така в зависимост от картите, които му се поставят, станът можел да произвежда напълно различни дрехи. Такива карти е използвал и [[Чарлз Бабидж]] през 1830 г., за да управлява своята [[сметачна машина]]. Тук отворите се използват за контрол на машината.
 
[[Файл:Hollerith punched card.jpg|мини|[[Перфокарта]] на Холерит]]
Това нововъведение по-късно е подобрено от Херман Холерит, който прилага перфорацията по определена схема за въвеждане на [[данни]]. Холерит изобретява специална перфорираща машина за въвеждане на големи масиви от данни, наречена табулатор. Тя се основава на [[реле]]та и работи с [[перфокарта|перфокарти]], които получават неговото име. Освен тях изобретява и четец за тези карти. Първото приложение на машината е при обработката на резултатите от преброяване на населението в САЩ през 1890 г. когато резултатите са обработени много по-евтино от очакваното и преди определения срок (при предишното преброяване обработката отнела години)<ref>[http://www.census.gov/history/www/technology/010873.html U.S. Census Bureau: Tabulation and Processing]</ref>. Следват усъвършенствувания на машината и през 1906 г. моделът ''Type I Tabulator'' вече е снабден с комутационен панел и позволява бързо и автоматизирано да се изпълняват различни задачи в счетоводството и складовото стопанство (първата крачка към програмирането).
[[File:Ada lovelace.jpg|thumb|[[Ада Лъвлейс]] се счита за първата програмистка]]
 
През 1896 г. Холерит основава [[компания]]та ''Tabulating Machine Company'' (днес [[IBM]]). До края на 40-те години имало различни видове машини за програмиране с [[комутационен панел ({{lang|en|unit record equipment}})]], които да изпълняват четенето на картите. Ранните компютри също са били програмирани чрез комутационни панели.
[[Файл:IBM402plugboard.Shrigley.wireside.jpg|мини|Комутационен панел с проводници за сметачна машина IBM 402.]]
 
[[Архитектура на фон Нойман|Изобретението]] на [[Джон фон Нойман]] позволява програмите да бъдат запаметени в [[компютърна памет]]. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в [[бинарен]] вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени [[език за програмиране|езиците за програмиране]], които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 1954 г. е създаден [[FORTRAN]] – първият [[език за програмиране|език]] на високо ниво. Това позволило на програмистите да извършват изчисленията директно чрез задаване на нужната формула. [[Изходен код|Изходният текстов код]] на програмата се превежда до машинни инструкции чрез специална програма, наречена [[компилатор]]. След това са създадени още много езици за програмиране (някои от тях с комерсиална цел) – като например [[COBOL]]. Програмите обаче все още се въвеждат с перфокарти или [[перфолента]].
[[Файл:PunchCardDecks.agr.jpg|мини|ляво|Кутия с [[перфокарта|перфокарти]] за няколко различни програмни пакета от ранните години на програмирането]]
Към края на 60-те години устройствата за съхранение на данни и [[компютърен терминал|компютърните терминали]] се развиват достатъчно, за да стане възможно програмите да бъдат писани директно на [[клавиатура (хардуер)|клавиатурата]]. Създадени са [[текстов редактор|текстови редактори]], които позволяват на програмистите да въвеждат, редактират и обработват кода си много по-лесно, отколкото с перфокартите.
 
== Модерно програмиране ==
=== Изисквания за качество ===
 
Какъвто и да е пътят за разработване, финалната програма трябва да отговаря на някои основни свойства. Следните свойства са сред най-важните:
 
* [[Надеждност на софтуера|Надеждност]]: колко често резултатите от дадена програма са верни. Това зависи от концептуалната коректност на алгоритмите и минимизирането на програмните грешки, като грешки в управлението на ресурсите (напр. [[:en:Buffer_overflow|препълване на буфер]] и [[:en:Race_condition|условия на състезание]] ) и логически грешки (като грешки при деление на нула или [[:en:Off-by-one_error|грешка при едно]] )
* [[:en:Robustness_(computer_science)|Издръжливост]] : колко добре дадена програма предотвратява проблеми, дължащи се на грешки, а не на бъгове[[бъг]]ове. Това включва ситуации като неправилни, неподходящи или повредени данни, липса на необходимите ресурси като памет, услуги на операционната система и мрежови връзки, потребителска грешка и неочаквани прекъсвания на захранването.
* [[Ползваемост]] ( [[ергономичност]]) на програмата: лекотата, с която човек може да използва програмата по предназначение или в някои случаи дори за неочаквани цели. Такива проблеми могат да доведат до успех или да нарушат неговия успех, независимо от други проблеми. Това включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.
 
*[[:en:Software_portability|Преносимост]]: обсега от [[компютърен хардуер]] и платформи на [[Операционна система|операционната система]], на които изходният код на програмата може да бъде [[компилатор|компилиран]] / [[:en:Interpreter_(computing)|интерпретиран]] и стартиран.
*Поддръжка: лекотата, с която дадена програма може да бъде модифицирана от нейните настоящи или бъдещи разработчици, за да се направят подобрения или да се персонализират, коригират [[бъг|грешки]] и [[:en:Vulnerability_(computing)|дупки в сигурността]] или да се адаптира към нови среди. Добрите практики  по време на първоначалната разработка са от значение в това отношение. Това качество може да не е пряко очевидно за крайния потребител, но може значително да повлияе на съдбата на програмата в дългосрочен план
*[[:en:Algorithmic_efficiency|Ефективност]] / [[:en:Performance_engineering|производителност]] : Измерване на системните ресурси, които една програма консумира (време на процесора, място в паметта, бавни устройства като дискове, честотна лента на мрежата и до известна степен дори взаимодействие с потребителя): колкото по-малко, толкова по-добре. Това включва и внимателно управление на ресурсите, например почистване на [[:en:Temporary_file|временни файлове]] и елиминиране на [[:en:Memory_leak|течове в паметта]]. Това често се обсъжда в светлината на избрания език за програмиране. Въпреки че езикът със сигурност влияе върху производителността, дори и по-бавните езици, като [[:en:Python_(programming_language)|Python]], може да изпълняват програмите незабавно от човешка гледна точка. Скоростта, използването на ресурси и производителността са важни за програмите, които затрудняват системата, но ефективното използване на времето на програмиста също е важно и е свързано с разходите: повече хардуер може да бъде по-евтино.
===Четимост на изходния код===
 
=== Четимост на изходния код ===
В компютърното програмиране [[:en:Readability|четимостта се]] се отнася до лекотата, с която човешкият четец може да разбере целта, [[:en:Control_flow|контролния поток]] и работата на изходния код. Това засяга аспектите на качеството по-горе, включително преносимост, ползваемост и най-важното поддръжка.
 
Четимостта е важна, защото програмистите прекарват по-голямата част от времето си в четене, опитвайки се да разберат и модифицират съществуващ изходен код, вместо да пишат нов изходен код. Нечетливият код често води до грешки, неефективност и [[:en:Duplicate_code|дублиран код]]. Проучване установи, че няколко прости трансформации на четливост правят кода по-кратък и драстично намаляват времето за разбирането му.
 
=== Сложност на алгоритъма ===
Академичното поле и инженерната практика на компютърното програмиране са до голяма степен свързани с откриването и прилагането на най-ефективните алгоритми за даден клас проблеми. За тази цел алгоритмите се класифицират в ''поръчки,класове'', използвайки [[:en:Big_O_notation|Big O нотация]], която изразява използването на ресурси, като времевремето за изпълнение или консумация нанеобходимата памет, по отношение на размера на входа. Програмистите, които са -експерти в тази област, са запознати с разнообразието от добре установени алгоритми и тяхната съответна сложност и използват тези знания, за да изберат алгоритмиалгоритмите, които са най-подходящи за обстоятелствата.
 
== Езици за програмиране ==
{{основна|езициЕзици за програмиране}}
Различните езици за програмиране поддържат различни стилове на програмиране ([[парадигма на програмиране]]). Според стила основните сред тях са: [[Обектно-ориентирано програмиране|обектно-ориентирано]], [[Императивно програмиране|императивно]], [[Функционално програмиране|функционално]] и [[Декларативно програмиране|декларативно]] <ref>{{икона|en}} Nørmark, Kurt. ''[http://people.cs.aau.dk/~normark/prog3-03/html/notes/paradigms_themes-paradigm-overview-section.html Overview of the four main programming paradigms]''. Aalborg University, 9 май 2011. Линк ат 22 септември 2012.</ref>. Според друг източник обектно-ориентираното програмиране спада към императивния стил, а функционалното програмиране спада към декларативния:<ref>{{Цитат уеб|уеб_адрес=http://fmi.wikidot.com/fp1|заглавие=Принципи на Функционалното програмиране. Увод в Scheme|фамилно_име=|първо_име=|дата=|труд=|издател=|език=|достъп_дата=29.12.2014|цитат=}}</ref>
* Императивни
Според предназначението си езиците за програмиране биват с общо предназначение и специализирани. Популярни съвременни езици за програмиране с общо предназначение са [[Java]], [[C Sharp|C#]], [[Delphi|Object Pascal]], [[C (език за програмиране)|C]], [[C++]], [[PHP]], [[Perl]]. Специализирани езици за програмиране са например [[SQL]] (за заявки към системи за управление на бази от данни), [[JavaScript]] (за реализиране на динамично поведение в уеб сайтове [[от страна на клиента]]) и т.н.
 
Избирането на език за програмиране е свързано с много съображения като например фирмена политика, [[оперативна съвместимост|съвместимост]], наличност на [[Библиотека (програмиране)|библиотеки]] или лични предпочитания.
 
== Източници ==
 
== Литература ==
* Дейкстра Э., ''Дисциплина программирования'' – 1-е изд. – Москва, 1978. – 275 с.
 
* Дейкстра Э., ''Дисциплина программирования'' — 1-е изд. — Москва, 1978. — 275 с.
* Дональд Кнут., ''Искусство программирования'', В четырёх томах, Москва, 2001 − 2013
 
* [[Софтуер]]
* [[Софтуерни метрики]] (изследвания на програмите)
 
{{превод от|en|Computer programming|1056918256}}
 
{{Портал|Информатика}}