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

от Уикипедия, свободната енциклопедия
Изтрито е съдържание Добавено е съдържание
TheMask07 (беседа | приноси)
Етикети: Редакция чрез мобилно устройство Редакция чрез мобилно приложение Разширена мобилна редакция
Ред 41: Ред 41:


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


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


* [[Надеждност на софтуера|Надеждност]]: колко често резултатите от дадена програма са верни. Това зависи от концептуалната коректност на алгоритмите и минимизирането на програмните грешки, като грешки в управлението на ресурсите (напр. [[: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:Usability|Използваемост]] : [[:en:Human_factors_and_ergonomics|ергономичността]] на програмата: лекотата, с която човек може да използва програмата по предназначение или в някои случаи дори за неочаквани цели. Такива проблеми могат да доведат до успех или да нарушат неговия успех, независимо от други проблеми. Това включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.
* [[Ползваемост]] ( [[ергономичност]]) на програмата: лекотата, с която човек може да използва програмата по предназначение или в някои случаи дори за неочаквани цели. Такива проблеми могат да доведат до успех или да нарушат неговия успех, независимо от други проблеми. Това включва широк спектър от текстови, графични и понякога хардуерни елементи, които подобряват яснотата, интуитивността, сплотеността и пълнотата на потребителския интерфейс на програмата.


*[[:en:Software_portability|Преносимост :]] обсега от [[компютърен хардуер]] и платформи на [[Операционна система|операционната система]] , на които изходният код на програма може да бъде [[:en:Compiler|компилиран]] / [[:en:Interpreter_(computing)|интерпретиран]] и стартиран.
*[[:en:Software_portability|Преносимост]]: обсега от [[компютърен хардуер]] и платформи на [[Операционна система|операционната система]], на които изходният код на програмата може да бъде [[компилатор|компилиран]] / [[:en:Interpreter_(computing)|интерпретиран]] и стартиран.
*Поддръжка : лекотата, с която дадена програма може да бъде модифицирана от нейните настоящи или бъдещи разработчици, за да се направят подобрения или да се персонализират, коригират [[:en:Software_bug|грешки]] и [[: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]], може да изпълняват програмите незабавно от човешка гледна точка. Скоростта, използването на ресурси и производителността са важни за програмите, които затрудняват системата, но ефективното използване на времето на програмиста също е важно и е свързано с разходите: повече хардуер може да бъде по-евтино.
'''<big>Четимост на изходния код</big>'''
===Четимост на изходния код===


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


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


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


* Различни [[:en:Indentation_style|стилове на отстъп]] (бели места)
* Различни [[:en:Indentation_style|стилове на отстъп]] (бели места)
Ред 69: Ред 69:
Различни [[:en:Visual_programming_language|езици за визуално програмиране]] също са разработени с намерението да се разрешат проблемите с четливостта чрез приемане на нетрадиционни подходи към структурата и показването на кода. [[:en:Integrated_development_environment|Интегрираните среди за разработка]] (IDE) имат за цел да интегрират цялата подобна помощ. Техники като [[:en:Code_refactoring|рефакторинг на код]] могат да подобрят четливостта.
Различни [[:en:Visual_programming_language|езици за визуално програмиране]] също са разработени с намерението да се разрешат проблемите с четливостта чрез приемане на нетрадиционни подходи към структурата и показването на кода. [[:en:Integrated_development_environment|Интегрираните среди за разработка]] (IDE) имат за цел да интегрират цялата подобна помощ. Техники като [[:en:Code_refactoring|рефакторинг на код]] могат да подобрят четливостта.


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


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

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

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

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

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

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

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

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

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

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

Табулаторът на Холерит от 1890

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

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

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

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

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

Комутационен панел с проводници за сметачна машина IBM 402.

Изобретението на Джон фон Нойман позволява програмите да бъдат запаметени в компютърна памет. Ранните програми трябвало стриктно да задават инструкциите на отделната машина, обикновено в бинарен вид. Всеки модел компютър се нуждаел от различни команди за изпълняването на една и съща задача. По-късно са създадени езиците за програмиране, които позволяват на програмистите да представят всяка инструкция в текстов формат, като въвеждат абревиатури за всички операции, вместо да ползват числа и специфични адреси в символен формат. През 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

Вижте също