01 август 2008

Указатели и рекурсия

Да погледнем няколко имена. Гуидо ван Росум, Ричард Столман, Робърт Морис. Какво е общото при тях освен че са известни хакери?Всички знаят добре С и вероятно знаят и lisp добре. Гуидо създава собствен език който днес е един от най- популярните, по случайност е написан на С, Ричард Столман пише gcc, а робърт морис е известен с това че е създал първия интернет червей и че е открил Buffer overflow. В същото време в компанията в която е бил партньор и един от главните хакери, се е разчилато много на lisp и C. Тези езици са почти противоположни във философийте си. C е език който приляга перфектно към Вон Ноймановия модел на изчисление, езикът е тясно свързан с архитектурата на която работи, а именно Вон Нойманова машина. Lisp от друга страна е абстрактен модел на излисление. Езиците са противоположни в скалата. Някъде из блоговете прочетох едно мнение което ми се стори интересно:

(цитиране и превод по памет)

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

Това ми се стори интересно, вече знаех че за да си наистина добър хакер трябва да знаеш C, също така знаех че ако знаеш lisp ще можеш да прилагаш много идеи във програмите си, дори и да не използваш тези езици, ако разбираш как работят те, най вероятно си достатъчно умен за да си хакер. Такъв смисъл тези езици са един вид тестове, ако не успееш да ги разбереш добре, най вероятно си с недостатъчен багаж. Това е логиката от нещата които чета за тях. Ако не можеш да разбереш указателите на С, няма да разбираш как работи езикът който използваш, който най вероятон е написан на C, а ако не е, езикът на който е написан езикът ти е написан на С. А ако не разбираш Lisp(по скоро ако не можеш да разбереш лисп) значи не можеш да разбереш моделът му за справяне със сложноста. Това е основата на софтуерното инжинерство, управлението на сложноста, впрягането на всички начини и абстракций, които са практично приложими, за да може сложноста на проблема ти да бъде разделена, и обхваната от решението ти. Знам малко lisp, все още го уча, и най вероятно ще го уча доста дълго, защото не е главния ми език, знам и още по малко С, но със сигурност ще направя опит да овладея до колкото мога и двата езика в някой момент. Ако не си сигурен дали ставаш за програмист, напиши компилатор на С, или имплементирай интерпретатор в lisp, или и двете. Едва ли в практиката някога ще използвам С, или някой от другите С-та със заковани допълнителни крака,известния цитат за С++, който е октопод, създаден като се заковават допълнителни крака на С, същото се отнася и за джава, и обджектив-С и С# и може би дори и D, въпреки че не съм чувал лоши неща за този език все още. ще науча С, поради причината за която се учи латински, същото е и с лисп, лисп вече ме прави по добър python програмист, c++ едва ли ще ме направи по добър, или поне едва ли по добър от С. По моето мнение това е пътят на хакера. Започваш със прост скриптов език, който ти помага да си свършиш работата на бързо, изграждаш си арсенал с трикчета и познания за езика, след това научаваш сериозната теория за компютърните науки(указатели и рекурсия) и вървиш към нирвана.

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