సి

**సి** ఒక కంప్యూటర్‌ భాష. దీనిని మధ్య స్థాయి భాషగాను లేదా క్రింది స్థాయి భాషగాను ఉపయోగించుకోవచ్చు. 'సి' ని 1970లో కెన్ థాంప్సన్, డెన్నిస్ రిచీ అను శాస్త్రవేత్తలు తయారు చేసారు. ఇప్పుడు ఈ భాషను కంప్యూటింగ్ రంగంలో చాలా విస్త్రుతంగా వాడుతున్నారు. అంతే కాదు, ఈ భాషకు ఉన్న కొన్ని ప్రత్యేకతల వలన క్రింది స్థాయి అప్లికేషన్ల డెవలప్మెంట్ కు చాలా మంచి భాషగా ప్రాముఖ్యత పొందింది.

## చరిత్ర

**ప్రోగ్రామింగ్** భాష అంటే ఒక యంత్రానికి (ముఖ్యంగా కంప్యూటరుకు) అది చేయవలసిన పనులను తెలియచెప్పడానికి రూపకల్పన చేసిన కృత్రిమమైన భాష. ప్రోగ్రామింగ్ భాషలతో యంత్రము యొక్క ప్రవర్తనను నియంత్రించడానికి ప్రోగ్రాములు తయారుచేయవచ్చు. అంతేగాక వీటిని మనిషికి-యంత్రానికి మధ్య సంభాషణ కొరకు ఒక మార్గముగా పరిగణించవచ్చు. ఇవి అనేక రకాలు. ఉదాహరణకు

*జావా
* సి
*సీ ప్లస్ ప్లస్ 
*కోబాల్.

**'సి**' భాష మొట్టమొదట ఏటీ & టీ బెల్ పరిశోధనాలయంలో (AT&T Bell Labs) 1969కు 1973 మధ్యన తయారు చేయటం జరిగింది. ఎక్కువ భాగం 1972లో తయారయింది. 'సి' కంటే ముందు 'బి' అనే కంప్యూటరు భాష ఉండేది. 'సి'కి సంబంధించిన చాలా విశేషాలను 'బి' నుండే తీసుకున్నారు. ఆంగ్లములో 'బి' తరువాత 'సి' వస్తుంది. ఈ రెండు కారణాల వలన 'సి' కి ఆ పేరు పెట్టడము జరిగింది. 1973 వచ్చేసరికి సి భాష మంచి రూపును సంతరించుకుంది, అటు తరువాత సి భాషను ఉపయోగించి యునీక్సు (ఆపరేటింగ్ సిస్టమ్) కెర్నలుని మరలా నిర్మించారు.

## సి నేర్చుకొనేందుకు కావలిసినవి
సి-భాష నేర్చుకొనేముందు మీకు కంప్యూటరు గురించి ప్రాథమిక పరిజ్ఞానము ఉండవలెను. అయితే మీకు ప్రోగ్రామింగుకి సంబంధించిన పరిజ్ఞానము పెద్దగా అవసరము లేదు.
సి-భాష నేర్చుకొనేందుకు మీకు ఒక సి-కంపైలరు (సాఫ్ట్వేర్) కావలెను.
మీరు విండోసు ఆపరేటింగ్ సిస్టం వాడుతున్నట్లయితే

* gcc కోసం Cygwin, కానీ MinGW కానీ వాడవలెను.
* లేదా ఏదయినా వాణిజ్యపరమయిన సి-కంపైలర్లు/IDEలు కూడా వాడవచ్చును.
మీరు లినక్స్ ని వాడుతున్నట్లయితే gcc ఈపాటికే మీ కంప్యుటరులో ఉండాలి.

## విశేషములు
### ఉపోద్ఘాతము
సి కంఫైలర్ ఉపయెగించే పద్థతి
'సి' భాష అసెంబ్లీ భాష (assembly language)కు బాగా దగ్గరగా ఉంటుంది. అందుకనే, సి భాషను అప్పుడప్పుడు "portable assembly" అని పిలుస్తారు. ఒకసారి సి భాషలో రాసిన ప్రోగ్రాముని దాదాపు ఏ యంత్రములోనయినా కంపైలు (compile) చేసుకొని వాడుకోవచు. కానీ అసెంబ్లీ భాషలో ఇలా అన్ని యంత్రాలకు సరిపోయేటట్లు ప్రోగ్రాములను వ్రాయటము కుదరదు.

అసలు 'సి' భాషను సులువుగా నేర్చుకోడానికి, ముందుగా మనకు అల్గారిథం (algorithm), క్రమచిత్రం (flowchart) ల గురించి తెలియాలి.

**ఆల్‌గారిధమ్ (ALGORITHM)**:

 కంప్యూటర్ పై ఒక సమస్యను పూరించేందుకు మనం ఆజ్ఞల సమితిని జారి చేయడానికి వాడే సోపాన క్రమవిధానాన్ని సాంకేతికంగా "ఆల్‌గారిధమ్" అంటారు.
(లేదా)
 ఒక పనిని పూర్తి చేయడానికి కొన్ని సూచనలను ఒక క్రమ పధ్ధతిలో ఉపయోగించుకోనే విధానాన్ని "ఆల్‌గారిధమ్" అంటారు

ఆల్‌గారిధమ్ అనేది ఏ కంప్యూటర్ భాషకుకి అయిన పునాది వంటిది. ఆల్‌గారిధమ్ (algorithm) ను కంప్యూటర్ అర్దం చేసుకొలేదు, ఏందుకు అంటే ఆల్‌గారిధమ్ (algorithm) ను మనం మన సొంత భాషలో వ్రాసుకొవచ్చు. ఆల్‌గారిధమ్ (algorithm) ను కంప్యూటర్ అర్దం చేసుకోవాలి అంటే దానిని మనం కంప్యూటర్ అర్దం చేసుకునే విధంగా వ్రాయలి. కంప్యూటర్ అర్దం చేసుకునే భాషను ప్రోగ్రామింగ్ లాంగ్వేజ్ (Programming language) అంటారు.

ఒక సమస్యను తీసుకుంటే దానికి ఆల్‌గారిధమ్ ఏలా వ్రాస్తారు ఇప్పుడు చూద్దాం..
ఇచ్చిన రెండు సంఖ్యలను కూడడం (add) :
(a=2 b=3 c=a+b) ?
 step1: start చేయాలి
 step2: మొదటి నంబరును తీసుకోవాలి (a=2)
 step3: రెండవ నంబరును తీసుకోవాలి (b=3)
 step4: తర్వాత రెండు సంఖ్యలను add చేయాలి add=a+b
 step5: ప్రింట్ చేయాలి print / display add
 step6: తర్వాత end చేయాలి.

**వివరణ**:
మనం ఏద్తెన పనిని చేయాలి అంటే ముందు దానిని start చేయాలి. అందుకే ప్తెన problem1 లో step1 అనేది start చేయడం. తర్వాత steps అనేవి మనం Slove చేసే Problem మీద ఆధారపడి ఉంటుంది. మనం ఏద్తెన పనిని start చేస్తే దానికి Ending కూడా ఉంటుంది. అందుకే last step (step6)అనేది End చేయడం

***'క్రమచిత్రం (FLOW CHAT):***'

సమస్య సాధనకు రాసిన ఆల్‌గారిధమ్ కి బోమ్మలతో కూడిన వర్ణనను *క్రమచిత్రం* అనవచ్చు. క్రమచిత్రం (flowgraph)ని వివిధ రకాల boxes, symbols తో గీయాలి చేయవలసిన పనిని (operation)box లోపల వ్రాస్తారు. మొత్తం boxes, symbols అనేవి Arrow ద్వారా connect చేయబడి వుంటాయి .ఈ విధంగా arrow తో connect చేయడం వలన algorithm యొక్క క్రమాన్ని మనం తేలుసుకోవచ్చు.
క్రింది figure క్రమచిత్రంలో ఉపయోగించే వివిధ రకాల symbols and boxes గురించి చేబుతుంది..
thumbnail|క్రమ చిత్రం|link=Special:FilePath/C:\Users\Aditya\Desktop\flowchartmain.jpg

ఇచ్చిన రెండు సంఖ్యలను add చేయడం (a=2 b=3 c=a+b) ?
దీనికి క్రమ చిత్రం ఎలా గీయలో చూద్దాం..
(Draw a Flow Chat Diagram For Addition Of Two Numbers)
thumbnail|రెండు సంఖ్యలను కూడుటకు క్రమ చిత్రం|link=Special:FilePath/C:\Users\Aditya\Desktop\ft1.JPG

**వివరణ**: మనం ఏద్తెన పనిని చేయాలి అంటే ముందు దానిని start చేయాలి. అందుకే ప్తెన సమస్యలో step1 అనేది start చేయడం. అందుకని దీనిని oval లో వ్రాసం .తర్వాత 2 & 3 steps అనేవి values ని తీసుకొవడం అందుకని 
సమాంతచతురస్రం [parallelogram] లో వ్రాసం. తర్వాత 4 step అనేది కూడికని perform చేయడం అందుకని దీర్ఘచతురస్రం [Rectangle] లో వ్రాసం .తర్వాత 5th steps అనేది output ని print చేయడం. అందుకని సమాంతచతురస్రం [parallelogram] లో వ్రాసం. మనం ఏద్తెన పనిని start చేస్తే దానికి Ending కూడా ఉంటుంది .అందుకే last step (step6) అనేది End చేయడం అందుకని దీనిని oval లో వ్రాసం.

### "హలో, ప్రపంచం!" ఉదాహరణ
మామూలుగా ఎవరయినా చిన్నపిల్లలకు భాషను నేర్పేటప్పుదు "ఓం" అనో, "అమ్మ" అనో, ఓం నమఃశివాయ అనో (ఓనమాలు అనే పదం ఇక్కడనుండే వచ్చినది అని చెప్తారు)వ్రాయించి ఓనమాలు దిద్దిస్తారు. అలాగే కంప్యూటరు భాషలను నేర్చుకునేటప్పుడు ఈ "హలో, ప్రపంచం!" ఉదాహరణతో మొదలు పెడతారు. ఈ ప్రోగ్రాము "హలో, ప్రపంచం!" అని మీ కంప్యూటరు మానిటరు మీద చూపిస్తుంది. సి భాషలో "హలో, ప్రపంచం!" ఉదాహరణ ఈ క్రింది విధముగా ఉంటుంది.

```c
main()
{
  printf("హలో, ప్రపంచం!\n");
}
```

పైన ఇచ్చిన ప్రోగ్రాము దాదాపు అన్ని కంపైలరు (compiler)లలో పని చేయక పోవచ్చును. ఎందుకనగా అది ANSI C ప్రమాణాల ప్రకారం రాయబడలేదు. ఆ ప్రోగ్రాముకు చిన్నచిన్న మార్పులు చేర్పులు చేస్తే, ప్రమాణాలకు తగ్గట్లుగా మార్చు కోవచును.

```c
#include <stdio.h>

int main(void)
{
  printf("హలో, ప్రపంచం!\n");

  return 0;
}
```

అయితే ఇప్పుడు మనము పైన ఇచ్చిన ప్రోగ్రాములోని ఒకొక్క వాక్యాన్ని అర్ధము చేసుకుందాము

```

```

సి-భాషలో #తో మొదలయే వాక్యాలను "ప్రీప్రోసెసింగ్ డైరెక్టీవ్స్" ("preprocessing directive") అని అంటారు.
`#include` అను ప్రీప్రోసెసింగ్ డైరెక్టీవ్, ప్రీప్రోసెసర్ను-ఆ వాక్యంలో పేర్కొన్న ఫైలులో ఉన్న మొత్తము సమాచారముతో, ఈయొక్క వాక్యము బదులుగా చేర్చుటకు సూచన ఇచ్చును.

```

```

తరువాతి వాక్యములో `main` అను ఒక ఫంక్షనుని "వివరించటం" (define) జరిగింది. సి-భాషలో `main`-ఫంక్షనుతో ఒక ప్రత్యేక ఉపయోగము ఉంది. ప్రోగ్రాముని ఎక్సిక్యూట్ చేసినప్పుడు ఈ ఫంక్షనునే మొటమొదట కాల్ చేస్తారు. కాబట్టి ఈ `main`-ఫంక్షను ప్రతీ ప్రోగ్రాములో తప్పని సరిగా ఉండాలి. `int` అనునది ఆ ఫంక్షను తిరిగి పంపించు సమాచారము యొక్క రూపును తెలుపును. ఇక్కడ `int` అనగా ఆ సమాచారము integer రూపములో ఉంటుందని అర్థము. `(void)` అనగా `main`-ప్రోగ్రామును పిలుచుటకు ఎటువంటి ఆర్గ్యుమెంట్సు (agruments)ని పంపించనవసరము లేదు అని తెలుపుతున్నది.


```
{
```

తెరుచుకునే మీసాల బ్రాకెట్లు `main`-ఫంక్షను మొదలును సూచించును.


```
printf("హలో, ప్రపంచం\n");
```

ఈ వాక్యము `printf` అను ఫంక్షనుని కాల్ (call) చేయును. ఈ ఫంక్షను `stdio.h` అను హెడ్డరు ఫైలులో నిర్మింపబడింది. ఈ ఫంక్షను, దానిలోకి పంపించిన సమాచారాన్ని ఒక క్రమ పద్ధతిలో అమర్చి మీ మానిటరు పైన చూపించును. `"హలో, ప్రపంచం!\n"`లో `\n` అనునది ఎస్కేప్ సిక్వెన్స్ ("escape sequence") అని అంటారు, అది కర్సరుని ఇంకో క్రొత్త లైనులోకి వెళ్ళుటకు అదేశించును. ఇచట మామూలు సమాచారము మధ్యలో అడెశములు కూడా ఉండటము వలన ఎస్కేప్ సిక్వెన్స్ అని పిలవటం జరుగుతుంది. `printf`-ఫంక్షను `int` రూపములో ఉన్న సమాచారమును తిప్పి పంపించును, కానీ దాని వలన మనకు పెద్ద ఉపయోగములు ఏమీ ఉండవు.


```
return 0;
```

ఈ వాక్యము `main`-ఫంక్షను ఎక్సిక్యూషన్ని అంతము చేసి '0' అనే సంఖ్యను తిప్పి పంపించును.


```
}
```

మూసుకునే మీసాల బ్రాకెట్లు `main`-ఫంక్షను చివరను సూచించును.

### సి కంపైలర్ ఉపయోగించే పద్థతి
సి భాషను కంఫ్యూటర్ కీ అర్థమయ్యే భాషలొకి మార్చాలంటే కంపైలర్ వుండాలని ఇంతకు ముందు చదివాం.
### అభిప్రాయములు - వ్యాఖ్యలు
సాధారణంగా కొన్ని వాక్యముల ప్రోగ్రాముని రాసి, ఆ వాక్యములు ఏమి చేస్తాయి అనే దానిని మనము ఈ వ్యాఖ్యలుగా రాసుకోవచ్చును. సి-భాషలో వ్యాఖ్యలను `/*`, `*/` ల మధ్యన ఉంచవలెను. కావున `/* */` మధ్యన ఏమి ఉన్నా కంపైలరు అసలు పట్టించుకోదు. అయితే అభిప్రాయములు తెలుపుటకు మనము `"//"` కూడా ఉపయోగించ వచ్చును. కాక పోతే `//` ఉపయోగించినప్పుడు వాటి తరువాత ఆ లైనులో ఉన్నదంతా వ్యాఖ్య కిందకు వస్తుంది.

## వీటిని కూడా చూడండి
* సి-ప్రీప్రాసెసర్
* సి-ప్రామాణిక నిధి (Standard Library)
* సి-వ్యాకరణము (Syntax)
* సి-ఆపరేటర్లు

## ఇవి కూడా చూడండి
* బ్రయాన్ కెర్నిగన్, డెన్నీస్ రిచీ రాసిన ద సి ప్రోగ్రామింగ్ లాగ్వేజీ, దీనిని K&R అని కూడా పిలుస్తారు.

## మూలాలు
వర్గం:సాఫ్టువేరు వ్రాయు భాషలు