Saturday, March 12, 2016

Գրքեր Lisp լեզվի մասին

Վերջին մի քանի տարիներին ես ակտիվորեն ուսումնասիրում եմ Lisp լեզուն, հատկապես նրա Common Lisp և Scheme տարատեսակները։ Եվ այդ ժամանակի ընթացքում հասցրել եմ ուսումնասիրել ավելի քան հարյուր գրքեր ու հոդվածներ՝ սկսած John McCarthy֊ի առաջին հոդվածից, վերջացրած Common Lisp֊ի ստանդարտով ու արհեստական բանականության մասին մենագրություններով։ Սակայն ես ուզում եմ այդ գրքերից առանձնացնել քանիսը, որոնք հատկապես կարևոր են Lisp լեզվի ուսումնասիրությունը սկսելու համար։

1. Practical Common Lisp, Peter Seibel ― հրաշալի գիրք է, գրված կենդանի լեզվով, առանց ավելորդ ճոռոմաբանությունների։ Բավականին շատ օրինակներով, որոնք բացահայտում են լեզվի բազմաթիվ հնարավարությունները և դրանց կիրառման առանձնահատկությունները։ Ազատ հասանելի է։ Մի քանի տարի առաջ թարգմանվել է նաև ռուսերեն՝ Практическое использование Common Lisp վերնագրով։

2. ANSI Common Lisp, Paul Graham ― Գրքի նախաբանում ասվում է, որ այն նախատեսված է Լիսպ լեզուն արագ ու հիմնավոր սովորելու համար։ Գրքի առաջին մասում մանրամասնորեն նկարագրվում են Լիսպ լեզվի հնարավորությունները, իսկ երկրորդ մասում՝ թվարկված և համառոտ նկարագրված է Common Lisp ստանդարտը։ Հեղինակը ՏՏ աշխարհի թերևս ամենահաջողակ մարդկանցից մեկն է։ Գիրքը նույն վերնագրով թարգմանված է ռուսերեն։

3. Common Lisp: the Language, 2nd ed., Guy Steel Jr. ― Այս գիրքը հենց Common Lisp ստանդարտն է։ Դրա ավելի քան 1000 էջերում մանրամասնորեն ու սպառիչ նկարագրված է լեզվի յուրաքանչյուր բաղադրիչ։ Լիսպ լեզվով աշխատելիս շատ օգտակար է մշտապես ձեռքի տակ ունենալ այս գիրքը։ Թարգմանված է ռուսերեն, սակայն հրատարակված չէ թղթի տարբերակով։ Common lisp: the Language գրքի և Common Lisp ստանդարտի հիման վրա պատրաստված է Common Lisp HyperSpec֊ը

4. Land of Lisp, Conrad Barski ― գծանկարներով ու ծաղրանկարներով հարուստ այս գրքում տարատեսակ խաղեր ծրագրավորելու օգնությամբ ու բավականին սրամիտ լեզվով պատմվում է Common Lisp լեզվի մասին։ Շատ հետաքրքիր գիրք է, հատկապես սկսնակների համար։

5. Common Lisp Recipes, Edmund Weitz ― Նոր եմ գտել այս գիրքը, դեռ չեմ հասցրել կարդալ։ Բայց բովանդակության մեջ քննարկված թեմաներից երևում է, որ շատ օգտակար ու հետաքրքիր նյութ է պարունակում։

Սկսելու համար թերևս այսքանը։

Monday, March 7, 2016

Ինչի՞ց սկսել Java լեզվի ուսումնասիրությունը

Իմ ընկերները, ուսանողները և ծանոթները, այն մարդիկ, ովքեր որոշել են սովորել ծրագրավորման Java լեզուն, հաճախ են հարցնում, թե ինչ գրքերից սկսել։ Ստորև ես հավաքել եմ այն մի քանի գրքերը, որոնք ինքս օգտագործել եմ (և օգտագործում եմ) Ջավա լեզվի հետ աշխատելիս։

1. Մի քանի տարի առաջ եմ հայտնաբերել Robert Sedgewick-ի, Kevin Wayne֊ի «Introduction to programming in Java», գիրքը, որը նախատեսված է Պրինստոնի համալսարանում ծրագրավորման սկզբնական դասընթացի համար։ Գեղեցիկ ու բազմազան օրինակներով, սխեմաներով ու պատկերներով հարուստ գիրք է։ (Վերջերս այս գիրքը վերահրատարակվել է՝ Java լեզուն Python լեզվով փոխարինված։)
2. Java 8. Руководство для начинающих, Герберт Шилдт ― հաջող գիրք է, հայտնի հեղինակը բավականին մանրամասնորեն շարադրում է Ջավա լեզվի վերջին տարբերակի հնարավորությունները։ Շատ հարմար է սկսելու համար։
3. Java 8. Полное руководство, Герберт Шилдт ― նույն հեղինակի մի ուրիշ գիրք, որն արդեն Ջավա լեզվի սպառիչ տեղեկատու է։ Այս գրքում կարելի է գտնել համարյա ամեն ինչ։
4. Java 7. Наиболее полное руководство, Хабибуллин Ильдар ― էլի լավ գիրք է, բայց սա ես խորհուրդ կտայի պարզապես ձեռքի տակ ունենալ, և եթե ին֊որ բան չես գտնում Շիլդտի գրքերում, նայել այստեղ։
5. Язык программирования Java SE 8. Подробное описание, Джеймс Гослинг, Гай Л. Стил և ուրիշներ ― հզոր գիրք է։ Հեղինակները հենց Ջավա լեզվի հեղինակներն են, ովքեր Ջավայի մասին գիտեն ամեն ինչ։
6. Java. Эффективное программирование, Блох Джошуа ― նորից հետաքրքիր գիրք է, որտեղ քննարկվում են Ջավա լեզվով ծրագրավորման առանձին հարցեր, առաջարկվում են հաճախ հանդիպող խնդիրների արդյունավետ լուծումներ։
7. Алгоритмы на Java, Седжвик Роберт, Уэйн Кевин ― իմ ամենասիրած գրքերից է։ Սա արդեն ոչ թե Ջավա լեզվի մասին է, այլ Ալգորիթմների իրականացման մասին է Ջավա լեզվի օգտագործմամբ։
8. Algorithms (4th Edition), Robert Sedgewick, Kevin Wayne ― նախորդ գրքի անգլերեն (օրիգինալ) տարբերակն է։
Բոլոր գրքերը կարելի է գտնել այստեղ։

Friday, March 4, 2016

GNU Emacs֊ի ևս մեկ ընդլայնում

GNU Emacs տեքստային խմբագրիչն իմ ամենօրյա աշխատանքային գործիքն է։ Դրանով եմ ես ծրագրեր գրում, նշումներ անում, OCR արված տեքստեր մաքրագրում և աշխատում իմ սեփական գրքերի ու գրառումների տեքստերի հետ։ Այս բոլոր գործերի մեծամասնությունը հայերեն տեքստերի հետ է կապված։ Եվ, բնականաբար, ինձ պետք է լինում ակտիվորեն օգտագործել Emacs-ի key-binding֊ները՝ ստեղնների համակցությունների հետ կապված գործողությունները։ Օրինակ, նոր ֆայլ ստեղծելու գործողությունը կապված է C-x C-f հաջորդականության հետ, որը նշանակում է․ «սեղմած պահել Control ստեղնը և հաջորդաբար սեղմել x և f ստեղնները»։ Սակայն անհարմարությունն այն է, որ Emacs֊ի բոլոր key-binding֊ները արված են լատինական (անգլերենի այբուբենի) տառերի համար, և հայերեն տեքստերի հետ աշխատելու ժամանակ, երբ մի որևէ գործ է պետք լինում անել, ես ստիպված եմ լինում փոխել ստեղնաշարը հայերենից անգլերենի, կատարել գործողութնունը (օրինակ, պահպանել ֆայլը, նշել տեքստի հատվածը և այլն), ապա վերադառնալ հայերեն դասավորությանն ու շարունակել իմ գործը տեքստի հետ։

Խմբագրման և գործողությունների հետ կապված անհարմարությունները լուծելու համար ես որոշեցի Emacs֊ի key-binding֊ները լրացնել նաև հայերեն տարբերակներով։ Այսինքն, ես ուզում եմ իմ .emacs ֆայլում ունենալ լատիներեն key-binding֊ներից հայերենի արտապատկերող մի այսպիսի արտահայտություն․
(armenian-keys 
 '(("C-x C-f" . "C-ղ C-ֆ")
   ("C-x C-s" . "C-ղ C-ս")
   ("M-w" . "M-ո")))
որում armenian-keys ֆունկցիան ստանում է կետով զույգերի (dotted pair) ցուցակ, որի տարրերից առաջինը արդեն գոյություն ունեցող համակցությունն է, իսկ երկրորդը դրա հայերեն համարժեքը, որը պետք է ստեղծել։

Արդեն գոյություն ունեցող key-binding֊ները պահվում են current-global-map ֆունկցիայի վերադարձրած օբյեկտում։ Ինձ հետաքրքրող key-binding֊ը վերցնում եմ lookup-key ֆունկցիայով, և global-set-key ֆունկցաիյով կապում եմ հայերեն համակցությանը։

armenian-keys ֆունկցիան սահմանել եմ հետևյալ կերպ․ այն անցնում է տրված ցուցակի տարրերով և ամեն մի զույգի համար կատարում է վերը թվարկված գործողությունները։
(defun armenian-keys (kml)
  (let ((cgm (current-global-map)))
    (dolist (e kml)
      (let ((en (kbd (car e)))
            (hy (kbd (cdr e))))
        (global-set-key hy (lookup-key cgm en))))))
Հիմա ես կարող եմ առանց ստեղնաշարը փոխելու օգտագործել ինձ հարկավոր գործողությունները։