சி-மொழியைப் படைத்த கணிப்பொறி வல்லுநர், டென்னிஸ் எம்.ரிட்சி (Dennis M. Ritchie) என்பது அனைவரும் அறிந்த ஒன்று. ஆனால், சி-மொழி உருவான வரலாறு உங்களுக்குத் தெரியுமா? அதன் வரலாற்றையும் சிறப்பையும் அறிந்து கொண்டாலே அந்த மொழியைக் கற்க வேண்டும் என்னும் ஆசை தானாக வரும். சி-மொழியின் நுணுக்கங்களைக் கற்றறிவதற்கு முன்பாக அது தோன்றி வளர்ந்த வரலாற்றைச் சற்றே புரட்டிப் பார்ப்போம்.
சி-மொழிக்கு முன்னால்
1950-1960: உயர்நிலைக் கணிப்பொறி மொழிகள் (High Level Languages) பல புதியதாக உருவாகி உலா வந்த காலம் அது. உயர்நிலை மொழிகளின் உதவியுடன் மனிதன் கணிப்பொறியுடன் எளிதாக உரையாட முடிந்தது. ஆனால் அக்காலத்தில் உருவான கணிப்பொறி மொழிகள் எல்லாம் ஒரு குறிப்பிட்ட வகையான பணிகளைச் செய்து முடிப்பதற்காகவே உருவாக்கப்பட்டவையாக இருந்தன.
பொறியியல் மற்றும் அறிவியல் பணிகளுக்கென ஃபோர்ட்ரான் (FORTRAN - FORmula TRANslation) உருவாக்கப்பட்டதும், வணிகத் துறையின் பயன்பாடுகளுக்காகக் கோபால் (COBOL - COmmon Business Oriented Language) மொழி உருவாக்கப்பட்டதும் நாம் அறிந்தவை. இப்படி ஒவ்வொரு பணிக்கும் ஒவ்வொரு மொழி இருந்த காலகட்டத்தில், எல்லாப் பணிகளுக்காகவும் ஒரு பொதுவான மொழி உருவாக்கப்பட்டால் என்ன? என்ற ஏக்கம் கணிப்பொறித் துறை வல்லுநர்கள் அனைவருக்கும் இருந்தது.
இந்தக் குறையை நீக்கப் பல நாடுகளின் வல்லுநர்களைக் கொண்ட ஒரு கமிட்டி அமைக்கப்பட்டது. அவர்கள், பெருமுயற்சிக்குப் பின் 1960-ல் ‘அல்கால்’ (ALGOL - ALGOrithmic Language) மொழியை உருவாக்கினர். அம்மொழி எதிர்பார்த்த பயனைத் தரவில்லை. மிகவும் அருவமாகவும் (too abstract), மிகப் பொதுப்படையாகவும் (too general) இருந்தது. மிகக் குறைவான நிரல் குறியீடுகள் உடையதாகவும், புரிவதற்குக் கடினமான நிரல் வரைவு கொண்டதாயும் விளங்கியது.
கணிப்பொறித் துறை வல்லுநர்களின் ஆய்வு தொடர்ந்தது. அல்கால் மொழியின் குறைகளை நீக்கி, 1963-ல் சிபீஎல் (CPL - Combined Programming Language) என்ற புதிய மொழியை உருவாக்கினர். அல்கால் அந்த விளிம்பில் என்றால், சிபீஎல் இந்த விளிம்பில் நின்றது. அதாவது சிபீஎல்லில் மிக அதிகமான புரோகிராம் குறியீடுகள், வளவளா என்று மிக விரிவான சடங்கு முறைகள் இருந்தன. கற்பதற்கும், பயன்படுத்துவதற்கும் மிகக் கடினமான ஒரு மொழியாக இருந்தது.
ஆனால், சிபீஎல் பல நல்ல கூறுகளை உள்ளடக்கியதாகவும் விளங்கியது. அதை ஓரளவு சுருக்கி, அதன் நல்ல தன்மைகளை வெளிக்கொணர பலர் முயன்றனர். அவர்களுள் ஒருவரான, இங்கிலாந்தில் கேம்பிரிட்ஜ் பல்கலைக் கழகத்தில் பணிபுரிந்து கொண்டிருந்த மார்ட்டின் ரிச்சர்ட்ஸ் (Martin Richards), பிசிபீஎல் (BCPL- Basic Combined Programming Language) என்னும் புதிய மொழியை 1967-ல் உருவாக்கி வெளியிட்டார். சிபீஎல்-லின் நல்ல தன்மைகளை அது உள்ளடக்கியதாக இருந்தது என்றாலும், சிபீஎல் அளவுக்குச் சக்தி வாய்ந்ததாக இல்லை. மேலும், ‘அனைத்துப் பணிகளுக்கான பொதுப்படையான மொழி’ ஒன்றை உருவாக்குவது என்ற அடிப்படை நோக்கத்திற்குப் பங்கம் விளைவிப்பதாகவும் அது ஆகிவிட்டது. அதாவது, சில குறிப்பிட்ட வகைப் பணிகளுக்கு மட்டுமே பயன்படக்கூடியதாய் அம்மொழி அமைந்திருந்தது.
சி-மொழியின் பிறப்பு
வரலாற்றின் நிகழ்ச்சிகள் ஒருபுறம் இவ்வாறு நடந்து கொண்டிருக்க, அமெரிக்கத் தொலைதொடர்பு மற்றும் கணிப்பொறித் துறையின் முன்னணி நிறுவனமான ஏடீ & டீ (AT & T) நிறுவனத்துக்குச் சொந்தமான பெல் (Bell) ஆய்வுக் கூடத்தில் கென் தாம்சனும் (Ken Thompson) டென்னிஸ் ரிட்சியும், அக்காலத்தில் பயன்பாட்டில் இருந்த ’மல்டிக்ஸ்’ (MULTICS) என்னும் பல்பயனர் இயக்கமுறைமைக்கு (Multiuser Operating System) மாற்றாக ஒரு புதிய இயக்க முறைமையை உருவாக்கிக் கொண்டிருந்தனர். தாங்கள் உருவாக்கிய புதிய இயக்கமுறைமையை, மூலையில் கிடத்தி வைக்கப்பட்டிருந்த டெக் பீடிபீ-7 (DEC PDP - 7) என்ற குறுங் கணிப்பொறியில் (Mini Computer) நடைமுறைப்படுத்தினர். பிறகு சற்றே திறன் கூடுதலான டெக் பீடிபீ-11 என்ற கம்ப்யூட்டரில் அந்த இயக்கமுறைமையை வெற்றிகரமாக இயக்கினர். மல்டிக்ஸைக் காட்டிலும் பல்வகையிலும் மேம்பட்டிருந்த தங்களின் இயக்க முறைமைக்கு எதிர்மறையாக ‘யூனிக்ஸ்’ (UNIX) என்று பெயரிட்டனர். அது இன்றளவும் செல்வாக்குப் பெற்றுத் திகழ்வதை நாம் அறிவோம்.
இந்தப் பணியில் மூழ்கியிருக்கும்போதே கென் தாம்சன், தனியாக ஒரு முயற்சியில் ஈடுபட்டிருந்தார். பீடிபீ-11 கணிப்பொறியில் யூனிக்ஸ் இயக்க முறைமையில் செயல்படுத்த, ஃபோர்ட்ரான் மொழிக்கான ஒரு ‘நிரல்பெயர்ப்பியை’ (Compiler) உருவாக்கிக் கொண்டிருந்தார். ஃபோர்ட்ரான் மொழிக்குக் கம்ப்பைலரை எழுதும்போது பக்க விளைவாக ஒரு புதிய கணிப்பொறி மொழி உருவானது. தாம்சன், கம்ப்பைலர் வேலையைப் பாதியிலேயே மறந்துவிட்டு, யூனிக்ஸ் இயக்க முறைமையில் இயங்கும் அந்தப் புதிய மொழியை வளர்த்தெடுத்தார். இது 1971-ல் நடந்தது.
பிசிபீஎல் (BCPL) மொழிதான் கென் தாம்சனுக்கு முன் மாதிரியாய் இருந்தது. பிசிபீஎல்-லின் பல நல்ல கூறுகளை தாம்சன் மொழி உள்ளடக்கியதாக இருந்தது. ஒரு வகையில் அதன் வாரிசாகவும் திகழ்ந்தது என்றுகூடச் சொல்லலாம். எனவே தாம்சன் தன் மொழிக்கு `பி’ (B) என்று பெயரிட்டார். `பி’ என்பது பிசிபீஎல் (BCPL) என்ற பெயரின் முதல் எழுத்தாகும்.
பி-மொழியிலும் சில பின்னடைவுகள் இருந்தன. முதலாவதாக, பி-மொழி, ’ஆணைபெயர்ப்பி’ (Interpreter) சார்ந்த மொழியாக இருந்தது. இரண்டாவதாக, பிசிபீஎல் மொழியைப் போன்றே மிகக் குறுகிய, குறிப்பிட்ட பணிகளுக்கே உதவும் மொழியாக இருந்தது.
இந்த நேரத்தில்தான், டென்னிஸ் ரிட்சி, வரலாற்றுச் சிறப்புமிக்க அச்சாதனையைச் செய்தார். பி-மொழியைச் செழுமைப்படுத்தி, தன் மேதமையின் சாரத்தைப் பிழிந்து அதில் கலந்து, கம்ப்பைலர் சார்ந்த ஒரு புதிய மொழியை உருவாக்கினார். பிசிபீஎல் மொழியிலும், பி-மொழியிலும் காணாமல் போயிருந்த பொதுத்தன்மையைத் தன் மொழியில் மீட்டுத் தந்தார். குறிப்பிட்ட பணிகளுக்கு மட்டும் அல்லாமல் எல்லாப் பணிகளுக்கும் பயன்படும் பொதுமொழியாக அது திகழ்ந்தது. கணிப்பொறி மொழி வல்லுநர்கள் 1960-ல் கண்ட கனவைக் கடைசியாக 1972-இல் ரிட்சி நிறைவேற்றி வைத்தார்.
ரிட்சி, தன் மொழிக்கு `சி’(C) என்று பெயரிட்டார். B என்ற ஆங்கில எழுத்துக்கு அடுத்த எழுத்து C என்பதால்தான் ரிட்சி அவ்வாறு பெயரிட்டதாக பலரும் கருதினர். ஆனால் அந்த ஒற்றுமை, தற்செயல் நிகழ்ச்சி என்று கூறுவாரும் உண்டு. உண்மையில் `சி’ என்பது பிசிபீல் (BCPL) மொழியில் உள்ள இரண்டாவது எழுத்தைத்தான் குறிக்கிறது என்பது அவர்கள் கருத்து. ஆக, தாம்சன் தன் மொழி பி-க்கு பிசிபீஎல்-லின் முதல் எழுத்தைச் சூட்டியதுபோல, ரிட்சி தன் மொழிக்கு இரண்டாவது எழுத்தைச் சூட்டினார் என்ற கருத்தும் ஒத்துக் கொள்ளக்கூடியதே.
1973-ஆம் ஆண்டில், டென்னிஸ் ரிட்சியும் கென் தாம்சனும் தாங்கள் ஏற்கெனவே உருவாக்கிய ‘யூனிக்ஸ்’ இயக்க முறைமையின் புதிய பதிப்பை, முழுக்கவும் சி-மொழியில் எழுதினர். சி-மொழியின் செயல்திறனுக்கு, யூனிக்ஸ் ஓர் எடுத்துக்காட்டாகத் திகழ்ந்தது.
சி-மொழியின் வளர்ச்சி
உயர்தனிச் செம்மொழியாய் சி-மொழி திகழ்ந்தபோதும் கணிப்பொறி நிரலர்களைப் (Computer Programmers) பெருமளவில் அது கவரவில்லை. அடுத்த ஆறு ஆண்டுகள் சி-மொழி பதுங்கிய புலியாகத்தான் இருந்தது எனலாம். பயன்படுத்திய சிலரும் தத்தம் விருப்பத்திற்கிணங்க சி-மொழியை வடிவமைத்துப் பயன்படுத்தி வந்தனர். ஒரு தரப்படுத்தப்பட்ட சி-மொழியை (Standard C) வரையறுக்கும்படி, அமெரிக்கன் நேஷனல் ஸ்டாண்டர்டு இன்ஸ்டிடியூட் (ANSI) கேட்டுக் கொண்டதற்கிணங்க, 1978-ல் டென்னிஸ் ரிட்சியும், பிரியன் கெர்னிகனும் இணைந்து `தி சி புரோகிராமிங் லாங்குவேஜ்’ (The C - Programming Language) என்ற நூலை வெளியிட்டனர்.
இன்று, சி-மொழி பற்றிய புத்தகங்கள் பலவும் கே & ஆர் (K & R) என்று மேற்கோள் காட்டுவது இந்தப் புத்தகத்தைத்தான். கே & ஆரின் புத்தகம் வெளியானதுமே கணிப்பொறி உலகில் ஒரு புரட்சியே நிகழ்ந்தது எனலாம். சி-மொழி, மென்பொருள் துறையை ஒரு கலக்கு கலக்கியது. இந்தக் கால கட்டத்தில்தான் வன்பொருள் துறையில் ஒரு புரட்சி நடந்தது. ஐபிஎம் (IBM) நிறுவனத்தினரின் சொந்தக் கணிப்பொறிகள் (Personal Computers - PCs) புற்றீசல் போல உற்பத்தியாகி உலா வந்தன.
பெரும் எண்ணிக்கையிலான பீசிக்களின் உற்பத்தி, சி-மொழியின் செல்வாக்குக்கு அடித்தளமாய் அமைந்தது. யூனிக்ஸ் பணித்தளச் சூழலில் பிறந்தபோதும், தன் பிறந்தகமான யூனிக்ஸின் பிடியிலிருந்து விடுவித்துக் கொண்டு, சி-மொழி சென்ற இடமெல்லாம் வெற்றிக்கொடி நாட்டியது. சி-மொழியின் செல்வாக்குப் பெருகியதும் சி-மொழியின் உருவாக்கத்தில் பங்கு பெறாத நிறுவனங்கள்கூட சி-மொழிக் கம்ப்பைலர்களை உருவாக்கி வெளியிடத் தொடங்கின. அவை தமக்கே உரிய தனித் தன்மைகளைக் கொண்டிருந்தன. மூல சி-மொழியிலிருந்து பல்வேறு மாற்றங்களையும் திருத்தங்களையும் கொண்டு விளங்கின. இதன் காரணமாய், சி-மொழிக்குக் காலத்திற்கேற்ற வடிவமைப்பும் ஒரு கறாரான வரையறுப்பும் தேவை என்பதை சி-மொழி அறிஞர்கள் உணர்ந்தனர். 1983-ஆம் ஆண்டு, அமெரிக்க தேசியத் தரக் கட்டுப்பாட்டு நிறுவனம் (ANSI) ஒரு குழுவை அமைத்தது. சி-மொழியின் பொலிவு குன்றாமல், திரிபில்லாத, ஒரு நவீன, கட்டுருவான, பொறிசாரா வரையறுப்பை (machine-independent definition) உருவாக்குவதே அக்குழுவின் நோக்கமாய் இருந்தது. ஐந்தாண்டு ஆய்வுகளுக்குப்பின் ‘அன்சி-சி’ (ANSI-C) உருவானது. டென்னிஸ் எம். ரிட்சியும், பிரியன் டபிள்யூ. கெர்னிகனும் இணைந்து, ‘தி சி புரோகிராமிங் லாங்குவேஜ்’ என்ற நூலின் இரண்டாம் பதிப்பை 1988-இல் வெளியிட்டனர்.
அன்சி-சி
அன்சி-சி சில மாற்றங்களைக் கொண்டிருந்தது. செயல்கூறுகளை (Functions) அறிவிப்பதிலும் வரையறுப்பதிலும் புதிய வடிவம் புகுத்தப்பட்டது. செயல்கூறின் தலைப்பியிலேயே (Function Header) செயலுருபுகளின் (arguments) தரவினத்தையும் (data type) குறிப்பிட முடியும். ’ஸ்ட்ரக்ட்’ (struct) தரவின மாறியில் (variable) மதிப்பிருத்தலும், ’ஈனம்’ (enum) தரவின வகையும் சி-மொழியின் உள்ளிணைந்த அங்கமாயின. மிதவைப் புள்ளிக் (floating point) கணக்கீடுகள் ஒற்றைத் துல்லிய (single precision) முறையில் செய்யப்பட்டன. ‘அன்சைன்டு’ (unsigned) இனங்களின் கணக்கீடுகள் தெளிவுபடுத்தப்பட்டன. செயலாக்கிக்கு முந்தைய (pre-processor) நெறிப்பாடுகள் விரிவுபடுத்தப்பட்டன. விரிவான சி-மொழி நூலகம் (C Library) உள்ளிணைக்கப்பட்டது. இயக்க முறைமையை அணுகுவது, குறிப்பாக கோப்புகளில் எழுதுவது/படிப்பது (write/read in files), வடிவமைக்கப்பட்ட உள்ளீடு/வெளியீடு (formatted input/output), நினைவக ஒதுக்கீடு (memory allocation), சரங்களைக் கையாளுதல் (string handling) போன்ற பணிகளுக்கு, ஏராளமான செயல்கூறுகள் உருவாக்கப்பட்டு, நூலக/தலைப்பிக் கோப்புகளாக (library/header files) இணைக்கப்பட்டன.
சி-மொழி நூலகத்தின் பெரும்பகுதி, யூனிக்ஸ் இயக்க முறைமையின் ‘ஸ்டாண்டர்டு ஐ/ஓ லைப்ரரியின்’ மாதிரியில் வடிவமைக்கப்பட்டது. இயக்க முறைமை தொடர்பான செயல்பாடுகள் தவிர, பிற நூலகச் செயல்கூறுகளை சி-மொழியிலேயே உருவாக்க முடியும் என்பதே இதன் சிறப்புக்கூறாகும். மூல சி-மொழியில் இன்டிஜருக்கும் பாயின்டருக்கும் அதிக வேறுபாடு இல்லாமல் இருந்தது. இரண்டையும் எளிதாக மாறுகொள்ள (Interchange) முடியும். ஆனால் அன்சி-சி-யில் இது நீக்கப்பட்டது. சுட்டுகளை முறைப்படி அறிவிக்கும் முறையும், இன்டிஜர் - பாயின்டர் இனமாற்றமும் (type conversion) வெளிப்படையாக செய்யப்பட வேண்டும் என்ற கட்டுப்பாடும் புகுத்தப்பட்டது.
சி-மொழி, ஆழமான இன உணர்வு கொண்ட (strongly typed) மொழி அல்ல என்றபோதிலும், இனச் சரிபார்ப்பு (type checking) வலுப்படுத்தப்பட்டது. ஒத்தியல்பில்லா தரவினங்களுக்கிடையே (incombatible data types) தானாக நடைபெறும் இனமாற்றங்கள் (automatic type conversions) தவிர்க்கப்பட்டன. பெரும்பாலான இனப் பிழைகளை (type errors) கம்ப்பைலர் சுட்டிக் காட்டும். 1988-ல் புதுவடிவம் பெற்ற சி-மொழி, தன் பயணத்தில் தளர்வேதும் இன்றி வெற்றி நடைபோட்டு வருகிறது. காலத்திற்கேற்ற பல புதிய மொழிகள் உருவாக்கப்படுவதற்கு ஊற்றுக் கண்ணாகவும் திகழ்கிறது.
சி++ மொழியின் உதயம்
ஏடீ & டீ பெல் ஆய்வுக் கூடத்தில் பணியாற்றிவந்த ஜேன் ஸ்ட்ரௌஸ்ட்ரப் (Bjarne Stroustrup) ரிட்சியின் நண்பர் ஆவார். 1980-ல் அவர், தான் செய்துவந்த நிகழ்வு அடிப்படையிலான பாவனைத் திட்டப்பணிக்கு (event based simulation project) ‘சிமுலா67’ (SIMULA67) மொழியைப் பயன்படுத்தினார். அம்மொழி திறன் குறைந்ததாக இருக்கவே, தன் பணியை சி-மொழியில் தொடர்ந்தார். ஆனால், அவரது திட்டப்பணிக்கு மிகவும் தேவையான வசதிகள் சி-மொழியில் இல்லாததை உணர்ந்தார். எனவே சி-மொழியில் சில புதிய வசதிகளைச் சேர்த்தார். சி-மொழியின் சுட்டுக்குச் (pointer) சற்று எளிமையான ’சுட்டுருபு’ (reference) என்னும் மாற்றைக் கண்டுபிடித்தார். இனக்குழு (class) என்னும் திறனுள்ள கருத்துருவைச் சேர்த்தார். பொருள்நோக்கு நிரலாக்கம் (Object Oriented Programming - OOP) என்ற கருத்துருவுக்குப் புதிய பாதை போட்டுத் தந்தார்.
ஸ்ட்ரௌஸ்ட்ரப் உருவாக்கிய சி-மொழி ஒரு புதிய மொழியாகப் பரிணமித்த போதும், அவர் தன் மொழியைத் தனி மொழியாகக் கருதவில்லை. சி-மொழியின் மேம்படுத்தப்பட்ட வடிவம் என்றே கருதினார். எனவே, தன் மொழிக்கு ‘இனக்குழுவுடன் கூடிய சி’ (C with Classes) என்றுதான் பெயர் சூட்டினார். மற்றவர்கள், ‘சி-யை உள்ளடக்கிய மொழி’ (Supper Set of C) என்றும், ‘சிறந்த சி’ (Better C) என்றும் பல பெயர்களில் அழைத்தனர். புதிய மொழி உருவாக்கப்பட்டு ஏறத்தாழ நான்காண்டுகள் கழித்து, 1983-ல் ரிக் மாஸ்சிட்டி என்பவர்தான் ஸ்ட்ரௌஸ்ட்ரப்பின் மொழிக்கு ‘சி++’ என்று பெயர் சூட்டினார்.
சி-மொழியில் எழுதப்பட்ட அனைத்து நிரல்களையும் மாற்றமின்றி அப்படியே சி++ மொழியில் செயல்படுத்த முடியும். எனவேதான் சி++ மொழியைத் தனி மொழியாக ஸ்ட்ரௌஸ்ட்ரப் கருதவில்லை. ++ என்பது சி-மொழியில் மாறியின் மதிப்பில் ஒன்றுகூட்டும் செயற்குறி (Operator) ஆகும். சி-மொழி செயற்குறியின் பொருளை உள்ளடக்கி, ‘மேம்படுத்தப்பட்ட சி-மொழி’ என்று பொருள்தொனிக்கும் வகையில் ‘சி++’ எனப் பெயரிடப்பட்டது. முற்றிலும் புதிய மொழி அல்ல என்பதால் பி, சி-க்கு அடுத்து டி (D) எனப் பெயர்சூட்டப்படவில்லை. எனவேதான் சி-மொழி வரலாற்றில் சி++ மொழியின் தோற்றத்தையும் தெரிந்து கொள்ள வேண்டியுள்ளது.
சி-மொழியைப் போலவே சி++ மொழியும் இன்றைக்குத் தனிச்சிறப்போடு விளங்குகிறது. சி-மொழியின் சிறப்புத் தன்மையே சி++ மொழியின் சிறப்புத் தன்மைக்கும் அடிப்படைக் காரணம் எனில் மிகையாகாது.
ஜாவா மொழியின் உதயம்
மின்னணுக் கருவிகளின் உட்பொதி மென்பொருளுக்கான (embeded software) ஆய்வு, ‘ஜாவா’ என்னும் புதிய மொழியின் உதயத்தில் முடிந்தது. சி++ மொழியின் சிக்கலான கருத்துருக்களைக் களைந்து, இணையப் பயன்பாடுகளை (Internet Applications) உருவாக்குவதற்கென்றே, ஒரு முழுமையான எளிய பொருள்நோக்கு நிரலாக்க மொழியாக ஜாவாவை ஜேம்ஸ் காஸ்லிங்கும் அவரது நண்பர்களும் சேர்ந்து உருவாக்கினர். பல வகையிலும் ஜாவா, ஒரு புதிய மொழி என்றபோதிலும் அதன் கட்டளை அமைப்புகள் அப்படியே சி- மொழியிலிருந்து எடுக்கப்பட்டவை ஆகும்.
மாறிக் கோவைகள் (expressions), if...else நிபந்தனைக் கூற்று (conditional statement), switch என்னும் கிளைபிரி கட்டளை (branching command) மற்றும் சக்தி வாய்ந்த for(), while(), do... while() ஆகிய கட்டுப்பாட்டு மடக்கிகள் (control loops) அனைத்தும் அப்படியே சி-மொழியிலிருந்து எடுத்துக் கொள்ளப்பட்டவை. தரவினங்கள் (data types), செயற்குறிகள் (operators), செயல்கூறு வரையறுப்புகள் (function definitions) ஆகியவையும் பெருமளவு சி-மொழியை ஒத்தவை. குறிப்பிடத்தக்க செய்தி என்னவெனில் முதன்முதல் ஜாவா கம்ப்பைலரும், ஜாவா இன்டர்பிரட்டரும் சி-மொழியில் உருவாக்கப்பட்டவை. ஜாவா மொழி, சி-மொழிக்குப் பெருமளவு கடமைப்பட்டுள்ளது எனில் மிகையாகாது.
இன்றைய மொழி சி#
மைக்ரோசாஃப்டின் புதிய படைப்பான சி# மொழி, சி மற்றும் சி++ மொழிகளின் அப்பட்டமான வாரிசாகும். சி# மொழியை உருவாக்கியவர்கள், அதனை சி, சி++ மொழிகளின் இயல்பான பரிணாம வளர்ச்சி என்றே கூறுகின்றனர். சி# மொழி ஜாவாவுக்குப் போட்டியாக உருவாக்கப்பட்ட மொழி என்றபோதிலும், சி, சி++ ஆகிய மொழிகளின் பாரம்பரியப் பெருமைகளை விட்டுக் கொடுக்காமல் அப்படியே தக்கவைத்துக் கொண்டுள்ளனர்.
அடிப்படைத் தரவினங்கள் மற்றும் கட்டளை அமைப்புகளை சி-மொழியிலிருந்து தருவித்துள்ளனர். ஜாவாவைப் போலப் பாயின்டர்களை முற்றிலும் துறந்து விடாமல், ’பாதுகாப்பற்ற குறிமுறை’ (unsafe code) என்ற பெயரில் சி# மொழியில் பாயின்டர்களை அப்படியே எடுத்தாள வழி செய்துள்ளனர். சி-மொழியின் வேகமும், திறனும் ஜாவாவைவிட சி# மொழியில் அதிகமாகவே உள்வாங்கப்பட்டுள்ளது என்றுதான் கூறவேண்டும். மைக்ரோசாஃப்ட் தன்னுடைய புதிய மொழிக்குப் பெயர் சூட்டும்போது, சி-மொழியின் பாரம்பரியத்தை நினைவுகூறும் வகையில் கவனமாக ‘சி#’ எனப் பெயரிட்டது. சி, சி# ஆகியவை இசைப்பலகையில் (Music Keyboard) சுரங்களைக் (Notes) குறிக்கும் குறியீடுகளாகும்.. சி வெள்ளைக் கட்டையிலும், சி# அடுத்துள்ள கருப்புக் கட்டையிலும் அமையும். சி-யைவிட, சி# சற்றே கூர்மையாய் ஒலிக்கும். எனவே, சி-யின் வழிவந்த புதுயுக மொழிக்கு சி# எனப் பெயரிட்டது பொருத்தமே.
திருக்குறளைப் பற்றித் தெரியாதவர் ஒரு தமிழறிஞராய் இருக்க முடியாது. அதுபோல சி-மொழியை அறியாதவர் ஒரு கணிப்பொறி நிரலராய் இருக்க முடியாது. ஆயிரம் மொழிகள் வந்து போனாலும் அன்றுமுதல் இன்றுவரை சிறப்புக் குன்றாமல் செல்வாக்குப் பெற்று விளங்குவது சி-மொழி ஆகும். புரோகிராமராக வேலைவாய்ப்புத் தேடிச் செல்வோரின் தகுதிக்குச் சான்றாக அவரின் சி-மொழி அறிவை ஏற்றுக் கொள்கின்றனர். ‘கற்றவர்க்குச் சென்ற இடமெல்லாம் சிறப்பு’ என்பதை மறுப்பவர் எவருமில்லை. ஆம்! சி-மொழியைக் கற்றவர்க்குச் சென்ற இடமெல்லாம் சிறப்புக் கிட்டும் என்பதில் ஐயம் எதுவுமில்லை. சி-மொழியில் நன்கு புலமை பெற்ற ஒருவரால் வேறெந்த மொழியிலும் எளிதாகப் புலமை பெற்றுவிட முடியும் என்பது அனைவரும் ஒப்புக் கொள்ளும் உண்மையாகும். அறிவுடையார் எல்லாம் உடையார் என்பது ஆன்றோர் மொழி. சி-மொழி அறிவுடையார் எல்லாம் உடையார் என்பது அனுபவ மொழி. எனவேதான் மாணவர்கள் மட்டுமல்ல, கணிப்பொறித் துறையில் கால்பதிக்க நினைக்கும் அனைவரும் சி-மொழியை விரும்பிக் கற்கின்றனர்.
சி-மொழி, சக காலத்தில் பயன்பாட்டிலிருந்த மொழிகளோடு ஒப்பிடுகையில், பல்வேறு வகையில் மேம்பட்டுத் திகழ்கிறது. சி-மொழியின் சிறப்புத் தன்மைகளை கீழ்க்காணுமாறு பட்டியலிடலாம்:
(1) இடைநிலை மொழி (Middle Level Language)
உயர்நிலை மொழிகள் (High Level Languages) மனிதனுக்கு நெருக்கமானவை. எனவே, நிரல் (Program) எழுதுவது எளிது. ஆனால் அவை கணிப்பொறிக்கு அந்நியமானவை. எனவே, நிரல் செயல்படும் திறன், வேகம் குறைவு. ஆனால் அடிநிலை மொழிகள் (Low Level Languages - Machine Language & Assembly Language) எந்திரத்துக்கு மிகவும் நெருக்கமானவை. திறனுடன் வேகமாகச் செயல்படுபவை. ஆனால் அவை மனிதனுக்கு அந்நியமானவை. இவற்றில் நிரல் எழுதுவது கடினமான வேலை. ஆனால், சி-மொழியோ இந்த இருவகை மொழிகளின் சிறப்புக் கூறுகளையும் தன்னகத்தே கொண்டது. மனிதனுக்கும் நெருக்கமானது, கணிப்பொறிக்கும் நெருக்கமானது. சி-மொழியின் அமைப்பு இருவருக்குமே எளிதில் புரியக் கூடியது. நிரல் எழுதுவதும் எளிது. நிறைவேற்றப்படும் திறனும் விரைவானது. எனவேதான், சி-மொழியைப் பலரும் இடைநிலை மொழி (Middle Level Language) என்றே அழைக்கின்றனர். ‘இடைநிலை மொழி’ என்று சிறப்புப் பெற்ற ஒரே மொழி சி-மொழி என்பது குறிப்பிடத் தக்கது.
(2) இயக்க முறைமையை உருவாக்கும் வல்லமை
முதன்முதலில் யூனிக்ஸ் சூழலில் சி-மொழி உருவானபோதும், இன்றைக்கு நாம் பயன்படுத்திக் கொண்டிருக்கும் யூனிக்ஸ் என்ற மாபெரும் இயக்க முறைமையின் ஆணைத் திரள் முழுமையும் சி-மொழியில் எழுதப்பட்டதாகும். 13 ஆயிரம் வரிகள் கொண்ட யூனிக்ஸ் இயக்க முறைமையின் ஆணைத் திரளில் 12 ஆயிரத்து 200 வரிகள் சி-மொழியில் எழுதப்பட்டவை. இயக்க முறைமையின் அடிப்படையில்தான் மொழிகள் உருவாக்கப்படுகின்றன. ஆனால், இயக்க முறைமையையே உருவாக்கும் வல்லமை சி-மொழிக்கு உண்டு. விண்டோஸ் மற்றும் விண்டோஸ் என்டீ இயக்க முறைமைகளின் பெரும்பகுதி சி-மொழியில் எழுதப்பட்டவை. இன்றைக்குப் பெருமளவு பேசப்படுகின்ற லினக்ஸ் (Linux) இயக்க முறைமை முழுக்க முழுக்க (100%) சி-மொழியில் எழுதப்பட்டுள்ளது குறிப்பிடத் தக்கது.
(3) பயன்பாட்டுத் தொகுப்புகளை உருவாக்கும் திறன்
பெரும்பாலும், பயன்பாட்டுத் தொகுப்புகளை (Application Packages) அசெம்பிளி மொழியில் எழுதிக் கொண்டிருந்தனர். இன்று, சி-மொழியைப் பயன்படுத்தி தரவுத்தளம் (Database), சொல் செயலாக்கி (Word Processor), விரிதாள் (Spreadsheet) போன்ற தொகுப்புகள் எழுதப்படுகின்றன. டி’பேஸ், வேர்டுஸ்டார், லோட்டஸ் போன்ற பல்வேறு பயன்பாட்டுத் தொகுப்புகள் சி-மொழியில் உருவாக்கப்பட்டவை.
(4) நிரல்பெயர்ப்பிகளை உருவாக்கும் திறன்
ஓர் உயர்நிலைக் கணிப்பொறி மொழியில் எழுதப்பட்ட நிரலை கணிப்பொறிக்குப் புரிகின்ற மொழியில் மொழிபெயர்த்துச் சொல்லும் மொழிபெயர்ப்பு மென்பொருளைக் ’கம்ப்பைலர்’ என்கிறோம். தமிழில் ‘நிரல்பெயர்ப்பி’ எனப்படுகிறது. ஓர் உயர்நிலை மொழிக்கான கம்ப்பைலர் அந்த நிரலைச் செயல்படுத்தவிருக்கும் கணிப்பொறியில் பொருத்தப்பட்டுள்ள நுண்செயலியின் (microprocessor) சில்லுமொழியில்தான் அதாவது அசெம்பிளி மொழியில்தான் பெரும்பாலும் எழுதப்படும். சி-மொழியின் கம்ப்பைலர்கள், சி-மொழியிலேயே எழுதப்படுகின்றன என்பது சற்றே வியப்பான செய்திதான். சி-மொழியின் முந்தைய பதிப்புகளைப் (earlier versions of C) பயன்படுத்திப் புதிய சி-மொழிக் கம்ப்பைலர்கள் உருவாக்கப்படுகின்றன.
(5) பிட்நிலைச் செயல்பாடுகள்
நாம் நிரலில் பயன்படுத்தும் மாறி அல்லது மாறிலிகளின் மதிப்புகள் (values of variables and constants) உள்பட அனைத்தையும், கணிப்பொறி 0,1 என்ற இரு இலக்கங்களின் தொகுப்பாகத்தான் நினைவகத்தில் இருத்திக் கொள்கிறது என்பதை நாம் அறிவோம். சி-மொழிக் கட்டளையால் நினைவகத்தில் இருத்தி வைக்கப்பட்டுள்ள மதிப்புகளில் உள்ள 0, 1 தொகுப்பில் உள்ள தனித்தனிப் பிட்டுகளை மாற்றியமைக்க முடியும். அதன் மூலம் மாறியின் மதிப்பை மாற்ற முடியும். நிரலில் கையாளும் தரவுகளை (data) பைட்டு நிலையில் மட்டுமின்றி பிட் நிலையிலும் கையாள முடிவது (bit level handling) சி-மொழியின் சிறப்புக் கூறாகும்.
(6) சிறப்பு மிக்க சி-மொழிச் சுட்டு
அனைத்துக் கணிப்பொறி மொழிகளிலும் நினைவகத்தில் குறிப்பிட்ட இடத்தில் இருத்தி வைக்கப்பட்டுள்ள ஒரு மாறியை, அதன் மதிப்பைக் கையாள வசதியுண்டு. ஆனால் அம்மாறியை, கணிப்பொறி நினைவகப் பரப்பில் இருத்தி வைத்துள்ள இடத்தின் முகவரியைக் கையாளவும் சி-மொழியில் வசதியுண்டு. அவ்வாறு நினைவகக் குறியிட முகவரியைக் (Address of the Memory Location) கையாண்டு, மாறிகளின் மதிப்புகளில் மாற்றங்களைச் செய்ய முடியும். இதற்குத்தான் சி-மொழியின் ’பாயின்டர்’ (pointer) பயன்படுகிறது. பாயின்டரைத் தமிழில் ’சுட்டு’ என்கிறோம். பாயின்டரைத் திறமையுடன் கையாளும் வல்லமை பெற்றவர்களின் காலடியில் சி-மொழி ஏவல் புரியக் காத்திருக்கும்.
(7) சுழல் செயல்பாடு
கணிப்பொறி நிரலில் சுழல் செயல்பாடு (Recursion) என்கிற ஒரு கருத்துரு உண்டு. பெரும்பாலான கணிப்பொறி மொழிகளில் இந்த வசதியில்லை. அதாவது ஒரு பிரதான நிரல் ஒரு குறிப்பிட்ட பணியைச் செய்து முடிக்க, செயல்கூறு அல்லது செயல்முறையின் (Function or Procedure) உதவியை நாடும். இத்தகைய ஒரு துணைக்கூறானது (செயல்கூறு அல்லது செயல்முறை) அந்தப் பணியை முடிக்க வேறொரு துணைக்கூறின் உதவியை நாடலாம். ஒரு துணைக்கூறு, அந்தப் பணியை முடிக்க, அதே துணைக்கூறின் உதவியை நாட முடியுமா? கோபால் மொழியில், ஒரு செயல்முறைப் பத்தியில் (Procedure Para) அதே செயல்முறையை நிறைவேற்றும்படியான ஆணையைக் கொடுக்க முடியாது. ஆனால் சி-மொழியில் ஒரு ஃபங்ஷன் உள்ளே அதே ஃபங்ஷனை நிறைவேற்றச் சொல்லி ஆணையிடலாம். இந்தச் சுழல் செயல்பாடு சி-மொழியின் தனிச்சிறப்பாகும்.
(8) உயர்தனிச் செம்மொழி
சி-மொழிக்கு முன்பும் பின்பும் கணிப்பொறி உலகில் செல்வாக்குப் பெற்று விளங்கிய பல்வேறு மொழிகள் இன்று, இருந்த சுவடு தெரியாமல் போய்விட்டன. ஏறத்தாழ நாற்பது ஆண்டுகளாக, சி-மொழி மட்டும் அதே செல்வாக்கோடு, கணிப்பொறி உலகில் இன்னும் வலம் வந்துகொண்டிருக்கிறது. “உன் சீரிளமைத் திறம்வியந்து செயல்மறந்து வாழ்த்துதுமே” என்று, உயர்தனிச் செம்மொழியான தமிழ்மொழிக்குச் சூட்டப்பட்ட புகழாரம் சி-மொழிக்கும் பொருந்தும். கால ஓட்டத்தில் காலாவதி (Obsolete) ஆகிப் போகாமல், அனைவரையும் ஈர்க்கும் திறனோடு இன்றைக்கும் பவனி வந்து கொண்டிருக்கிறது.
(9) கச்சிதமான மொழி
சி-மொழி மிகமிகக் குறைந்த சிறப்புச் சொற்களைக் (reserved words) கொண்ட மொழியாகும். மொத்தம் 32 சிறப்புச் சொற்கள் மட்டுமே சி-மொழியில் உண்டு.
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continuefor signed void default goto sizeof volatile do if static while ரிட்சியின் சொற்களில் சொல்வதெனில், சி-மொழி சிறியது. ஆனால் மிகப்பெரும் பணிகளையும் செய்ய வல்லது. சி-மொழி சிக்கனமானது. ஆனால் வளம் மிக்கது. மிக நவீன கட்டுப்பாட்டுக் கட்டளை அமைப்புகளையும் (Control Structures), தரவுக் கட்டுருக்களையும் (Data Structures), வளமான செயற்குறிகளையும் (Operators) கொண்டது. எந்த ஒரு குறிப்பிட்ட பயன்பாட்டுக்காகவும் உருவாக்கப்பட்டதன்று. சி-மொழி ஒரு பொதுப்பயன் மொழியாகும். இதன் பொதுத்தன்மை, மிகச் சக்தி வாய்ந்த மொழிகளால் சாதிக்க முடியாததையும் சாதிக்க வல்லதாய் உள்ளது.
(10) இயக்கமுறை, கணிப்பொறி சாரா மொழி
சி-மொழி மிகவும் இனிமையானது, தெளிவானது, வெளிப்படையானது, பல்திறன் மிக்கது, கற்க எளிமையானது, ஒருவரின் அனுபவத்துக்கு ஏற்ப இதன் திறனும் கூடிக்கொண்டே போகிறது என்று ரிட்சியும், கெர்னிகனும் தம் நூலின் முன்னுரையில் குறிப்பிடுகின்றனர். சி-மொழி எந்தவோர் இயக்க முறைமையுடனோ (Operating System), கணிப்பொறியுடனோ (Machine) கட்டுண்டது அன்று. என்றாலும் கம்ப்பைலர்களையும், இயக்க முறைமைகளையும் எழுதப் பயன்படுவதால், சி-மொழி ஒரு ‘முறைமை நிரலாக்க மொழி’ (System Programming Language) என்றழைக்கப்படுகிறது. அதுமட்டுமின்றி பல்வேறு பணித்தளங்களிலும் (Platforms) எதிர்கொள்ளும் மிகப்பெரும் சவால்களுக்குத் தீர்வு காணவும் சி-மொழி பயன்படுகிறது.
சி-மொழியில் இருப்பதும் இல்லாததும்
சி-மொழியில் ஸ்டிரிங், லிஸ்ட், அர்ரே போன்ற தருவிக்கப்பட்ட தரவினங்களை (derived data types) கையாள நேரடியான ஆப்பரேட்டர்கள் கிடையாது. அர்ரே, ஸ்டிரிங் ஆகியவற்றை முழுமையாக எடுத்தாளும் செயல்முறைகள் எதுவும் வரையறுக்கப்படவில்லை. ஆனால் ஸ்ட்ரக்சர்களை முழுமையாக நகலெடுக்க முடியும். நினைவக மேலாண்மைக்கு தானியங்கு நினைவக விடுவிப்பு (Garbage Collection) வசதி சி-மொழியில் கிடையாது. இன்னும் சொல்லப்போனால் சி-மொழியில் திரையகவழி உள்ளீட்டு, வெளியீட்டுக்கு (screen input, output) உள்ளிணைந்த கட்டளைகள் கிடையாது. அதாவது read, write போன்ற நேரடியான கட்டளைகள் கிடையாது. ஃபைல்களை அணுகுவதற்கு உள்ளிணைந்த வழிமுறைகள் எதுவுமில்லை. இவையனைத்தும் நூலகச் செயல்கூறுகள் (Library Functions) மூலமாகவே செயல்படுத்தப்படுகின்றன.
சி-மொழியில் பொருள்நோக்கு நிரலாக்க கருத்துருக்கள் (Object Oriented Programming Concepts) கிடையாது. பல்புரியாக்கம் (multi-threading) கிடையாது. ஒரே திரெட் மட்டுமே உண்டு. மற்றும் பல்நிரலாக்கமும் (multi-programming) கிடையாது. ஒன்றுக்கு மேற்பட்ட உடன்நிகழ் செயல்பாடுகளோ (concurrent activities), உடன்நிகழ் நிரல்கூறுகளோ (co-routines) கிடையாது. ஒத்தியக்கம் (Synchronization) என்னும் கருத்துருவும் இல்லை. இவையெல்லாம் சி-மொழியின் குறைபாடுகள் அல்ல. சி-மொழி மிகச் சிறியதாய், மிகக் கச்சிதமாய் அமைய இவையே காரணம். சி-மொழி சிறியதாய் இருப்பதால் அதனை மிக எளிதாய் விளக்க முடியும். மிக விரைவாய்க் கற்க முடியும். எனவே ஒரு சி-மொழி நிரலர் எப்போதும் சி-மொழியை அதன் முழுமையோடு தெரிந்து, புரிந்து பயன்படுத்த முடியும் அல்லவா?
பாடம்-3
சி நிரலைச் செயல்படுத்தல்
சி-மொழியில் ஒரு நிரலை எழுதிச் செயல்படுத்துவது எப்படி என்பதைப் பார்ப்போம். சி-மொழியில் ஜோர்டெக்-சி, போர்லாண்டு-சி, மைக்ரோசாஃப்ட்-சி, டர்போ-சி என்று எத்தனையோ வகைகளும், ஒவ்வொன்றிலும் பல்வேறு பதிப்புகளும் உள்ளன. இவை எல்லாம் பல்வேறு நிறுவனங்கள் உருவாக்கிய சி-மொழிக்கான கம்ப்பைலர்கள். இவையனைத்தும் ரிட்சி உருவாக்கிய அடிப்படையான சி-மொழியின் இலக்கணப்படி அமைந்தவை.
நாம் எழுதும் சி-மொழி நிரலை ஏதேனும் ஒரு கம்ப்பைலரில் கம்ப்பைல் செய்து பிறகுதான் இயக்கிப் பார்க்க முடியும். கம்ப்பைலர்களில் பின்பற்றப்படும் வழிமுறைகளில் மிகச்சிறு வேறுபாடுகள் இருக்க முடியும். நமது பாடங்களைப் பொறுத்தவரை டர்போ-சி (Turbo C) கம்ப்பைலரை அடிப்படையாகக் கொண்டே நிரல்கள் வடிவமைக்கப்பட்டுள்ளன. கருத்துருக்களும் விளக்கப்பட்டுள்ளன. ஒன்றில் நல்ல அனுபவம் பெற்று விட்டால், மற்றதில் பணிபுரிவது எளிதாகவே இருக்கும்.
நிரலை எழுதிச் சேமித்தல்
டர்போ சி-யின் ஃபைல்கள் TC என்னும் டைரக்டரியில் இருப்பதாக வைத்துக் கொள்வோம். அந்த டைரக்டரியில் இருந்துகொண்டு,
C : \TC>TC WELCOME
என்று கட்டளை கொடுங்கள். திரையில் டர்போ சி-யின் ஒருங்கிணைந்த புரோகிராம் உருவாக்க சூழலின் (Integrated Development Environment) மெனுவும் புரோகிராம் எடிட்டரும் தோன்றும்.
டர்போ சி-யின் எடிட்டரில் கீழ்க்காணும் புரோகிராமை தட்டச்சு செய்யுங்கள்:
/* Program No.1.1 */
/* WELCOME.C */
#include < stdio.h >
main()
{
printf("Welcome to C!");
}
சிறிய எழுத்து, பெரிய எழுத்து, அடைப்புக் குறிகள், அரைப்புள்ளி ஆகியவற்றை எதையும் மாற்றாமல் மறக்காமல் அப்படியே தட்டச்சு செய்யுங்கள். ஏன் என்று பிறகு விளக்கமாகப் பார்ப்போம். நிரலைத் தட்டச்சிட்டு முடித்த பிறகு F2 விசையை அழுத்துங்கள். உங்கள் நிரல் WELCOME.C என்ற பெயரில் நிலைவட்டில் சேமிக்கப்பட்டுவிடும். C என்ற வகைப்பெயரை ((Extension) டர்போ-சி தானாகவே கோப்பின் பெயரில் ஒட்ட வைத்துக்கொள்ளும்.
நிரலைக் கம்ப்பைல் செய்து செயல்படுத்தல்
கோப்புச் சேமிக்கப்பட்ட பின்னும் டீசி எடிட்டர் திரை மறையாமல் அப்படியே இருக்கும். இப்போது F9 விசையை அழுத்துங்கள். திரைக்குள் ஒரு குட்டித்திரை தோன்றும். கம்ப்பைலிங், லிங்க்கிங் ஆகிய இரண்டு வேலைகளும் கடகடவென்று நடந்து முடியும். WELCOME.EXE என்ற கோப்பு உருவாகி விடும். Success என்ற செய்தி திரையில் தெரியும். Press any key என்ற செய்தி மின்னிக் கொண்டிருக்கும். நீங்கள் Alt+F கீகளை ஒருசேர அழுத்துங்கள். மேலே முதல் வரியிலுள்ள மெனுத் தேர்வுகளில் File என்பதில் உள்ள துணைமெனுப் பட்டியல் திரையில் தோன்றும். இப்போது O (ஓ) என்னும் எழுத்தைத் தட்டுங்கள். அது ’ஆப்பரேட்டிங் சிஸ்டம் ஷெல்லைக்’ (OS Shell) குறிக்கிறது.
அதாவது, நீங்கள் தற்காலிகமாக டீசி பணிப் பரப்பைவிட்டு நீங்கி, டாஸ் பணிப் பரப்பிற்கு வந்திருக்கிறீர்கள் என்று பொருள். திரையில் மைக்ரோசாஃப்டின் பதிப்புச் செய்தியும், C:\TC> என்ற டாஸ் சின்னமும் தோன்றும். இப்போது,
C : \ TC > WELCOME
என்று கட்டளை கொடுங்கள். சுத்தமான திரையின் மத்தியில்,
Welcome to C!
என்ற வாசகம் தோன்றும். அருகில் C : \TC> என்னும் டாஸ் சின்னம் இருக்கும். இப்போது EXIT என்ற கட்டளை கொடுங்கள். மீண்டும் டீசி எடிட்டரில் உங்கள் நிரல் தோன்றும். ஏதேனும் திருத்தங்கள் இருப்பின், செய்யலாம். முன்பு சொன்னது போலவே F2 விசையை அழுத்தி நிரலைச் சேமிக்கலாம். F9 மூலம் .EXE கோப்பினை உருவாக்கலாம். Alt+F+O மூலம் ஓஎஸ் ஷெல்லுக்கு வந்து நிரலைச் செயல்படுத்தலாம்.
மாற்று வழிமுறை
சி-மொழி நிரலை இயக்கிப் பார்க்க இன்னொரு வழிமுறையும் உள்ளது. நிரலை எழுதி முடித்தவுடன் Ctrl மற்றும் F9 கீகளை ஒருசேர அழுத்துங்கள். நிரல் கம்ப்பைல் ஆகி, லிங்க் ஆகி, .EXE கோப்பு உருவாகி முடிந்துவிடும். ஆனால் உடனே ஐடிஇ-க்கே திரும்பிவிடும். நிரலின் வெளியீட்டைப் பார்க்க வேண்டுமானால் Alt+F5 விசைகளை அழுத்த வேண்டும். டாஸ் திரையில் வெளியீடு தெரியும். என்டர் விசையைத் தட்டினால் மீண்டும் ஐடிஇ-க்கே திரும்பலாம். பலரும் இந்த முறையையே பின்பற்றுகிறார்கள். ஆனால், சில சி-மொழி நிரல்களை இந்த முறையில் இயக்கிப் பார்க்க முடியாது. எனவே, F9 அழுத்திக் கம்ப்பைல் / லிங்க் செய்தபின், Alt+F+O அழுத்தி, டாஸ் சூழலுக்கு வந்து, நிரலை இயக்கிப் பார்க்கும் முறையே சிறந்த முறையாகும்.
டீசி எடிட்டரில் இருக்கும்போது Alt+F விசைகளை ஒருசேர அழுத்தி, துணைமெனு வந்த பிறகு L என்ற எழுத்தை அழுத்தி, ஏற்கெனவே எழுதப்பட்டுள்ள ஒரு நிரலின் பெயரை உள்ளிட்டு, அதனை எடிட்டரில் வரவழைக்கலாம். L-க்குப் பதில் N கீயை அழுத்திப் புதிய நிரலை எழுதலாம். எழுதி முடித்துச் சேமிக்கும் முன்பாகப் புதிய நிரலுக்குப் பெயர் கொடுக்கலாம்.
டீசி பணிப் பரப்பை அதாவது டீசி ஐடிஇ-யை விட்டு வெளியே வருவதற்கு Alt +F விசைகளை ஒரு சேர அழுத்திப் பின் Q விசையைத் தட்டுங்கள். திரையில் C:\TC> தோன்றும். விண்டோஸிலிருந்து TC-க்குச் சென்றிருப்பின் மீண்டும் விண்டோஸ் முகப்புக்கு வந்து விடலாம். இப்போது டீசியைவிட்டு நிரந்தரமாக வெளியே வந்துவிட்டீர்கள்.
வேறு எடிட்டரைப் பயன்படுத்தல்
சி-மொழி நிரலை நோட்பேடு போன்ற வேறு எந்த எடிட்டரில் வேண்டுமானாலும் எழுதலாம். வேறு எடிட்டரில் எழுதும்போது .C என்ற வகைப்பெயர் கொடுத்து, WELCOME.C என்று நிரல் கோப்பினை உருவாக்குங்கள். பிறகு, TC டைரக்டரிக்கு வந்து,
C:\TC>TCC WELCOME
என்று கட்டளை கொடுங்கள். ஒரே நொடியில் நிரல் கம்ப்பைல், லிங்க் செய்யப்பட்டு, WELCOME.EXE என்ற கோப்பு உருவாகிவிடும். ஆனால், டீசி ஐடிஇ-யில் நிரல் எழுதிக் கம்ப்பைல் செய்யும்போது, நிரலில் உள்ள பிழைகளைக் கண்டறிந்து திருத்துவதற்கு ஐடிஇ-யின் சில தனிச்சிறப்பான வசதிகளை பயன்படுத்திக் கொள்ள முடியும்.
சி நிரலின் கூறுகள்
ஒரு நிரலின் கட்டமைப்பில், இருவகைக் கூறுகள் உள்ளன. ஒன்று மரபு (Convention); மற்றொன்று விதிமுறை (Rule). மரபுகளை, நீங்கள் விரும்பினால் பின்பற்றலாம். இல்லாவிட்டால் விட்டுவிடலாம். மரபுகள் பின்பற்றப்படா விட்டாலும் அந்த நிரல் சரியாகவே செயல்படும். ஆனால் விதிமுறைகளை நிரல் எழுதும்போது கட்டாயம் கடைப்பிடித்தே ஆக வேண்டும். இல்லையேல் நிரல் கம்ப்பைல் ஆகாது அல்லது சரியாகச் செயல்படாது.
ஒவ்வொரு மொழியிலும் மரபு முறைகளும், விதிமுறைகளும் வேறுபடுகின்றன. ஆனால், இந்த இரண்டு கூறுகள்தாம் ஒரு மொழியில் எழுதப்படும் நிரலின் கட்டமைப்பினை முடிவு செய்கின்றன.
ஒரு சிறு நிரலை எடுத்துக் கொள்வோம். இந்த நிரலைச் செயல்படுத்தியவுடன், ஓர் ஆண்டை உள்ளிடும்படி கேட்கும். நாம் கொடுத்த ஆண்டு லீப் ஆண்டா அல்லது சாதாரண ஆண்டா என்பதைக் கணக்கிட்டுச் சொல்லும். இந்த நிரலில் கட்டளை வாக்கியங்கள் எப்படி அமைந்துள்ளன, அவற்றின் பொருள் என்ன நிரலின் வடிவமைப்பு எப்படி உள்ளது, மரபு முறைகளும் விதிமுறைகளும் எப்படிப் பின்பற்றப்பட்டுள்ளன என்ற விவரங்களை மேலோட்டமாக இப்பாடத்தில் அறிந்துகொள்வோம். அடுத்துவரும் பாடங்களில் ஒவ்வொன்றைப் பற்றியும் ஆழமாகக் கற்போம்.
/* Program No.1.2 */
/* LEAPYEAR.C */
/* Program to find square of a number */
/* Written by M.Sivalingam on 25-04-1994 */
#include <stdio.h>
main()
{
int y;
printf("Enter year: ");
scanf("%d",&y);
if (y%4==0 && y%100!=0 || y%400==0)
printf("%d is a leap year", y);
else
printf("%d is not a leap year", y);
}
இந்த நிரலை எழுதி இயக்கிப் பார்ப்பதற்கு முன்பாக, நிரலின் கூறுகள் ஒவ்வொன்றையும் வரிவரியாக ஆய்வு செய்வோம்.
1. குறிப்புரை (Comment)
ஒரு நிரலின் தலைப்பில், நிரலின் முகப்புரை (Preamble) இடம் பெறுவது மரபாகும். நிரலின் பெயர், நிரலின் நோக்கம், நிரலை எழுதியவர் பெயர், நாள் போன்ற குறிப்புகள் கொண்ட பகுதி முகப்புரை எனப்படுகிறது. சி-மொழியில் இதனைக் குறிப்புரை (Comment) என்கிறோம். குறிப்புரை /* */ ஆகிய குறிகளுக்கு இடையில் அமையும். சி-மொழி நிரலுக்குக் குறிப்புரை கட்டாயமில்லை. மேற்கண்ட நிரலில் குறிப்புரைகள்,
/* Program No.1.2 */
/* LEAPYEAR.C */
/* Program to check leap year */
/* Written by M.Sivalingam on 25-04-1994 */
என அமைந்துள்ளன. சி-மொழியில் குறிப்புரை நிரலின் முகப்பில் மட்டுமின்றி எங்கு வேண்டுமானாலும் இடம் பெறலாம்.
குறிப்புரைக்கும், நிரல் செயல்பாட்டுக்கும் எவ்விதத் தொடர்பும் இல்லை. இந்தக் குறிப்புரைகள் இல்லாவிட்டாலும் நிரல் சரியாகவே செயல்படும் என்பதை மறக்க வேண்டாம். நிரலைக் கம்ப்பைல் செய்யும்போது /* */ ஆகியவற்றுக்கு இடையே அமையும் குறிப்புரைகளைக் கம்ப்பைலர் புறக்கணித்துவிடும். இத்தகைய விளக்கக் குறிப்புரைகள் நிரலைப் படிக்கின்ற மற்றவர்களுக்கு பெரிதும் பயன்படுகின்றன. நிரலை எழுதியவர்க்கேகூட இந்த விளக்கக் குறிப்புகள் பயனுள்ளவையாக இருக்கும்.
குறிப்புரை எத்தனை வரிகள் வேண்டுமானாலும் இருக்கலாம். குறிப்புரை முடிந்த பிறகு */ என்ற குறிகளை இடவேண்டும். ஒவ்வொரு கட்டளைக்கும் அரைப்புள்ளி இடவேண்டும் என்ற சி-மொழி விதிமுறை விளக்கவுரைக்குப் பொருந்தாது.
/* */ ஆகிய குறிகளைக் குறிப்புரையின் ஒவ்வொரு வரியிலும் பயன்படுத்தத் தேவையில்லை. விளக்கவுரை எத்தனை வரிகள் இருந்தாலும் தொடக்கத்தில் /* எனவும், இறுதியில் */ எனவும் குறிப்பிட்டால் போதும்.
/*..... /* .....*/ .....*/
என்று குறிப்புரைக்குள், இன்னொரு குறிப்புரை எழுத அனுமதி கிடையாது.
நிரலில் எங்கு வேண்டுமானாலும் குறிப்புரை இடம்பெறலாம். ஒவ்வொரு கட்டளை வரிக்கு முன்னும் பின்னும் குறிப்புரை அமைக்கலாம். கட்டளை வரியிலேயே குறிப்புரை இடம்பெறலாம்.
int i, J;/*Declaring variables*/
என்று அமைக்கலாம். ஒரு கட்டளையின் நடுவில்கூட குறிப்புரை அமைக்க முடியும் என்பது சி-மொழியின் சிறப்புக்கூறாகும். printf(), scanf() மற்றும் இனி படிக்கவிருக்கும் if(), for(), while() ஆகியவற்றில் அடைப்புக்குறிகளுக்கு உள்ளேயும் குறிப்புரை அமைக்கலாம்.
scanf("%d", &num /* Address of the variable */);
printf(/* Display the result */ "%d is a leap year", y);
என்று குறிப்புரைகளை அமைக்கலாம். இவ்வாறெல்லாம் ஒவ்வொரு வரிக்கும் குறிப்புரை எழுத வேண்டியதில்லை. தேவையான இடங்களில் மட்டும் குறிப்புரை சேர்ப்பது சிறந்தது.
2. நூலகக் கோப்புகள் (Library Files)
நிரலின் மூன்றாவது வரியில்,
# include <stdio.h>
என்று குறிப்பிடப்பட்டுள்ளது. stdio.h என்பது சி-மொழியின் உள்ளிணைந்த நூலகக் கோப்பாகும். இதனை ’ஹெடர் ஃபைல்’ என்றும் அழைப்பர். stdio என்ற சொல் (எஸ்டீடிஐஓ என உச்சரிப்பர்) standard input output என்பதையும், h என்ற எழுத்து header என்பதையும் குறித்து நிற்கிறது. stdio கோப்பில் பல்வேறு உள்ளீட்டு, வெளியீட்டுச் செயல்கூறுகள் (I/O Functions), மாறிலிகள் (constants) வரையறுக்கப்பட்டுள்ளன. அவற்றை நமது நிரலில் பயன்படுத்த வேண்டியிருப்பின் அந்தக் கோப்பினை #include என்ற கட்டளைச்சொல் மூலம் இணைத்துக் கொள்கிறோம். ஒரே நிரலில் ஒன்றுக்கு மேற்பட்ட கோப்புகளை இணைத்துக் கொள்ள முடியும். ஒவ்வொரு கோப்பினையும் தனித்தனி #include கட்டளைகளில் அடுத்தடுத்த வரிகளில் குறிப்பிட வேண்டும். #include கட்டளை நிரலின் தொடக்கத்தில் இடம்பெற வேண்டும்.
3. செயல்கூறுகள் (Functions)
நிரலின் அடுத்தவரி,
main()
என அமைந்துள்ளது. ( ) என்ற அடைப்புக் குறிகள் main என்பது ஒரு ஃபங்ஷன் என்பதை குறிக்கின்றன. அதன்கீழ் உள்ள கட்டளைகள் அனைத்தும் { } என்ற அடைப்புக் குறிகளுக்குள் கொடுக்கப்பட்டுள்ளன. ஒவ்வொரு சி-மொழி நிரலும் ஃபங்ஷன்களால் ஆனதுதான். ஒரு நிரலில் ஒரு ஃபங்ஷனோ அல்லது ஒன்றுக்கு மேற்பட்ட ஃபங்ஷன்களோ இருக்கலாம். ஒன்று மற்றதை அழைக்கலாம்.
ஒவ்வொரு நிரலிலும் குறைந்தபட்சம் main() ஃபங்ஷன் மட்டுமாவது இருக்க வேண்டும் என்பது கட்டாய விதிமுறையாகும். main ஃபங்ஷனின் கட்டளைகளை { } என்னும் அடைப்புக் குறிகளுக்குள் அமைக்க வேண்டும் என்பதும் கட்டாய விதிமுறையாகும். இந்த இரு விதிமுறைகளுக்கும் உட்பட்டு எழுதப்பட்ட,
main()
{
}
என்பதுதான் சி-மொழியில் மிகச்சிறிய நிரல். இந்த நிரல் எந்தச் செயலையும் செய்யாது என்பது ஒருபுறம் இருக்க, இது சி-மொழியின் விதிமுறைப்படி எழுதப்பட்ட நிரல் (Legal Program) என்பதைக் கருத்தில் கொள்க. இதைக் குறிப்பிடுவதன் நோக்கம், ஒவ்வொரு சி-மொழி நிரலிலும்,
main ()
{
............ ;
............ ;
}
என்ற கட்டமைப்பு கட்டாயம் இருக்க வேண்டும் என்பதை வலியுறுத்தத்தான்.
4. மாறிகளின் அறிவிப்பு (Declaration of Variables)
main() ஃபங்ஷனுக்குள் உள்ள முதல் வரி,
int y;
என்பதுதான். இதில் int என்பது integer என்னும் தரவு இனத்தைக் (Data Type) குறிக்கிறது. சி-மொழியில் char, int, float, double என்னும் அடிப்படைத் தரவினங்கள் வரையறுக்கப்பட்டுள்ளன. y என்பது int இனத்தில் ஒரு மாறி (variable) ஆகும். ஒரு சி-மொழி நிரலில் பயன்படுத்தப்படுகிற அனைத்து மாறிகளும் நிரலின் தொடக்கத்திலேயே அறிவிக்கப்பட வேண்டும் என்பது விதிமுறையாகும்.
5. உள்ளீடு / வெளியீடு (Input / Output)
நிரலில் அடுத்து,
printf("Enter year: ");
scanf("%d",&y);
ஆகிய வரிகள் இடம்பெற்றுள்ளன. printf()-ல் ஒரு செய்தி வெளியிடப்பட்டுள்ளது. scanf()-ல் ஒரு மாறியின் மதிப்புப் பெறப்பட்டுள்ளது. printf(), scanf() ஆகியவை stdio.h என்னும் ஹெடர் ஃபைலில் வரையறுக்கப்பட்டுள்ள ஃபங்ஷன்கள் ஆகும். இத்தகைய உள்ளிணைந்த ஃபங்ஷன்களின் துணைகொண்டே சி-மொழி நிரலில் உள்ளீடும் வெளியீடும் செயல்படுத்தப்படுகின்றன. ஒற்றை எழுத்து, ஒரு சொல், ஒரு வரி எனப் பல்வேறு வகையில் உள்ளீடு / வெளியீடு செய்ய வெவ்வேறான ஃபங்ஷன்கள் உள்ளன. அவற்றைப் பற்றிப் பின்வரும் பாடங்களில் விரிவாகப் படிக்க இருக்கின்றோம்.
6. கட்டளை அமைப்புகள் (Command Syntax)
ஒவ்வொரு கட்டளைத் தொடரின் இறுதியிலும், ஓர் அரைப்புள்ளி (;) இடம் பெற்றுள்ளதை நோக்குங்கள். இது கட்டாய விதிமுறையாகும். இங்கே அரைப்புள்ளி, கட்டளையை முடித்துவைக்கும் குறியீடாகப் (Terminator) பயன்படுகிறது, பாஸ்கல் மொழியில் உள்ளதுபோல், கட்டளைகளைப் பிரித்துக்காட்டும் குறியீடாக (separator) அல்ல என்பதைப் புரிந்துகொள்ள வேண்டும். ஒன்றுக்கு மேற்பட்ட கட்டளை வாக்கியங்களை ஒரே வரியில் எழுத முடியும். எடுத்துக்காட்டாக, மேற்கண்ட நிரலின் முதல் மூன்று வரிகளை,
int y ; printf (“Enter Year:”); scanf("%d",&y);
என்று ஒரே வரியில் எழுதினாலும் நிரல் செயல்படும்.
ஒரு கட்டளை வாக்கியம் மிக நீளமாக இருந்தால், \ என்னும் பின்சாய்வுக்குறி (Back Slash) மூலம் கட்டளை வாக்கியத்தைத் துண்டாக்கி ஒன்றுக்கு மேற்பட்ட வரிகளில் எழுதலாம்.
printf("Do you want to add more records? \
Say Y/N : ");
என்று எழுதலாம். மேற்கண்ட நிரலில், அடுத்து,
if ()
........... ;
else
............. ;
என்னும் கட்டளை அமைப்பு பயன்படுத்தப்பட்டுள்ளது. இந்தக் கட்டளை, தீர்வுசெய் கட்டளை (Decision Making Command) அல்லது நிபந்தனைச் சரிபார்ப்புக் கட்டளை (Condition Checking Command) எனப்படுகிறது. மேலே உள்ள நிரலில் அந்தச் சொற்கள் இடம்பெற்ற வரிகளில் அரைப்புள்ளி கிடையாது என்பதைக் கவனியுங்கள். மேற்கண்ட நான்கு வரிகளையும்,
if (<Condition>) statement;
else statement ;
என இரண்டு வரிகளிலும் எழுதலாம். இதுதவிர, for(), while(), do...while() ஆகிய கட்டுப்பாட்டு மடக்கி (Control Loop) என்னும் கட்டளை அமைப்பும் சி-மொழியில் உண்டு. இவற்றைப் பற்றி இனிவரும் பாடங்களில் விரிவாகப் படிப்போம்.
7. செயற்குறிகள் (Operators)
if () நிபந்தனையில் == != % && || ஆகிய செயற்குறிகள் (Operators) இடம்பெற்றுள்ளன. சி-மொழியில் கணக்கீடு, ஒப்பீடு, மதிப்பிருத்தல், நிபந்தனைச் சரிபார்ப்பு, ஒன்று கூட்டல், ஒன்று குறைத்தல், பிட்நிலைச் செயல்பாடு போன்ற பல்வேறு பணிகளுக்கும் பல்வேறு வகைப்பட்ட ’ஆப்பரேட்டர்கள்’ எனப்படும் செயற்குறிகள் பயன்படுத்தப்படுகின்றன. இவைபற்றித் தனியாக இனிவரும் பாடத்தில் படிப்போம்.
8. வடிவமைப்புக் குறியீடுகள் (Format Specifiers)
சி-மொழி நிரலில் உள்ளீட்டு, வெளியீட்டுக் கட்டளைகளில் பல்வேறு வகையான வடிவமைப்புக் குறியீடுகள் (Format Specifiers) பயன்படுத்தப்படுகின்றன. இந்த நிரலில் scanf(), printf() கட்டளைகளில் %d என்கிற வடிவமைப்புக் குறியீடு பயன்படுத்தப்பட்டுள்ளது. உள்ளீட்டில் பெறப்படும் மதிப்பும் வெளியீட்டில் இடம்பெறும் மதிப்பும் ஓர் இன்டிஜர் என்பதை %d உணர்த்துகிறது. இதுபோல சி-மொழியில் ஒவ்வோர் உள்ளீட்டு வெளியீட்டுக் கட்டளையிலும், கையாளப்படும் மதிப்பு எந்த இனத்தைச் சார்ந்ததாகக் கருதப்பட வேண்டும் என்பதைக் குறிப்பிடக் கட்டாயமாக வடிவமைப்புக் குறியீட்டைப் பயன்படுத்த வேண்டும்.
9. சிறிய எழுத்து / பெரிய எழுத்து (Lower Case / Upper Case)
நிரலை உற்று நோக்குங்கள். பெரும்பாலும் சிறிய எழுத்தில் எழுதப்பட்டுள்ளன. include, main, int, printf, scanf, if, else - ஆகிய சொற்களைப் பெரிய எழுத்திலோ, கலப்பு எழுத்திலோ எழுதினால் நிரல் கம்ப்பைல் ஆகாது. .EXE கோப்பு உருவாகாது. கம்ப்பைலர் பிழைசுட்டும். நாம் பயன்படுத்துகிற மாறிகள் (variables), மாறிலிகள் (constants) ஆகியவற்றின் பெயர்கள்கூட வடிவக் கட்டுப்பாடு உள்ளவை (case sensitive). SUM என்கிற ஒரு மாறியை உங்கள் நிரலில் பயன்படுத்துவதாக வைத்துக் கொள்வோம். SUM, Sum, sum என்று எழுதப்படுகிற மூன்றும் வெவ்வேறு மாறிகள் ஆகும்.
10. வெற்றுவரிகள் / இடவெளிகள் (Blank Lines / Spaces)
சி-மொழி நிரலின் கட்டளைத் தொடர்களை வரியின் எந்த இடத்தில் வேண்டுமானாலும் எழுதத் தொடங்கலாம். ஃபோர்ட்ரான், கோபால் போன்ற மொழிகளில் குறிப்பிட்ட கட்டளையை, வரியில் ஒரு குறிப்பிட்ட இடத்திலிருந்துதான் தொடங்க வேண்டும் என்ற விதிமுறை உண்டு.
ஒரு கட்டளை வாக்கியத்தில் ஒரு சொல்லுக்கும், இன்னொரு சொல்லுக்கும் இடையே ஒன்றுக்கு மேல் எத்தனை இடவெளி (space) இருந்தாலும் நிரல் செயல்படும். கட்டளை வரிகளுக்கு இடையே வெற்று வரிகள் எத்தனை வேண்டுமானாலும் இருக்கலாம். சி-மொழிக் கம்ப்பைலர் வெற்று வரிகள், தத்தல்கள் (Tabs), ஒன்றுக்கு மேற்பட்ட இடவெளிகள் (spaces) ஆகியவற்றைப் புறக்கணித்துவிடும்.
கட்டமைப்பு மிக்க சி-மொழியின் நிரல் கட்டமைப்பை நன்கு புரிந்து கொண்டுள்ளோம். இனி வரிசைப்படி ஒவ்வொரு கருத்துருவையும் (concept) விரிவாகக் கற்றுக் கொள்வோம்.
பாடம்-5
சி-மொழித் தரவினங்கள்
(Data Types in C)
ஒரு குறிப்பிட்ட பணியைச் செய்து முடிப்பதற்குக் கம்ப்யூட்டரில் புரோகிராம் எழுதுகிறோம். புரேகிராம் என்பது கம்ப்யூட்டருக்குத் தரப்படும் கட்டளைகளின் தொகுப்பாகும். வெறும் கட்டளைகளை வைத்துக் கொண்டு கம்ப்யூட்டரால் எதுவும் செய்ய முடியாது. புரோகிராம் செயல்படுவதற்குத் தேவையான விவரங்களை உள்ளீடாகத் தரவேண்டும். இவ்விவரங்களைத்தான் டேட்டா என்கிறோம். தமிழில் ‘தரவு’ எனலாம்.
ஆக, கம்ப்யூட்டர் புரோகிராம் என்பது ஒரு பணியைச் செய்து முடிப்பதற்கான தீர்வுநெறி (Algorithm), தரவுகள் (Data) - ஆகிய இரண்டையும் உள்ளடக்கியதாகும். சென்ற அத்தியாயத்தில் குறிப்பிட்டுள்ள LEAPYEAR.C என்ற புரோகிராமை எடுத்துக் கொள்ளுங்கள். அது நாம் தரும் ஆண்டினை, லீப் ஆண்டா எனப் பரிசோதித்துச் சொல்லும். நாம் உள்ளீடாகத் தரும் ஆண்டினை டேட்டா என்கிறோம். இத்தகைய தரவுகளை அடித்தளமாகக் கொண்டு, அவற்றைக் கையாளும் கட்டளைகளின் உதவியுடன் சிக்கலான புரோகிராம் மாளிகைகளை எழுப்புகிறோம்.
புரோகிராம்களில் பயன்படுத்தப்படும் ஒவ்வொறு டேட்டாவும் குறிப்பிட்ட இனத்தைச் சேர்த்ததாகவே இருக்கும். LEAPYEAR.C புரோகிராமில்,
int y;
என்று குறிப்பிட்டுள்ளோம். y என்பது ‘இன்டிஜர்’ இனத்தைச் சேர்ந்தது என்பது இதன் பொருள். இதுபோலப், பல்வேறு இனத் தரவுகளைக் கம்ப்யூட்டரில் கையாளுகிறோம்.
ஓர் அலுவலரின் பெயர், வயது, பிறந்த நாள், சம்பளம், திருமணம் ஆனவரா இல்லையா என்ற விவரம் - இவற்றையெல்லாம் புரோகிராமில் எடுத்தாள வேண்டியுள்ளது. இவை முறையே எழுத்துச் சரம் (String), முழுஎண் (Integer), தேதி (Date), பதின்மப் புள்ளி எண் (Real), ஆமில்லை (Logical) போன்ற வெவ்வேறு இன மதிப்புகளாகும். ஒவ்வொரு கம்ப்யூட்டர் மொழியும் தமக்கே உரிய தரவினங்களைக் கொண்டுள்ளன. சி-மொழியில் கையாளப்படும் தரவின வகைகளைப் பார்ப்போம்.
சி-மொழியில் நான்கு அடிப்படைத் தரவினங்கள் (Basic Data Types) உள்ளன. .இவை மூலத் தரவினங்கள் (Primitive Data Types) என்றும் அழைக்கப்படுவதுண்டு. எளிய தரவினங்கள் (Simple Data Types) என்றும் கூறுவர். தரவினம் என்பது ஒரு குறிப்பிட்ட தரவை மட்டுமின்றி அதைப் பயன்படுத்துவது பற்றிய விதிமுறைகளையும் சேர்த்தே குறிக்கிறது. ஒரு தரவினம் குறிப்பிட்ட மதிப்புகளையே (values) ஏற்கும். குறிப்பிட்ட செயல்பாடுகளையே (operations) அதன்மீது நிகழ்த்த முடியும்.
சி-மொழியின் தரவினங்களில் சில உள்-வகைகளும் உள்ளன. மூலத் தரவினங்களின் அடிப்படையில் உருவாக்கப்படும் தருவிக்கப்பட்ட தரவினங்களும் (Derived Data Types) சி-மொழியில் கையாளப்படுகின்றன.
மூலத் தரவினங்கள் (Basic Data Types)
சி-மொழியின் அடிப்படை அல்லது மூலத் தரவினங்கள்:
1. char
2. int
3. float
4. double
char என்பது ஒற்றை எழுத்து, எண் அல்லது சிறப்புக் குறியைக் (special character) குறிக்கிறது. int என்பது முழு எண்களையும் float என்பது மெய்யெண் (Real Number) எனப்படும் புள்ளி எண்களையும் double என்பது துல்லியப் புள்ளி எண்களையும் குறிக்கின்றன. ஒன்றுக்கு மேற்பட்ட எழுத்துகள் அடங்கிய சரத்தைக் (String) குறிக்கத் தனியான தரவினம் சி-மொழியில் கிடையாது. அதே வேளையில், எண்வகை இனம் int, float, double என்ற மூன்று தனித்தனி தரவினங்களாக அமைந்துள்ளன.
இந்த நான்கு மூலத் தரவினங்களையும் அடிப்படையாகக் கொண்டு அர்ரே, ஸ்ட்ரக்சர், யூனியன், ஈநம், பாயின்டர் என்னும் தருவிக்கப்பட்ட தரவினங்களும் (Derived Data Types) கையாளப்படுகின்றன. இவற்றைப்பற்றி பின்வரும் அத்தியாயங்களில் விரிவாகப் படிப்போம். சி-மொழியில் ஸ்டிரிங் தரவினம் இல்லை. ஸ்டிரிங்குகளைக் கையாள கேரக்டர் அர்ரேக்கள் பயன்படுத்தப்படுகின்றன. சி-மொழியில் தேதிக்கென்று தனி இனம் கிடையாது. அதேபோல் சரி/தவறு (True/Flase) என்ற லாஜிக்கல் இனமும் கிடையாது. ஜீரோ என்கிற எண் மதிப்பு False என்பதற்கும், ஒன்று அல்லது ஏதேனும் ஒரு நிறை எண் (Positive number) True என்ற நிலைக்கும் பயன்படுத்தப்படுவது சி-மொழியின் சிறப்புக் கூறாகும்.
உள்-வகைகள்
நான்கு மூலத் தரவினங்களும், அவை ஏற்கும் மதிப்பெல்லைகளை அடிப்படையாகக் கொண்டு, பல்வேறு உட்பிரிவுகளாகப் பிரிக்கப்படுகின்றன: int இனம் மூன்று வகையாக எடுத்தாளப்படுகிறது.
1. short int
2. int
3. long int
மேற்கண்ட மூன்று இனங்களும் நினைவகத்தில் எடுத்துக் கொள்ளும் இடம் (பைட் எண்ணிக்கை) கம்ப்யூட்டரைப் பொறுத்து மாறுபடுகின்றது. அதாவது பீசி, மினி, மெயின் ஃபிரேம்களில் இந்த அளவுகள் மாறுபடலாம். ஆனால் short int என்பது int-ஐவிட அதிக பைட்டுகளை எடுத்துக் கொள்ள முடியாது. சில கம்ப்யூட்டர்களில் short int நினைவகத்தில் எடுத்துக் கொள்ளும் பைட்டு எண்ணிக்கை int எடுத்துக் கொள்வதில் பாதியாக இருக்கலாம். அதேபோல் long int என்பது int அளவைப்போல் இரு மடங்கு இருக்கும். எல்லா கம்ப்யூட்டரிலும் அப்படி இருக்கும் என்று சொல்ல முடியாது. ஆனால் int என்பது long int-ஐவிட அதிக அளவுடையதாக இருக்க முடியாது.
புரோகிராம்களில் தரவினங்களைக் குறிப்பிடுகையில் short int என்பதை வெறுமனே short எனவும், long int என்பதை long எனவும் குறிப்பிட்டால் போதும். டர்போ-சி கம்ப்பைலரைப் பொறுத்தவரை short int என்பதும் int என்பதும் ஒன்றுதான். long int என்பது int -ஐவிட இரு மடங்கு பைட்டு அளவுடையது.
பதின்மப் புள்ளி எண்களைப் பொறுத்தவரை double இனம் float இனத்தைவிட இரு மடங்கு பைட்டுகளை நினைவகத்தில் எடுத்துக் கொள்ளும். இதுவும் கம்ப்யூட்டர் சார்ந்த (Machine Dependent) அளவீடுதான். double இனம் long float எனவும் வரையறுக்கப்படும். அன்சி-சி, long double என்னும் ஒரு புதிய உள்-வகைக்கு வழியமைத்துக் கொடுத்துள்ளது. இது double இனத்தைவிட அதிக அளவு இடத்தை எடுத்துக் கொள்ளும்.
சி-மொழியில் char, int ஆகிய தரவு இனங்களை signed, unsigned ஆகிய பண்புகளினால் வேறுபடுத்திக் காட்ட முடியும். தரவு இனங்களை அறிவிக்கும்போது signed char, unsigned char எனவும் signed int, unsigned int எனவும் signed long, unsigned long எனவும் அறிவிக்க முடியும். signed இனம் நெகட்டிவ், பாஸிட்டிவ் ஆகிய இரு மதிப்புகளையும் ஏற்கும். unsigned இனம் பாஸிட்டிவ் மதிப்புகளை மட்டுமே ஏற்கும். இதன் காரணமாய் unsigned இனம் ஏற்கும் உச்சமதிப்பு signed இனத்தின் உச்சமதிப்பைவிட இருமடங்கு இருக்கும்.
short, long, signed, unsigned ஆகியவை தனித் தரவினங்களாகக் கருதப்படுவது இல்லை. இச்சொற்கள் பண்பேற்றிகள் (Qualifiers அல்லது Modifiers) என்று அழைக்கப்படுகின்றன. எனவேதான் இத்தகைய அடைமொழி பெற்ற தரவினங்களை ‘உள்-வகை’ எனக் குறிப்பிட்டுள்ளோம். தரவின அறிவிப்பில் வெறுமனே char, int, long எனக் குறிப்பிட்டால் signed char, signed int, signed long ஆகிய இனங்களையே குறிக்கும்.
தரவு இனம், மதிப்பெல்லை, நினைவக அளவு
இதுவரை நாம் பார்த்த தரவினங்கள் மற்றும் அவற்றின் உள்-வகைகள் ஏற்கும் மதிப்புகளின் எல்லைகளையும், இவ்வினங்கள் நினைவகத்தில் எடுத்துக் கொள்ளும் பைட் அளவுகளையும் கீழே உள்ள பட்டியலில் காண்க:
தரவு இனம் மதிப்பின் எல்லை நினைவக அளவு (பைட்டில்) signed char -128 to +127 1 char -128 to +127 1 unsigned char 0 to 255 1 signed short int -32768 to +32767 2 short int-32768 to +32767 2 unsigned short int 0 to 65535 2 signed int -32768 to +32767 2 int -32768 to +32767 2 unsigned int 0 to 65535 2 signed long int -2147483648 to +2147483647 4 long int -2147483648 to +2147483647 4 unsigned long int 0 to 4294967295 4 float .4 x 10-38 to 3.4 x 1038 4 long float .7 x 10-308 to 1.7 x 10308 8 double .7 x 10-308 to 1.7 x 10308 8 long double .7 x 10-4932 to 1.7 x 104932 10 பட்டியலின் இறுதியில் குறிப்பிட்டுள்ள நினைவக அளவு கம்ப்யூட்டருக்குக் கம்ப்யூட்டர் வேறுபடலாம். சில கம்ப்பைலர்கள் char என அறிவிக்கப்படும் தரவினத்தை எப்போதும் unsigned char இனமாகவே கருதிக்கொள்ளும். அதாவது char என்பது 0 முதல் 255 வரையிலான மதிப்புகளையே எடுத்துக்கொள்ளும். நெகட்டிவ் மதிப்புகளை ஏற்காது. எனவே char இனத்தைக் கம்ப்பைலருக்கு ஏற்பப் பயன்படுத்த வேண்டும் என்பதை மனதில் கொள்க.
int என அறிவிக்கப்பட்ட மாறியில் 36767-ஐவிடப் பெரிய எண்ணை இருத்தி வைக்க முடியாது. எடுத்துக்காட்டாக 200 x 200 என்ற பெருக்குத் தொகையின் விடையை ஓர் int மாறியில் இருத்த முடியாது. உங்கள் புரோகிராமில்,
int n;
n = 200 * 200;
என்று, கட்டளைகள் அமைந்துள்ளதாக வைத்துக் கொள்வோம். புரோகிராமைக் கம்ப்பைல் செய்யும்போது, கம்ப்பைலர் பிழை எதுவும் சுட்டாது. புரோகிராமைச் செயல்படுத்தும்போது இயக்கநேரப் பிழை (Run Time Error) எதுவும் நிகழாது. ஆனால், புரோகிராம் தவாறான விடையைக் காட்டும். n என்னும் மாறியில் 40000 என்னும் மதிப்பு இருக்காது. இதுபோன்ற தருணங்களில் n என்னும் மாறியை long என அறிவித்துக் கொள்ள வேண்டும். உங்கள் புரோகிராம்களில் கணக்கீடுகளை மேற்கொள்ளும்போது தரவினங்களின் மதிப்பெல்லைகளை நினைவில் வைத்துக் கொள்வது முக்கியம்.
பாடம்-6
சி-மொழியில் மாறிகள்
(Variables in C)
கம்ப்யூட்டர் மொழிகளில் டேட்டாவை இரண்டு வகையாகக் கையாள முடியும்:
1. மாறிகள் (variables)
2. மாறிலிகள் (constants)
ஒரு புரோகிராம் செயல்படுத்தப்படும்போது, மதிப்பு மாறக்கூடிய வாய்ப்பிருக்கும் டேட்டா, மாறி (variables) எனப்படுகிறது. LEAPYEAR.C புரோகிராமை எடுத்துக் கொள்வோம். அதில் y-ன் மதிப்பு ஒவ்வொரு முறை புரோகிராம் இயக்கப்படும்போதும், நமது உள்ளீட்டுக்கு ஏற்ப மாறுகின்றது. எனவே, இதனை மாறி என்கிறோம். மாறிலி (constants) என்பது மாறா மதிப்பைக் கொண்டது. மாறிலி அறிவிக்கப்படும்போது அதில் இருத்தப்படும் மதிப்புப் புரோகிராமில் பின் எப்போதும் மாற்றப்பட முடியாதது. முதலில் மாறிகள் பற்றிக் காண்போம்.
நாம் பார்த்த நான்கு தரவு இனங்களில் மட்டும் இன்றி, அவற்றின் உள்-வகைகளிலும், தருவிக்கப்பட்ட தரவு இனங்களான அர்ரே, ஸ்ட்ரக்சர், யூனியன், ஈநம், பாயின்டர் ஆகிய தரவு இனங்களிலும் மாறிகள் அறிவிக்கப்பட்டுக் கையாளப்படுகின்றன. சி-மொழியில் லாஜிக்கல் (அல்லது பூலியன்) மாறிகள், ஸ்டிரிங் மாறிகள் கிடையாது என்பதை மனதில் இருத்துங்கள்.
மாறிகளைப் புரோகிராம்களில் எடுத்தாள்வதற்குப் பல்வேறு வழிமுறைகளும் விதிமுறைகளும் வரையறுக்கப்பட்டுள்ளன. அவற்றை எடுத்துக்காட்டுகளுடன் விரிவாகக் காண்போம்.
மாறிகளின் பெயர்கள்
புரோகிராமில் பயன்படுத்தப்படும் டேட்டா கம்ப்யூட்டரின் நினைவகத்தில் பதிந்து வைக்கப்பட்டு எடுத்தாளப்படுகின்றது. தேவையானபோது எடுத்தாள அதற்கு ஒரு பெயர் இருக்க வேண்டும். எனவே, புரோகிராமில் பயன்படுத்தப்படும் டேட்டாவுக்குப் பொருத்தமான ஒரு பெயரைச் சூட்டுகிறோம். அதாவது, டேட்டாவை நினைவகத்தில் பதிந்து வைக்க ஓர் இடத்தை ஒதுக்கீடு செய்து, அந்த இடத்துக்கு ஒரு பெயர் (Label) சூட்டுகிறோம். அப்பெயரையே மாறி (variable) என்கிறோம்.
மாறிகளின் பெயர்கள் எப்படி அமைய வேண்டும் என்பதற்கான விதிமுறைகள்:
(1) மாறிகளின் பெயர்கள் அதிக அளவாக எட்டு எழுத்துகள் இருக்கலாம். ஆனால் புதிய கம்ப்பைலர்கள் 16 அல்லது அதற்கு மேற்பட்ட எழுத்துகளையும் ஒத்துக் கொள்கின்றன. அதிக அளவாக 31 எழுத்துகளை அடையளம் காண முடியும் என அன்சி-சி வரையறுத்துள்ளது.
(2) மாறிகளின் பெயர்கள் எண்ணாகவோ, எண்ணில் தொடங்குமாறோ இருக்கக் கூடாது.
(3) மாறிகளின் பெயரில் இடவெளி (space) இடம்பெறக் கூடாது.
(4) அண்டர் ஸ்கோர் தவிர பிற சிறப்புக் குறிகள் இடம்பெறக் கூடாது.
(5) மாறிகளின் பெயர்களாக சி-மொழியின் சிறப்புச் சொற்களைப் (Reserved Words) பயன்படுத்தக்கூடாது.
மாறிகளின் சரியான பெயர்களுக்கு எடுத்துக்காட்டுகள்:
1. a, b, c, ab, xyz, A, Bc,aBC
2. a1, B2, C2c, x1y2z3
3. name, age, pay, area, redius
4. SUM, Sum, sum, average, dBASE
5. a_1, file_2, basic_pay, data_of_birth
6. lotus123, art312C, sys5ver6
மாறிகளுக்கு எப்போதுமே பொருத்தமான பெயர்களைச் சூட்ட வேண்டும். வெறுமனே ஒற்றை எழுத்துகளை மட்டுமே மாறிகளின் பெயர்களாக அறிவிப்பது சிறந்த முறை ஆகாது. ஒரு பணியாளரின் பெயர், வயது, சம்பளம் போன்றவற்றைக் கையாள முறையே a, b, c எனக் குறிப்பிடக் கூடாது. பொருத்தமாக name, age, salary எனப் பெயரிடலாம். total amount, rate of interest என இரண்டு மூன்று சொற்களில் மாறிகளின் பெயர்களை அமைக்க விரும்பினால் சொற்களுக்கு இடையே அண்டர் ஸ்கோர் பயன்படுத்தி, total_amount, rate_of_interest என மாறிகளின் பெயர்களை அறிவிக்க வேண்டும். மாறிகளின் பெயர்கள் எப்போதும் சிறிய எழுத்தில் இருப்பதே மரபு.
மாறிகளின் தவறான பெயர்களுக்கு எடுத்துக்காட்டுகள்:
(1) 2, 32, 123 - எண்களாக இருக்கக் கூடாது
(2) 2A, 4BCD, 5digit - எண்ணில் தொடங்கக் கூடாது
(3) basic pay, date of birth - இடவெளி கூடாது
(4) yes/no, bill.amt, month-total - சிறப்புக் குறிகள் கூடாது
(5) int, char, float - சிறப்புச் சொற்கள் கூடாது
(6) while, do, else, return - கட்டளைச் சொற்கள் கூடாது
மாறிகளை அறிவித்தல்
புரோகிராம்களில் மாறிகளை அறிவிக்கும் முறைக்குச் சில எடுத்துக்காட்டுகளைப் பார்ப்போம்.
char ch;
int age;
long salary;
float radius;
double area;
ஒரே இனத்தில் ஒன்றுக்கு மேற்பட்ட மாறிகளையும் அறிவிக்க முடியும்.
int i, j, k;
float radius, area;
ஒரே இனமாக இருந்த போதிலும் வேறுவேறு பயன்பாடுகளுக்கான மாறிகளைத் தனித்தனி வரிகளில் அறிவிப்பது மரபாகும்.
int i, j;
int length, breadth;
அறிவிப்பும் வரையறுப்பும் (Declaration & Definition)
ஒரு மாறி, மதிப்பை ஏற்ற பிறகே ‘இனிஷியலைஸ்’ செய்யப்பட்டதாகக் கொள்ளப்படும். இனிஷியலைஸ் செய்யப்பட்ட பிறகே அந்த மாறி வரையறுக்கப்பட்டதாகக் (defined) கருதப்படும். இனிஷியலைஸ் செய்யப்படாத மாறியை எக்ஸ்பிரஷன்களில் பயன்படுத்தினால் கம்ப்பைலர் எச்சரிக்கை செய்யும்.
ஒரு மாறியை இரண்டு வழிகளில் இனிஷியலைஸ் செய்யலாம். மாறியை அறிவித்த பிறகு புரோகிராமின் வேறோர் இடத்தில் அதில் மதிப்பை இருத்துவது ஒரு முறை. அறிவிக்கும்போதே அதில் தொடக்க மதிப்பை இருத்துவது இன்னொரு முறை.
int a;
...........
a = 5;
என்று மதிப்பிருத்தலாம்.
int sum = 0;
int a = 100;
char ch = ‘A’;
என்றும் மாறிகளை வரையறுக்கலாம். ஒரே அறிவிப்பில் ஒன்றுக்கு மேற்பட்ட மாறிகளை அறிவிக்கும்போது, சிலவற்றை மட்டும் இனிஷியலைஸ் செய்யலாம்.
int m, n, sum = 0;
int start = 1, end, step = 5, sum;
என்றெல்லாம் அறிவிக்க முடியும். மிகவும் கறாராகக் கூறுவது எனில்,
int m;
என்று மாறியை மட்டும் மதிப்பிருத்தாமல் குறிப்பிடுவது ‘அறிவிப்பு’ (Declaration) எனப்படும்.
int m = 5;
என்றோ,
int m;
m = 5;
என்றோ மாறியை இனிஷியலைஸ் செய்வது ‘வரையறுப்பு’ (Definition) எனப்படும். எந்தவொரு மதிப்பையும் ஏற்காமல் அறிவிப்பு நிலையிலேயே இருக்கும் மாறி வரையறுக்கப்படாத மாறி எனப்படுகிறது.
சி-மொழிப் புரோகிராமில் பெரும்பாலும் மாறிகள் புரோகிராமின் அல்லது ஒரு ஃபங்ஷனின் தொடக்கத்திலேயே அறிவிக்கப்படுகின்றன. மிக அரிதாக ஒரு பிளாக்குக்குள் மாறிகள் அறிவிக்கப்படுவதுண்டு. { } என்னும் இரட்டை அடைப்புக் குறிகளுக்குள் அமையும் கட்டளைத் தொகுதி சி-மொழியில் பிளாக் எனப்படுகிறது இதைப்பற்றி பின்னர் விரிவாக படிப்போம்.
main() அல்லது வேறு ஃபங்ஷனில் அல்லது பிளாக்கில் மாறிகளின் அறிவிப்புக்கு முன்பாக printf(), scanf() ஃபங்ஷன்களோ அல்லது வேறெந்தக் கட்டளையுமோ இடம்பெறக் கூடாது. இன்னொரு கோணத்தில் சொல்வதெனில், சி-மொழிப் புரோகிராமில் மாறிகளை இடையிடையே நினைத்த இடத்தில் அறிவித்துக் கொள்ள முடியாது. மேலேயுள்ள புரோகிராமை நன்றாகக் கூர்ந்து கவனியுங்கள். radius, pai, area ஆகிய மாறிகள்/மாறிலிகள் தொடக்கத்திலேயே அறிவிக்கப்பட்டுள்ளன.
printf(“\nEnter redius:”);
scanf(“%d, &redius);
float area;
area = pai * redius * redius;
என்று கட்டளைகள் அமைத்தால் புரோகிராம் கம்ப்பைல் ஆகாது.
ஒரு ஃபங்ஷனுக்குள் அல்லது ஒரு பிளாக்கினுள் ஒரே பெயரில் இரண்டு மாறிகள் இருக்க முடியாது. அதாவது ஒருமுறை அறிவித்த மாறியை மீண்டும் அறிவிக்க முடியாது. அதாவது, ஏற்கெனவே அறிவிக்கப்பட்ட ஒரு மாறியின் பெயரில் வேறொரு மாறியை அறிவிக்க முடியாது. வெவ்வேறு ஃபங்ஷன்களில் அல்லது வெவ்வேறு பிளாக்குகளில் ஒரே பெயரில் வெவ்வேறு மாறிகளைப் பயன்படுத்த முடியும்.
மாறிகளை அறிவிக்கும் விதம் தொடர்பாக, மனதில் பதிய வைக்க வேண்டிய விவரங்களைத் தொகுத்துக் காண்போம்:
(1) மாறிகள் புரோகிராம், ஃபங்ஷன் அல்லது பிளாக்கின் தொடக்கத்திலேயே அறிவிக்கப்பட வேண்டும்.
(2) மாறிகளின் இனத்தை முன்கூட்டியே தெரிவித்துவிட வேண்டும். இனம் சுட்டாத மாறி இருக்க முடியாது. வேறுசில மொழிகளில் இருப்பதுபோல் முதலில் மாறியை அறிவித்துவிட்டுப் பிறகு இனத்தைத் தீர்மானிக்க சி-மொழியில் அனுமதி இல்லை.
(3) ஒரு ஃபங்ஷனுக்குள் அல்லது ஒரு பிளாக்கினுள் ஒரே பெயரில் இரண்டு மாறிகள் இருக்க முடியாது.
(4) ஓர் இன மாறியில் வேறு இன மதிப்பை இருத்த முடியாது. (int மாறி என அறிவித்து விட்டால், அதில் float மதிப்பை இருத்தி வைக்க முடியாது). இனமாற்றம் செய்து இருத்தலாம். இனமாற்றம் பற்றிப் பிறகு படிப்போம்.
(5) ஒரு மாறியை அறிவிக்கும்போதே அதில் தொடக்க மதிப்பையும் இருத்த முடியும்.
(6) ஒரே இனமுள்ள பல மாறிகளை ஒரே வரியில் முன்னறிவிக்கலாம். இரண்டு மாறிகளுக்கிடையே காற்புள்ளி இடவேண்டும்.
(7) மதிப்பு இருத்தப்பட்ட மாறி இனிஷியலைஸ் செய்யப்பட்ட மாறி எனப்படும். இனிஷியலைஸ் செய்யப்பட்ட மாறி வரையறுக்கப்பட்ட மாறி ஆகிறது.
(8) வரையறுக்கப்படாத அதாவது இனிஷியலைஸ் செய்யப்படாத (மதிப்பு இருத்தப்படாத) மாறிகளை எக்ஸ்பிரஷன்களில் பயன்படுத்தக் கூடாது.
சி-மொழியில் மாறிலிகள்
(Constants in C)
ஒரு புரோகிராமில் எப்போதுமே மாற்றப்படும் சாத்தியக்கூறு இல்லாத ஒரு டேட்டாவை மாறிலி (Constant) என்கிறோம். சி-மொழியில் இரண்டு வகையாக மாறிலிகள் செயல்படுத்தப்படுகின்றன. (1) #define பதிலீடுகள் மூலமாக. இத்தகைய மாறிலிகள் ‘குறியீட்டு மாறிலிகள்’ (Symbolic Constants) என்று அழைக்கப்படுகின்றன. (2) const என்னும் பண்பேற்றி (Qualifier) மூலமாக. இத்தகைய மாறிலிகள் ‘பண்பேற்றிய மாறிகள்’ (Qualified Variables) எனப்படுகின்றன. இவ்விரண்டு வகைகளையும் எடுத்துக் காட்டுகளுடன் பார்ப்போம்.
நேரடி மதிப்பு
புரோகிராமில் எப்படிப்பட்ட இடங்களில் மாறிலியைப் பயன்படுத்த முடியும் என்பதற்கு ஒரு சரியான எடுத்துக்காட்டைப் பார்ப்போம். பயனாளரிடம் இருந்து ஆர அளவை (radius) பெற்று வட்டத்தின் பரப்பளவைத் திரையிடும் புரோகிராமைப் பாருங்கள்:
/* Program No. */
/* AREA1.C */
#include <stdio.h>
main()
{
int radius;
float area;
printf(“\nEnter radius: “);
scanf(“%d”, &radius);
area = 3.14 * radius * radius;
printf(“Area of the circle is %f”, area);
}
இந்தப் புரோகிராமில் பரப்பளவைக் காணும் கட்டளையில் 3.14 என்னும் மதிப்பை நேரடியாகப் பயன்படுத்தி உள்ளோம். இந்தப் புரோகிராமை எத்தனை முறை இயக்கினாலும், ஆர அளவை எப்படிக் கொடுத்தாலும் 3.14 என்னும் மதிப்பு மாறப்போவதில்லை. ஒரே புரோகிராமில் வெவ்வேறு இடங்களில் வட்டத்தின் பரப்பளவை காணவேண்டி இருந்தாலும் இதே 3.14 மதிப்பைத்தான் பயன்படுத்த வேண்டியிருக்கும்.
3.14 என்பது இந்தப் புரோகிராமில் மட்டும் அல்ல உலகிற்கே ஒரு பொதுவான எண் அல்லவா? இப்படிப்பட்ட உலகப் பொதுவான எண்களை மட்டும் அல்ல உங்கள் புரோகிராமிற்கு மட்டும் பொதுவான (மதிப்பு மாறாத) எண்களைக்கூட இப்படி நேரடியாகக் கணக்கீடுகளில் பயன்படுத்தக் கூடாது. இந்தப் புரோகிராமைப் படிப்பவர்களுக்கு 3.14 என்ற எண்ணின் முக்கியத்துவம் புலப்படாமலே போகும். புரோகிராமை எழுதியவர்க்கே, பல நேரங்களில், எக்ஸ்பிரஷன்களில் காணப்படும் இதுபோன்ற எண்கள் புதிர் எண்களாகத் தோன்றும். மொழி வல்லுநர்கள் இத்தகைய எண்களை ‘மேஜிக் எண்கள்’ எனக் கிண்டலாகக் குறிப்பிடுவர். புரோகிராமுக்குப் பொதுவான இப்படிப்பட்ட மாறா மதிப்புகளை நேரடியாகப் பயன்படுத்தக்கூடாது என்பது அவர்களின் கருத்து. அவற்றை ஒரு மாறிலி வழியாகவே பயன்படுத்த வேண்டும். எப்படி எனப் பார்ப்போம்.
குறியீட்டு மாறிலி
சி-மொழியில் குறியீட்டு மாறிலிகளை வரையறுக்க, #define என்னும் கட்டளைச் சொல் பயன்படுத்தப்படுகிறது. புரோகிராமின் தொடக்கத்தில்,
#define PAI 3.14
என்று அறிவித்து விட்டுப் புரோகிராமின் உள்ளே,
area = PAI * radius * radius;
என்று பரப்பளவைக் கணக்கிட வேண்டும். கீழே உள்ள புரோகிராமை நோக்குங்கள்:
/* Program No. */
/* AREA2.C */
#include <stdio.h>
#define PAI 3.14
main()
{
int radius;
float area;
printf(“\nEnter radius: “);
scanf(“%d”, &radius);
area = PAI * radius * radius;
printf(“Area of the circle is %f”, area);
}
#define என்பதைக் கம்ப்பைல் பணிக்கு முந்தைய நெறியுறுத்தம் (pre-processor directive) என்று கூறுவர். அதாவது புரோகிராமில் எங்கெல்லாம். PAI இடம்பொற்றுள்ளதோ. அங்கெல்லாம் 3.14 என்ற மதிப்பு பதிலிடப்பட்டு, அதன்பிறகே புரோகிராம் கம்ப்பைல் செய்யப்படும்.
இவ்வாறு புரோகிராமில் கையாளும் மாறா மதிப்புகளை மாறிலிகளாகக் கையாளுவதில் இரண்டு வகையான நன்மைகள் உள்ளன:
(1) PAI ஒரு மாறா மதிப்பு என்பது புரோகிராமைப் படிப்பவர்க்கு எளிதில் புலனாகும். பொருள் பொதிந்ததாகவும் உள்ளது.
(2) PAI - யின் மதிப்பை இன்னும் துள்ளியமாக 3.142 என்றோ அல்லது 3.1415 என்றோ பயன்படுத்த எண்ணினால் #define வரையறுப்பில் மாற்றினால் போதும். நேரடியாக மதிப்பை பயன்படுத்தி இருந்தால், அம்மதிப்பு இடம்பெற்ற அத்தனை கணக்கீடுகளையும் கண்டறிந்து மாற்ற வேண்டும். மிகப் பெரிய புரோகிராம்களில் இது ஒரு சிக்கலான பணியாகும்.
புரோகிராமின் தொடக்கத்தில் மாறிலியை அறிவித்தபின் புரோகிராமின் உள்ளே,
PAI = 3.142;
என்று புதிய மதிப்பைப் புகுத்த முடியாது. சரியாகச் சொல்வதெனில், ஒரு மதிப்பு இருத்தும் கட்டளையில் (assignment statement) இடப்புறத்தில் PAI -ஐப் பயன்படுத்த முடியாது.
குறியீட்டு மாறிலியின் வரையறுப்புகள்
ஒரு #define அறிவிப்பில் ஒரேயொரு மாறிலியை மட்டுமே குறிப்பிட முடியும். வெவ்வேறு மாறிலிகளுக்கு தனித்தனி #define அமைக்க வேண்டும்.
#define TRUE 1
#define FALSE 0
#define TOP 100
#define EOF -1
#define PERIOD ‘.’
#define NAME “Sivalingam”
ஒரு #define அறிவிப்பில் உள்ள மாறிலியை அடுத்துவரும் #define அறிவிப்பில் பயன்படுத்திக் கொள்ளமுடியும்.
#define START 100
#define NEXT START + 1
என்று பயன்படுத்த முடியும்.
#define கட்டளையில் int, char, string மதிப்புகளைத் தவிர unsigned, long மதிப்புகளையும், octal, hexa decimal மதிப்புகளையும் அறிவிக்க முடியும்.
#define CR 0x0D /* hexa value 13 */
#define LINE_FEED 012 /* octal value 12 */
#define PORT 25U /* unsigned value 25 */
#define LIMIT 40000L /* long value 40000 */
#define BELL ‘\007’ /* character value 7 */
#define NEW_LINE ‘\n’ /* newline character */
#define TAB ‘\t’ /* tab character */
#define கட்டளையைப் பயன்படுத்தும்போது கருத்தில் கொள்ள வேண்டிய முக்கிய விவரங்கள்:
(1) main() ஃபங்ஷனுக்கு வெளியே புரோகிராமின் தொடக்கத்தில் அமைய வேண்டும்.
(2) #define கட்டளையின் இறுதியில் அரைப்புள்ளி கிடையாது.
(3) #define வரையறுப்பில் தரவினத்தைக் குறிப்பிட வேண்டிய தில்லை. மதிப்பினைக் கொண்டே கம்ப்பைலர் அடையாளம் கண்டு கொள்ளும்.
(4) ஒரு #define-ல் ஒரு மாறிலியை மட்டுமே வரையறுக்க முடியும்.
(5) மாறிலிகளின் பெயர்கள் எப்போதும் பெரிய எழுத்துகளில் இருப்பது மரபு.
மதிப்புருக்கள் (Literals)
int n = 25;
char ch = ‘A’;
average = 12.345 / 6.0;
printf (“Welcome to C!”);
என்பது போன்ற கட்டளைகளில் இன்டிஜர், கேரக்டர், ஸ்ட்ரிங் மதிப்புகளைப் பயன்படுத்துகிறோம். இப்படிப்பட்ட மதிப்புகளை மாறா மதிப்பு (Constant Values) என்கிறோம். மாறிலி (Constant) என்று கூறினாலும் தவறில்லை. சில ஆசிரியர்கள் இவற்றை மதிப்புருக்கள் (Literals) என்று அழைக்கின்றனர். ஒவ்வொரு தரவினத்திலும் ஏற்கெனவே அட்டவணையில் கொடுக்கப்பட்ட வரம்புகளுக்குள் ஏதேனும் ஒரு மதிப்பை மாறியில் இருத்த முடியும் அல்லது கணக்கீட்டில் பயன்படுத்த முடியும். எடுத்துக்காட்டுகள்:
char - ‘a’, ‘A’, ‘5’, ‘?’, ‘=’
int - 25, 32767, 0, -8, +65, 037
long - 0L, 25L, 100000L
unsigned - 0U, 65000U, 25U
octal - 03, 012, 0345
hexa - 0x01A, 0xFFF, 0Xf0ab
float - 12.345F, 5.0F, -8.3F, +1.234F
double - 12.345, 5.0, -8.3, +1.23, 1.23E+5, 1.234e-8
string - “Kumar”, “Long Live”, “12345”
சி-மொழியில் ஒற்றையெழுத்து கேரக்டர் மதிப்பை ஒற்றை மேற்கோள் குறிகளுக்குள்ளும், ஸ்டிரிங் மதிப்புகளை இரட்டை மேற்கோள் குறிகளுக்குள்ளும் குறிப்பிட வேண்டும் என்பதை நினைவில் கொள்க. குறிப்பிடத்தக்க செய்தி என்ன வெனில், சி-மொழியில் ஸ்டிரிங் மாறிகள் கிடையாது. ஆனால், ஸ்டிரிங் மாறிலிகள் (அதாவது மதிப்புருக்கள்) உண்டு.
const என்னும் பண்பேற்றி
புரோகிராமில் மாறிலிகளை அறிவிப்பதற்கு அன்சி-சி-யில் ஒரு புதிய முறை புகுத்தப்பட்டது. const என்னும் பண்பேற்றி (Qualifier) அறிமுகப்படுத்தப்பட்டது.
const float pai = 3.142;
என்று ஒரு மாறிலியை அறிவிக்கலாம். இங்கே pai என்பது float மாறி. const என்னும் அடைமொழியால் ஒரு மாறிலியாக மாற்றப்பட்டுள்ளது. இவ்வாறு const என்று அறிவித்துவிட்டால் புரோகிராமில் பின்னோர் இடத்தில்,
pai = 3.1415;
என்று புரோகிராமரே நினைத்தாலும் மாற்ற முடியாது. const என அறிவிக்கும்போது கட்டாயமாக அதில் ஒரு தொடக்க மதிப்பு இருக்க வேண்டும். அதாவது,
const float pai;
என்று அறிவிக்க முடியாது. AREA2.C புரோகிராமை const பயன்படுத்தி எழுதிப் பார்ப்போமா?
/* Program No. */
/* AREA3.C */
#include <stdio.h>
main()
{
int radius;
float area;
const float pai = 3.14;
printf(“\nEnter radius: “);
scanf(“%d”, &radius);
area = pai * radius * radius;
printf(“Area of the circle is %f”, area);
}
இந்தப் புரோகிராமின் வெளியீடு முந்தைய புரோகிராமின் வெளியீடு போலவே இருக்கும். const அறிவிப்பில் ஒன்றுக்கு மேற்பட்ட மாறிலிகளை வரையறுக்க முடியும்.
const int start = 100, end = 200;
const char ch = ‘A’, int limit = 1000, float pai = 3.14;
மாறிலிகளை அறிவிக்கும் விதம் தொடர்பாக, மனதில் பதிய வைக்க வேண்டிய விவரங்களைத் தொகுத்துக் காண்போம்:
(1) மாறிலிகள் புரோகிராமின் தொடக்கத்திலேயே அறிவிக்கப்பட்டுவிட வேண்டும்.
(2) மாறிலிகளை #define அல்லது const என்ற முறையில் அறிவிக்கலாம்.
(3) #define அறிவிப்பில் மாறிலியின் பெயரும் அதன் மதிப்பும் இடம்பெற வேண்டும்.
(4) #define அறிவிப்பில் தரவு இனத்தைக் குறிப்பிட வேண்டிய தேவையில்லை. மதிப்புகளைக் கொண்டே தரவு இனத்தைக் கம்ப்பைலர் புரிந்து கொள்ளும்.
(5) #define, main()-க்கு வெளியே இடம்பெற வேண்டும்.
(6) #define அறிவிப்பின் இறுதியில் அரைப்புள்ளி கிடையாது.
(7) const அறிவிப்பில் தரவு இனத்தைக் குறிப்பிட வேண்டும்.
(9) ஒரு மாறிலியை const என அறிவிக்கும்போது கட்டாயமாக அதில் ஒரு தொடக்க மதிப்பை இருத்த வேண்டும். அந்த மதிப்பை புரோகிராமில் வேறு எங்கும் மாற்ற முடியாது.
(10) ஒரே const-ல் ஒன்றுக்கு மேற்பட்ட மாறிலிகளை அறிவிக்க முடியும்.
(11) மாறிகள் அல்லது மாறிலிகளில் இருத்தப்படும் மதிப்புகளும் எக்ஸ்பிரஷன்களில் பயன்படுத்தப்படும் மதிப்புகளும் மதிப்புரு (Literal) என்றும், சில வேளைகளில் மாறிலி (Constant) என்றும் அழைக்கப்படுவதுணடு.
சி-மொழியில் இனமாற்றங்கள்
(Type Conversions in C)
ஒரு புரோகிராமில் char, int, float, double ஆகிய தரவினங்களில் அறிவிக்கப்பட்ட மாறிகளில், ஓர் இனத்தின் மதிப்பை வேறோர் இனத்தின் மதிப்பாக எடுத்தாளும் முறையே இனமாற்றம் (Type Conversion) எனப்படுகிறது. சி-மொழியைப் பொறுத்தவரைப் புரோகிராமரின் தலையீட்டிலும், புரோகிராமரின் தலையீடு இல்லாமலும் இத்தகைய இனமாற்றம் சாத்தியம். சி-மொழியில் char மதிப்பை int மதிப்பாகவும், int மதிப்பை char மதிப்பாகவும், int மதிப்பை float அல்லது double-ஆகவும், float அல்லது double மதிப்புகளை int ஆகவும் மாற்றிக் கையாளலாம். இத்தகைய இனமாற்றம் இரண்டு வழிகளில் நடைபெறுகிறது:
(1) உட்கிடை இனமாற்றம் (Implicit Type Conversion)
(2) வெளிப்படை இனமாற்றம் (Explicit Type Conversion)
இந்த இருவகையான இனமாற்றங்களும் சி-மொழியில் எவ்வாறு நடைபெறுகின்றன என்பதை எடுத்துக்காட்டுகளுடன் பார்ப்போம்.
உட்கிடை இனமாற்றம் (Implicit Type Conversion)
கம்ப்யூட்டர் புரோகிராம்களில் இனமாற்றம் என்பது அவ்வப்போது தேவைப்படும். குறிப்பாகக் கணக்கீடுகளில் இது தேவைப்படுகிறது. ஓரினத்தில் உருவாக்கப்பட்ட ஒரு மாறியின் மதிப்பை வேறோர் இன மதிப்போடு கணக்கீடுகளில் பயன்படுத்தும்போது இத்தகைய தேவை எழும். அதுபோன்ற தேவையை அறிந்து கொள்ள சில எடுத்துக்காட்டுகளைப் பார்ப்போம். கீழேயுள்ள புரோகிராமை எழுதி இயக்கிப் பாருங்கள்:
/* Program No. */
/* TYPECAS1.C */
#include <stdio.h>
main()
{
int a=10, b=4;
float c;
c = a / b;
printf("a=%d, b=%d, a/b=%3.1f", a, b, c);
}
இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,
a = 10, b = 4, a/b = 2.0
என்றுதான் விடை கிடைக்கும். ஏனெனில், a, b இரண்டும் int-ஆக இருப்பதால் a/b என்பதும் int-ஆகத்தான் இருக்கும். எனவே 2.0 தான் விடையாக வரும். 2.5 வராது. விடையை ஒரு float மாறியில் இருத்துவதாலேயே விடை 2.5 என்று ஆகிவிடாது. int மதிப்புகளில் செய்யப்படும் கணக்கீட்டின் விடை int மதிப்பாகவே இருக்கும் என்பது அறிக. மேற்கண்ட புரோகிராமைச் சிறிதே மாற்றுங்கள்:
/* Progarm No.2.4 */
/* TYPECAS2.C */
#include <stdio.h>
main()
{
int a = 10;
float b = 4, c;
c = a / b;
printf("a=%d, b=%1.0f, a/b=%3.1f", a, b, c);
}
இந்தப் புரோகிராம்,
a = 10, b = 4, a / b = 2.5
என்று காண்பிக்கும். float மதிப்புகளுக்கிடையே நடைபெறும் கணக்கீட்டின் விடைதானே float மதிப்பாக இருக்கும். இங்கே, b-யின் மதிப்பு float-ஆகவும், a-யின் மதிப்பு int-ஆகவும் இருந்தும் float மதிப்பு எவ்வாறு விடையாக வந்தது? மேலும் ஒரே இனத்தைச் சார்ந்த மதிப்புகளுக்கு இடையேதான் கணக்கீடு சாத்தியம். இங்கே ஓர் int மதிப்புக்கும், ஒரு float மதிப்புக்கும் இடையே வகுத்தல் எவ்வாறு சாத்தியமாயிற்று? இங்குதான் உட்கிடை இனமாற்றம் பங்கு வகிக்கிறது. c = a / b என்ற கணக்கீட்டில் c-யும், b-யும் float-ஆக இருப்பதால் a-யின் மதிப்பும் float-ஆக மாற்றப்பட்டு, விடையும் float மதிப்பாகவே கிடைத்துவிடுகிறது. ஏற்கெனவே நாம் பார்த்த AREA3.C புரோகிராமை இங்கே நினைவு கூருங்கள். அதில்
area = pai * radius * radius;
என்ற கட்டளை இடம் பெற்றுள்ளது. radius என்பது int இனமாக இருந்த போதிலும் pai என்பது float-ஆக இருப்பதால், radius என்பது float-ஆக மாற்றப்பட்டு அவற்றின் பெருக்குத் தொகையும் float இனமாகவே இருக்கும். எனவேதான் area என்பது float-ஆக அறிவிக்கப்பட்டுள்ளது. இவ்வாறு, இரண்டு தரவு இனங்களிடையே செய்யப்படும் கணக்கீட்டில், கீழ்நிலை இனம் மேல்நிலை இனமாகத் தாமாகவே மாற்றப்பட்டுவிடும். இந்த இனமாற்றத்தைக் கம்ப்பைலர் செய்கிறது. உட்கிடை இனமாற்றத்தில் இடம்பெறும் இனங்களின் தகுதி வரிசை int, long , float, double என்றவாறு அமையும். int, long-ஆக மாறி, விடை long-லேயே கிடைக்கும். அதுபோலவே int-ம் double-ம் மோதினாலும், float-ம் double-ம் மோதினாலும் விடை double-இல்தான் கிடைக்கும்.
இவ்வாறு சி-மொழிக் கணக்கீடுகளில் புரோகிராமரின் தலையீடு இல்லாமல் தாமாகவே (Implicitly) இனமாற்றம் நிகழ்கிறது. இந்த இனமாற்றம் தற்காலிகமானதே. கணக்கீட்டில் இனமாற்றம் அடையும் ஒரு மாறி தனது மூல இனத்தை இழப்பதில்லை. கணக்கீட்டிற்குப் பிறகு அது மூல இனத்திலேயேதான் நீடிக்கும்.
எண்வகை இனங்களுக்குள் நடைபெறும் உட்கிடை இனமாற்றம் போலவே சி-மொழியில் char இனத்துக்கும் int இனத்துக்கும் இடையிலும் உட்கிடை இனமாற்றம் சர்வ சாதாரணமாக நடைபெறுகிறது. எந்த அளவுக்கு என்றால் ஒரு குறிப்பிட்ட மதிப்பெல்லைக்குள் char இனத்தை int இனமாகவே கையாளும் அளவுக்கு இந்த இனமாற்றம் நடைபெறுகிறது. எப்படி எனப் பார்ப்போம்.
char, int இரண்டும் ஓரினமா?
சி-மொழியில் char இனத்தை int இனமாகவும், int மதிப்பை char ஆகவும் கையாள முடியும். உங்கள் புரோகிராமில் ஓர் எண்வகை மாறியின் மதிப்பை -128 முதல் 127 வரைதான் கையாளுகிறீர்கள் எனில் அதனை int என்பதற்குப் பதிலாக signed char என அறிவித்துக் கொள்ளலாம். 0 முதல் 255 வரைதான் கையாளுகிறீர்கள் எனில், அதனை unsigned char என அறிவித்துக் கொள்ளலாம். அதேபோல char மதிப்புகளை int மதிப்புகளாகவே எடுத்தாள முடியும். அதாவது char இனம் மூலம் செய்து முடிக்க வேண்டிய வேலைகளை int இனம் மூலமாகவே சாதித்துக் கொள்ள முடியும். அதற்கு சி-மொழியின் உட்கிடை இனமாற்றம் துணைபுரிகிறது. இதன் காரணமாக “சி-மொழியைப் பொறுத்தவரை அனைத்துத் தரவினங்களும் எண்வகையைச் சார்ந்தவையே. எழுத்துவகை (கேரக்டர், ஸ்ட்ரிங்) இனங்களே கிடையாது” என்று கூறுவாரும் உண்டு.
int என்று அறிவிக்கப்பட்ட ஒரு மாறியை அதன் மதிப்பு -128 லிருந்து +127 வரை அல்லது 0 விலிருந்து 255 வரை இருக்கும் பட்சத்தில் அதனை char இனமாகவே கையாள முடியும் என்பதற்கு ஓர் எடுத்துக்காட்டுப் பார்ப்போம். கீழே உள்ள புரோகிராமைப் பாருங்கள்:
/* Program No.2.3 */
/* CHARINT2.C */
#include <stdio.h>
main()
{
int alpha=65;
printf("\nASCII value is %d", alpha);
printf("\nASCII character is %c", alpha);
}
இந்தப் புரோகிராமைச் செயல்படுத்தினால்,
ASCII value is 65
ASCII character is A
என்று திரையில் காட்டும். இதில் குறிப்பிடத்தக்க செய்தி என்னவெனில், alpha என்ற int இன மாறியின் மதிப்பை %d என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் 65 என்றும், %c என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் A என்றும் காண்பிக்கிறது. A என்னும் ஆங்கில எழுத்தின் ஆஸ்க்கி மதிப்பு 65 என்பது நீங்கள் அறிந்ததே. இங்கே %c என்னும் வடிவமைப்புக் குறியீடே (format specifier) இனமாற்றத்தை நிகழ்த்தி விடுகிறது. கீழ்க்காணும் புரோகிராமையும் இயக்கிப் பாருங்கள்:
/* Program No.7 */
/* CHARINT3.C */
#include <stdio.h>
main()
{
char alpha='A';
printf("\nASCII character is %c", alpha);
printf("\nASCII value is %d", alpha);
}
இந்த புரோகிராமைச் செயல்படுத்தினால்,
ASCII character is A
ASCII value is 65
என்று காட்டும். alpha என்னும் char இன மாறியின் மதிப்பை %c என்ற குறியீட்டில் A எனவும், %d என்ற குறியீட்டில் 65 எனவும் காட்டுகிறது. இன்னும் ஒரு புரோகிராமைப் பாருங்கள்:
/* Program No.2.*/
/* CHARINT1.C */
#include <stdio.h>
main()
{
char alpha = 'A';
char beta;
beta = alpha + 1;
printf("\nAlpha is %c", alpha);
printf("\nBeta is %c", beta);
}
இந்தப் புரோகிராமைச் செயல்படுத்திப் பாருங்கள்.
Alpha is A
Beta is B
என்று மிகச் சரியாகவே காண்பிக்கும். முந்தைய புரோகிராமைவிட ஒரு படி மேலே போய் alpha என்ற கேரக்டர் மாறியில் உள்ள A என்னும் மதிப்பில் 1 என்னும் எண்ணை நேரடியாகக் கூட்ட முடிகிறது. beta = alpha + 1 என்ற கணக்கீட்டில் + என்னும் கணக்கீட்டுச் செயற்குறி (arithmatic operator) alpha என்னும் char மதிப்பை int மதிப்பாக இனம் மாற்றிக் கணக்கீட்டைச் செய்ய உதவுகிறது. அதேபோல், = என்னும் மதிப்பிருத்தல் செயற்குறி (assignmaent operator) ஓர் int மதிப்பை char மதிப்பாக இனம் மாற்றி, beta என்னும் char மாறியில் இருத்த உதவுகிறது. இந்த உட்கிடை இனமாற்றங்களைப் புரோகிராமரின் தலையீடின்றிக் கம்ப்பைலரே முன்னின்று செய்து முடிக்கிறது.
மேற்கண்ட புரோகிராம்களில் char மாறிகளில் கேரக்டர் மதிப்பையும் int மாறிகளில் இன்டிஜர் மதிப்பையும் இருத்தி வைத்து, கேரக்டராகவோ இன்டிஜராகவோ நம் விருப்பப்படி எடுத்தாள முடிந்தது. அடுத்து நம்முன் உள்ள கேள்வி, char மாறியில் இன்டிஜர் மதிப்பையும், int மாறியில் கேரக்டர் மதிப்பையும் இருத்தி வைத்துக் கையாள முடியுமா என்பதுதான். அப்படியும் முடியும் என்பதை அடுத்த புரோகிராமில் காண்க:
/* Program No. */
/* ALPBETA1.C */
#include <stdio.h>
main()
{
int alpha = ‘A’;
char beta = 66;
printf(“int alpha = %d\n”, alpha);
printf(“char alpha = %c\n”, alpha);
printf(“int beta = %d\n”, beta);
printf(“char beta = %c”, beta);
}
இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு இருக்கும்:
int alpha = 65
char alpha = A
int beta = 66
char beta = B
இதிலும் உட்கிடை இனமாற்றங்களை இடம், பொருள், ஏவல் கருதிக் கம்ப்பைலர் உட்கிடை இனமாற்றங்களைச் செய்து முடிக்கிறது. char, int இனங்களுக்கு இடையே நடைபெறும் உட்கிடை இனமாற்றத்தின் உச்சத்துக்கு இன்னோர் எடுத்துக்காட்டைப் பாருங்கள்:
/* Program No */
/* ALPHBETA.C */
#include <stdio.h>
main()
{
const char alpha = ‘A’, beta = ‘B’;
int sum = alpha + beta;
int product = alpha * beta;
printf(“alpha = %c\n”, alpha);
printf(“beta = %c\n”, beta);
printf(“alpha + beta = %d\n”, sum);
printf(“alpha * beta = %d”, product);
}
இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு அமையும்:
alpha = A
beta = B
alpha + beta = 131
alpha * beta = 4290
கேரக்டர் இன மாறிகளை எண்களைப் போலக் கூட்டவும் பெருக்கவும் முடிகிறது. காரணம் உட்கிடை இனமாற்றம் என்னும் சிறப்புக் கூறே ஆகும். இங்கே உட்கிடை இனமாற்றம் நிகழ்த்தப்பட வேண்டும் என்பதைக் கணக்கீட்டுச் செயற்குறிகள் கம்ப்பைலருக்கு உணர்த்துகின்றன. எனவே மேற்கண்ட கணக்கீடுகள் சாத்தியமாகின்றன. உட்கிடை இனமாற்றத்தின் காரணமாய், எவ்வித ஃபங்ஷன்களின் துணையும் இல்லாமலேயே, ஓர் int மதிப்பை கேரக்டராகவும், ஒரு char மதிப்பை இன்டிஜராகவும் கையாள முடியும் என்பது சி-மொழியின் சிறப்புக் கூறாகும். இதன் காரணமாகவே ’சி-மொழி இன உணர்வு (type sensitive) அற்ற மொழி’ என்ற பழிச்சொல்லுக்கும் ஆளாகிறது.
இன்னொரு முக்கியமான விவரத்தை நீங்கள் மனதில் வைத்துக் கொள்ள வேண்டும். தரவினப் பாடத்தில் (பாடம்-5) கொடுக்கப்பட்டுள்ள அட்டவணையைக் கவனியுங்கள். char இனம் என்று அறிவிக்கப்படுகிற மாறி (variable) -128 லிருந்து +127 வரையுள்ள மதிப்புகளைத்தான் ஏற்றுக் கொள்ளும். நாம் மேலே பார்த்த புரோகிராம்களில் char என்று அறிவிக்கப்பட்டுள்ள மாறிகள் signed char வகையைச் சார்ந்தவைதான். டர்போ-சி-யைப் பொறுத்தவரை வெறுமனே char என்று குறிப்பிட்டால் signed char என்றே எடுத்துக் கொள்ளப்படும். ஆனால் char இன மாறியின் மதிப்பை 0 லிருந்து 255 வரை கையாள வேண்டும் என எண்ணினால் அந்த மாறியை unsigned char என்று அறிவிக்க வேண்டும்.
பொதுவாக, சி-மொழிப் புரோகிராமர்கள் தங்கள் புரோகிராம்களில் 0 முதல் 255-க்குள் பாஸிட்டிவ் இன்டிஜர் மதிப்புகளை மட்டுமே ஏற்கும் மாறிகளை unsigned char என்றே அறிவிப்பர். எடுத்துக்காட்டாக day, month போன்ற விவரங்களைக் கையாள, int இனத்தைவிட unsigned char இனமே மிகவும் பொறுத்தமானதாகும். காரணம் அவை முறையே 1 முதல் 31 வரை, 1 முதல் 12 வரை மதிப்புகளையே ஏற்கின்றன.
வெளிப்படை இனமாற்றம் (Explicit Type Conversion)
மேற்கண்ட TYPECAS2.C புரோகிராமில் b என்ற மாறியை float-ஆக மாற்றியுள்ளோம். இவ்வாறு மாற்றாமல், a, b இரண்டையும் int ஆகவே வைத்துக் கொண்டு, விடையை மட்டும் float-ல் பெறவும் வழியுண்டு.
/* Program No. */
/* TYPECAS3.C */
#include <stdio.h>
main()
{
int a=10, b = 4;
float c;
c = (float)a / b;
printf("a = %d, b = %d, c = %3.1f", a, b, c);
}
இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,
a = 10, b = 4, c = 2.5
என்று விடையாகக் கிடைக்கும். இதில் a, b இரண்டும் int இனத்தைச் சார்ந்தவைதாம். c-யின் மதிப்பைக் கணக்கிடும்போது மட்டும் a என்ற மாறியைத் தற்காலிகமாக float என்று கருதிக் கொள்ளுமாறு வெளிப்படையாக (Explicitly) கட்டளை அமைத்துள்ளோம். a, float-ஆக இருப்பதால் b-யும் தாமாகவே float-ஆக மாற்றப்பட்டுவிடும். எனவே விடையும் float-ல் கிடைத்துவிடும். இவ்வாறு புரோகிராமர் தலையிட்டு வெளிப்படையாக இனமாற்றம் செய்யும் செயல்முறைஇனமாற்றுகை (Typecasting) எனப்படுகிறது.
சில வேளைகளில் ஒரு float இன மதிப்பில் முழு எண் பகுதி (Integer portion) மட்டும் தேவைப்படுகிறது எனில், அதற்கும் வழியுள்ளது. கீழேயுள்ள புரோகிராமைக் கவனியுங்கள்:
/* Program No. */
/* TYPECAS4.C */
#include <stdio.h>
main()
{
float x = 5.84;
printf("\nValue of x : %4.2f", x);
printf("\nInteger Portion: %d", (int)x);
}
இந்தப் புரோகிராமின் விடை 5 என்று காண்பிக்கும். இவ்வாறு ஒரு float மதிப்பில் உள்ள int மதிப்பை மட்டும் எடுத்தாள நமக்கு இனமாற்றம் (Type Casting) வழி வகுக்கிறது.
Type Conversion Vs. Type Casting
Type Conversion, Type Casting இரண்டும் ஒன்றா? வேறு வேறா? வேறுபட்டவை எனில் இரண்டையும் வேறுபடுத்திக் காட்டுக. இவ்வாறெல்லாம் நேர்முகத் தேர்வுகளில் கேள்வி கேட்கப்படுவதுண்டு. இதற்குப் பதில் என்ன?
இரண்டும் சொல்தொடர்களுக்கும் வெவ்வேறு பொருள் என்பதில் ஐயமில்லை. ஆனால் கம்ப்யூட்டர் மொழிகளில் அதனை எவ்வாறு வேறுபடுத்திக் காட்டுவது என்பதில்தான் ஐயம் எழுகிறது. சில ஆசிரியர்கள் உட்கிடை இனமாற்றத்தை Type Conversion என்றும், வெளிப்படை இனமாற்றத்தை Type Casting என்றும் மிக எளிதாக விளக்கம் அளிக்கின்றனர். வேறுசில ஆசிரியர்கள் Type Casting என்பது காரணம் (cause), Type Conversion என்பது விளைவு (effect) எனவும் விளக்கம் அளிக்கின்றனர். இந்த இரண்டு வகையான விளக்கங்கங்களுள் மிகச் சரியானது எது?
ஆங்கிலச் சொற்களுக்கான நேரடியான பொருள் எதுவாக இருந்த போதிலும், கம்ப்யூட்டர் மொழிகளில் புரோகிராமர் வெளிப்படையாக இனமாற்றம் செய்யும் செயல்பாட்டையே Typecasting என்னும் சொல்லால் குறிப்பிடுகின்றனர். அச்செயல்பாட்டின் மூலம் Type Conversion என்னும் நிகழ்வு நிகழ்த்தப்படுகிறது. உட்கிடை இனமாற்றம், வெளிப்படை இனமாற்றம் இரண்டிலுமே இனமாற்றம் (Type Conversion) நிகழ்கிறது. முதலாவதில் இனமாற்றத்தைக் கம்ப்பைலர் நிகழ்த்துகிறது. இரண்டாவதில் புரோகிராமர் நிகழ்த்துகிறார். புரோகிராமர் நிகழ்த்தும் இனமாற்றமே (Type Coversion) Typecasting எனப்படுகிறது. எனவே மேற்கண்ட இரண்டு வகையான விளக்கங்களுள் இரண்டாவது விளக்கமே சரியானவை எனலாம்.
Type Conversion, Type Casting ஆகியவற்றுக்கு இணையாக நாம் பயன்படுத்தும் இனமாற்றம், இனமாற்றுகை என்னும் இரண்டு தமிழ்ச் சொற்களும் தாமாகவே இரண்டுக்கும் இடையேயான வேறுபாட்டை விளக்கி நிற்கின்றன.
No comments:
Post a Comment