Видове програмиране
Сега, след като изяснихме основната идеология на програмирането и дадохме бегла представа какво е алгоритъм, вече можем да се спрем по-обстойно на това какви видове програмиране има. Фактически, те са само два - системно и приложно. Но тъй като приложното програмиране е доста широко понятие, по добре е да бъдат разграничени и неговите направления - обектно-ориентирано, визуално, и програмиране в интернет. Това разделяне не е много точно, тъй като визуалното програмиране е също обектно ориентирано, но то има някои характерни особености които трябва да се споменат отделно.
И така, да започваме:
Системно програмиране
С развитето на техниката и електрониката се стигнало до момент в който чрез настройване в определена комбинация на разни ключове, щекери и т.н. малки превключватели, да се командва и управлява работата на огромни по размери машини. Машините, заедно с управлението образували система изпълняваща някаква си функция. Задаването на комбинацията на щекерите (или каквито там превключватели били) било наречено системно програмиране. Въпреки че подобен начин на управление все още съществува, той е поел по по-различен път от програмирането на съвременните компютри и определен термин за него няма. Подобен начин за задаване на изискваните команди в момента се нарича "програмиране на трикоординатен обработващ център с кинематично управление с щекерна панела" или "програмиране на фрезова машина със система на управление тип FANUG" или още нещо което дава точна представа за какво става дума. От това обаче в момента не се интересуваме.
Понятието системно програмиране в момента грубо казано обхваща прилагането на езици за програмиране от първо и второ поколение. Особеностите на тези езици ще бъдат разгледани по-подробно.
Няма да ви занимавам с особеностите на системното програмиране, тъй като то е достатъчно сложно дори за човек който се е занимавал с програмиране, а концепцията тук е да се обясни на прост език - т.е. като на човек който нищо не разбира. Доколко сме успели не знам де. Единственото което в момента трябва да разберете е следното:
Системното програмиране указва точните действия които машината (компютъра) или отделно устройство (процесор, клавиатура, мишка, видео карта, флопи и пр. и пр.) трябва да извърши на език близък до логиката на електрониката, остявяйки на заден план алгоритъма по който се работи.
По-лесно е да се разбере като се сравнят сорсовете между системно и приложно програмиране, и затова ще дам един пример: Трябва да се сравни съдържанието на две клетки от паметта на адреси A и B, и по-голямата стойност да се запише на адрес Max.
На един език от високо ниво, това ще бъде реализирано така:
If A^ > B^ then Max^ := A^ else Max^ := B^; |
if (*A>*B) *Max=*A; else *Max=*B; |
Това са едни и същи инструкции написани на два различни езика - Pascal и C. Преведени на човешки език означават следното: "Ако това което се сочи от A е по-голямо от това което се сочи от B, тогава на адреса сочен от Max да се присвои стойността на соченото от A, иначе на адреса сочен от Max да се присвои стойността на соченото от B." Както се вижда, идеята е предадена в сорса едно към едно, без да се интересува програмистът какво точно ще направи процесора за да реализира действията.
Написано обаче на асемблер (език от второ поколение), същите действия ще добият малко по-друг вид:
Префикс | Команда в сорса | Смисъл на командата |
| mov eax, dword ptr [A] | Зареди в регистър eax стойността сочена от A |
| cmp eax, dword ptr [B] | Извади стойността сочена от B от стойността на регистър eax без резултата да се запомня |
| jg Label | Ако (A) е по-голямо прескочи на Label |
| mov eax, dword ptr [B] | Зареди в регистър eax стойността сочена от B |
Label: | mov dword ptr [Max], eax | Запиши на адрес Max стойността на регистър eax |
Както се вижда, системното програмиране се интересува от това кое къде ще застане и от къде ще мине, а не от идеята защо това се прави. От това се разбира и трудността на този вид програмиране - докато пише програмата, програмистът трябва да помни основната идея и да я проиграва мислено. Това включва всички операции и повечето инструкции, които трябва да са добре подредени в главата му.
Друга трудност с която се сблъсква начинаещия в началото е очевидна - езиците са по-неразбрани. Това обаче след известно време се преодолява и след достатъчно дълга практика системните програмисти започват да мислят, че приложното програмиране e далеч по-трудно. Това не е чак толкова абсурдно, защото примера който дадох по-горе с оператора if-else на C може да се напише и така:
*Max=(*A>*B?*A:*B);
Приложно програмиране
to be written
Обектно-ориентирано програмиране (ООП)
Що за дявол е пък този? Програмиране е и това е ясно, само че в него е пъхната и идеята за обектите, по-точно - базира се върху обекти. Те пък се базират върху структури, тъй че предшественик му е структурното програмиране и явно се налага първо да обясня и то какво представлява...
Ами едно от най-най-първите неща, които научава всеки програмист е как да си служи с променливите. Това са разни клетки в паметта (чекмедженца в шкафа, папки, листчета в тефтерчето и бог знае още с какви работи са наизмислили да ги сравняват), в които си записваме данни.
Променливите са няколко типа и всичките са относително малки, защото могат да поберат само едно късче/парче/отрязъче/тулупче/океанче информация. Тоест например целочислената променлива побира само едно число - било то и 4`000`000`000, все пак си е само едно (нищо че погледнато от друга страна то може да съдържа в себе си адреса, на който да намерим още 20000 числа например).
Има променливи, които съдържат в себе си буква - точно така, само една буква. Пак е достатъчна за да обозначим 255 възможни начина да се спънеш например, стига да можем да ги измислим.
Има променливи, които записват дробно число и въпреки че с тях можем да запишем число като 2`000`000`000`000`000`000`000`000`000`000`000, или 0.000`000`000`000`000`000`000`000`01, пак си остава само едно, освен това пък не можем да запишем 2`142`526`172`828`287`991`889`253, но тези особености можете да си ги научите сами.
Тези трите са всичко, което можете да откриете в един процесор. В зависимост от езика за програмиране, който използвате, може да има и други типове, но те се базират по някакъв начин върху тези. Например символният низ (който си е чист стринг, ама да не спорим сега с превежданата литература...) е просто купчина букви, наредени в редица (тъй де - масив).
В началото, когато компютрите са имали размери на танкове, а програмистите са работели на тях с телетипни терминали, всичко това им е било напълно достатъчно и никой не се е замислял за още. Но след няколко години, когато са взели да се появяват такива чудовищни и немислими научни постижения като настолно РС с 512 килобайта памет, програмистите взели да чувстват някаква липса на организация в програмните си езици.
Например ако някой иска на напише програма, която да държи сметка за броя на книгите в библиотеката му, като освен това си отбелязва заглавието и точното място на съхранение на всяка книга, както и кратък коментар към нея и дали в момента не е дадена на някой приятел и може би една елементарна оценка по десетобалната скала, то той трябва да задели една целочислена променлива за броя на книгите и по една целочислена плюс няколко стринга за всяка книга.
Ами да разбира се - би могло да се направи и с досега описаните средства, ама някак си не е особено удобно. Затова взели че измислили структурите - това са едни такива средства в програмния език, които позволяват човек да си опакова няколко променливи заедно и да си ги кръсти с някакво име. А компилаторът държи сметка колко и каква памет да заделя за тях и как да ги разграничава помежду им, без да се налага с това да се занимава програмистът.
И ето значи програмистът притичва до близкия магазин, купува новата версия на любимия си компилатор, връща се, прочита документацията и прави една структура. Озаглавява я "Книга" и в нея опакова всичките си променливи за една книга. После прави една структура "библиотека" и в нея слага един масив от структури "книга" плюс променливата, която записва броя им. След един-два месеца практика ще му дойде наум че няма нужда от тази по-голяма структура, но в момента е в екстаз от новата екстра в програмирането.
(Като направи четвърта пета и шеста версия на програмата си, постепенно той ще открие колко добро нещо са това указателите (чисти поинтери, ама да не спорим сега...), ще разбере за предимствата на свързаните списъци, ще направи голямата си структура вместо с масив - със свързан списък, за да може да избегне неминуемото ограничение за максималния брой книги, ще открие, че това работи адски бавно, ще прочете още книги, ще разбере устройството на хеш-таблицата, ще разкара голямата си структура "библиотека", ще я замести с хеш и ще миряса).
Чудесна идея. Само че не минало кой знае колко дълго време и ето че взели програмистите да искат още удобства... Отвратително племе сме това ние програмистите - много ни мързи.
И така, нека хлопнем нашия програмист с някоя буква по главата и го подсетим да се замисли какво би трябвало да прави неговата програма за библиотеката му. Ами трябва да може да добавя нови книги към записаните, когато на някого му хрумне да купи такива, както и да изтрива стари книги, ако например някой доброжелателен приятел реши да оттърве програмиста от бремето да полага грижи и да бърше праха от някоя книга като просто не му я върне (не че програмистът би седнал някога да бърше прах от някоя книга, независимо какво чудо му се е случило, но за нашите цели ще оставим доброжелатeлят да си мисли каквото си поиска).
Друго, което трябва да може програмата, е да открие и изведе информация за произволна книга, използвайки някой от нейните белези - номер, заглавие, тежест (да речем че в третата версия на програмата програмистът е решил да си записва и колко е тежка книгата, за да му е по-лесно когато търси четиво за заспиване, или тежести за вдигане).
И последно тя би трябвало да може да си записва информацията във файлове, пък и да я чете от там. Ето един хубав набор от функции, които програмистът ще добави около своите структури, ще напише няколко, които изписват разни неща по екрана и четат данни от клавиатурата и ето ви една чудесна програма за библиотека - красива и проста.
В нея ще има разни изрази от рода на `Книга=НаправиНоваКнига(); Попълни(Книга, "Дрън-Дрън", 4, ...); Запиши(Книга); освободи(Книга);`, където Книга е указател към структура книга - първата функция заделя памет, втората (след точката и запетаята) записва данните в нея, третата я записва във файл, четвъртата освобождава паметта, "Дрън-Дрън" е заглавието, 4 е тежестта й, а в многоточието има още такива данни, но ме мързи да ги пиша.
Разбира се, идва страшният ден, когато нашият вечно търсещ нещо ново програмист се закача в интернет и подръпва оттам новата версия на любимия си компилатор (хващам се на бас, ча това вече съвсем не е същия компилатор, който му беше любим докато се занимавеше със структурно програмиране, но това е то - в мозъка на един програмист повечето неща дето щъкат са променливи, а сред тях се нарежда и "любим компилатор").
Сяда да чете някаква книга, дръпната от друго място, която обяснява какво е новото в тази версия и остава изключително приятно изненадан - ами те хората били измислили някакви едни такива работи, дето им викат "обекти". `Дай сега да видим що за дявол е това` - доволно потрива той ръчища, бутва книгата настрани и започва да щрака по клавиатурата на коленете си (нали не сте си помислили, че седи на някаква масичка и светлината върху книгата идва от нощна лампа??).
Може би се подосетихте, че функцията е някакво такова нещо, дето върши работа. Няма да я обяснявам подробно - да действат колегите, но това си е като структурата, само дето вътре не са опаковани променливи, а инструкции. И пак си има име - човек като я викне и тя хоп! - набързо си свършва работата с процесора... Та това е общо взето.
Значи обектът пък е пак като структура - има си име, но в него се пакетират променливи (дори и структури, понеже и те са си вид променлива, както забравих да спомена докато обяснявах как нашият програмист пъха една структура в друга) и функции. Мдам.. и функции.
С други думи можем да си представим, че ако структурата е една сбирщина от променливи, то обектът (в С++ той се нарича клас) е също такава сбирщина, само дето тя знае какво да прави със себе си. Хитра сбирщина един вид.. като стадо лисици. Е, ако програмистът е бил тъп като тапир, то и обектът му вероятно ще е сбирщина променливи, хитри колкото стадо тапири, но това си е негов проблем.
Да речем, че нашият програмист е от хитрите. Така че той прибавя към структурата "книга" функциите за записване на нова книга и за изтриване на стара и става обект "книга". Прави един обект "Входно-изходен нафарфулник" и в него слага функциите, които изписват разни неща по екрана и четат данни от клавиатурата. Както и необходимите им променливи, разбира се.
Ще направи и един обект "ХД", което съвсем очевадно си значи хард-диск и в него ще нареди функции за записване и четене на файлове, заедно с техните си променливи. И сега вече ще се получат изрази от рода на: `Книга= нова Книга("Дрън-Дрън", 4, ...); Диск.Запиши(Книга); трий Книга;`, като първото едновременно заделя памет за структурата книга (използвайки конструктор, който ако ви е много интересно да разберете какво е, прибегнете до книга за С++) и я попълва с данни, второто я записва във файл, а третото освобождава паметта, използвайки деструктор (пак ползвайте книгата). "Дрън-Дрън" и 4 ги знаете какво са.
И понеже подозирам, че нашият програмист отново е в екстаз от обектите, имам чувството че ще направи и един голям обект "програма", който ще има за функции нещо като ИнициализирайСе(), Работи(), ГръмниСе() и за променливи - по-малките обекти, плюс някоя и друга дребна архаична елементарна променливка.
Или за да бъдем кратки - Обект това е тип променлива, който представлява обединение на функции и променливи, където функция, това е обединение на инструкции, вършещи определена работа, което приема параметри и връща резултати, а променлива това е или проста променлива от базов тип, или структура от променливи със същото дефиниционно множество от типове, а обектно ориентирано програмиране е такъв стил на програмиране, в който решенията на алгоритмите се реализират чрез употребата на обекти.
Хайде сега превеждайте си.
Визуално "програмиране" (моделиране)
to be written
Програмиране в интернет
to be written