2010/05/03

Аниагийн дөрвөн асуулт ба нэг сэтгэгдэл

Нөхрийн гарын үзүүрээр сараачиж шийдсэн бодлогыг уншаад Anonymous буюу нэгэн аниа ийнхүү асуусан байв.
- логик болон функционал програмчлал гэдгээ дэлгэрэнгүй тайлбарлавал?
- юуг програмчлах гэж байгаа юм бэ?
- юунд хэрэгтэй эд вэ?
- боломжууд нь?

надад сонирхолтой байна л даа
Аниагийн тун товч дөрвөн асуулт нэг сэтгэгдлийг уншаад уг хариулах зүйтэй хүн маань завгүй үе нь таарч, угийн тавтиргүй миний завтай үе таарч хариулах гэж оролдсон чинь үгийн тоо нь хэтэрч гурван хэсэг салсан юм болсон бөгөөд нөхөр үзээд тусад нь тэрлэ гэж зөвлөсний дагуу үүнийг бичив.
Уг бодлогыг нөхөр цахим заавар бичиж тавин таван мөрөнд багтааж шийдсэн байгаа юм. Тэрнээс арван мөр нь тайлбар, таван мөр нь сул зай бөгөөд тэднийг хасаж тооцохоор цаана нь ердөө гучин есөн мөрөнд л шийджээ. Дөчин нэг ч юмуу,,

Би энэ бодлогыг шийдэх гэж оролдсон бол лав түүнээс хэд дахин богино мөрөнд багтааж болох ч баталгаатай хэд дахин худлаа шийдэх нь найдвартай :). Уул нь ингээд логик програмчлалын талаарх бүх асуултанд хариулчихаж болохоор боловч уншигч авхайг уйдаахгүйн үүднээс хэдэн мөр нэмье. Эхний асуултанд энэ бичлэгээр хариулахыг оролдоё. Хоёр дахь асуултын хариу нь энэ тэрлэлд өөрт нь байх шиг байна гэж би бодож байна. Уг даалгаварыг та хэрэв цахим заавар (код) бичдэг бол өөр хэл дээр бичих гээд үзэх хэрэгтэй. Жишээ нь жаава, с, с++, с# дээр ч юм уу. Бичиж чадаад амжилттай шийдсэн бол тэрэнд зарцуулсан өдөр хоног, бичвэрийн мөрийн дугаар бас хэр их хөлс дуслуулсан бэ гэсэн харьцуулалт хийх нь зүйтэй. Ингэвэл бараг гурав дахь асуултанд нь хариулчих байх.

Гэхдээ их зан гаргалгүйгээр нэг, гурав болон дөрөвдүгээр асуултанд нь тодорхой хариулахыг хичээе. Цэнхэр гариг дээр хэрэглэгдэж байгаа програмын хэлүүдийг өөр өөр өнцгөөс нь харж янз янзаар ангилсан байдаг.
Жишээ нь C, Java, Python, гэсэн хэлүүд бол imperative буюу тушааж захирсан бичлэгтэй програмын хэлний төрөлд орно. Эдгээр хэл дээр та нэг үйлдэл хийдэг функц бичсэн байг гэж бодоход, хэрэв уг функц өөрт нь дамжуулж өгсөн өгөгдөлтэй хамтарч өөр үйлдэл хийх, эсвэл тэр өгөгдлөө өөрчлөх, шинэ юм гаргах, цааш нь дамжуулах гэх мэт дурын юм хийж болно. Гэвч зарим хүмүүс ингэж "дурын өөрчлөлт хийдэг" функцэд дургүй байдаг. Ийм дурын өөрчлөлтийг гол чухал юманд дээрээ хийвэл улс ч гэсэн эвгүй байдалд орж байгааг бидний монголчууд хангалттай амсаж байгаа байх. Тэдгээр дурын өөрчлөлтөнд дургүй хүмүүс уг функцийг тодорхой дүрмийн дагуу бичдэг. Жишээ нь Эрланг хэмээх функциональ хэл дээр ямар нэгэн хувьсагчид нэг л утга өгсөн бол тэрний утгыг хэзээ ч өөрчилж болдоггүй. Ингэснээр энэ хувьсагч ийм л утгыг насаараа тээж явна гэдэгт цахим заавар бичигч хүн итгэлтэй байдаг. Тийм хэл дээр функц бичсэн бол тэр функц нь ийм утга оруулахаар ийм утга буцааж өгнө гэсэн дүрмээ яс барьдаг. Ийм функцийг өөр функцтэй давхар залгаж бас нэг функц үүсгэж болдог. Энэ нь яг математикийн томъёогоор бичсэн юм шиг л ажилладаг. Нэгж функц нь нэг үүргээ л яг биелүүлдэг бол бичиж байгаа хүн нь уг функцдээ тэгтлээ итгэлтэй байдаг учраас өөр функцтэй дуртайяа хольж, нийлүүлж, хавсарч, тэр байтугай өөр функцийн оролт болгож дагуулж өгч болдог. Ингэж ажиллаж байгаа хэл бол функционал хэлний нэг гол шинж.

Тушааж захирсан хэл нь дуртай тушаалаараа дурын өөрчлөлт хийдэг байхад, функционал хэл нь юмнаас ирсэн юмыг өөрчилж юм болгоод цааш нь дамжуулдаг байх жишээтэй. Тушааж захирсан ууртай хэлэн дээр ч функционал маягаар бичиж болно. Гэхдээ дунд нь та нэг тушаагаад өөрчлөгдөх ёсгүй юмыг өөрчилчих юм бол цаашаагаа дамжигдахдаа асар их өөрчлөлт үзүүлэх нөлөө үүсгэж байгаа юм. Хамгийн гоё нь тушаасан хэл дээрх функц нь зөвхөн тэр тушаалдаа л таарсан гүйцэтгэл хийдэг учраас, хэрэв та өөр тушаал хийх болохоороо нөгөө функцээ дахиж ашиглах боломж тун бага, заримдаа бүр боломжгүй болдог. Функциональ хэлний функц гаднах орчноосоо тэгж их хамаардаггүй болохоор оруулах гаргах хоёр нь таарч байвал хаана ч хамаагүй , хэд ч хамаагүй дуудаж хэрэглэж болдог учраас энэ хэл дээр бичигдсэн бичлэг нь ууртай хэлнээсээ хэд дахин цөөхөн бичлэг агуулж байдаг нь бараг ёс болчихсон билээ. Логик хэлний бүтэц нь энэ хоёроос арай өөр. Гэхдээ логик хэлээр функционал бичиж болдог. Логик хэлийг тоглоом бичиж байгаа хүмүүс ар талын шийд гаргах, бяцхан тархи бэлдэх, хэцүү бүтцийг задлаж салгаж хувиргах зэрэгт маш их хэрэглэдэг. Байгаа бүх бодит нөхцлүүдийг нь бэлдэж өгөөд дараа нь хүнээс асууж байгаа юм шиг асуух юмуу шийдэл шаардахад нөгөөх нь олон дахин туршиж үзсэн хүн шиг яг сайхан хариулт өгдөг энэ хэрэглээ нь логик хэлний хамгийн том хүч нь юм.

Ийм шийдлийг тоглоомны завсар нөхцөл байдлаасаа хамаараад янз бүрээр асуух хэрэг гарна, тэр болгоныг та ууртай хэлэн дээр бичих гээд үз л дээ? мянга дахин их болно, мянга дахин хүч зарна, аягүй бол сэтгэлээр унана, тэгээд архинд орж ч магадгүй. Магадгүй нэг сульдаа болсон нөхөр цагаан мах нь гараад цагиралсан нүүртэй юм "би чадчихлаа" гэж дуугарч болох л юм, тэгэхээр нь асуултандаа нэг үг нэмсэн нөхцөл өөрчлөөд чадах уу гээд асуугаад царайг нь ажиглавал цайж ирж ажилласнаа цаашаагаа пид гээд унах вий :).
Логик болон функциональ хэлүүдийн боломж нь тус тусын салбартаа янз бүр. Эрланг хэлэн дээр хийгдсэн системдээ байгууллага нь ерэн ес гэж таслал тавиад ард нь долоон ширхэг есийн тоо тавьсан найдварын баталгаа гаргаж өгдөг байхад ууртай хэлэн дээр тийм баталгаа хийх нь бүү хэл алдаа бол програмын нэг сайжруулах үндэс гэж бараг найз маягийн юм ярьж явдаг онолтонгууд хүртэл байна. Алдаатай бичигдсэн функционал хэлэн дээр алдаа олох хугацаа нь ууртайгаас маш хурдан. Ууртай хэлэн дээр алдаа олох хэцүү. Яагаад гэвэл функц болгон нь ууртай догшин юм болгоныг эвдэлж нураачих гээд байдаг болохоор. Чингисийн үед монгол улс функционал байсан гэж ойлгож болно :).
Мэдээж шал хэрэггүй ууртай хэл оршиж байгаа бус, дошин дээрээ томордог үе уг хэлэнд бас бийг бодох хэрэгтэй. За ингээд хувийн хүндрэл, хүчтэй суутнуудын үгийг өөрийн юм шиг хольж хутгаад байтал анхны сэдвээсээ халихаас гадна бичсэн тэрлэлээсээ тэнэсэн урт болох аюултай болчихлоо.

Анхлан сонирхож байгаа хүнд энэ зэргийн хариу барихад болох байх гэж бодов. Түүнээс биш хоосноос гэрэл үүсгэж байгаа юм шиг гэнэт ламбАда функц үүсгээд усан дээр чулуу ойлгож байгаа юм шиг уг функцээ өгөгдлийн цуваан дээр өнхрүүлж бүгдэд нь халдаах гэх мэт сонин хачин мэргэжлийн нэр ус ороод ирэхээр (lambda calculus) би ч гэсэн амьсгаа давчдаад нүд харанхуйлаад явчихдаг юм. Энэ удаад та бага ч гэсэн гэрэл харсан байгаасай гэж найдъя.

6 comments:

  1. тайлбарласанд баярлалаа.
    үүнээс дэлгэрэнгүй тайлбар гэж юу байх вэ дээ.

    гэхдээ нэг хүсэлт байна.
    яг юунд хэрэгтэй юм бэ?
    жишээ аваад өгөөч.

    төвөг удаж ойлгохгүй байгаа бол уучлаарай аниагаа

    ReplyDelete
  2. Хэрэглэх талбар нь бүх хэлэн дээр адилхан. Та өөрийнхөө төсөлдөө ууртай ч бай функционал ч бай эсвэл бүр харь гаригийн лисп хэлийг ч гэсэн та сонгож асуудлаа шийдэж болно. Тэгвэл эдгээр хэлүүд бүгдээрээ таны хэрэгцээг хангаж өгнө (гэхдээ янз бүрийн хугацаанд, янз бүрийн чанартайгаар). Хэрэгтэй гэдэг үгийг та ялгаа гэдэг үгээр солиод асуугаад үзэхээр хэрэгтэй нь илүү тодорч магадгүй. Бүгд л адилхан хүндрэл шийдэх гэсэн хэлүүд шүү дээ. Гол нь өөр хоорондоо тэс ондоо зарчимтай ажилладагтаа л ялгаа нь байгаа юм. Ууртай хэлэнд их нэвчсэн хүн функциональ хэлийг сурахад их хэцүү хүндрэлтэй тулгардаг. Гахай хариулж уураа барсан юм шиг шал өөр нүдээр харж сэтгэхгүй бол ажиллахгүй гэсэн үг. Харин нэг функциональ уруу орсон хүн буцаж ууртай руу бараг ордоггүй. Гол нь хүндрэлдээ биш хүндээ байж болох юм. Үлгэрлэвэл баатар хүн нэг сэлмийг хоёр гараараа цавчиж байгаад дараа нь нэг гараараа цавчаад сурчихвал энэ нь өөрт нь илүү үр дүнтэй санагдаж магадгүй ( нөгөө гараараа хоол идэж байж болно ш дээ). Тэгээд энэ сурсан аргаа өөр юунд ч хамаагүй хэрэглэж болно :). Гүүгл ахаас prolog usage, functional language usage гэх мэтээр лавлаад үз. Ууртай хэлтэй хүн функциональ уруу умбаж үзэхээс нааш энэ асуултуудыг тавьсаар байдаг нь түгээмэл. Тийм болохоор та оролдоод үзээч гэж зөвлөмөөр байна. Оролдож байх завсраа та хийж байгаа зүйлээ ууртай хэлэн дээр яаж хийх вэ гээд бодоод үз. Заримдаа ууртай хэлэн дээр санаанд ч багтахааргүй зүйлийг хөнгөхөн хийж байгаагаас та юунд хэрэгтэйг нь харах болно.

    ReplyDelete
  3. Гоё бичжээ. Хөгжилтэй юм.

    ReplyDelete
  4. google ийг хүмүүс яагаад гүүгэл ах гэж хэлээд байдаг юм бол?
    гүүгэл эгч байж болоогүй юм байхдаа.

    эсвэл үүсгэн байгуулсан хүмүүс нь эрэг-тэй болохоор нь тэгсэн юм бол уу?
    аан хэрвээ эрэг-гүй хүмүүс үүсгэсэн бол гүүгэл эгч гэх байсан бол уу?

    Нацаг ах юу гэж бодож байна?

    ReplyDelete
  5. Би дөнгөж сая энэ хуудас уруу орж Ринчен гуайд хэмх загнуулчихсан уруу царайтай уравгар юм сууж байтал Аниагийн дээрх асуулт ирлээ. Бодоод байсан чинь нанхиад юмуу солонгос кинон дээрх ахчилах маягийн махчилсан дууриалал болсон хэллэг хэрэглэсэн байжээ, би. Соёлт хүний ёсоор гүүгл гуай гэж авгайлахаар шийдсэн даруйдаа энэ хариуг баръя даа.

    ReplyDelete
  6. Өмнө өгүүлсэн хуудасны хаяг ардаа " гэсэн тэмдэгтай залгагдаад заасан хаяг уруу зөв орсонгүй. Та энд дарж зөв орно уу.

    ReplyDelete