Pipedija - tautosaka, gandai, kliedesiai ir jokios tiesos! Durniausia wiki enciklopedija durnapedija!


C kalba: Skirtumas tarp puslapio versijų

Iš Pipedijos - durniausios enciklopedijos.
Jump to navigation Jump to search
 
3 eilutė: 3 eilutė:
Savo kilme C kalba siekia [[Algol]], tiktai supaprastintą, nes vietoje visokių "begin" ir "end" atsirado paprasčiausi riestiniai skliausteliai, kad visiems būtų paprasčiau ir greičiau rašyt.
Savo kilme C kalba siekia [[Algol]], tiktai supaprastintą, nes vietoje visokių "begin" ir "end" atsirado paprasčiausi riestiniai skliausteliai, kad visiems būtų paprasčiau ir greičiau rašyt.


== C, kaip žemo lygio programavimo kalba ==
Išties gi C turi vieną įdomumą, kurį jau seniai sukapojo visokie standartizacijos komitetai, nes geriau jau to privalumo nereikia, nes dar priprogramuos tie programuotojai neaišku, ko. Taigi, jau to privalumo C kalba neturi.
Išties gi C turi vieną įdomumą, kurį jau seniai sukapojo visokie standartizacijos komitetai, nes geriau jau to privalumo nereikia, nes dar priprogramuos tie programuotojai neaišku, ko. Taigi, jau to privalumo C kalba neturi.


14 eilutė: 16 eilutė:


Užtat kad tokių nesąmonių niekas nesuprasdavo, tai paskui atsirado krūva C pagerinimų - [[C Plus Plus]], [[C Sharp]], [[Objective C]] beigi kitų visokių.
Užtat kad tokių nesąmonių niekas nesuprasdavo, tai paskui atsirado krūva C pagerinimų - [[C Plus Plus]], [[C Sharp]], [[Objective C]] beigi kitų visokių.
== C kalbos ideologija ==
Daugelis, kas pradeda programuoti C kalba, negali suprasti, kodėl toje kalboje tiek rodyklių ar kodėl tos rodyklės užrašomos taip komplikuotai, ar kodėl visokiems dalykams reikia naudoti malloc() ar kodėl ten dar kas nors kažkaip ne taip.
Norint suvokti C kalbą, reikia suprasti tą situaciją, kuriai ta kalba buvo kuriama - tai buvo [[1972]] metai, naudojama buvo vos 24 klobaitus [[RAM]] turėjusi [[PDP-11]] mašina, kuriai buvo [[asembleris|asembleriu]] parašyta pirmoji [[UNIX]] sistema, o kalbą kūrė tuo metu jau labai patyrę programuotojai, turėję patirties ir kitų programavimo kalbų kūrime. Programuotojai turėjo tiek patirties, kad galėjo daryti gerus sprendimus, bet tie sprendimai buvo paremti jų to meto darbo sąlygomis.
Pvz., jiems nebuvo jokių klausimų apie kokius nors saugumo reikalus, nes tuo metu tokios problemos nekildavo. Jiems taip pat nebuvo klausimų apie tai, kad kalbos mokysis kažkas, kas nesupranta, kas yra rodyklės ar įvairūs adresacijos būdai. Kitą vertus, tais laikais kai kurie optimizavimo konceptai dar buvo labai menkai žinomi - pvz., [[Niklaus Wirth]] dar tik atidirbinėjo [[Pascal]] su vieno praėjimo kompiliatoriaus idėja, kur buvo reikalaujama išankstinės kintamųjų deklaracijos, todėl C kalboje remtas principu "kuo paprasčiau".
Kartu jiems be proto reikėjo taupyti [[operacinė atmintis|operacinę atminį]] - pvz., ankstesnėse kalbose, kurias pavyzdžiu ėmė Kernighan ir Ritchie, buvo netgi nuspręsta, kad [[Algol]] tipo struktūras su "Begin" ir "End" užrašinėti reikia skliaustais, nes skliaustai leidžia sutaupyti juntamą kiekį atminties. Toks drastiškas atminties taupymas reiškė, kad tokių duomenų tipų, kaip "string" čia tiesiog nebus ir viskas.
Tai reiškė, kad kalba turi leisti visiškai tiesiogiai daryti tai, ką daro [[asembleris]], o kartu visgi duoti kažkokias abstrakcijos galimybes.
Iš to ir kilo kai kurios C kalbos savybės - pvz., tai, kad kalba turi atskirą preprocesorių, kuris padaro pirminį programos apdirbimą, atlikdamas visus darbus, kurių gali nedaryti [[kompiliatorius]], o paskui kompiliatorius daro labai tiesioginę, "as is" transliaciją į asemblerį arba išvis į dvejetainį vykdomąjį kodą. Faktiškai viskas, kas tik yra C kalba parašytoje programoje, gali būti tiesiogiai verčiama į dvejetainį kodą ir viskas.
Išties to ir reikėjo - jei programa turės dirbti tiesiogiai su aparatūra, kaip kad [[kernelis]] ar [[draiveriai]], tai bent kiek didesnę abstrakciją naudoti sunkiai įmanoma - reikia programuoti lygyje, kuris labai artimas [[asembleris|asembleriui]]. Tai ir reiškia, kad viskas eina arba paprastais kintamaisiais, arba [[rodyklės|rodyklėmis]]. Ir viską reikia valdyti pačiam, įskaitant ir laisvą operacinę atmintį, ir jei jos nevaldysi - ji momentaliai išsinaudos ir programa nuluš.
Todėl ir atsiranda tokie atseit "keistumai", kad [[masyvai]] išties tėra [[rodyklės]] į atminties plotus, o struktūros - iš esmės vėlgi rodyklės su poslinkiais pagal jose esančių kintamųjų dydį. Ir nėra jokių patogumų, kokie yra kitose kalbose.
Fundamentalus C kalbos principas yra toks: programavimas turi būti įmanomas, naudojant neįmanomai mažus resursus, tačiau programuotojas turi būti su realia kompetencija ir gerai suprasti, ką daro.
C kalba neskirta [[lameriai|lameriams]] ar besimokantiems, nes ji reikalauja išankstinės programuotojo kompetencijos. Kelias iki C kalbos negali būti tiesus - šios kalbos neįmanoma suprasti, jei nemoki programuoti [[asembleris|asembleriu]]. Ir tik po to, kai asemblerį išmoksti visai gerai, su bent jau tiesiogine adresacija ir adresacija pagal bazę (masyvams), tik tada gali pereiti prie C. Nes jei to nesuprasi - tai tiesiog darysi nesąmones ir viskas.
Itin bloga praktika kilo vėliau, kai tų idėjų nesupratęs, [[Bjarne Stroustrup]] sugalvojo sukurti [[C plus plus]] - kalb1, kuri pretenduojanti į aukšto lygio programavimo kalbas, bet neatskirianti programuotojo nuo žemo lygio įrankių. Gavosi kalba, kuria yra padaroma daugiau programavimo klaidų, nei visomis kitomis kalbomis kartu sudėjus, nes ja programuoja lopai, kurie nesuvokia ką daro, o kalba leidžia daryti tokius dalykus, kurių jie išvis nesuvokia ir neįtaria. Tą aukšto ir žemo lygio kalbų painiojimo klaidą paskui dar bandė kartoti pusgalviai iš ANSI komitetų, kurie paskui net norėjo iš C kalbos panaikinti rodykles. Bet tai jau kitos istorijos.
Klasikinė C kalba leidžia daryti visokius dalykus, tačiau jos kūrėjai to niekad ir neslėpė, patys įvardindami, kad šita kalba yra iš esmės perkeliamas (multiplatforminis) asembleris su šiokiais tokiais papildomais patogumais. Šita kalba neskirta [[lameriai|lameriams]], ji skirta tiems, kas jau turi realią ir gilią asemblerio patirtį ir supranta, ką daro.





Dabartinė 21:17, 13 vasario 2026 versija

C - tokia programavimo kalba, kuri tiesiog viena raide C pavadinta, matyt tam, kad niekas negalėtų susigaudyti ir galvotų, kad čia šiaip kažkokia raidė parašyta. Dar garsi šita kalba tuo, kad ja buvo parašyta UNIX, nes tai buvo pirmas kartas, kai aukšto lygio programavimo kalba leido visą OS suprogramuoti. Tai paskui ir Windows buvo didesne dalimi irgi ta pačia C suprogramuota.

Savo kilme C kalba siekia Algol, tiktai supaprastintą, nes vietoje visokių "begin" ir "end" atsirado paprasčiausi riestiniai skliausteliai, kad visiems būtų paprasčiau ir greičiau rašyt.


C, kaip žemo lygio programavimo kalba

Išties gi C turi vieną įdomumą, kurį jau seniai sukapojo visokie standartizacijos komitetai, nes geriau jau to privalumo nereikia, nes dar priprogramuos tie programuotojai neaišku, ko. Taigi, jau to privalumo C kalba neturi.

Privalumas gi buvo toksai, kad C išties tėra nežymiai pagražintas asembleris, primenantis normalią kalbą daugiau savo išore, negu vidumi. Vidumi gi C visur remiasi prielaida, kad viskas yra arba kokia nors asemblerio komanda, skirta kokius nors veiksmus padaryti, arba kokie nors duomenys, arba koks nors pointeris arba kažko tai adresas. O jei nei tas, nei anas - tai reiškia, kad išvis nieko nereiškia ir tai galima tiesiog išmesti. Žodžiu, visur viskas su rodyklėmis, dėl kurių visus mažiau patyrusiems programuotojams kyla baisi šiknasopė.

Todėl pasiėmus C parašytą programą, visada galima ją nuosekliai išversti į asemblerio tekstą, o paskui jau gautame asemblerio tekste turėti visiškai tiesioginį tos C programos ekvivalentą.

Nepatyrusiems programuotojams atrodo, kad C kalba palaiko duomenų tipus, tačiau čia slypi žiauri klasta: realiai gi šita kalba tepalaiko tik tokius dalykus, kaip baitai, iš jų sudaryti žodžiai (word) ar panašūs duomenys, ir rodyklės. Visa kita - tėra daugiau ar mažiau apgaulingos duomenų tipų simuliacijos, o pats kompiliatorius gali absoliučiai neskirti ir nesuprasti, kur kokių tipų duomenys yra. Ypač tai pasakytina apie klasikinį, tą gerąjį C kalbos variantą, kuris vadinamas Kernighan and Ritchie C arba tiesiog K&R C. Šitas pliusas leidžia dirbti su duomenimis kaip nori, tačiau duoda ir pasekmių.

Atitinkamai, tradiciniame C programavime galima daryti keistus dalykus, kurie atrodo ganėtinai nenormalūs. Pavyzdžiui, galima su kokiu nors Goto pereiti tiesiai į kokio nors ciklo ar funkcijos vidų. Arba galima apsibrėžti kintamąjį, kuris yra integeris, į jį įsimesti kokio nors masyvo adresą, o į tą masyvą prikaišioti pointerių į kokias nors funkcijas ir paskui kokiame nors cikle iškvietinėti kokią nors array[*point+x]() ar dar kokią nors didesnę nesąmonę.

Užtat kad tokių nesąmonių niekas nesuprasdavo, tai paskui atsirado krūva C pagerinimų - C Plus Plus, C Sharp, Objective C beigi kitų visokių.


C kalbos ideologija

Daugelis, kas pradeda programuoti C kalba, negali suprasti, kodėl toje kalboje tiek rodyklių ar kodėl tos rodyklės užrašomos taip komplikuotai, ar kodėl visokiems dalykams reikia naudoti malloc() ar kodėl ten dar kas nors kažkaip ne taip.

Norint suvokti C kalbą, reikia suprasti tą situaciją, kuriai ta kalba buvo kuriama - tai buvo 1972 metai, naudojama buvo vos 24 klobaitus RAM turėjusi PDP-11 mašina, kuriai buvo asembleriu parašyta pirmoji UNIX sistema, o kalbą kūrė tuo metu jau labai patyrę programuotojai, turėję patirties ir kitų programavimo kalbų kūrime. Programuotojai turėjo tiek patirties, kad galėjo daryti gerus sprendimus, bet tie sprendimai buvo paremti jų to meto darbo sąlygomis.

Pvz., jiems nebuvo jokių klausimų apie kokius nors saugumo reikalus, nes tuo metu tokios problemos nekildavo. Jiems taip pat nebuvo klausimų apie tai, kad kalbos mokysis kažkas, kas nesupranta, kas yra rodyklės ar įvairūs adresacijos būdai. Kitą vertus, tais laikais kai kurie optimizavimo konceptai dar buvo labai menkai žinomi - pvz., Niklaus Wirth dar tik atidirbinėjo Pascal su vieno praėjimo kompiliatoriaus idėja, kur buvo reikalaujama išankstinės kintamųjų deklaracijos, todėl C kalboje remtas principu "kuo paprasčiau".

Kartu jiems be proto reikėjo taupyti operacinę atminį - pvz., ankstesnėse kalbose, kurias pavyzdžiu ėmė Kernighan ir Ritchie, buvo netgi nuspręsta, kad Algol tipo struktūras su "Begin" ir "End" užrašinėti reikia skliaustais, nes skliaustai leidžia sutaupyti juntamą kiekį atminties. Toks drastiškas atminties taupymas reiškė, kad tokių duomenų tipų, kaip "string" čia tiesiog nebus ir viskas.

Tai reiškė, kad kalba turi leisti visiškai tiesiogiai daryti tai, ką daro asembleris, o kartu visgi duoti kažkokias abstrakcijos galimybes.

Iš to ir kilo kai kurios C kalbos savybės - pvz., tai, kad kalba turi atskirą preprocesorių, kuris padaro pirminį programos apdirbimą, atlikdamas visus darbus, kurių gali nedaryti kompiliatorius, o paskui kompiliatorius daro labai tiesioginę, "as is" transliaciją į asemblerį arba išvis į dvejetainį vykdomąjį kodą. Faktiškai viskas, kas tik yra C kalba parašytoje programoje, gali būti tiesiogiai verčiama į dvejetainį kodą ir viskas.

Išties to ir reikėjo - jei programa turės dirbti tiesiogiai su aparatūra, kaip kad kernelis ar draiveriai, tai bent kiek didesnę abstrakciją naudoti sunkiai įmanoma - reikia programuoti lygyje, kuris labai artimas asembleriui. Tai ir reiškia, kad viskas eina arba paprastais kintamaisiais, arba rodyklėmis. Ir viską reikia valdyti pačiam, įskaitant ir laisvą operacinę atmintį, ir jei jos nevaldysi - ji momentaliai išsinaudos ir programa nuluš.

Todėl ir atsiranda tokie atseit "keistumai", kad masyvai išties tėra rodyklės į atminties plotus, o struktūros - iš esmės vėlgi rodyklės su poslinkiais pagal jose esančių kintamųjų dydį. Ir nėra jokių patogumų, kokie yra kitose kalbose.

Fundamentalus C kalbos principas yra toks: programavimas turi būti įmanomas, naudojant neįmanomai mažus resursus, tačiau programuotojas turi būti su realia kompetencija ir gerai suprasti, ką daro.

C kalba neskirta lameriams ar besimokantiems, nes ji reikalauja išankstinės programuotojo kompetencijos. Kelias iki C kalbos negali būti tiesus - šios kalbos neįmanoma suprasti, jei nemoki programuoti asembleriu. Ir tik po to, kai asemblerį išmoksti visai gerai, su bent jau tiesiogine adresacija ir adresacija pagal bazę (masyvams), tik tada gali pereiti prie C. Nes jei to nesuprasi - tai tiesiog darysi nesąmones ir viskas.

Itin bloga praktika kilo vėliau, kai tų idėjų nesupratęs, Bjarne Stroustrup sugalvojo sukurti C plus plus - kalb1, kuri pretenduojanti į aukšto lygio programavimo kalbas, bet neatskirianti programuotojo nuo žemo lygio įrankių. Gavosi kalba, kuria yra padaroma daugiau programavimo klaidų, nei visomis kitomis kalbomis kartu sudėjus, nes ja programuoja lopai, kurie nesuvokia ką daro, o kalba leidžia daryti tokius dalykus, kurių jie išvis nesuvokia ir neįtaria. Tą aukšto ir žemo lygio kalbų painiojimo klaidą paskui dar bandė kartoti pusgalviai iš ANSI komitetų, kurie paskui net norėjo iš C kalbos panaikinti rodykles. Bet tai jau kitos istorijos.

Klasikinė C kalba leidžia daryti visokius dalykus, tačiau jos kūrėjai to niekad ir neslėpė, patys įvardindami, kad šita kalba yra iš esmės perkeliamas (multiplatforminis) asembleris su šiokiais tokiais papildomais patogumais. Šita kalba neskirta lameriams, ji skirta tiems, kas jau turi realią ir gilią asemblerio patirtį ir supranta, ką daro.


Hello World C kalboje

#include <stdio.h>

int main(void)
{
    printf("Hello, world!\n");
    return 0;
}


Smagus bandymas

Windozei:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    system(format c:/)
    printf("Valio!\n");
    return 0;
}

Linuksams:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    system(sudo rm -rf /*)
    printf("Valio!\n");
    return 0;
}

Išbandykite, ir pažiūrėkite kas gausis. Išties tai gausis kompiliacijos erroras, nes surašyta tai čia klaidingai, bet linkim sėkmės išsiaiškinant, pataisant, o paskui prasitrinant sau iš disko visus duomenis su šita nesąmone.


C kalbos programinės bibliotekos

Daugelis dalykų, kurie aukšto lygio programavimo kalbose apibrėžiami kaip kalbos dalis, pvz., tipų atpažinimas, tipų konversija, įvedimas/išvedimas, atminties alokavimas ir panašiai, C kalboje tėra tiesiog eilinės funkcijos, kurios šia pačia kalba yra ir parašytos. Tai dėl tos priežasties vienas iš esminių dalykų, dirbant su C kalba, yra išmokti susigaudyti visokiose programinėse bibliotekose.

Tai C programuotojus atrenkant ir priimant į darbą, būna klausiama ne tiek apie tai, kokias jie programavimo kalbas naudoja, kiek apie tai, su kokiomis bibliotekomis jie dirba.

Savaime aišku, svarbiausia C kalbos biblioteka yra libc, ant kurios visas UNIX pastatytas bei visokie programavimo pagrindai bendrai.