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

от Уикипедия, свободната енциклопедия
Изтрито е съдържание Добавено е съдържание
Етикети: Редакция чрез мобилно устройство Редакция чрез мобилно приложение Разширена мобилна редакция
+2 ш; см. картинка;форматиране: 4x нов ред, 4x тире, 2x заглавие-стил, 2 интервала (ползвайки Advisor)
Ред 1: Ред 1:
{{обработка|премахване на вътр. препратки към английската У}}
[[Файл:Java source2.svg|thumb|350px|right|Програма за кол центрове, писана на [[Java]]]]
[[Файл:Java source2.svg|thumb|350px|Програма за [[Колцентър|колцентрове]], писана на [[Java]]]]


'''Програмирането''' е [[компютърна наука]] и дял от [[математика]]та-[[информатика]]та, която се занимава с методите и средствата за създаване на [[Компютърна програма|компютърни програми]]. Компютърната програма представлява [[алгоритъм]], който може да бъде „разбран“ и изпълнен от [[компютър]]а. При програмирането се използват [[език за програмиране|езици за програмиране]], на които се записват изходните текстове на програмата.<ref>Желязко Желязков (и други колектив), Информатика, Учебници за ВУЗ</ref>
'''Програмирането''' е [[компютърна наука]] и дял от [[математика]]та-[[информатика]]та, която се занимава с методите и средствата за създаване на [[Компютърна програма|компютърни програми]]. Компютърната програма представлява [[алгоритъм]], който може да бъде „разбран“ и изпълнен от [[компютър]]а. При програмирането се използват [[език за програмиране|езици за програмиране]], на които се записват изходните текстове на програмата.<ref>Желязко Желязков (и други колектив), Информатика, Учебници за ВУЗ</ref>


Процесът по създаването на програма включва писането, [[Тестване на софтуер|тестването]] и поддържането на нейния [[сорс код]] (изходен код). Програмнвият код, който се пише на [[език за програмиране]], може да бъде и модификация на съществуващ вече код или да бъде нов, с цел решаването на даден математически проблем или програмно изискване.<ref>Информатика, Учебници за ВУЗ, ИУ - Варна, 2013</ref>
Процесът по създаването на програма включва писането, [[Тестване на софтуер|тестването]] и поддържането на нейния [[сорс код]] (изходен код). Програмнвият код, който се пише на [[език за програмиране]], може да бъде и модификация на съществуващ вече код или да бъде нов, с цел решаването на даден математически проблем или програмно изискване.<ref>Информатика, Учебници за ВУЗ, ИУ – Варна, 2013</ref>


В сферата на [[софтуерното инженерство]], програмирането е част от процеса на [[разработка на софтуер]].
В сферата на [[софтуерното инженерство]], програмирането е част от процеса на [[разработка на софтуер]].
Ред 12: Ред 13:
{{Основна|Софтуерен инженер}}
{{Основна|Софтуерен инженер}}


Софтуерният инженер (програмист) е математик / инженер, който пише [[Компютърна програма|компютърни програми]]. Работа на програмиста обикновено включва:
Софтуерният инженер (програмист) е математик / софтуерен инженер, който пише [[Компютърна програма|компютърни програми]]. Работата на програмиста обикновено включва:


* [[Анализ на изискванията]]
* [[Анализ на изискванията]]
Ред 25: Ред 26:


== История на програмирането ==
== История на програмирането ==
[[Файл:HollerithMachine.CHM.jpg|мини|Табулаторът на Холерит от 1890]]
Най-старата машина за програмиране (това е машина, чието поведение може да се контролира от промените на програма) е програмният хуманоиден робот на [[Ал Джазари]] през 1206 г. Външният вид на робота на Ал Джазари е механизирана лодка с четирима автоматични музиканти, която се носи по езерото и забавлява гостите по време на кралските балове. Неговият механизъм включва програмируеми барабани с ключе, захванати на малка ръчка, които отмерват ритъма. Барабанистът е можел да изпълнява различни ритми в зависимост от положението на ключето.
Най-старата машина за програмиране (това е машина, чието поведение може да се контролира от промените на програма) е програмният хуманоиден робот на [[Ал Джазари]] през 1206 г. Външният вид на робота на Ал Джазари е механизирана лодка с четирима автоматични музиканти, която се носи по езерото и забавлява гостите по време на кралските балове. Неговият механизъм включва програмируеми барабани с ключе, захванати на малка ръчка, които отмерват ритъма. Барабанистът е можел да изпълнява различни ритми в зависимост от положението на ключето.


Често за образец на ранното изкуство е считан [[Жакардов стан|жакардовият стан]], създаден през 1801 г. В тази машина се използвали картонени карти с дупки по тях, като дупките показват извивките на дрехата. Така в зависимост от картите, които му се поставят, станът можел да произвежда напълно различни дрехи. Такива карти е използвал и [[Чарлз Бабидж]] през 1830 г., за да управлява своята [[сметачна машина]]. Тук отворите се използват за контрол на машината.
Често за образец на ранното изкуство е считан [[Жакардов стан|жакардовият стан]], създаден през 1801 г. В тази машина се използвали картонени карти с дупки по тях, като дупките показват извивките на дрехата. Така в зависимост от картите, които му се поставят, станът можел да произвежда напълно различни дрехи. Такива карти е използвал и [[Чарлз Бабидж]] през 1830 г., за да управлява своята [[сметачна машина]]. Тук отворите се използват за контрол на машината.


[[Файл:Hollerith punched card.jpg|мини|Перфокарта на Холерит]]
[[Файл: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'' вече е снабден с комутационен панел и позволява бързо и автоматизирано да се изпълняват различни задачи в счетоводството и складовото стопанство (първата крачка към програмирането).
Това нововъведение по-късно е подобрено от Херман Холерит, който прилага перфорацията по определена схема за въвеждане на [[данни]]. Холерит изобретява специална перфорираща машина за въвеждане на големи масиви от данни, наречена табулатор. Тя се основава на [[реле]]та и работи с [[перфокарта|перфокарти]], които получават неговото име. Освен тях изобретява и четец за тези карти. Първото приложение на машината е при обработката на резултатите от преброяване на населението в САЩ през 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}}), които да изпълняват четенето на картите. Ранните компютри също са били програмирани чрез комутационни панели.
През 1896 г. Холерит основава [[компания]]та ''Tabulating Machine Company'' (днес [[IBM]]). До края на 40-те години имало различни видове машини за програмиране с [[комутационен панел]], които да изпълняват четенето на картите. Ранните компютри също са били програмирани чрез комутационни панели.
[[Файл:IBM402plugboard.Shrigley.wireside.jpg|мини|Комутационен панел с проводници за сметачна машина IBM 402.]]


[[Архитектура на фон Нойман|Изобретението]] на [[Джон фон Нойман]] позволява програмите да бъдат запаметени в [[компютърна памет]]. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в [[бинарен]] вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени [[език за програмиране|езиците за програмиране]], които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 1954 г. е създаден [[FORTRAN]] – първият [[език за програмиране|език]] на високо ниво. Това позволило на програмистите да извършват изчисленията директно чрез задаване на нужната формула. [[Изходен код|Изходният текстов код]] на програмата се превежда до машинни инструкции чрез специална програма, наречена [[компилатор]]. След това са създадени още много езици за програмиране (някои от тях с комерсиална цел) – като например [[COBOL]]. Програмите обаче все още се въвеждат с перфокарти или [[перфолента]].
[[Архитектура на фон Нойман|Изобретението]] на [[Джон фон Нойман]] позволява програмите да бъдат запаметени в [[компютърна памет]]. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в [[бинарен]] вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени [[език за програмиране|езиците за програмиране]], които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 1954 г. е създаден [[FORTRAN]] – първият [[език за програмиране|език]] на високо ниво. Това позволило на програмистите да извършват изчисленията директно чрез задаване на нужната формула. [[Изходен код|Изходният текстов код]] на програмата се превежда до машинни инструкции чрез специална програма, наречена [[компилатор]]. След това са създадени още много езици за програмиране (някои от тях с комерсиална цел) – като например [[COBOL]]. Програмите обаче все още се въвеждат с перфокарти или [[перфолента]].
[[Файл:PunchCardDecks.agr.jpg|мини|ляво|Кутия с [[перфокарта|перфокарти]] за няколко различни програмни пакета]]
[[Файл:PunchCardDecks.agr.jpg|мини|ляво|Кутия с [[перфокарта|перфокарти]] за няколко различни програмни пакета от ранните години на програмирането]]
Към края на 60-те години устройствата за съхранение на данни и [[компютърен терминал|компютърните терминали]] се развиват достатъчно, за да стане възможно програмите да бъдат писани директно на [[клавиатура (хардуер)|клавиатурата]]. Създадени са [[текстов редактор|текстови редактори]], които позволяват на програмистите да въвеждат, редактират и обработват кода си много по-лесно, отколкото с перфокартите.
Към края на 60-те години устройствата за съхранение на данни и [[компютърен терминал|компютърните терминали]] се развиват достатъчно, за да стане възможно програмите да бъдат писани директно на [[клавиатура (хардуер)|клавиатурата]]. Създадени са [[текстов редактор|текстови редактори]], които позволяват на програмистите да въвеждат, редактират и обработват кода си много по-лесно, отколкото с перфокартите.


== Модерно програмиране ==
== Модерно програмиране ==
===Изисквания за качество===
=== Изисквания за качество ===

Какъвто и да е пътят за разработване, финалната програма трябва да отговаря на някои основни свойства. Следните свойства са сред най-важните:
Какъвто и да е пътят за разработване, финалната програма трябва да отговаря на някои основни свойства. Следните свойства са сред най-важните:


* [[Надеждност на софтуера|Надеждност]]: колко често резултатите от дадена програма са верни. Това зависи от концептуалната коректност на алгоритмите и минимизирането на програмните грешки, като грешки в управлението на ресурсите (напр. [[:en:Buffer_overflow|препълване на буфер]] и [[:en:Race_condition|условия на състезание]] ) и логически грешки (като грешки при деление на нула или [[:en:Off-by-one_error|грешка при едно]] )
* [[Надеждност на софтуера|Надеждност]]: колко често резултатите от дадена програма са верни. Това зависи от концептуалната коректност на алгоритмите и минимизирането на програмните грешки, като грешки в управлението на ресурсите (напр. [[:en:Buffer_overflow|препълване на буфер]] и [[:en:Race_condition|условия на състезание]] ) и логически грешки (като грешки при деление на нула или [[:en:Off-by-one_error|грешка при едно]] )
* [[:en:Robustness_(computer_science)|Издръжливост]] : колко добре дадена програма предотвратява проблеми, дължащи се на грешки, а не на бъгове. Това включва ситуации като неправилни, неподходящи или повредени данни, липса на необходимите ресурси като памет, услуги на операционната система и мрежови връзки, потребителска грешка и неочаквани прекъсвания на захранването.
* [[:en:Robustness_(computer_science)|Издръжливост]] : колко добре дадена програма предотвратява проблеми, дължащи се на грешки, а не на [[бъг]]ове. Това включва ситуации като неправилни, неподходящи или повредени данни, липса на необходимите ресурси като памет, услуги на операционната система и мрежови връзки, потребителска грешка и неочаквани прекъсвания на захранването.
* [[Ползваемост]] ( [[ергономичност]]) на програмата: лекотата, с която човек може да използва програмата по предназначение или в някои случаи дори за неочаквани цели. Такива проблеми могат да доведат до успех или да нарушат неговия успех, независимо от други проблеми. Това включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.
* [[Ползваемост]] (ергономичност) на програмата: лекотата, с която човек може да използва програмата по предназначение или в някои случаи дори за неочаквани цели. Такива проблеми могат да доведат до успех или да нарушат неговия успех, независимо от други проблеми. Това включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.


*[[:en:Software_portability|Преносимост]]: обсега от [[компютърен хардуер]] и платформи на [[Операционна система|операционната система]], на които изходният код на програмата може да бъде [[компилатор|компилиран]] / [[:en:Interpreter_(computing)|интерпретиран]] и стартиран.
*[[:en:Software_portability|Преносимост]]: обсега от [[компютърен хардуер]] и платформи на [[Операционна система|операционната система]], на които изходният код на програмата може да бъде [[компилатор|компилиран]] / [[:en:Interpreter_(computing)|интерпретиран]] и стартиран.
*Поддръжка: лекотата, с която дадена програма може да бъде модифицирана от нейните настоящи или бъдещи разработчици, за да се направят подобрения или да се персонализират, коригират [[бъг|грешки]] и [[:en:Vulnerability_(computing)|дупки в сигурността]] или да се адаптира към нови среди. Добрите практики  по време на първоначалната разработка са от значение в това отношение. Това качество може да не е пряко очевидно за крайния потребител, но може значително да повлияе на съдбата на програмата в дългосрочен план
*Поддръжка: лекотата, с която дадена програма може да бъде модифицирана от нейните настоящи или бъдещи разработчици, за да се направят подобрения или да се персонализират, коригират [[бъг|грешки]] и [[:en:Vulnerability_(computing)|дупки в сигурността]] или да се адаптира към нови среди. Добрите практики по време на първоначалната разработка са от значение в това отношение. Това качество може да не е пряко очевидно за крайния потребител, но може значително да повлияе на съдбата на програмата в дългосрочен план
*[[:en:Algorithmic_efficiency|Ефективност]] / [[:en:Performance_engineering|производителност]] : Измерване на системните ресурси, които една програма консумира (време на процесора, място в паметта, бавни устройства като дискове, честотна лента на мрежата и до известна степен дори взаимодействие с потребителя): колкото по-малко, толкова по-добре. Това включва и внимателно управление на ресурсите, например почистване на [[:en:Temporary_file|временни файлове]] и елиминиране на [[:en:Memory_leak|течове в паметта]]. Това често се обсъжда в светлината на избрания език за програмиране. Въпреки че езикът със сигурност влияе върху производителността, дори и по-бавните езици, като [[:en:Python_(programming_language)|Python]], може да изпълняват програмите незабавно от човешка гледна точка. Скоростта, използването на ресурси и производителността са важни за програмите, които затрудняват системата, но ефективното използване на времето на програмиста също е важно и е свързано с разходите: повече хардуер може да бъде по-евтино.
*[[:en:Algorithmic_efficiency|Ефективност]] / [[:en:Performance_engineering|производителност]] : Измерване на системните ресурси, които една програма консумира (време на процесора, място в паметта, бавни устройства като дискове, честотна лента на мрежата и до известна степен дори взаимодействие с потребителя): колкото по-малко, толкова по-добре. Това включва и внимателно управление на ресурсите, например почистване на [[:en:Temporary_file|временни файлове]] и елиминиране на [[:en:Memory_leak|течове в паметта]]. Това често се обсъжда в светлината на избрания език за програмиране. Въпреки че езикът със сигурност влияе върху производителността, дори и по-бавните езици, като [[:en:Python_(programming_language)|Python]], може да изпълняват програмите незабавно от човешка гледна точка. Скоростта, използването на ресурси и производителността са важни за програмите, които затрудняват системата, но ефективното използване на времето на програмиста също е важно и е свързано с разходите: повече хардуер може да бъде по-евтино.
===Четимост на изходния код===


=== Четимост на изходния код ===
В компютърното програмиране [[:en:Readability|четимостта се]] отнася до лекотата, с която човешкият четец може да разбере целта, [[:en:Control_flow|контролния поток]] и работата на изходния код. Това засяга аспектите на качеството по-горе, включително преносимост, ползваемост и най-важното поддръжка.
В компютърното програмиране [[:en:Readability|четимостта]] се отнася до лекотата, с която човешкият четец може да разбере целта, [[:en:Control_flow|контролния поток]] и работата на изходния код. Това засяга аспектите на качеството по-горе, включително преносимост, ползваемост и най-важното поддръжка.


Четимостта е важна, защото програмистите прекарват по-голямата част от времето си в четене, опитвайки се да разберат и модифицират съществуващ изходен код, вместо да пишат нов изходен код. Нечетливият код често води до грешки, неефективност и [[:en:Duplicate_code|дублиран код]]. Проучване установи, че няколко прости трансформации на четливост правят кода по-кратък и драстично намаляват времето за разбирането му.
Четимостта е важна, защото програмистите прекарват по-голямата част от времето си в четене, опитвайки се да разберат и модифицират съществуващ изходен код, вместо да пишат нов изходен код. Нечетливият код често води до грешки, неефективност и [[:en:Duplicate_code|дублиран код]]. Проучване установи, че няколко прости трансформации на четливост правят кода по-кратък и драстично намаляват времето за разбирането му.
Ред 70: Ред 68:


=== Сложност на алгоритъма ===
=== Сложност на алгоритъма ===
Академичното поле и инженерната практика на компютърното програмиране са до голяма степен свързани с откриването и прилагането на най-ефективните алгоритми за даден клас проблеми. За тази цел алгоритмите се класифицират в ''поръчки,'' използвайки [[:en:Big_O_notation|Big O нотация]], която изразява използването на ресурси, като време за изпълнение или консумация на памет, по отношение на размера на входа. Програмистите, които са експерти в тази област, са запознати с разнообразието от добре установени алгоритми и тяхната съответна сложност и използват тези знания, за да изберат алгоритми, които са най-подходящи за обстоятелствата.
Академичното поле и инженерната практика на компютърното програмиране са до голяма степен свързани с откриването и прилагането на най-ефективните алгоритми за даден клас проблеми. За тази цел алгоритмите се класифицират в ''класове'', използвайки [[: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>
Различните езици за програмиране поддържат различни стилове на програмиране ([[парадигма на програмиране]]). Според стила основните сред тях са: [[Обектно-ориентирано програмиране|обектно-ориентирано]], [[Императивно програмиране|императивно]], [[Функционално програмиране|функционално]] и [[Декларативно програмиране|декларативно]] <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>
* Императивни
* Императивни
Ред 88: Ред 86:
Според предназначението си езиците за програмиране биват с общо предназначение и специализирани. Популярни съвременни езици за програмиране с общо предназначение са [[Java]], [[C Sharp|C#]], [[Delphi|Object Pascal]], [[C (език за програмиране)|C]], [[C++]], [[PHP]], [[Perl]]. Специализирани езици за програмиране са например [[SQL]] (за заявки към системи за управление на бази от данни), [[JavaScript]] (за реализиране на динамично поведение в уеб сайтове [[от страна на клиента]]) и т.н.
Според предназначението си езиците за програмиране биват с общо предназначение и специализирани. Популярни съвременни езици за програмиране с общо предназначение са [[Java]], [[C Sharp|C#]], [[Delphi|Object Pascal]], [[C (език за програмиране)|C]], [[C++]], [[PHP]], [[Perl]]. Специализирани езици за програмиране са например [[SQL]] (за заявки към системи за управление на бази от данни), [[JavaScript]] (за реализиране на динамично поведение в уеб сайтове [[от страна на клиента]]) и т.н.


Избирането на език за програмиране е свързано с много съображения като например фирмена политика, [[оперативна съвместимост|съвместимост]], наличност на [[Библиотека (програмиране)|библиотеки]] или лични предпочитания.
Избирането на език за програмиране е свързано с много съображения като например фирмена политика, [[оперативна съвместимост]], наличност на [[Библиотека (програмиране)|библиотеки]] или лични предпочитания.


== Източници ==
== Източници ==
Ред 94: Ред 92:


== Литература ==
== Литература ==
* Дейкстра Э., ''Дисциплина программирования'' – 1-е изд. – Москва, 1978. – 275 с.

* Дейкстра Э., ''Дисциплина программирования'' 1-е изд. Москва, 1978. 275 с.
* Дональд Кнут., ''Искусство программирования'', В четырёх томах, Москва, 2001 − 2013
* Дональд Кнут., ''Искусство программирования'', В четырёх томах, Москва, 2001 − 2013


Ред 106: Ред 103:
* [[Софтуер]]
* [[Софтуер]]
* [[Софтуерни метрики]] (изследвания на програмите)
* [[Софтуерни метрики]] (изследвания на програмите)

{{превод от|en|Computer programming|1056918256}}


{{Портал|Информатика}}
{{Портал|Информатика}}

Версия от 09:57, 24 ноември 2021

Програма за колцентрове, писана на Java

Програмирането е компютърна наука и дял от математиката-информатиката, която се занимава с методите и средствата за създаване на компютърни програми. Компютърната програма представлява алгоритъм, който може да бъде „разбран“ и изпълнен от компютъра. При програмирането се използват езици за програмиране, на които се записват изходните текстове на програмата.[1]

Процесът по създаването на програма включва писането, тестването и поддържането на нейния сорс код (изходен код). Програмнвият код, който се пише на език за програмиране, може да бъде и модификация на съществуващ вече код или да бъде нов, с цел решаването на даден математически проблем или програмно изискване.[2]

В сферата на софтуерното инженерство, програмирането е част от процеса на разработка на софтуер.

В някои специализирани приложения или специфични ситуации, програма може да бъде написана или модифицирана чрез директно зареждане на нужните инструкции на машинен код и тяхното изпълнение.

Софтуерен инженер

Софтуерният инженер (програмист) е математик / софтуерен инженер, който пише компютърни програми. Работата на програмиста обикновено включва:

История на програмирането

Най-старата машина за програмиране (това е машина, чието поведение може да се контролира от промените на програма) е програмният хуманоиден робот на Ал Джазари през 1206 г. Външният вид на робота на Ал Джазари е механизирана лодка с четирима автоматични музиканти, която се носи по езерото и забавлява гостите по време на кралските балове. Неговият механизъм включва програмируеми барабани с ключе, захванати на малка ръчка, които отмерват ритъма. Барабанистът е можел да изпълнява различни ритми в зависимост от положението на ключето.

Често за образец на ранното изкуство е считан жакардовият стан, създаден през 1801 г. В тази машина се използвали картонени карти с дупки по тях, като дупките показват извивките на дрехата. Така в зависимост от картите, които му се поставят, станът можел да произвежда напълно различни дрехи. Такива карти е използвал и Чарлз Бабидж през 1830 г., за да управлява своята сметачна машина. Тук отворите се използват за контрол на машината.

Перфокарта на Холерит

Това нововъведение по-късно е подобрено от Херман Холерит, който прилага перфорацията по определена схема за въвеждане на данни. Холерит изобретява специална перфорираща машина за въвеждане на големи масиви от данни, наречена табулатор. Тя се основава на релета и работи с перфокарти, които получават неговото име. Освен тях изобретява и четец за тези карти. Първото приложение на машината е при обработката на резултатите от преброяване на населението в САЩ през 1890 г. когато резултатите са обработени много по-евтино от очакваното и преди определения срок (при предишното преброяване обработката отнела години)[3]. Следват усъвършенствувания на машината и през 1906 г. моделът Type I Tabulator вече е снабден с комутационен панел и позволява бързо и автоматизирано да се изпълняват различни задачи в счетоводството и складовото стопанство (първата крачка към програмирането).

Ада Лъвлейс се счита за първата програмистка

През 1896 г. Холерит основава компанията Tabulating Machine Company (днес IBM). До края на 40-те години имало различни видове машини за програмиране с комутационен панел, които да изпълняват четенето на картите. Ранните компютри също са били програмирани чрез комутационни панели.

Изобретението на Джон фон Нойман позволява програмите да бъдат запаметени в компютърна памет. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в бинарен вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени езиците за програмиране, които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 1954 г. е създаден FORTRAN – първият език на високо ниво. Това позволило на програмистите да извършват изчисленията директно чрез задаване на нужната формула. Изходният текстов код на програмата се превежда до машинни инструкции чрез специална програма, наречена компилатор. След това са създадени още много езици за програмиране (някои от тях с комерсиална цел) – като например COBOL. Програмите обаче все още се въвеждат с перфокарти или перфолента.

Кутия с перфокарти за няколко различни програмни пакета от ранните години на програмирането

Към края на 60-те години устройствата за съхранение на данни и компютърните терминали се развиват достатъчно, за да стане възможно програмите да бъдат писани директно на клавиатурата. Създадени са текстови редактори, които позволяват на програмистите да въвеждат, редактират и обработват кода си много по-лесно, отколкото с перфокартите.

Модерно програмиране

Изисквания за качество

Какъвто и да е пътят за разработване, финалната програма трябва да отговаря на някои основни свойства. Следните свойства са сред най-важните:

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

Четимост на изходния код

В компютърното програмиране четимостта се отнася до лекотата, с която човешкият четец може да разбере целта, контролния поток и работата на изходния код. Това засяга аспектите на качеството по-горе, включително преносимост, ползваемост и най-важното поддръжка.

Четимостта е важна, защото програмистите прекарват по-голямата част от времето си в четене, опитвайки се да разберат и модифицират съществуващ изходен код, вместо да пишат нов изходен код. Нечетливият код често води до грешки, неефективност и дублиран код. Проучване установи, че няколко прости трансформации на четливост правят кода по-кратък и драстично намаляват времето за разбирането му.

Следването на последователен стил на програмиране често помага за четливостта. Въпреки това, тя е нещо повече от стил на програмиране. Много фактори, които имат малко или нищо общо със способността на компютъра да компилира и изпълнява ефективно кода, допринасят за четливостта. Някои от тях са:

Аспектите на презентация (като тире, нови редове, цвят Отбелязването и т.н.) често са разглеждани от изходния код редактор , но аспектите съдържание отразяват талант и умения на програмист.

Различни езици за визуално програмиране също са разработени с намерението да се разрешат проблемите с четливостта чрез приемане на нетрадиционни подходи към структурата и показването на кода. Интегрираните среди за разработка (IDE) имат за цел да интегрират цялата подобна помощ. Техники като рефакторинг на код могат да подобрят четливостта.

Сложност на алгоритъма

Академичното поле и инженерната практика на компютърното програмиране са до голяма степен свързани с откриването и прилагането на най-ефективните алгоритми за даден клас проблеми. За тази цел алгоритмите се класифицират в класове, използвайки Big O нотация, която изразява използването на ресурси, като времето за изпълнение или необходимата памет, по отношение на размера на входа. Програмистите-експерти в тази област са запознати с разнообразието от добре установени алгоритми и тяхната съответна сложност и използват тези знания, за да изберат алгоритмите, най-подходящи за обстоятелствата.

Езици за програмиране

Различните езици за програмиране поддържат различни стилове на програмиране (парадигма на програмиране). Според стила основните сред тях са: обектно-ориентирано, императивно, функционално и декларативно [4]. Според друг източник обектно-ориентираното програмиране спада към императивния стил, а функционалното програмиране спада към декларативния:[5]

  • Императивни
    • Процедурни
    • Рефлективни
  • Декларативни
    • Функционални
    • Логически
    • Функционални + Логически
    • Хибридни (декларативни + императивни)
      • Генетични
  • Структурни
    • Обектно ориентирани

Според предназначението си езиците за програмиране биват с общо предназначение и специализирани. Популярни съвременни езици за програмиране с общо предназначение са Java, C#, Object Pascal, C, C++, PHP, Perl. Специализирани езици за програмиране са например SQL (за заявки към системи за управление на бази от данни), JavaScript (за реализиране на динамично поведение в уеб сайтове от страна на клиента) и т.н.

Избирането на език за програмиране е свързано с много съображения като например фирмена политика, оперативна съвместимост, наличност на библиотеки или лични предпочитания.

Източници

  1. Желязко Желязков (и други колектив), Информатика, Учебници за ВУЗ
  2. Информатика, Учебници за ВУЗ, ИУ – Варна, 2013
  3. U.S. Census Bureau: Tabulation and Processing
  4. ((en)) Nørmark, Kurt. Overview of the four main programming paradigms. Aalborg University, 9 май 2011. Линк ат 22 септември 2012.
  5. Принципи на Функционалното програмиране. Увод в Scheme // Посетен на 29.12.2014.

Литература

  • Дейкстра Э., Дисциплина программирования – 1-е изд. – Москва, 1978. – 275 с.
  • Дональд Кнут., Искусство программирования, В четырёх томах, Москва, 2001 − 2013

Вижте също

  Тази страница частично или изцяло представлява превод на страницата Computer programming в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс – Признание – Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година – от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите. ​

ВАЖНО: Този шаблон се отнася единствено до авторските права върху съдържанието на статията. Добавянето му не отменя изискването да се посочват конкретни източници на твърденията, които да бъдат благонадеждни.​