அல்கோரிதம் – அடுக்குகளை தலைகீழ் படுத்துவது எப்படி ?

Move 1,2,3 disks from peg #1 to peg #2, with peg #3 as intermediate. Move disk 4 from peg #1 to peg #4. Then move all disks from peg #2 to peg #3 using peg #1 as intermediate.

இந்த வாரம் அமெரிக்காவில் “long weekend” அதாவது மூன்று-நாள் வார விடுமுறை – காரணம் மே மதம் நான்காம் திங்கள் “Memorial day” என்கிற “அமெரிக்க போர்வீரர் நினைவு தினம்”. இதனை ஒட்டி சராசரி குடும்பங்கள் நாடெங்கும் உல்லாச பயணம், சுற்றுலா என்று செல்வது அமெரிக்க பண்பாடு. இந்த ஆண்டு எங்கள் வீட்டில் விருந்தினரை வரவேற்கிறோம் – பயணம் என்பது இந்த ஆண்டு எங்கள் விருந்திரனுக்கு மட்டுமே! சரி அப்போது ஒரு புதிய தரவமைப்பு பற்றி ஒரு blog post போடுவோம் என்று எழுத ஆரம்பித்தது இங்கே.

அடுக்கு (Stack) என்பது ஒரு மிக அடிப்படை கணினி நிரலாக்க கோட்பாடு. ஒரு அடுக்கு தரவமைப்பில் செய்யக்கூடிய நடவடிக்கைகள் ஆனது : மேல் நுழை (push), மேல் நீக்கு (pop) என்பது.

ஒரு அடுக்கை இப்படி (கீழ் கண்டபடி) உருவாக்கலாம்:

எ = அடுக்கு()
மேல்_நுழை( எ, "அ" )
மேல்_நுழை( எ, "ஆ" )

இது கணினியில் ஒரு அடுக்கு போலவே உருவெடுக்கும்,

    
   --> [ ஆ ]
       [ அ ]
      --------
அடுக்கு "எ" என்பதில் இரண்டு உருப்படிகள் உள்ளது; 
இதில் "மேல்" உருப்படி "ஆ" என்ற மதிப்பாகும்.

மேலும் இந்த அடுக்கில் மற்ற உயிரெழுத்துக்களை முழுதாக சேர்க்கலாம்:

மேல்_நுழை( எ, "இ" )
மேல்_நுழை( எ, "ஈ" )
மேல்_நுழை( எ, "உ")
மேல்_நுழை( எ, "ஊ")
மேல்_நுழை( எ, "எ")
மேல்_நுழை( எ, "ஏ")
மேல்_நுழை( எ, "ஐ")
மேல்_நுழை( எ, "ஒ")
மேல்_நுழை( எ, "ஓ")
மேல்_நுழை( எ, "ஔ")

கணினியில் இதன் தோற்றம் இப்படி இருக்கும்,

   --> [ ஔ ]
       [ ஓ ]
       [ ஒ ]
       [ ஐ ]
       [ ஏ ]
       [ எ ]
       [ ஊ ]
       [ உ ]
       [ ஈ ]
       [ இ ]
       [ ஆ ]
       [ அ ]
அடுக்கு "எ" என்பதில் பன்னிரண்டு உருப்படிகள் உள்ளது; 
இதில் "மேல்" உருப்படி "ஔ" என்ற மதிப்பாகும்.

நம்ம இங்கே ஆயுத எழுத்து “ஃ” என்பதை சேர்க்கவில்லை; உங்களுக்கு வேண்டுமானால் நீங்கள் சேர்த்து கொள்ளலாம்.

அடுக்கின் வரிசை மாற்றுவது எப்படி ?

இப்போது அடுக்கு “எ” இதன் வரிசை மாற்றுவது எப்படி ? ஒரு குவிப்பில் இருந்து “மேல் எடு” என்று செய்தால் என்ன விளைவு என்று முதல் படியாக பார்க்கலாம் – இதன் விளைவு மேல் உள்ள உருப்படியை அழிக்கும்.

மேல்_எடு( எ )
# தற்போது குவிப்பு 'எ' வில் 11 உருப்படிகள் மட்டும் இருக்கும்.
# ஏற்கெனவே உள்ள மேல் உருப்படி 'ஓ' அழிக்கப்பட்டது.
# புதிய மேல் உருப்படி 'ஓ' என்று ஆனது.

இப்போது இந்த அடுக்கின் நிலை,

 -->   [ ஓ ]
       [ ஒ ]
       [ ஐ ]
       [ ஏ ]
       [ எ ]
       [ ஊ ]
       [ உ ]
       [ ஈ ]
       [ இ ]
       [ ஆ ]
       [ அ ]
அடுக்கு : எ 

இப்போது அழித்த மேல் உருப்படியை புதிய அடுக்கு ‘ஏ’ வில் மேல் நுழைத்தால் – அதையே ‘எ’ என்ற அடுக்கில் உருப்படிகள் உள்ளவரை அதில் மேல் எடுத்து, ‘ஏ’ வில் மேல் நுழைத்துக்கொண்டே இருந்தால் என்ன ஆகும் ?
இதனை நிரல் படுத்தி பார்க்கலாம்.

ஏ  = அடுக்கு()
மேல்_நுழை( ஏ, "ஔ")
@( நீளம்( எ ) > 0 ) வரை 
    மதிப்பு = மேல்_எடு( எ )
    மேல்_நுழை( ஏ, மதிப்பு )    
முடி

தற்போது அடுக்கு ‘எ’-வின் நிலை காலியானது:

 -->[ ]
அடுக்கு : எ 

ஆனால் அடுக்கு ‘ஏ’-வின் நிலையோ – வரிசை மாற்றப்பட்டது!

-->[ அ ]
   [ ஆ ]
   [ இ ]
   [ ஈ ]
   [ உ ]
   [ ஊ ]
   [ எ ]
   [ ஏ ]
   [ ஐ ]
   [ ஒ ]
   [ ஓ ]
   [ ஔ ]
அடுக்கு : ஏ 

இந்த நிரல் துண்டு Python மொழியில் இப்படி எழுதலாம்,

# (C) 2017 Ezhil Language Foundation
# This code is shared under public domain
# Ref: https://ezhillang.wordpress.com
import tamil
import pprint

class Stack:
    def __init__(self):
        self.store = list()

    def top(self):
        return self.store(-1)

    def __len__(self):
        return self.store.__len__()

    def push(self,val):
        self.store.insert(-1,val)

    def pop(self):
        val = self.store.pop()
        return val

    def display(self):
        pprint.pprint(list(zip(range(self.__len__()-1,0,-1),self.store)))
        
a = Stack()
for letter in tamil.utf8.uyir_letters:
    a.push(letter)
a.display()

rev_a = Stack()

while len(a) > 0:
    val = a.pop()
    rev_a.push(val)

print("Original stack => ")
a.display()
print("Reversed stack => ")
rev_a.display()

இதன் வெளியீடோ கீழே உள்ளபடி:

[(11, 'ஆ'),
 (10, 'இ'),
 (9, 'ஈ'),
 (8, 'உ'),
 (7, 'ஊ'),
 (6, 'எ'),
 (5, 'ஏ'),
 (4, 'ஐ'),
 (3, 'ஒ'),
 (2, 'ஓ'),
 (1, 'ஔ')]
Original stack => 
[]
Reversed stack => 
[(11, 'ஔ'),
 (10, 'ஓ'),
 (9, 'ஒ'),
 (8, 'ஐ'),
 (7, 'ஏ'),
 (6, 'எ'),
 (5, 'ஊ'),
 (4, 'உ'),
 (3, 'ஈ'),
 (2, 'இ'),
 (1, 'ஆ')]

எழில் எங்கே போகிறது ?

ezhil_March1_2017.png
படம் :  திருத்தியுடன்  எழில் மொழி  செயலி; நிரல் இடது பக்கம், இயக்கிய வெளியீடு வலது பக்கம். சாளரத்தின் கீழ் இயக்கிய விவரம். இந்த செயலி எழில் படிக்க உதவும்.       (c) 2017 எழில் மொழி அறக்கட்டளை.

 

“எழில் மொழியை எப்படி வெளியீடு செய்வது ?” என்று சப்பென்று தலைப்பை வைத்து மேலும் ஒரு பதிவை எழுதலாம் என்று தொடங்கினேன். அனால் இன்று எனக்கும் பொறுமைக்கும் நீண்ட தூரம் ஆயிற்று. நம்ம மண்ணில் ஜே.கே. போன்றவர் இருந்ததாக கேள்வி, என்னமோ அவர் ஆசியில் ஒரு தலைப்பு. சில வெளிப்பாடுகள் அதுவாக வரவேண்டும், ஸ்வயம்பு போல.

“ஆளே இல்லாத கடையில ஏண்டா டீ ஆத்தூர்?” நக்கலுக்கு தமிழ் எந்த மொழியிர்க்கும் சளச்சது இல்லை. சிலர் நேரில் என்னை, சற்று வெகுளி தனமாக – இங்கு அமெரிக்காவில் முதல் தலைமுறை தமிழர் (எழுதவோ, நல்லா பேசவோ சாகஜமாக வராதவர்) – “ஏன் நீங்கள் தமிழில் மென்பொருள் ரீதியில் செயல்படுகிறீர்கள்” என்று கேட்டார்; என்னமோ செவ்வாயில் குடிபுகுவது போல நான் செய்யும் வேலைகள் எனது நண்பர்களிடமும், முகம் அறியா இணைய நபர்களிடமும் தெரியும். தமிழில் செயல்படுவது எனது சுய உறிமை, சில நேரம் பெருமை, தன்னிரக்கம், அகராதி என்றும் பலர் கூறலாம்; ஆனால், அதில் சமூக பொறுப்பு, அறிவியலாளரின் சமூக பார்வை, அறிவியல் மொழி வளர்ச்சி, தேடல், தொழில்நுட்ப கண்டெடுப்பு, தியானம் போன்ற நுட்ப்பமான  விஷயங்களை மறந்து விடுவார்கள். சில நேரங்களில் எழில் எங்கே போகிறது என்று எண்ணுவேன்; ஆனால் முதலில் அந்த எட்டு வயது குழந்தைகள் நிரலாக்கத்தை தமிழ் வழி கற்பிக்கும் பொது தமிழ் கணிமை உலகம் நாம் அனைவரும் கூடி கண்ட வெற்றி என்பதில் ஐயமில்லை.

எழில் மொழி என்பது பல ஆண்டுகளாக  நான் செய்து வருவது; இதனை முழுமையாக 2013 ஆண்டில் பொது வெளியீடு செய்து இந்நாள் வரை பத்து பங்களிப்பாளர்கள் தங்கள் நேரத்திற்கும், அறிவிற்கும் லாபம் பொருட்படாமல் பங்காளித்துள்ளனர். தமிழ் நெஞ்சங்கள் எங்கும் ஆதரவு அளித்துள்ளனர். அனால் இவர்களின் வேலைகளும் எழில் மொழியில் இலக்கான சிறுவர் கணிமை கற்றலுக்கு கொண்டு சேர்க்க முடியவில்லையே என்று எனக்கு பல நாட்கள் தூக்கம் தொலைந்து போனது.

சமீபத்தில் சில மாறுதல்கள்; எழில் கிட்ஹப்-இல் இருந்தாலும் இதனை ஒரு முழுமை அடைந்த மென்பொருளாக கொள்ள முடியாது. மென்பொருள் என்றால் அதற்க்கு பயனாளர்களின் தேவைகளையும், அவசியமான பயன்பாட்டுகளையும் பூர்த்தி செய்ய வேண்டும். சும்மா மூல நிரலை மூஞ்சியில் விட்டு எறிஞ்சால் யாருக்கும் பயன்படாது.  என்னமோ கோவத்தில் எழுதி விட்டதாக நீங்கள் தப்பாக எடுத்துக்கொள்ள வேண்டாம். சுய விமர்சனமாக எனக்கு கொள்ளுங்கள்.

எழில் மொழியை கடைசி end-user பயனாளர்கிடத்து சேர்த்தால் என்பது என்னுடைய பொறுப்பு என்று ஒரு மூன்று ஆண்டுகளாக உணர்ந்து வருகிறேன். இதனை சிறப்பாக செய்ய எனக்கு ஒரு போர் படை தேவை. பத்து பேர் இருக்கிறார்கள் மீதி வாருங்கள்.

எழில் மொழியில் உள்ள “installer” திரட்டியில் இவை இடம் பெறவேண்டும் என்று எனக்கு தற்சமய நிபந்தனை:

  1. Platform Support: இயங்கு தளங்களில் வேலை செய்ய வேண்டும்:
    1. Windows 64, 32 bit
    2. Linux 64
  2. திரட்டியில் வேண்டியவை : Installer package
    1. எழில் மொழி திருத்தி ; இதனை ‘ezhuthi’ (எழுதி) என்று pygtk-இல் இங்கு இங்கு வடிவமைத்து வருகிறேன்.
    2. எழில் மொழி ezhil module python library
    3. தமிழில் நிரல் எழுது புத்தகம்
    4. தமிழில் நிரல் எழுது புத்தகம் பயிற்சி நிரல்கள்
    5. மேல் நிலை எழில் எ.கா. உதாரணங்கள்
    6. பாடம், ஆசிரியர்களுக்கு உண்டான காணொளி, கேள்வி தாள், வினா-விடை பாட திட்டம்.
  3. பரிசோதனைகள்
    1.  மொத்தமாக நிறுவுதல் பரிசோதனை (அணைத்து தளங்களிலும்)
    2. நிரல் எழுதுவது
    3. கோப்புகளை திறப்பது, இயக்குவது, சேமிப்பது
    4. தனியன்க்கி பரிசோதனைகள் (automatic tests)
    5. பயனர் நடப்பு பரிசோதனை (interactive tests)
  4. வெளியீடு
    1. md5 checksum, zip/exe/tgz package generation and upload to networks
    2. release notes, credits, contribution notes, credits to open-source software

ஒரு தவம், வரம் மறக்கப்படாது – முயற்சி திருவினையாக்கும். கை கூடுவோம், வாருங்கள்.

 

தொடர் பட்டியல் (Linked lists)

தொடர் பட்டியல் என்பது ஒரு எளிதான தரவு வடிவம். சுலபமாக பல ஆயிரக்கணக்கான மதிப்புகளை சேமிக்க இந்த தொடர் பட்டியல் பயன்படுத்தலாம்.

தொடர் பட்டியல் அவதாரங்கள்

இந்த தொடர் பட்டியல் இரண்டு வகையாக அமையும்: ஒருபடை தொடர் பட்டியல் (singly linked list) மற்றும் இருபடை(doubly linked list) இவை கீழே படங்களில் காணலாம். இதனையும் தாண்டி வட்டம் தொடர் பட்டியல் (circular linked list) என்றும் செய்யலாம் இதனை கடைசியில் காண்போம்.

408px-singly-linked-list-svg

படம் 1: ஒருபடை தொடர் பட்டியல் (singly linked list). இதன் முதல் தலை நுனி ‘12’ என்ற மதிப்பை கொண்டது. இதன் ‘அடுத்த’ மதிப்பு ‘99’ மதிப்பு கொண்ட நுனியின் விலாசத்தை கொண்டது. மேலும் ‘99’ நுனி ‘37’ என்ற மதிப்பு கொண்ட நுனியின் விலாசம் கொண்டது. ‘37’ நுனி என்பது கடைசி நுனி என்பதால் இதற்க்கு அடுத்து மதிப்பு காலி என கொண்டது. இந்த ‘அடுத்து’ என்ற இணைப்பே ‘12’ நுனியில் தொடங்கி ‘37’ வரை செல்லும் அம்சத்தை தொடர் பட்டியல் என்று ஆகும் படி இந்த தரவு வடிவத்திற்கு அளிக்கிறது.

610px-doubly-linked-list-svg

படம் 2: படம் 1-ஐ போலவே தொடர் பட்டியல் ஆனால் ‘அடுத்து’ மதிப்பை போலவே கூடுதலாக ‘முந்தைய’ என்ற மதிப்பையும் ஒவ்வொரு நுனியும் கொண்டது. இதன் காரணமாக இதனை ‘இருபடை தொடர் பட்டியல்’.

 

தொடர் பட்டியல் அமைப்பு

தொடர் பட்டியல் என்பது நுனிகள் என்பதால் உருவாக்கப்பட்டது; இவை ஒருன்றுடன் ஒன்று ‘அடுத்து’ என்ற மதிப்பில் இணைக்க பெற்று முழுமையாக தொடர் என்று உருவம் எடுக்கிறது. இது உதிரி பூக்களை மாலையாக கோர்ப்பது போல என்று நினைத்து கொள்ளலாம்.

# நுனி உருவாக்குதல்

நிரல்பாகம் ஒருபடை_நுனி( மதிப்பு )

      நு = {“அடுத்து” : [], “மதிப்பு” : மதிப்பு  }

      பின்கொடு நு

முடி

# நுனியின் அடுத்து விலாசத்தை மற்றோரு நுனியில் அமைத்தல் /

நிரல்பாகம் ஒருபடை_இணை( நுனி_முதல், நுனி_அடுத்து  )

      நுனி_முதல் [“அடுத்து”] = நுனி_அடுத்து

      பின்கொடு நுனி_அடுத்து

முடி

தொடர் பட்டியலில் அணுகுதல்

தொடர் பட்டியலின் முதல் நுனியை “தலை நுனி” என்று பெயரிடுவோம். இந்த தலை நுனியை மட்டும் நாம் கொண்டு முழு பட்டியலை ஒவ்வொன்றாக அணுகலாம். எப்படி ? நுனியில் “அடுத்து” என்ற நுனி விலாசம் உள்ளதை வைத்து நுனிக்கு செல்லலாம். இதனையே பலமுறை – அதாவது அடுத்து என்பதன் மதிப்பு காலி ஆகும் வரை – செய்தால் முழு பட்டியலையும் தலை நுனியில் இருந்து கடைசி நுனிவரை ஒவ்வொன்றாக அணுகலாம். இதனை “ஒருபடை_அணுகு()” என்ற நிரல்பாகம் நிரல்படுத்தும்.

தொடர் பட்டியலில் தேடல்

சரி – இப்ப இந்த பட்டியலில் ஒரு குறிப்பிட்ட மதிப்பு உள்ளதா என்று எப்படி தேடுவது ? இந்த செயல்முறையை நம்ம “ஒருபடை தொடர் பட்டியல் தேடல்” என்று பெயரிடுவோம். தேடல் என்பது பட்டியலில் உள்ள ஒவ்வொரு நுனியையும் அணுகி (அணுகுதல் என்ற நிரல்பாகம் கீழே எழுதப்பட்டதைப்போல்) குறிப்பிட்ட மதிப்பிற்கு சமமாக உள்ளதா என்று பார்க்கவேண்டும்.

# ஒருபடை தொடர் பட்டியலை வரிசையில் அணுகுதல்

நிரல்பாகம் ஒருபடை_அணுகு( நுனி  )

   நுனி_அடுத்து = []

   காலி =  []

   @(    நுனி != காலி  ) வரை  

       #பதிப்பி “முதிப்பு  => “,

       பதிப்பி நுனி [“மதிப்பு”]

       நுனி_அடுத்து = நுனி [“அடுத்து”]

       நுனி = நுனி_அடுத்து

   முடி

   பின்கொடு  நுனி_அடுத்து

முடி

தேடிய ‘குறிப்பிட்ட மதிப்பு’ கிடைக்காவிட்டால் -1 என்ற மதிப்பு பின்கொடுக்கப்படும்; கிடைத்தால், தலை நுனியில் இருந்து தூரத்தை  வரிசை எண் என்று பின்கொடுக்கப்படும்

நிரல்பாகம் ஒருபடை_தேடு ( நுனி, குறிப்பிட்ட_மதிப்பு   )

   நுனி_அடுத்து = []

   காலி =  []

   வரிசை_எண்  = 1

   @(    நுனி != காலி  ) வரை

       @( நுனி [“மதிப்பு”] == குறிப்பிட்ட_மதிப்பு ) ஆனால்

           பின்கொடு வரிசை_எண்        

       முடி

        நுனி_அடுத்து = நுனி [“அடுத்து”]

        நுனி = நுனி_அடுத்து

        வரிசை_எண் = வரிசை_எண் + 1

   முடி

   பின்கொடு  -1

முடி

 

# நுனி உருவாக்குதல்

நு12 = ஒருபடை_நுனி( 12 )

நு99 = ஒருபடை_நுனி( 99 )

நு37 = ஒருபடை_நுனி( 37 )

 

# நுனியின் அடுத்து விலாசத்தை மற்றோரு நுனியில் அமைத்தல் /

ஒருபடை_இணை( நு12, நு99 )

ஒருபடை_இணை( நு99, நு37 )

 

# ஒருபடை தொடர் பட்டியலை வரிசையில் அணுகுதல்

ஒருபடை_அணுகு( நு12 )

#சாவே இல்லாத வீட்டிலே கைப்பிடி கடுகு  கிடைக்குமா ?

பதிப்பி ஒருபடை_தேடு(நு12, 10) 

பதிப்பி ஒருபடை_தேடு(நு12, 37)

இதன் வெளியீடு :  12, 99, 37. முழு நிரல் இங்கு.

இந்த மாதிரி தொடர் பட்டியலில் பல கேள்விகளை எழுப்பலாம், உதாரணத்திற்கு:

  1. இரண்டு தொடர்பட்டியலை எப்படி இணைப்பது ?
  2. ஒரு தொடர்பட்டியலில் குறிப்பிட்ட மதிப்பு எத்தனை முரை அவதானிக்கிறது ?
  3. தொடர்பட்டியலை முன்னுக்கு பின் எப்படி வேகமாக மாற்றுவது ?
  4. இரு தொடர் பட்டியலில் உள்ள பொதுவான மதிப்புகளை கண்டு எடுக்க முடியுமா ?
  5. அணிகள் (arrays) என்பதற்கும் தொடர் பட்டியல் என்பதற்கும் என்ன வித்யாசம் ?

இதனை போல கேள்விகளை பயிற்சிக்கு கேட்டு கொண்டே போகலாம். அனால் நீங்கள் இந்த இரண்டு புத்தகங்களை நேரம் கிடைக்கும் சமயம் கட்டாயம் படித்தால் எல்லாம் விளங்கும்.

  1. “Introduction to algorithms” by Cormen, Leiserson, Rivest, and Stein. MIT press இங்கு.
  2. “The Algorithm Design Manual” by Steven Skiena. இங்கு

இதை இரண்டையுமே நீங்கள் கரைத்து குடித்துவிட்டால் உங்களுக்கு நிரலாக்க திரையில் கிராக்கி அமோகமாக விளங்கும். அப்படி கார்பொரேட் கைதியாக இருக்கவேண்டாம் என்று வீரப்பாக இருந்தால் இந்த புத்தகத்தில் உள்ள லட்டு, ஜிலேபி இனிப்புகளை இன்பமாக அனுபவியுங்கள்.

மேலும் அடுத்த வாரம்.

-முத்து

கவனத்திற்கு: தொடர் பட்டியல் படங்கள் விக்கிபீடியா, புத்தக அட்டைகள் பதிப்பகத்திற்கு சொந்தம்; எழுத்து பிழைகள் எல்லாமே என்னோடது.

குவிப்பு – stack -தரவு வடிவம் பற்றி

இதில் குவிப்பு (stack / ஸ்டாக் ) தரவு-அமைப்புகைள (Data Structures) பற்றியும் படிக்கலாம்.

Stacks ( குவிப்பு ) என்ற தரவு அமைப்பில் மதிப்புகளை சேமிக்கலாம், பட்டியல் (லிஸ்ட்/list) போலவே. அனால் என்ன வித்யாசம் என்று கேட்டிங்கள் என்றால் சேமிக்கும் வரிசை, மீட்கும் வரிசை என்பது நேர் மாரக இருக்கும். முதலில் சேமித்த மதிப்பை கடைசியில் மட்டும் தான் எடுக்கமுடியும். கடைசியில் சேமித்த மதிப்பை முதலிலேயே எடுக்கலாம். 

குவிப்பு என்பதில் முதல் உருப்படி 1 ஏற்கனவே உள்ளது. அதன் மேல் ‘2’ என்ற மதிப்பை தினி-க்கிறோம்; பின்பு ‘3’, ‘4’, ‘5’, ‘6’ மதிப்புகளையும் கூட. கீழ் வரிசையில் 6 முதல் 10 வரை ‘பாப்’ என்று சொல்லக்கூடிய குவிப்பில் ‘மேல்அழி’ செயல்புரிகிறோம். (படம்: விக்கிபீடியா)

 

இதனை யோசித்தால் உங்களுக்கு விளங்கும். எ. கா. உங்கள் வீட்டில் துணிகளை துவைக்க ஒரு கூடை இருக்கும், அதில் வாரம் திங்கள் முதல் வெள்ளிவரை தினமும் மாலை துவைக்கும் ஆடைகளை நீங்கள் இந்த கூடையில் சேர்ப்பீர்கள் என்று வைத்துக்கொள்ளலாம். சனிக்கிழமை நீங்கள் இந்த கூடையில் உள்ள துணிகளை எப்படி எடுப்பேர்கள் ? ஒரு குவியலை போல – வெள்ளி அன்று அணிந்த ஆடை முதல் வெளி வரும், அடுத்து வியாழன், புதன், செவ்வாய், கடைசியாக திங்கள். இதையே தான் குவிப்பு என்ற தரவு அமைப்பும் கணினியில் செயல்புரியும். ஓவ்வொரு புதிய மதிப்பும் ஏற்கெனவே உள்ள உச்சி மதிப்பின் மேலே அடுக்கி வைக்கப்படும். இதனால் குவிப்பை அடுக்கு என்றும் அழைக்கலாம்.

கணினியில் உள்ள அடுக்கில் ‘தினி’ (push), ‘மேல்எடு’ (pop), ‘உச்சி’ (top).

இதனை நிரல்படுத்தினால், இங்கு பார்க்கலாம்.

உங்களுக்கு ‘push’, ‘pop’ என்பதற்கு ‘தினி’, ‘மேல்எடு’ பதில் மாற்று சொற்கள் தோன்றினால் கமெண்ட் செய்யவும்.

தமிழில் நிரல் எழுத – எழில் தமிழ் நிரலாக்க மொழி

தமிழில் நிரல் எழுத – எழில் தமிழ் நிரலாக்க மொழி புத்தகம் இங்கு .

எங்கள் வீட்டு பரிசு

ezhil-logo

எழில் மொழி அறக்கட்டளை இந்த ஆண்டு ஓரு சிறிய பரிசு தொகையை தமிழில் இயங்கும் மென்பொருள் வடிவமைக்கும் மாணவர்களுக்காக அறிவிக்கிறது.

தமிழ் கணிமை மட்டும் திற மூல மென்பொருள் உருவாக்குதல் என்ற சேவைகளை மாணவர்கள் மேற்கொள்ளும் வகையில் இந்த ஆண்டு ஒரு சிறிய பரிசு அறிவிக்கப்படுகிறது.

இந்த பரிசிற்கு விண்ணப்பிக்க இந்த சுட்டியில் சென்று படிமத்தை நிரப்பவும். விண்ணப்பங்கள் இந்த ஆண்டு கடைசி வரை ஏற்கப்படுகின்றன.

https://ezhillang.wufoo.com/forms/ezhil-language-scholarship/

மேலும் விவரங்களுக்கு எங்கள் மின் அஞ்சலில் அணுகவும் : ezhillang@gmail.com

நன்றி,

முத்து

 

அறிவியல் நோக்கில் கணினி நிரலாக்கம்

இதழ்: அறிவியல் ஒளி; தேதி : அக்டோபர் 2, 2016

ஆசிரியர் : முனைவர். முத்து அண்ணாமலை, எழில் மொழி அறக்கட்டளை

அறிவியல் நோக்கில் கணினி நிரலாக்கம்

நீங்கள் உபயோவிக்கும் கணினியில் படம் பார்ப்பதில் இருந்து, ஆவணங்களை (இந்த கட்டுரையை போல) படிப்பதும் எழுதுவதும் ஆகட்டும், முகநூல் (facebook), கூகிள் (Google) தேடல் பொறி, வாட்சப் (whatsapp) தகவல் செயலி போன்றவற்றை கணினி வழியாக பயன் செய்திருப்பீர்கள். ஆனால் சற்று இந்த கணினியும் நாம் விசைபலகையில் தட்டினால் எப்படி இவ்வளவு காரியங்களையும் சாதிக்கிறது என்று யோசித்தது உண்டா ? இப்போது இந்த கணினி நாடகத்தின் திரைக்கு பின்னரே என்ன நடக்கிறது என்றும் பார்க்கலாம்.

எங்கும் கணினி, எதிலும் கணினி என்ற இந்த காலத்தில் கணினி எந்திரம் செயல்பாடுகள், இணையம் சேவை போன்றவற்றின் செயல்பாட்டை ஒரு அறிவியல் நோக்கின் படி புரிதல் முக்கியமானது. இந்த பாதையில் இளம் வாசகர்களை பயணிக்க தூண்டுகோல் போல இந்த கட்டுரை அமையும் என்று எதிர்ப்பார்க்கிறேன்.

கணினி என்பது பல அவதாரங்களில் நம்மிடையே இன்று பயன்பாட்டில் உள்ளது. சொல்லப்போனால் மடி கணினி (laptop), திறன்பேசி (smart phone), கைபேசி (mobile phone), மேசை கணினி (desktop) என்றெல்லாம் சில வடிவங்களில் சொல்லலாம். ஆனால் இவை அனைத்தும் ஒரே ஒரு அடிப்படை அறிவியல் கொள்கையினால் உருவானது. சற்று சிந்தித்து பாருங்கள் எல்லா எண்ணிம மின்சார கருவிகளும் (digital electronic gadgets) இந்த மாதிரி ஒரே மூல காரணத்தினால் இயங்குகிறது.

கணினியின் அடிப்படை செயல்பாடு

சரி. அப்ப இந்த எண்ணிம கருவிகளின் அடிப்படையான இரும ஏரணம் (binary logic) என்ற தர்க கணிதவியல் பற்றியும், இந்த இரு நிலை தர்க செயல்பாட்டை அமல்படுத்துவது திரைதடயம் (semiconductor transistor). இன்னும் எளிமையாக சொல்ல போனால் (தமிழ் விக்கிப்பீடியாவில் இருந்து)கணினியை இயக்கும் நுண்கருவிகளில் மின்னோட்டம் நடக்கும்நடக்காது என இரட்டை நிலை (உண்டுஇல்லை) இயக்கமாகிய தொடுக்கியாகவும் (சுவிட்சு, switch) பயன்படுகின்றது.”

சும்மா சொல்ல போனால் கணினி என்பது செயல்படுவதற்கு மின்சாரத்தில் இயங்கும் மையகனிணி (CPU) தேவை. இந்த மையகனிணி கணிதம், தர்க்க கோட்பாடுகள் (மற்றும் {AND}, அல்லது {OR}, எதிர்மரை {NOT}) போன்றவற்றை கணிக்கவும், மற்றும் இரு நிலை – ‘0’ அல்லது ‘1’ என்பதையும் நினைவில் கொள்ள நினைவகம் (memory) என்ற இரு செயல்களையும் புரிய உருவாக்கப்பட்ட வன்பொருள். இது போன்ற சிபியுகளை semiconductor transistor வழியாக உருவாக்கலாம். (CPU தயாரிப்பாளர்கள் Intel, AMD, ARM, Qualcomm போன்றவர்களை விளம்பரம் மூலம் நீங்கள் சந்தித்திருக்க வாய்ப்பு உள்ளது.)

எண்ணிம நுட்பம் மற்றும் தர்க கணிதவியல் வரலாறு

 `georgeboole

[படம்: ஜார்ஜ் பூல்: பூலியன் கணிமை கண்டுபித்த ஆங்கிலேயர்]

இந்த இருநிலை தர்க கணிமையை உருவாக்கியவர்களில் முக்கியமானவர்கள் இருவர். இரவர்கள் வாழ்க்கையில் சமகாலத்தவர்களாக இல்லாவிட்டாலும் செயலில் ஒரே போல சிந்தனை கொண்டவர்கள்.

இவர்கள், கணித மேதை பூலியன் அல்ஜிப்ரா படைத்த ஆங்கிலர் ஜார்ஜ் பூல் (1815-1864), மற்றும் தகவல்தொழில்நுட்பம் துரையின் தந்தை இருநிலை தர்க்க கணிதத்தை தொலைபேசி வலையமைப்பில் ஞானித்த அமெரிக்க மின்னணுவியல் பொறியாளர் கிலாடு ஷான்னன் (1916-2001) அவர்களை பற்றியும் நீங்கள் வீட்டு படமாக மேலும் படித்து தெரிந்து கொள்ள வேண்டும். இதற்கு தமிழ் விக்கீபீடியவை பயன்படுத்தலாமே (http://ta.wikipedia.org)!

 shannon

[படம்: கிலாடு ஷான்னன்: தொலைபேசி வலையமைப்பில் பூலியன் கோட்பாடுகளை செயல்படுத்திய அமெரிக்க பொறியாளர்]

தர்க வகை கணிதம் மட்டும் போதுமா ?

இதானால் நம்முடைய கணினியை பொறுத்த மட்டில் இது செயல்படுவது எண்ணிம தர்க வகை கணிதம் (digital logic) மற்றும் சிலிக்கான் திண்மத்தால் உருவாக்கிய திரைதடயம் (semiconductor transistor).

இது அடிப்படை மட்டும் தான் அல்லவா, இதனை கொண்டு எப்படி மேல் கூறிய தேடல் பொறி, சமூக வலைத்தளம் போன்றவை உருவாக்கினார்கள் ? நல்ல கேள்வி மேலும் படியுங்கள்.

எஞ்சிய துண்டு நிரலாக்கம்

சிலிக்கான் திண்மத்தால் ஆக்கிய CPU ஒன்றை கட்டுப்படுத்தி பிரயோஜனமான செயல்களை செய்ய இந்த எந்திரத்தை கணினி நிரலாக்கம் என்ற கூர்வேலை கொண்டு தாக்க வேண்டும்.

நிரலாக்கம் (software programming, coding) என்பது ஒரு புலியன்கொம்பு ஒன்றும் இல்லை ஒரு நிறுவனத்தில் மேற்பார்வையாளர் ஒரு வேலையாள் கிட்ட எப்படி வேலை வாங்குவார் என்பது போலவே, நாமும் கணினியிடம் வேலை வாங்குவதற்கு கணினி நிரல் எழுதிய பின்னரே, என்று புரிந்துகொள்ளலாம். அதாவது மேற்பார்வையாளர் “புள்ளி நடுவே கொடு போடவும்” என்று சொன்னால் மட்டுமே இந்த வேலையை செய்வார் அந்த தொழிலாளி இது போலவே கணினியிடம் “எண்கள் இரண்டையும் நினைவில் இருந்து கூட்டி, பின்னர் திரையில் வெளியீடு”
என்று சொல்வதற்கு கணினி நிரல் மூலமே முடியும்
.

என்னவோ குழந்தை தட்டு தடுமாறி, படி மேல் கால்வைத்து, எழுந்து நடந்து, ஓடிய கதை மாதிரி இருக்குதல்லவா ? இது கேள்வி கூறினால் உங்கள் சிந்தனை சரியான திசையில் நோக்கி செல்கிறது என்று சந்தோஷ படுங்கள்.

நிரலாக்கம் (programming) அப்படினா என்ன ?

கணினி செய்யும் ஓவ்வொரு செயலிலும் அதற்கு போதித்து நாம் நிரல் மூலம் சொல்ல வேண்டி இருக்கிறது இதையே நிரலாக்கம் (programming) என்றும், இதனை செய்பவள் நிரலாளர் (programmer) என்றும் அழைக்கிறோம். இவ்வாறு தர்க ரீதியாக, கணிதம் ரீதியாக, செயல்முறை (algorithm) விதிகளையும் கோட்பாடுகளையும் கொண்டு ஒரு கணினியை செயல்படுத்தும் வேலை தற்போது படு கிராக்கியாக உள்ளது எல்லோரும் அறிந்த உண்மை. ஆனால் இதனையும் தாண்டி இந்த துறையில் என்னமோ ஒரு சிறப்பு அம்சம் உள்ளது என்பதையும் இதந்த அறிவியல் துறை மிக இளமையானது என்பதையும் இன்றைய மாணவர்கள் மனதில் கொள்ளவேண்டும்.

கணிமையின் கோட்பாடு கட்டமைப்பு அலன் டூரிங்

அலன் டூரிங் (1912-1954) என்ற கணிதவியல் மேதை, தனது தர்க ஆராய்ச்சிகளில் கணிமையின் அடிப்படை கோட்பாடுளை 1936 ஆண்டில் “on computable numbers with an application to the entscheidungsproblem,என்ற தலைப்பில் ஒரு மாபெரும் ஆய்வு கட்டுரையை வெளியிட்டார். இதில் எப்படி ஒரு சூத்திரம் அல்லது செயல்முறை இருந்தாலும் அவற்றில் சில கோட்பாடுகளை எந்திரத்தாலும் கூட கணிக்கவே முடியாது என்றும் நிரூபித்தார். இந்த ஆய்வில் அவர் சிந்தனையில் உருவாக்கிய கருவியே பின்னாளில் “டூரிங் எந்திரம்” (Turing machine) என்றும் பெயர் பெற்று தற்கால கணினி கட்டமைப்பிலும் ஏறத்தாழ 80 ஆண்டுகளாக இன்றுவரையும் நமக்கு கலங்கரை விளக்காக அமைந்துள்ளது.

turing1 turing2

[படம் : அலன் டூரிங் (1912-1954) – கணிமையின் பிதாமகன், தற்கால கணினியின் விஸ்வரூபத்தை முதலில் கண்டுபிடித்தும், இதற்க்கு கணிதவியல் கோட்பாடுகளில் அடிப்படை அஸ்திவாரத்தை அமைத்ததும் இவரே. இவர் கலோனிய இந்தியாவில் பிறந்த ஆங்கிலேயர்]

கணினி நிரலாக்கம்

சரி இந்த மிக பெரிய அறிவியல் சிந்தனையாளர்களை பற்றி எல்லாம் கற்றுக்கொண்டதும் நல்லது, ஆனால் நீங்கள் இதனை கொண்டு எப்படி நிரலாக்கம் கற்று கொள்ள முடியும் ? பல கணினி மொழிகள் உண்டு; கத்துக்குட்டி சிறுவர்களும் BASIC, LOGO போன்ற எளிய மொழிகளை கற்று கொள்ளலாம். இவை ஆங்கிலம் அல்லாமல் இன்று பல மொழிகளில் உள்ளன தமிழிலும் கூட இன்று ஒன்றிற்கும் மேற்பட்ட கணினி மொழிகள் உண்டு.

தமிழில் கணினி நிரலாக்கம் செய்யும் வழி “எழில்” என்றும் ஒரு நிரலாக்க மொழி உள்ளது இதனை http://ezhillang.org என்ற வலை தளத்தில் இருந்து பயன்படுத்தி பார்க்கலாம். இதே தளத்தில் கணிமை நிரலாக்கம் பற்றி கற்று கொள்ளவும் ஒரு புத்தகம், “தமிழில் நிரல் எழுது” என்ற பெயரில், உள்ளது (இது இலவசமாக கிடைக்கும்). எழில் மொழி உங்களை போன்ற சிறுவர்கள் உங்களுக்கு முதன்முறையாக நிரல்கள் எழுத உதவும். ஆங்கிலம் அறியாதவர்கள் கணிப்பொறியை இயக்க உதவும். கீழே ஒரு வினா விடை விளையாட்டை எழில் மொழியில் எப்படி கணினியுடன் விளையாடுவது என்றும் பார்க்கலாம்,

பதிப்பி======== சரியான விடையை தேர்ந்தெடுக்கவும் ========”

பதிப்பி இந்தியாவின் தலைநகரம் எது?”
பதிப்பி அ ⇒ சென்னை
பதிப்பி ஆ⇒ மதுரை
பதிப்பி இ ⇒ டெல்லி
பதிப்பி ஈ ⇒.மும்பை

சரியானவிடை = “
உங்கள்விடை
= உள்ளீடு(“உங்களுடைய பதில் என்ன? “)

@(சரியானவிடை == உங்கள்விடை) ஆனால்
பதிப்பி வாழ்த்துகள். உங்களுக்கு 10 மதிப்பெண்கள்!”
இல்லை
பதிப்பி தவறான விடை. மீண்டும் முயற்சி செய்யுங்கள்!”
முடி

[குறிப்பு : வினா விடை விளையாட்டை இயக்கும் வண்ணம் அமைந்த “எழில்” கணினி மொழி நிரல்]

இந்த நிரலை இயக்கினால் ‘இ’ என்றும் பயனர் விடையளித்தால் வாழ்த்து கிடைக்கும், அல்லது உதை (சும்மா விளையாட்டுங்க) – இல்லை இல்லை திரும்ப விளையாடும் வாய்ப்பும் பயனருக்கு கிடைக்கும் வண்ணம் இந்த நிரல் உருவாக்கபட்டது.

cover

[படம்: எழில் மொழி பயில்வதற்கு உபயோகமாகும் “தமிழில் நிரல் எழுது எழில் நிரலாக்க மொழி,” புத்தகம். இதை http://ezhillang.org இல் இருந்து பெறலாம்]

 example

[படம் (வலது): பெர்னோல்லி எண்களின் சூத்திரம்; இதனை நிரலாகவும் மாற்றலாம்.]

adalovelace

[படம் (இடது): இலண்டன் பூங்காவில் அரசி அடா லவ்லேஸ்இன் சிற்பம்]

சாதனை நிரலாளர்கள்

கணிமையில் பல அறிவு ஜீவி நிரலாளர்கள் உள்ளனர் இவர்களின் குறிப்பிடதக்கவர்களில் ஒருவர் அரசி அடா லவ்லேஸ் என்ற ஒரு பெண். இவர் கணினி தற்கால உருவம் எடுக்கும் முன்னரே, சார்லஸ் பாபேஜ் உடைய கணினி அமைப்பில் பெர்னோல்லி எண்களை கணிக்கும் வகையில் முதல் முதலில் ஒரு நிரலை எழுதினர் என்பது சரித்திரம் படைத்த வரலாறு. இதனை எழில் மொழியில் கணிக்க இவ்வாறு நிரல் எழுதலாம்,

# பெர்னொல்லீ எண்களை கணக்கிடு
நிரல்பாகம் பெர்னொல்லீ_எண் ( m, n )
@( m == 0 )
ஆனால்
# பெர்னொல்லீ_எண்( 0, n ) = 1
பின்கொடு 1.0
இல்லை
பெர்னொல்லீ
= 0.0
மொத்தம்
= 0.0
எண்கள்
= range(0,m)
@(எண்கள் இல் இவ்வெண்) ஒவ்வொன்றாக
மொத்தம்
= மொத்தம் + binomial_coeff(m,இவ்வெண்)*பெர்னொல்லீ_எண்(இவ்வெண்,n)/(m – இவ்வெண் + 1.0) #பதிப்பி இவ்வெண், மொத்தம்
முடி
பெர்னொல்லீ
= n^(m*1.0) – மொத்தம்
பின்கொடு பெர்னொல்லீ
முடி
முடி

[குறிப்பு : பெர்னோல்லி எண்களை கணக்கிடும் வண்ணம் அமைந்த “எழில்” கணினி மொழி நிரல்]

அறிவுரை

நீங்கள் ஒரு சிறுவராக இந்த மாதிரி இயற்பியல் (சிலிக்கான் திண்மம் கொண்ட டிரான்சிஸ்டர் உருவாக்குவதும்), கணிமை, கணிதவியல், தர்க எண்ணிமம் என்று ஏதேனும் ஒரு துரையில் தேர்ச்சி பெற்றும், பிற்காலத்தில் இந்த சான்றோர் போலவே மானுட உலகில் வாழ்க்கை மேம்பட சாதனையாளராக வரலாம். சிறிய அளவில் உங்களுக்கும் உங்கள் படிப்புக்கும், வேலை வாய்ப்பிற்கும், அறிவியல் ஆர்வத்திற்கும் பல புதிர்களையும், சவால்களையும் அளிக்கும் ஆற்றலும், ஆழமும் கொண்டது கணினி அறிவியல்.

உங்களுக்காக செயற்கை நுண்ணறிவும் (A.I), எந்திரன் போன்ற ரோபோக்கள் (Robots), தானியங்கி கார்கள் (self-driving cars) போன்ற பல சவால்கள் காத்திருக்கின்றன. நீங்கள் இவற்றை மேற்கொள்ள கணினியியல், மற்றும் நிரலாக்கம், ஒரு நல்ல படிக்கல்லாக அமையும் என்று உங்களுக்கு அறிவுறுத்துகிறேன்.

முனைவர். திரு. முத்து அண்ணாமலை,

விரிகுடா பகுதி.

கலிஃபோர்னியா. ஐக்கிய அமெரிக்க

(தொடர்பு மின்அஞ்சல்: ezhillang@gmail.com)

குறிப்பு: படங்கள் ஒப்புகைகள் விக்கிபீடியா, கிரேட்டிவ் காமன்ஸ் பொது உரிமை நோக்கில் சேர்க்கப்பட்டன.