സി (പ്രോഗ്രാമിങ് ഭാഷ)

ഒരു  രീതി-അധിഷ്ഠിത(procedure-oriented), പൊതു ഉപയോഗ (general purpose) പ്രോഗ്രാമിങ് ഭാഷയാണ് **സി** (C Programming Language). 1972 - ൽ ബെൽ‌‌ലാബിലെ ഡെന്നിസ് റിച്ചിയാണ്‌ സി വികസിപ്പിച്ചെടുത്തത്. അദ്ദേഹം തന്നെ വികസിപ്പിച്ച യുണിക്സ് ഓപ്പറേറ്റിങ് സിസ്റ്റത്തിൽ ഉപയോഗിക്കാനായിരുന്നു സി നിർമ്മിക്കപ്പെട്ടത്. സിയുടെ വികസന കാലം മുതലിങ്ങോട്ട് ഒരുപാട് പ്രോഗ്രാമിങ് ഭാഷകളെ സ്വാധീനിക്കാൻ ഇതിനായിട്ടുണ്ട്. ഏറ്റവും ജനപ്രീതി നേടിയ പ്രോഗ്രാമിങ് ഭാഷ എന്ന സ്ഥാനവും സി നേടിയെടുത്തു. ഇന്നും സിസ്റ്റം, ആപ്ലിക്കേഷൻ പ്രോഗ്രാമിങ് രംഗത്ത് സി ഉപയോഗിക്കപ്പെട്ടുവരുന്നു. ഡിസൈൻ പ്രകാരം, സാധാരണ മെഷീൻ നിർദ്ദേശങ്ങളിലേക്ക് കാര്യക്ഷമമായി മാപ്പ് ചെയ്യുന്ന നിർമ്മാണങ്ങൾ സി നൽകുന്നു. അസംബ്ലി ഭാഷയിൽ മുമ്പ് കോഡ് ചെയ്ത ആപ്ലിക്കേഷനുകളിൽ സി ഉപയോഗിച്ചു വരുന്നു. അത്തരം ആപ്ലിക്കേഷനുകളിൽ ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങളും കമ്പ്യൂട്ടർ ആർക്കിടെക്ചറുകൾക്കായുള്ള വിവിധ ആപ്ലിക്കേഷൻ സോഫ്‌റ്റ്‌വെയറുകളും ഉൾപ്പെടുന്നു, അവ സൂപ്പർ കമ്പ്യൂട്ടറുകൾ മുതൽ പിഎൽസികൾ, എംബഡഡ് സിസ്റ്റങ്ങൾ വരെയുള്ളവയിൽ സിയുടെ ഉപയോഗം കണ്ടെത്താൻ സാധിക്കും.

സി, ബി എന്ന പ്രോഗ്രാമിംഗ് ഭാഷയുടെ പിൻഗാമിയായി, യുണിക്സിൽ പ്രവർത്തിക്കുന്ന യൂട്ടിലിറ്റികൾ നിർമ്മിക്കുന്നതിനായി 1972 നും 1973 നും ഇടയിൽ ഡെന്നിസ് റിച്ചി ബെൽ ലാബിൽ വികസിപ്പിച്ചെടുത്തതാണ്. 1980-കളിൽ, സി ക്രമേണ ജനപ്രീതി നേടി. സി 1989 മുതൽ എഎൻഎസ്ഐയും (എഎൻഎസ്ഐ സി) ഇന്റർനാഷണൽ ഓർഗനൈസേഷൻ ഫോർ സ്റ്റാൻഡേർഡൈസേഷനും (ഐഎസ്ഒ) സ്റ്റാൻഡേർഡ് ചെയ്തിട്ടുണ്ട്.

സി ഒരു ‌ഇമ്പറേറ്റീവ് പ്രോസീജറൽ ഭാഷയാണ്. കുറഞ്ഞ റൺടൈം പിന്തുണയോടെ, മെഷീൻ നിർദ്ദേശങ്ങളിലേക്ക് കാര്യക്ഷമമായി മാപ്പ് ചെയ്യുന്ന മെമ്മറിയിലേക്കും ഭാഷാ നിർമ്മാണങ്ങളിലേക്കും ലോ-ലെവൽ ആക്‌സസ് നൽകുന്നതിനായി കംപൈൽ ചെയ്യാൻ രൂപകൽപ്പന ചെയ്‌തിരിക്കുന്നു. നിമ്ന തലത്തിലുള്ള കഴിവുകൾ ഉണ്ടായിരുന്നിട്ടും, ക്രോസ്-പ്ലാറ്റ്ഫോം പ്രോഗ്രാമിംഗിനെ പ്രോത്സാഹിപ്പിക്കുന്നതിനാണ് ഭാഷ രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്. പോർട്ടബിലിറ്റി സാധ്യമാക്കുന്നതിന് വേണ്ടി എഴുതപ്പെട്ട ഒരു സ്റ്റാൻഡേർഡ്-കംപ്ലയന്റ് സി പ്രോഗ്രാം, അതിന്റെ സോഴ്സ് കോഡിൽ കുറച്ച് മാറ്റങ്ങളോടെ വൈവിധ്യമാർന്ന കമ്പ്യൂട്ടർ പ്ലാറ്റ്‌ഫോമുകൾക്കും ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങൾക്കും വേണ്ടി കംപൈൽ ചെയ്യാൻ കഴിയും.

2000 മുതൽ, പ്രോഗ്രാമിംഗ് ഭാഷകളുടെ ജനപ്രീതിയുടെ അളവുകോലായ ടിയോബെ(TIOBE)സൂചികയിലെ ആദ്യ രണ്ട് ഭാഷകളിൽ സി സ്ഥിരമായി സ്ഥാനം നേടി.
## തത്ത്വം
സി സിസ്റ്റം നിർമ്മിക്കാനായി ഉപയോഗിക്കുന്ന ഒരു രീതി-അധിഷ്ഠിത പ്രോഗ്രാമിംഗ് ഭാഷയാണ്‌. താരതമ്യേന ലളിതമായ ഒരു കമ്പൈലർ ഉപയോഗിച്ച് സമാഹരിക്കുക (compiling), മെമ്മറിയിലേക്ക് താഴ്ന്ന തലത്തിലുള്ള പ്രവേശനം (low level access) ലഭ്യമാക്കുക, മെഷീൻ ഇൻസ്റ്റ്റക്ഷനുകളിലേക്ക് സമർത്ഥമായി സമ്മേളിക്കുവാൻ പറ്റിയ ഭാഷാഘടകങ്ങൾ (language constructs), ഏറ്റവും കുറച്ചു റൺ-സമയ പിന്തുണ (run-time support)- ഇവയാണ്‌ സിയുടെ രൂപകല്പനയിലെ ലക്ഷ്യങ്ങൾ. അതുകൊണ്ട് തന്നെ അസെംബ്ലി ഭാഷയ്ക്ക് പകരമായി പല സാഹചര്യങ്ങളിലും സി ഉപയോഗിക്കാം.

ഒരു യന്ത്ര-സ്വതന്ത്ര പ്രോഗ്രാമിംഗ് ഭാഷ (machine-independent) കൂടിയാണ്‌ സി. നന്നായി എഴുതിയ ഒരു സി പ്രോഗ്രാമിനെ വളരെ കുറച്ചു മാറ്റങളോടെയോ മാറ്റങ്ങൾ ഇല്ലാതെ തന്നെയുമോ പല കമ്പ്യൂട്ടർ പ്ലാറ്റ്ഫോമുകളിലും ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങളിലും സമാഹരിക്കാൻ (compile) സാധിക്കും.

## സവിശേഷതകൾ

**സി**യുടെ പൂർവ്വികന്മാരെ അപേക്ഷിച്ച് ശക്തവും ലളിതവുമായ സിന്റാക്സാണ് ഇതിന്റെ ഏറ്റവും വലിയ സവിശേഷത. ഏതാണ്ട്‌ മുപ്പതോളം മാത്രം വരുന്ന നിർദ്ദേശ വാക്കുകൾ (Keywords) ഉപയോഗിച്ചാണ് സിയിൽ പ്രോഗ്രാമുകൾ എഴുതുന്നത്. ഈ പ്രോഗ്രാമുകൾ യന്ത്രഭാഷയിലേക്ക് (Machine Language) മാറ്റുമ്പോൾ സി ഏറ്റവും കുറവ് യന്ത്രഭാഷാ നിർദ്ദേശങ്ങളേ ഉപയോഗിക്കുന്നുള്ളു. ഇതിന്റെ ഫലമായി നിർമ്മിക്കപ്പെടുന്ന പ്രോഗ്രാമിന് വേഗത കൂടുതലായിരിക്കും.

കമ്പ്യൂട്ടർ പ്രോഗ്രാമിന്റെ അടിസ്ഥാന ഘടകങ്ങളിലൊന്നായ ഡേറ്റാ സ്ട്രൿചറുകൾനിർമ്മിക്കുവാനും ഉപ‌യോഗിക്കുവാനും ഈ ഭാഷയിൽ എളുപ്പത്തിൽ സാധിക്കും. കമ്പ്യൂട്ടർ മെമ്മറിയുടെ ഏറ്റവും ഫലവത്തായ ഉപയോഗവും സിയുടെ സവിശേഷതയാണ്.

സി ഒരു പോർട്ടബിൾ ഭാഷയാണ്. അതായത്, സിയുടെ തനത് നിർദ്ദേശക്കൂട്ടങ്ങൾ ഉപയോഗിച്ച് എഴുതിയ ഒരു പ്രോഗ്രാം മറ്റു പ്ലാറ്റ്ഫോമുകളിലേക്ക് എളുപ്പത്തിൽ മാറ്റാൻ സാധിക്കും (ഉദാഹരണത്തിന്, വിൻ‌ഡോസ് ഓപ്പറേറ്റിങ് സിസ്റ്റത്തിൽ നിന്നും യൂണിക്സിലേക്കും തിരിച്ചും). ഇതിന് മാറ്റുവാനുദ്ദേശിക്കുന്ന പ്ലാറ്റ്ഫോമിന് അനുയോജ്യമായ കംപൈലർ പ്രോഗ്രാമുകൾ ആവശ്യമാണ്. ഇന്ന് ഏതാണ്ടെല്ലാ പ്ലാറ്റ്ഫോമിലും ഉപയോഗ്യമായ സി കംപൈലർ പ്രോഗ്രാമുകൾ നിർമ്മിക്കപ്പെട്ടിട്ടുണ്ട്.

* നെസ്റ്റിങ് (ഒന്നിന്റെ ഉള്ളിൽ മറ്റൊന്നിനെ‌‌ ഉൾ‍പ്പെടുത്തുക അനുവദിക്കാത്ത function നിർവചനങ്ങൾ.
* പകുതി ദുർബലമായ തരംതിരിക്കൽ (weak typing). ഉദാഹരണത്തിന്‌ ക്യാരക്ട്രർ variables integers ആയും ഉപയോഗിക്കാം.
* തരംതിരിച്ച (typed) പോയിന്ററുകളെ യന്ത്ര വിലാസങ്ങളിലേക്ക് മാറ്റുന്നതിനായി താഴ്ന്ന തലത്തിലുള്ള മെമ്മറി പ്രവേശനം
* പോയിന്റർ കണക്കു പ്രകാരം നിർവചിച്ചിരിക്കുന്ന അറെ (array) ഇൻഡ്ക്സുകൾ
* മാക്രൊ നിർവചനത്തിനു വേണ്ടി പ്രിപ്രോസസ്സർ, സോഴ്സ് കോഡ് ഉൾപ്പെടുത്താനുള്ള സൗകര്യം, നിബന്ധനകൾക്ക് വിധേയമായിട്ടുള്ള സമാഹരണം(conditional compilation) 
* 30 കീവേഡുകൾ

## ചരിത്രം
### ആദ്യകാല ചരിത്രം

1969-1972 കാലഘട്ടത്തിലാണ് സിയുടെ നിർമ്മാണത്തിന് തുടക്കമിട്ടത്. സിയുടെ നിർമ്മാണഘട്ടത്തിൽ അക്കാലത്തുണ്ടായിരുന്ന ‘ബി’ എന്ന പേരിലറിയപ്പെട്ടിരുന്ന മറ്റൊരു പ്രോഗ്രാമിങ് ഭാഷ നിർണ്ണായക സ്വാധീനം ചെലുത്തിയിട്ടുണ്ട്. ഇതിനാലാണത്രെ താൻ നിർമ്മിച്ച പുതിയ ഭാഷയ്ക്ക് ‘സി’ എന്ന പേരിടാൻ ഡെന്നിസ് റിച്ചിയ്ക്ക് പ്രചോദനമായത്. ഇംഗ്ലീഷ് അക്ഷരമാലയിൽ ‘ബി’ കഴിഞ്ഞ്‌ ‘സി’ ആണല്ലൊ വരുന്നത്.

യുണിക്സ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന്റെ നിർമ്മാണവുമായി സിയുടെ തുടക്കത്തിന്‌ ബന്ധമുണ്ട്. യുണിക്സ് യഥാർത്ഥത്തിൽ പിഡിപി-7 കമ്പ്യൂട്ടരിനു വേണ്ടി കെൻ തോംസണും ഡെന്നിസ് റിച്ചിയും ചേർന്ന് അസെംബ്ലി ഭാഷയിൽ വികസിപ്പിച്ചെടുത്തതാണ്‌. അത് പിഡിപി-11ലേക്ക് പോർട്ട് ചെയ്യാനായി ബി ഉപയോഗിച്ചപ്പോൾ, ബിയുടെ പല പരിമിതികളും അവർ മനസ്സിലാക്കി. ഇത് സിയുടെ ആദ്യകാല വികസനത്തിന്‌ വഴിതെളിച്ചു.

1973 ആയപ്പോഴേക്കും യുണിക്സ് കെർണൽ മുഴുവനായി സിയിൽ മാറ്റി എഴുതപ്പെട്ടിരുന്നു. അങ്ങനെ അസെംബ്ലി ഭാഷയിലല്ലാതെ എഴുതപ്പെടുന്ന ആദ്യ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റ്ങ്ങളിൽ ഒന്നായി യുണിക്സ് മാറി.
  
### ആൻ‌സി സി (ANSI C)

**സി** ഭാഷ ഒട്ടേറെ തവണ പരിഷ്കരിക്കപ്പെട്ടിട്ടുണ്ട്‌. 1970 അവസാനമായപ്പോഴേക്കും മൈക്രോ‌കമ്പ്യൂട്ടറുകളിലെ പ്രോഗ്രാമിംഗ് ഭാഷ എന്ന നിലയിൽ ബേസിക്(BASIC) ഭാഷയെ സി കടത്തി വെട്ടിയിരുന്നു. 1980-കളിൽ IBM കമ്പനി തങ്ങളുടെ ആവശ്യങ്ങൾക്കായി സി ഭാഷയെ തിരഞ്ഞെടുത്തു. സിയുടെ വർദ്ധിച്ചു വരുന്ന ഉപയോഗം കണക്കിലെടുത്ത് 1983-ൽ സി ഭാഷയെ ഏകീകരിക്കുക എന്ന ലൿഷ്യത്തോടെ അമേരിക്കൻ നാഷനൽ സ്റ്റാൻ‌ഡേർഡ്‌സ് ഇൻസ്റ്റിറ്റ്യൂട്ട് ഒരു കമ്മിറ്റി രൂപവൽക്കരിച്ചു. ഈ കമ്മിറ്റി ഏകീകരിച്ച സി ഭാഷയുടെ പതിപ്പാണ് ആൻ‌സി സി (ANSI C) എന്ന പേരിലറിയപ്പെടുന്നത്.
## ഘടന
### കീ വേർഡുകൾ
സി പ്രോഗ്രാമ്മിങ് ഭാഷയിൽ 32 കീ വേർഡുകൾ ഉണ്ട്.

:`auto`
:`break`
:`case`
:`char`
:`const`
:`continue`
:`default`
:`do`

:`[[double precision|double]]`
:`else`
:`[[enumerated type|enum]]`
:<code>extern</code>
:`[[floating point|float]]`
:`[[for loop|for]]`
:`[[goto]]`
:`if`

:`int`
:`[[long integer|long]]`
:`register`
:`return`
:`[[short integer|short]]`
:`signed`
:`[[sizeof]]`
:<code>static</code>

:`[[struct (C programming language)|struct]]`
:`[[switch statement|switch]]`
:`typedef`
:`union`
:`unsigned`
:`[[void type|void]]`
:`[[volatile variable|volatile]]`
:`[[while loop|while]]`

## വിമർശനങ്ങൾ

ഇന്ന് കമ്പ്യൂട്ടർ രംഗത്തെ പ്രശ്ന നിർദ്ധാരണത്തിന് സി മതിയാവില്ലെന്നാണ് വിമർശകരുടെ ആരോപണം. തുടക്കത്തിൽ ഉപകാരപ്രദങ്ങളായ ഒട്ടേറെ സംരംഭങ്ങൾക്ക് വഴിതെളിച്ചെങ്കിലും സൂക്ഷിച്ച് ഉപയോഗിച്ചില്ലെങ്കിൽ അപകടകരമായ ഫലങ്ങൾ ഉണ്ടാവുക അല്ലെങ്കിൽ ഉദ്ദേശിച്ച ഫലം ലഭിക്കാതിരിക്കുക എന്നിവ സി ഉപയോഗിച്ച് എഴുതിയ പ്രോഗ്രാമുകൾ കൊണ്ട് ഉണ്ടാകാം എന്ന് വിമർശകർ ചൂണ്ടിക്കാട്ടുന്നു. സി ഒരു വസ്തുതാധിഷ്ഠിത കമ്പ്യൂട്ടർ പ്രോഗ്രാമിങ് ഭാഷയല്ല, അതിനാൽ അത്യധികം സങ്കീർണ്ണമായ പ്രോഗ്രാമുകൾ സിയിൽ നിർമ്മിച്ചെടുക്കുക ഏതാണ്ട്‌ അസാധ്യം തന്നെയാണെന്നാണ് വിമർശകരുടെ പക്ഷം.

## മറ്റു കമ്പ്യൂട്ടർ ഭാഷകൾ

സി ഭാഷ സ്വാധീനം ചെലുത്തിയ മറ്റു കമ്പ്യൂട്ടർ ഭാഷകൾ ഇവയാണ്.

* സി++ (C++)
* പി.എച്ച്.പി (PHP)
* പൈത്തൻ (Python)
* ജാവ (Java)
* ജാവാസ്ക്രിപ്റ്റ് (JavaScript)
* സി# (C#)
* ഒബ്ജെൿറ്റിവ് സി (Objective C)

## അവലംബം


വർഗ്ഗം:പ്രോഗ്രാമിങ് ഭാഷകൾ
വർഗ്ഗം:സി പ്രോഗ്രാമിങ് ഭാഷാ കുടുംബം
വർഗ്ഗം:അമേരിക്കൻ കണ്ടുപിടിത്തങ്ങൾ