четвъртък, 12 февруари 2009 г.

Защо Javascript е истински език?

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

Да се върнем към фундаментът. Какво е компютърът? Изчислителна машина! Ок. Ето как бих обяснил компютърното програмиране на човек който няма почти никакъв досег с компютър(т.е. няма предразсъдъци относно какъв е процесът):

"Компютърът е машина, която е неспособна да прави каквото и да било. Работата на програмистът е да я научи как да се "преструктурира" във специализирана машина, която да извършва точно определена задача".

И ето поясненията: Компютърът наистина е безполезен без софтуерът. А какво е наистина софтуерът? Това е описание на някаква машина.

def fib(n):
if n==0:
return 1
else:
return n*fib(n-1)

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

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

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

Когато погледнем на нещата от този ъгъл, осъзнаваме че подробностите имат отношение само към конкретния проблем който решаваме. И да отречеш даден подход напълно, или да проявиш липса на разбиране и арогантност към определен дял от изкуството е равносилно на неразбиране на фундаментът. Или по конкретно, ако смяташ че уеб програмирането не е истинско програмиране, защото не можеш да продуцираш .exe файл, проявяваш невежество. Не е важно дали създаваш .exe или .sh или .py и дали кодът ти се компилира или интерпретира за да определиш дадено програмиране като истинско, а друго като нещо тотално различно. Това са подробностите които зависят само от конкретния проблем. Ако пишеш десктоп програми за уйндолс, ползвай C++ или C# и продуцирай .exe-та, ако искаш да организираш цялата информация на планетата създай мега-сървър, използвайки JVM като платформата ти, ако искаш да напишеш инсталатор за библиотеката ти, използвай bash... Не можеш да кажеш че само .exe файловете са истински софтуер, това е глупаво и най важното: НЕ Е ВАЖНО. Или поне не е най- важното. Отново повтарям: Това е просто детайл свързан със специфичния проблем който се решава.

Каква е разликата между scheme интерпретатор написан на С и Scheme интерпретатор написан на Scheme? Едното е по бързо от другото, да, но това е само подробност. Ако погледнем на нещата от по високо, разбираме че единствената разлика са детайлите, всъщност това че едното е .exe а другото е .scm няма никакво значение, и двете се подчиняват на което и да е определение за софтуер. Всъщност дори и интерпретаторът да беше написан на Javascript и да работеше в браузарът, пак нямаше да има значение, защото кодът просто описва машина, която върши действие, няма нищо магическо в .exe файловете, те са просто друг формат. Няма нищо срамно в това интерфейсът ти да е написан на HTML, вместо на QT, резултатът е същия, просто едното е в табче във firefox, а другото е в собствен прозорец. Въпросът е да си свършиш работата!

Едно от най важните неща които всеки програмист трябва да научи е кои детайли да гледа, и кои да игнорира. Това на каква платформа работи приложението ти има значение, но то не е фундаментално.

Няма коментари:

Публикуване на коментар