Въведение

Това е книга за придобиване на компютърни знания , с които да може да правите каквото си искате с компютрите. Компютрите са толкова много днес, но те съдържат много скрити сложности и по този начин са трудни за работа и разбиране. За много хора те остават чужди и леко заплашителни.

Communicating with a computer

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

Но ние още не сме намерили добър начин за използване на точка/клик подхода за комуникиране на нещата на компютъра, както дизайнера на интерфейс очаква. За отворени интефейси, които дават указания на компютъра да изпълнява произволни задачи, ние имаме повече късмет с подхода, при който се възползваме от нашия талант с езика: преподаване на машинен език.

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

Програмирането стана много по-разпространено през последните 20 години и езиково базирани интерфейси, в които хората взаимодействат с компютрите, до голяма степен са заменени с графични интефейси. Но те все още са там, ако знаете къде да търсите. Един такъв език е JavaScript, той е вграден в почти всеки уеб браузър и по този начин работи на почти всяко потребителско устройство.

Тази книга има намерение да ви направи достатъчно запознати с този език, за да бъдете в състояние да накарате компютъра да направи това, което искате.

Програмиране

Аз не просвещавам ония, които не са готови да учат, нито да предизвикам тези, които не са нетърпеливи да дадат обяснение на себе си. Ако аз стоя на един от ъглите на площада и те не могат да се върнат при мене с другите три, то аз не трябва да разяснявам отправните точки отново.”

Confucius

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

Ще има моменти, когато четете тази книга да се почувствате ужасно разочаровани. Ако сте нов в програмирането, ще има много нов материал за храносмилане. За голяма част от този материал, след като бъде комбиниран по начин, който изискват от вас, ще трябва да направите допълнителни връзки.

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

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

Joseph Weizenbaum, Computer Power and Human Reason

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

Компютъра е машина построена да действа, като домакин за тези части. Самия компютър може да прави само глупави прости неща. Причината да са толкова полезни е, че правят тези неща с невероятно висока скорост. Една програма може изкусно да съчетае огромен брой от тези прости действия, за да направи много сложни неща.

За някои от нас писането на компютърни програми е невероятна игра. Програмата е сграда на мисълта, тя е безплатна за изграждане и расте по-лесно с машинописни ръце.

Но без грижи, размера и сложността на дадена програма расте без контрол, объркваща дори човека, който я е създал. Поддържане на програми под контрол е основният проблем на програмирането. Когато работи дадена програма тя е красива. Изкуството на програмирането е умението да контролираме сложността. Голямото програмиране е покорено на простотата в неговата сложност.

Много програмисти смятат, че тази сложност се управлява най-добре с помощта на малък набор от добре разбрани техники в своите програми. Те са съставени от строги правила (най-добри практики), предписващи формата, която трябва да имат програмите и някои по-ревностни от тях ще кажат за тези, които отиват извън тази малка безопасна зона - грешно за програмисти.

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

Защо езикова материя

В началото при раждането на компютъра, не е имало езици за програмиране. Програмите са изглеждали нещо такова:

00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000

Това е програма за събиране на цифрите от 1 до 10 заедно и отпечатване на резултата: 1 + 2 + ... + 10 = 55. Тя може да се движи по един прост хипотетичен начин. За да може да програмирате на ранни компютри, е необходимо да се създадат големи масиви от ключове в правилна позиция или дупки в лента от картон с които да се храни компютъра. Вероятно може да си представите колко досадна и склонна към грешки е тази процедура. Дори написването на прости програми изисквало голяма интелигентност и дисциплина. Комплекс от тях е бил почти немислим.

Разбира се ръчното въвеждане на тези тайнствени модели на бита(единици и нули), подарява на програмиста дълбокото чувство, че е могъщ магьосник. И това е стойността по отношение на удовлетвореност от работата.

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

1. Store the number 0 in memory location 0.
2. Store the number 1 in memory location 1.
3. Store the value of memory location 1 in memory location 2.
4. Subtract the number 11 from the value in memory location 2.
5. If the value in memory location 2 is the number 0,
   continue with instruction 9.
6. Add the value of memory location 1 to memory location 0.
7. Add the number 1 to the value of memory location 1.
8. Continue with instruction 3.
9. Output the value of memory location 0.

Въпреки, че е неразбираема супа от битове, тя е и доста неприятна. На помощ може да използваме имена вместо цифри за инструкциите и местата в паметта:

 Set “total” to 0.
 Set “count” to 1.
[loop]
 Set “compare” to “count”.
 Subtract 11 from “compare”.
 If “compare” is zero, continue at [end].
 Add “count” to “total”.
 Add 1 to “count”.
 Continue at [loop].
[end]
 Output “total”.

Можете ли да видите как работи програмата в този момент? Първите две линии дават две места в паметта, техните изходни стойности: total ще бъде използван за изграждане на резултата от изчислението, а count ще следи броя. Линиите използващи compare са може би най-странните такива. Програмата иска да види дали count е равен на 11, за да спре да работи. Защото нашата хипотетична машина е доста примитивна, тя може да тества само дали даден номер е нула и да вземе решение (или скочи) въз основа на това. Така че, компютъра използва местоположението на паметта белязано с compare за да изчисли стойността на count - 11 и взема решение на базата от тази стойност. Следващите две линии добавят резултата към стойността на count и нарастване на count с 1 всеки път, докато програмата не реши, че count е равно на 11.

Ето я същата програма с JavaScript:

var total = 0, count = 1;
while (count <= 10) {
  total += count;
  count += 1;
}
console.log(total);
// → 55

Тази версия ни дава няколко подобрения. Най-важното е, че не е необходимо да уточняваме начина по който искаме програмата да скочи обратно и да продължи нататък. While-конструкцията се грижи за това. Той продължава да изпълнява блока (увит в къдрави скоби) под него, докато условието продължава да бъде вярно. Това условие е count <= 10, което означава, че count е по-малко или равно на 10. Вече не трябва да създаваме временна стойност и да я сравняваме докато стигне 0, което е безинтересна подробност. Част от силата на езиците за програмиране е, че те се грижат за безинтересните подробности вместо нас.

В края на програмата, след като while конструкцията е завършена, на console.log операцията се прилага резултата, за да го изпише като продукция.

И накрая, програмата може да изглежда и така, при условие, че има вградени удобни операции, като range и sum, които съответно ще създадат набор от цифри в рамките на диапазона и изчислят сумата от набора от цифри:

console.log(sum(range(1, 10)));
// → 55

Поуката от тази история е, че една и съща програма може да се изрази по дълги и къси, нечетливи и четливи начини. Първата версия на програмата е изключително неясна, докато тази последната е почти на английски: log на sum на range на номерата от 1 до 10 (Ще видим в следващите глави как да изградим операции като sum и range.)

Един добър програмен език помага на програмиста, като му позволява да говори за действията, които компютъра трябва да извърши на по-високо ниво. Той помага да пропусне безинтересните подробности и предоставя удобни градивни елементи (като while и console.log), позволява ви да дефинирате собствени градивни елементи (като sum и range) и прави блоковете лесни за композиране.

Какво е JavaScript?

JavaScript е въведен през 1995г., като начин за добавяне на програми в уеб страници в браузъра на Netscape Navigator. Езикът е приет от всички други големи графични уеб браузъри. Той направи съвременните уеб приложения възможни, с които може да се взаимодейства директно, без да се налага презареждане на страницата за всяко действие. Но той също се използва в по-традиционните сайтове за осигуряване на различни форми на интерактивност и интелигентност.

Важно е да се отбележи, че JavaScript няма почти нищо общо с езика за програмиране Java. Подобното име е вдъхновено от маркетингови съображения, а не от добра преценка. Когато JavaScript е бил въведен, езика Java е бил силен на пазара и е набирал популярност. Някой е помислил, че е добра идея да се опитат да се возят на този успех. Сега се е забил с името.

След приемането му извън Netscape, е написан стандартен документ, който да опише начина на работа на езика JavaScript, за да сме уверени, че различните части на софтуер, който претендира, че се подържа от JavaScript е всъщност един и същи език. Това е стандарта ECMAScript, ECMA е международна организация, която е направила стандартизацията. На практика ECMAScript и JavaScript могат да се използват, като взаимозаменяеми - т.е. две имена на един и същи език.

Има хора, които ще казват ужасни неща за езика JavaScript. Много от тези неща са верни. Когато за първи път написах нещо с JavaScript, аз започнах да го презирам.Той прие почти всичко, което написах, но го тълкува по начин напълно различен от това, което имах в предвид. Разбира се това има много общо с факта, че не съм имал представа какво правя, но съществува реален проблем тука: JavaScript е абсолютно либерален в това, което позволява. В действителност най-често прави намирането на проблеми в програмите по-трудно, защото системата не ги посочва. Идеята на този проект е да направи по лесно програмирането за начинаещи на JavaScript.

Тези недостатъци също имат своите предимства, все пак. Те оставят пространство за много техники, които са невъзможни с по-твърди езици и както ще видите (например в Глава 10) може да се използват за преодоляване на някои от тези недостатъци в JavaScript. След изучаване на езика правилно и работа с него известно време, разбрах, че всъщност харесвам JavaScript.

Има няколко версии на JavaScript. ECMAScript версия 3 е широко подкрепяна в момента на изчакване за доминиране на JavaScript, приблизително между 2000г.и 2010г. През това време е в ход работата по амбициозната версия 4, която планира редица радикални подобрения и разширения на езика. Промяната на средата на широко използван език по такъв начин се оказва политически трудно и работата по версия 4 е изоставена през 2008г., което води до много по-малко амбициозната версия 5, която излиза през 2009г. Сега сме в точката където всички основни браузъри поддържат версия 5 и тази книга ще се съсредоточи върху тази езикова версия. Версия 6 е в процес на финализиране и някои браузъри започват да подкрепят новите функции от тази версия.

Уеб браузърите не са единствените платформи, на които се използва JavaScript. Някои база данни, като MongoDB и CouchDB, използват JavaScript, като техен скриптов език и език за заявки. Няколко платформи за десктоп и сървър програмиране, най-вече на проекта Node.js (предмет на Глава 20) осигуряват мощна среда за програмиране с JavaScript извън браузъра.

Код и какво да правя с него

Code е текста, с който се правят програми. Повечето глави в книгата, съдържат доста от него. В моя опит, четене и писане на код са необходима част от обучението за програмиране, така че се опитайте не само да хвърляте поглед върху примерите. Прочетете ги внимателно и се опитайте да ги разберете. Това може да бъде объркващо в началото, но обещавам, че бързо ще свикнете с него. Същото важи и за упражненията. Не си мислете, че ги разбирате, докато не сте ги написали в работна среда.

Препоръчвам ви да пробвате вашите решения на упражненията в действителен JavaScript интерпретатор. По този начин, ще получите незабавна обратна връзка дали това, което правите е вярно и надявам се, ще се изкушите да експериментирате извън рамките на упражненията.

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

Ако искате да стартирате програми, от тази книга извън пясъчника на книгата, се изисква известно внимание. Много примери имат своя собствена стойност и могат да работят в която и да е JavaScript среда. Но кода в следващите глави е написан най-вече за определена среда (браузър или Node.js) и могат да работят само там. В допълнение, много глави дефинират по-големи програми, както и части от код, който се появява в тях и зависят от други програми или от външни файлове. Пясъчника на уеб-сайта предоставя връзки към архивирани файлове,съдържащи всички скриптове и файлове с данни, необходими за работа на кода в дадена глава.

Преглед на тази книга

Тази книга съдържа приблизително три части. Първите 11 глави, разглеждат самия език JavaScript. Следващите осем глави са около уеб браузъри и начина по който се използва JavaScript за програмиране. И накрая две глави са посветени на Node.js, друга среда за програмиране на JavaScript.

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

Езиковата част на книгата започва с четири глави за въвеждане в основната структура на езика JavaScript. Те обясняват контролни структури (като while, думата която видяхте във въведението), функции (писане на собствени операции), както и структури от данни. След това, вие ще бъдете в състояние да пишете прости програми. На следващо място, глави 5 и 6 обясняват техники за използване на функции и обекти, за да пишете по абстрактно код и да държите сложността под контрол.

След първия проект на първата част на проекта, тя продължава с глави за фиксиране и обработка на грешки, регулярни изрази (важен инструмент за работа с текстови данни), а на модулност - друго оръжие срещу сложност. В втория проект се заключава първата част на книгата.

Във втората част, глави от 12 до 19, описват инструментите, до които браузъра има достъп с JavaScript. Ще научите, как да показвате неща на екрана (глави 13 и 16), отговори на потребителски заявки (глави 14 и 18) и общуване по мрежата(Глава 17). Тука отново има два проекта в тази част.

След това, Глава 20 описва Node.js и Глава 21 изгражда една проста уеб система, като използва този инструмент.

Начин на записване

В тази книга текст написан с monospaced шрифта ще представлява елементи от програми, понякога те са самодостатъчни фрагменти, а по някога се отнасят до част от близка програма. Програми (от които вече сте виждали няколко), са написани както следва:

function fac(n) {
  if (n == 0)
    return 1;
  else
    return fac(n - 1) * n;
}

Понякога, за да покаже изхода, която една програма произвежа, очакваното производство е написано след нея с две наклонени черти и стрела в предната част.

console.log(fac(8));
// → 40320

Късмет!