Първи стъпки
от Българският сайт за математика
Какво е този документ?
Повечето туториъли от този тип които съм виждал започват със нещо от рода на "Що е то програмиране" или друга глупост. Щом четете това, значи имате някаква представа какво е програмирането. Ако нямате, уикипедия е добро място за информация. Този текст не е урок по програмиране, а е нещо като насока за хората които искат да се захванат с програмиране. Той предлага обяснение на някои по често задавани въпроси, или някои по важни, но рядко задавани въпроси. Този текст е публикуван във свободно уики, което означава, че всеки може да го редактира, но оригиналният автор Павел Пенев(pavelludiq) държи да отбележи, че мненията в този документ са строго негови лични и че ако някой има възражение може да обсъдим и променим документа ако е необходимо.
Какво не е този документ?
Този документ не е въведение във никой език за програмиране, въпреки, че препоръчва няколко като начални езици и дава примери с тях, повечето неща, освен тези изрично споменати другояче са универсални при повечето модерни езици за програмиране. Този документ не се стреми да наложи никакво мнение относно изборът на технология и език, но не е напълно обективен, защото авторът има силни лични пристрастия. Въпреки това едва ли ще сгрешите ако послушате съветите в този материал. Ако сте достатъчно умни, ще разберете кои съвети са грешни за вас, след като навлезете в материала и ще направите собствените си избори.
В началото бе словото...
Това е цитат от Библията. Според светото писание бог сътворил светът чрез словото. Словото има божествена сила, и фактът че хората притежават силата на словото, ги прави такива велики създания. Програмирането наподобява историята на сътворението от библията. И рече програмиста да бъде код... Ако никога не сте програмирали е добре да се подготвите за първата си програма. Първото нещо което трябва да решите е какав среда ще използвате. Ако сте на уйндолс, вероятно не ползвате най- удачната система за разработка. Въпреки, че е разумна среда за начинаещи, е добра идея да инсталирате и разучите линукс или някой от вариантите на БСД или опънСоларис(най-малко препоръчвания от всички изброени уникси) Ако разполагате със Макинтош, вероятно OSX е добра среда за начало. След като минахме през средата да поговорим малко за инструментите. Инструментите са най важното нещо за всеки занаятчия, без значение дали е стругар или художник, или програмист. В нашия случай инструментите които са необходими са:
-Самия език. Добри езици за начинаещи са python и ruby. Лоши езици за начинаещи са C++, paskal, BASIC, java. Някой езици да добри езици, но не е добра идея да се захващате с тях освен ако нямате вече някакъв опит такива езици са С и lisp. За някой от тези езици ще пиша по надолу.
-Имплементацията на езикът. Ако искате да научите някой език, ви трябав негова имплементация, това означава някоя негова версия, за С/С++ имплементация вероятно означава компилатор за вашата платформа. Python има няколко популярни имплементаций, официалната CPython е написана на С и е най гъвкъвата и функционална. Други популярни имплементаций са IronPython с който може да използвате съвместно със .NET и Jython който е написан на Java и може да използва Java библиотеки. Друга популярна версия е PyPy това е python написан в самия себе си. Мисля че подобни имплементаций има и за ruby, при lisp нещата с имплементацийте са извън контрол, причината е че почти всеки може да напише своя имплементация на на lisp в самия lisp. При Lisp тези версий се наричан диалекти. Lisp има много диалекти, някой от най- известните са Common Lisp, Scheme, EMACS Lisp, Script Foo(скриптовия език на GIMP, базиран върху мини версия на Scheme) За щастие докато не напреднете няма да ви се налага да се занимавате с този език и диалектите му.
-Редакторът. това в което пишете. Най популярния редактор е Notepad. И същевременно това е най скапания. Уйндолс идва със още един редактор WordPad който е прост уърд процесор. Редакторът обаче е друго нещо. Редакторът е инструмент за въвеждане и редактиране на текст във чист вид. Докато уърд процесорите като WordPad се използват за въвеждане, редактиране и форматиране на текст. Интересни шрифтове, цветове и други подобни елементи, които са безполезни при програмирането са част от нещата които уърд процесорите могат да правят. Истинските редактори за програмиране са мощни инструменти. NotePad е шега когато се постави до мощни редактори като EMACS и VIM. Но не ви е необходим такъв редактор. Ако се занимавате със C++ вероятно в даскало сте ползвали DevC++ или някъква подобан програма. Това са IDE-та, интегрирани среди за разработка. Аз не съм почитател на подобни неща, предпочитам суровата мощ на текстовия редактор. Ако сте на уйндолс, добър редактор е notepad++. Този редактор е безплатен и опън сорс. Достатъчно мощен е и потдържа най важните функций необходими както на начинаещи, така и на професионалисти. Ако сте на линукс или някакъв друг уникс, изборът ви е невероятно голям. Има няколко много мощни IDE-та като Kdevelop, но истинското разнообразие идва със редакторите. Повечето линукси идват със дефаут редактор някой от следните: gedit, kate или kwrite. Всеки от тях е достатъчно мощен за работа. Но истинските бижута са EMACS и VIM. И двата са сравнително трудни за начинаещи, но мощта им е невероятна. Който редактор да изберете(с изкрючение на ноутпад) Вероятно ще се справите.
Ако сте объркани от горните редове, не се притеснявайте, идва още по объркващата част на истинското програмиране. Като пример ще използвам Python код, но това не е python туториъл. Когато обеаснявам повечето от важните езици които споменах ще дам линкове за някой добир материали за тях и как да започнете по подробно.
Започваме със най важните понятия. Променливите. в python това са указатели към обекти в паметта. Това ще рече че променливите са имена на нещо. Да речем a=4 означава че а е указател на обекта 4, който е цяло число. при повечето модерни динамични езици, променливите не съдържат стойност, "а" указват към обект съдържащ стойност, това е различен подход от езици като С където променливите имат типове, и съдържат стойност. При С променливата "а" е тип int и съдържа стойност от 4. Това е статичния подход, при динамичните езици обаче имаме една мощ която нямаме при статичните. Можем да даваме различни типове на едни и същи променливи. Да речем че нямаме нужда от това число 4, можем просто да зададем друга стойност на "а" сега вече имаме а=4,3 което е число с плаваща запетая(или както учат децата, това е десетична дроб) Във си, този тип се нарича float и за да зададем такава стойност на "а", първо трябав да я дефинираме от тип float. Това разбира се не са единствените типове които има python, той има много други, но няма да ги обеаснявам в подробности. Само ще спомена някой от тях и ще дам пример с код:
цяло число или int 4
число с плаваща запетая, или float 4,3
знаков низ или str "string" това е напрактика дума или друг текст в кавички, може да бъде редактиран, съхраняван и изписван на екрана.
списък или list [1,2,3,4,5] Списъкът може да съдържа всички други типове, включително други списъци.
наредена n-торка или tuple (1,2,3,4,5) Разликата със списъкът е в това че във python наредените n-торки не могат ад е променят.
речници или dict {"a":"b", "c":"d"} Това е мощен инструмент. Във python те предттавляват таблици при която къд даден ключ, в този пример "a" и "c", се задава стойност, в този случай "b" и "d". В ruby този тип се нарича хеш или hash. Стойноста е отделена от ключът със две точки, отново може да съдържа всякъкви други типове, включително функций, и други речници.
Функций. някой от горните може и да ги няма в някой езици, но почти всички модерни езици имат функций, при някой те са мощни инструменти, при други са просто допълнение. Функцийте в някой езици се наричат subroutine. Те представляват начин кодът ви да се капсулира и да се използва многократно. Да речем че искате да удвоите стойноста на дадена променлива. Вместо да пишете един и същ код за всяка променлива която искает да удвоите, е добра идея да напишете функция, и да я използвате за всяка променлива, когато ви потрябва. Ето как изтлежда подобна функция във python:
def doublevar(x):
return x+x
няма да обеаснявам подробностите защото те са спесифични за всеки език, но освоното тук е че дефинирахме функцията doubleint() която приема 1 аргумент х и връща удвоената му стойност. Различните езици подхождат различно от синтактична гледна точка, но горе долу семантиката е еднакав при всички. Функцията се повиква, дава и се аргумент, и тя връща стойност, или извършва друго действие.
Аритметични действия
+ така известния ни +, повечето езици имат нещо подобно(най често самия +) Той събира две стойности. Ако събирате две числа да речем 2 и 3 при повечето езици трябва да напишете нещо от сорта на
2+3
Този израз ще върне 5. При някой езици синтаксисът е различен но няма да го обеаснявам сега. при python можете да събирате и други типове например низове:
"str"+"ing" връща нов знаков низ "string"
- e обратното на +. Няма много какво да се обеаснява, почти същите правила важат и тук. При python обаче не може да изваждате str това ще върне грешка, предполагам е така и при повечето други езици. пир python ако искате да извадите нещо от знаков низ има друг синтаксис, който няма да обеаснявам тук.
- умножение. Същите правила както тези които обеаснявах горе за +. Ако напишете "a"*4 ще получите знаковия низ "aaaa" ако напишете "a"*"a" при python
деленето вече е сложната част. В зависимост от езикът се използва някой от следните значи "/" "//" или "%" при различните езици имат различно значение. Някой делят с остатък, други без остатък, други връщат само остатъкът от деленето.
Общо взето това са основни неща които трябва да знаете като абсолютно начало. Сега ще дам допълнително инфо за различин езици и мое мнение за тях. Няма да пиша за езиците които не харесвам, защото съм го правил на други места. Тук ще напиша езиците които харесвам и ще обеасня какво харесвам, и защо са/не са подходзящи за начинаещи. Също така ще дам материали за начинаещи, и по напреднали, както и допълнително инфо.
Python е езикът който използвах за пример в този текст. Причината е че е любимия ми език. Той е едновременно доста лесен и прост, и невероятно мощен така че без значение дали сте начинаещ, или python гуру, езикът ще ви върши превъзходна работа, според нуждите(в повечето случаи, когато нуждите ви не са прекалено спесифични). За разлика от други прости скриптови езици като BASIC той няма да развали мозакът ви. Аз го препоръчвам като първи език и въпреки че не е перфектен, е добър избор. Но не ме слушайте, а го изпробвайте. Ето материали които ще са ви от полза:
http://python-bg.sourceforge.net/ това е българската документация, доста е остаряла, но върши работа като начало.
http://www.python.org/ това е официалната страница на проекта, тук може да намерите инфо, да свалите езикът, и да намерите документация. Внимание, ако пишете адресът в браузарът си ръчно, никога не пишете python.com :D особено от работното ви място.
http://en.wikipedia.org/wiki/Python_(programming_language) Ето инфо в уйкипедия.
http://www.swaroopch.com/byteofpython/ Това е книгата с която аз започнах, препоръчвам я, добра е и е безплатна.
http://diveintopython.org/ Още една добра книга, след като прочетете горната, е добре да минете и тази.
Ruby е също страхотен език, прилича на python, но е различен, който от двата да изберете за първи, няма да сгрешите, не знам много ruby, но знам доста за самия език. Разликите с python са основно в самия стил и философия, тези неща няма да разберете докато не станете малко по запознати с материала. Езикът е също толкова добър, колкото python в някой неща по добър, в други не толкова, те са почти изравнени по мощ и простота, всеки спор за това кой е по добър по мое мнение е безсмислен.
http://www.ruby-lang.org/en/ ето сайтът на самия език
http://en.wikipedia.org/wiki/Ruby_programming_language а ето и страницата в уйкипедия.
Съжалявам че не давам толкова инфо и линкове колкото за python, но не съм толкова запознат с материалите за този език. Със сигурност ще намерите добир книги и упътвания в интернет с помоща на гугъл.(ако някой иска да добави свои материали за който и да е език, да заповяда, стига да са свободни, тези с авторски права не са позволени тук)
C е така известния език. Повечето от нас са учили този език в даскало или C++. Според мен е глупаво да се учи който и да е от двата като първи. Няма да говоря за C++ защото не го харесвам, но това си е мое мнение, С обаче е истинска легенда. Unix е написан на С, линукс също, повечето езици имат пноне една имплементация написана на него. С е добър език за операзионни системи, драйвери, компилатори. Това че се учи в даскало е неуредица на самата система. Ако искате да го научите, не го започвайте като първи език. Всъщност не ако искате, задължително е да го знаете, защото той е като описание на това как работи компютърът. Той е език от ниско ниво, труден е, много по труден от Python или Ruby, но не е предназначен за решаване на същите проблеми. Когато станете опитни, може да го започнете. Аз го уча в момента със книгата на Браян Керниган и Денис Ричи "Програмния език С" Препоръчвам ви да си я купите, или да си я намерите в интернет, мисля че има безплатна версия на английски. С е малък, мощен(за целите си) и бърз. Ако го използвате съвместно с други езици, може да получите мчного добир резултати. Маериали няма да дам, защото още не сте пораснали за него :D
Lisp е нещо като противоположноста на С. Той е много по абстрактен, мощен и има изцяло различна философия. С е създаден като език за програмиране който да върши работа. Lisp е създадет като теоретична функция която да обеаснява изчислението на алгоритми. Практически когато за пръв път вкарали тази функция eval в компютърът, тя станала нещо като интерпретатор за самия език. Езикът притежава няколко прости функций, наречени примитиви. Те са нещо като аксиоми във самия език, както аксиомите в математиката. С тях можете да построите почит всичко друго от което езикът има нужда, можете дори да напишете съвсем друг език. За това този език е толкова мощен, но не е за начинаещи. Семантиката на езика е много по различна от тази на С. Python и Ruby са езици които са близки по семантика със Lisp. Те имат много общи характеристики, но синтаксисът им, начинът по който се пишат програмите е доста различен. Ruby и Python приличат повече на C от колкото на lisp. Ако искате да бъдете някой ден наистина добир програмисти, е добра идея да научите lisp . Това го препоръчва Ерик Реймънд Във есето си как да станем хакери http://catb.org/~esr/faqs/hacker-howto.html Ако напишете "Как да стана хакер" в гугъл ще ви излезе есето му на български. Препоръчвам ви да го прочетете преди всичко друго към което съм дал линкове в този материал
Изводите: Не знам какви са били очакванията ви, но този материал със сигурност има още много работа, още материали, още информация, или по скоро по малко материали, и по малко информация. Изчистването на материалът е добра идея, ще се радвам да някъкви коментари и редакций, особено на правописни грешки. Ще помоля ако някой има различно виждане за това "есе" да се свърже с мен за да обсъдим промени, не мисля че е добра идея, някой да дойде и да изсипе куп други материали, които нямат място тук, като например инфо за още 10 различни езика или нещо от сорта. Можете да се свържете с мен на pavelludiqATgmailDOTcom
пп Имам много печатни грежки причинени от бързо писане, които ще отстраня скоро, правописните грежки от неграмотност ще бъдат премахнати също скоро, очаквам помощ със пунктуацията най- вече :D