Programavimas

Kodėl C programavimo kalba vis dar valdo

Nei viena technologija nesilaiko 50 metų, nebent ji atlieka savo darbą geriau nei dauguma kitų dalykų, ypač kompiuterinės technologijos. C programavimo kalba gyva ir spyriojasi nuo 1972 m., Ir ji vis dar karaliauja kaip vienas iš pagrindinių programinės įrangos apibrėžto pasaulio elementų.

Tačiau kartais technologija laikosi, nes žmonės tiesiog nesugebėjo jos pakeisti. Per pastaruosius kelis dešimtmečius pasirodė dešimtys kitų kalbų - kai kurios aiškiai skirtos užginčyti C dominavimą, kai kurios iš šono atmetė C kaip šalutinį jų populiarumo produktą.

Nesunku teigti, kad C reikia pakeisti. Programavimo kalbos tyrimai ir programinės įrangos kūrimo praktika užuomina į tai, kaip yra kur kas geresnių būdų atlikti dalykus nei C būdas. Tačiau C išlieka tas pats, o dešimtmečius atliekami tyrimai ir plėtra. Nedaugelis kitų kalbų gali jį įveikti dėl našumo, suderinamumo su plikais metalais ar visur. Vis dėlto verta pamatyti, kaip C kovoja su didelių vardų kalbos konkurencija 2018 m.

C ir C ++

Natūralu, kad C dažniausiai lyginamas su C ++, kalba, kuri, kaip rodo pats pavadinimas, buvo sukurta kaip C. pratęsimas. Skirtumus tarp C ++ ir C galima apibūdinti kaip didelius arbaper didelis, priklausomai nuo to, ko klausiate.

Nors savo sintakse ir požiūriu C ++ vis dar yra panašus į C, jis teikia daugybę tikrai naudingų funkcijų, kurių nėra natūraliai C: vardų sritis, šablonus, išimtis, automatinį atminties valdymą ir pan. Projektai, reikalaujantys aukščiausio lygio našumo - duomenų bazės, mašininio mokymosi sistemos - dažnai rašomi C ++ formatu, naudojant šias funkcijas, kad būtų išvengta kiekvieno efektyvumo lašo iš sistemos.

Be to, C ++ toliau plečiasi kur kas agresyviau nei C. Būsimasis C ++ 20 į lentelę įtraukia dar daugiau modulių, korutinų, sinchronizavimo bibliotekos ir sąvokų, kurios palengvina šablonų naudojimą. Naujausia C standarto peržiūra nedaug pridėta ir sutelkta į atgalinio suderinamumo išlaikymą.

Reikalas tas, kad visi C ++ pliusai taip pat gali veikti kaip minusai. Dideli. Kuo daugiau naudosite „C ++“ funkcijų, tuo sudėtingiau įdiegsite ir sunkiau prisijaukinti rezultatus. Kūrėjai, apsiribojantys tik C ++ pogrupiu, gali išvengti daugelio blogiausių spąstų ir perteklių. Tačiau kai kurios parduotuvės nori apsisaugoti nuo C ++ sudėtingumo. Laikydamiesi C verčia kūrėjus apsiriboti tuo pogrupiu. Pavyzdžiui, „Linux“ branduolio kūrimo komanda vengia C ++.

„C“ pasirinkimas per „C ++“ yra būdas jums ir visiems kūrėjams, kurie prižiūri kodą po jūsų, kad nereikėtų susidurti su „C ++“ pertekliais, taikant priverstinį minimalizmą. Žinoma, „C ++“ dėl gausių priežasčių turi gausų aukšto lygio funkcijų rinkinį. Bet jei minimalizmas geriau tinka dabartiniams ir būsimiems projektams ir projektams komandos—Tada C yra prasmingesnė.

C ir Java

Po dešimtmečių „Java“ išlieka pagrindine įmonės programinės įrangos kūrimo dalimi ir apskritai pagrindine kūrimo dalimi. Daugelis reikšmingiausių įmonės programinės įrangos projektų buvo parašyti „Java“ kalba, įskaitant didžiąją dalį „Apache Software Foundation“ projektų, ir „Java“ išlieka perspektyvi kalba kuriant naujus projektus pagal įmonės lygio reikalavimus.

„Java“ sintaksė daug skolinasi iš C ir C ++. Tačiau, skirtingai nei C, „Java“ pagal numatytuosius nustatymus nekompiliuoja į gimtąjį kodą. Vietoj to, „Java“ vykdymo trukmės aplinka, JVM, JIT („just-in-time“), kaupia „Java“ kodą, kad jis veiktų tikslinėje aplinkoje. Esant tinkamoms aplinkybėms, „JITted Java“ kodas gali pasiekti ar netgi viršyti C našumą.

„Java“, parašiusi vieną kartą, paleisk bet kur, filosofija taip pat leidžia „Java“ programoms veikti gana mažai koreguojant tikslinę architektūrą. Priešingai, nors C buvo perkeltas į labai daug architektūrų, bet kurią C programą vis tiek gali reikėti pritaikyti, kad tinkamai veiktų, tarkime, „Windows“, palyginti su „Linux“.

Šis perkeliamumo ir gero našumo derinys kartu su didžiule programinės įrangos bibliotekų ir sistemų ekosistema paverčia „Java“ kalba ir vykdymo laiku kuriant įmonės programas.

Kur „Java“ nesiekia C, yra sritis, kurioje „Java“ niekada nebuvo skirta konkuruoti: bėgti arti metalo ar dirbti tiesiogiai su aparatūra. C kodas sudaromas į mašininį kodą, kurį vykdo procesas tiesiogiai. „Java“ yra sudaryta į baitų kodą, kuris yra tarpinis kodas, kurį JVM vertėjas konvertuoja į mašininį kodą. Be to, nors automatinis „Java“ atminties valdymas daugeliu atvejų yra palaima, C geriau tinka programoms, kurios turi optimaliai išnaudoti ribotus atminties išteklius.

Be to, yra keletas sričių, kuriose „Java“ gali priartėti prie C greičio atžvilgiu. JVM JIT variklis optimizuoja rutiną vykdymo metu, atsižvelgdamas į programos elgseną, leidžiantį atlikti daugybę optimizavimo klasių, kurių neįmanoma atlikti anksčiau sukompiliuotu C. Ir nors „Java“ vykdymo laikas automatizuoja atminties valdymą, kai kurios naujesnės programos ją išsprendžia. Pavyzdžiui, „Apache Spark“ iš dalies optimizuoja atminties apdorojimą naudodamas pasirinktinį atminties tvarkymo kodą, kuris apeina JVM.

C prieš C # ir

Praėjus beveik dviem dešimtmečiams po jų įdiegimo, C # ir .Net Framework išlieka pagrindine įmonės programinės įrangos pasaulio dalimi. Buvo pasakyta, kad C # ir .Net buvo „Microsoft“ atsakas į „Java“ - valdomą kodų kompiliatorių sistemą ir universalią vykdymo trukmę - ir tiek daug C ir Java palyginimų taip pat palaiko C ir C # /. Net.

Kaip ir „Java“ (ir tam tikru mastu „Python“), „Net“ siūlo perkeliamumą įvairiose platformose ir didžiulę integruotos programinės įrangos ekosistemą. Tai nėra nemenki pranašumai, atsižvelgiant į tai, kiek .net tinkle vyksta į įmonę orientuota plėtra. Kurdami programą C # ar bet kuria kita .Net kalba, galite pasinaudoti įrankių ir bibliotekų visuma, parašyta .Net vykdymo metu.

Kitas „Java“ tipo .NET pranašumas yra JIT optimizavimas. C # ir .Net programas galima sudaryti anksčiau laiko, kaip nurodyta C, tačiau jas daugiausia tik laiku paruošia .Net vykdymo laikas ir optimizuoja vykdymo laiko informacija. JIT kompiliacija leidžia atlikti įvairius vykdomos .Net programos optimizavimus vietoje, kurių negalima atlikti C kalba.

Kaip ir C, C # ir .Net suteikia įvairius mechanizmus, kaip tiesiogiai pasiekti atmintį. Su kaupu, kaupu ir nevaldoma sistemos atmintimi galima naudotis per .Net API ir objektus. Ir kūrėjai gali naudoti nesaugus režimą. Net, kad pasiektumėte dar didesnį našumą.

Niekas iš jų nėra nemokamas. Tvarkomi objektai ir nesaugus objektai negali būti savavališkai keičiami, o tarp jų surenkant reikia mokėti už našumą. Todėl maksimalus .Net programų našumas reiškia, kad judėjimas tarp valdomų ir nevaldomų objektų yra minimalus.

Kai negalite sau leisti sumokėti baudos už valdomą ir nevaldomą atmintį arba kai .Net vykdymo laikas yra netinkamas pasirinkimas tikslinei aplinkai (pvz., Branduolio vietos) arba gali būti visai nepasiekiamas, tada C reikia. Skirtingai nuo C # ir .Net, C pagal nutylėjimą atrakina tiesioginę prieigą prie atminties.

C ir Go

„Go“ sintaksė yra daug skolinga C - garbanotieji breketai, kaip atribikliai, teiginiai, baigiami kabliataškiais, ir pan. Kūrėjai, mokantys C kalbą, paprastai be didelių sunkumų gali pereiti tiesiai į „Go“, net atsižvelgdami į naujas „Go“ funkcijas, pvz., Vardų sritis ir paketų valdymą.

Skaitytinas kodas buvo vienas iš svarbiausių „Go“ dizaino tikslų: palengvinkite kūrėjams galimybę paspartinti bet kurį „Go“ projektą ir per trumpą laiką mokėti naudotis kodų baze. C kodų bazes gali būti sunku sugriebti, nes jos linkusios virsti žiurkių makrokomandomis ir #ifdefTai būdinga ir projektui, ir konkrečiai komandai. „Go“ sintaksė ir jos integruoti kodų formatavimo bei projektų valdymo įrankiai yra skirti išlaikyti tokias institucines problemas.

„Go“ taip pat turi tokių priedų, kaip gorutinės programos ir kanalai, kalbos lygio įrankiai, skirti tvarkyti sutapimą ir pranešimų perdavimą tarp komponentų. „C“ reikalautų, kad tokius dalykus rankiniu būdu suktų ar tiektų išorinė biblioteka, tačiau „Go“ juos pateikia iškart iš dėžutės, todėl kur kas paprasčiau sukurti jiems reikalingą programinę įrangą.

Kur „Go“ labiausiai skiriasi nuo C po gaubtu, yra atminties valdymas. Pagal numatytuosius nustatymus „Go“ objektai yra automatiškai tvarkomi ir surenkami šiukšlės. Daugeliui programavimo darbų tai yra nepaprastai patogu. Bet tai taip pat reiškia, kad bet kurią programą, kuriai reikalingas deterministinis atminties valdymas, bus sunkiau parašyti.

„Go“ apima nesaugus paketas, skirtas apeiti kai kurias „Go“ tipo tvarkymo saugos priemones, pvz., savavališkos atminties skaitymas ir rašymas naudojant a Rodyklė tipo. Bet nesaugus pateikiamas įspėjimas, kad su juo parašytos programos „gali būti neperkeliamos ir jų neapsaugo„ Go 1 “suderinamumo gairės“.

„Go“ puikiai tinka kurti tokias programas kaip komandinės eilutės komunalinės paslaugos ir tinklo paslaugos, nes joms retai reikia tokių smulkių manipuliacijų. Tačiau žemiausio lygio įrenginių tvarkykles, branduolio-erdvės operacinės sistemos komponentus ir kitas užduotis, reikalaujančias griežto atminties išdėstymo ir valdymo valdymo, galima sukurti C kalba.

C prieš rūdis

Tam tikru požiūriu „Rust“ yra atsakas į atminties valdymo nemalonumus, kuriuos sukūrė C ir C ++, ir į daugelį kitų šių kalbų trūkumų. „Rust“ kompiliuojamas pagal vietinį kompiuterio kodą, todėl jis laikomas lygiaverčiu C laipsnių atžvilgiu. Tačiau pagal nutylėjimą atminties saugumas yra pagrindinis „Rust“ pardavimo taškas.

„Rust“ sintaksė ir kompiliavimo taisyklės padeda kūrėjams išvengti įprastų atminties tvarkymo klaidų. Jei programai iškyla atminties valdymo problema, kuri kerta Rust sintaksę, ji paprasčiausiai nekompiliuos. Naujokai kalboje, ypač iš tokios kalbos kaip C, kuri suteikia daug vietos tokioms klaidoms, praleidžia pirmąjį „Rust“ švietimo etapą mokydamiesi, kaip nuraminti kompiliatorių. Tačiau „Rust“ šalininkai teigia, kad šis trumpalaikis skausmas turi ilgalaikį atsipirkimą: saugesnis kodas, kuris neaukoja greičio.

Rūdys taip pat pagerina C su savo įrankiais. Projektas ir komponentų valdymas yra įrankių grandinės, pagal numatytuosius nustatymus tiekiamos „Rust“, dalis kaip ir „Go“, dalis. Yra numatytasis rekomenduojamas paketų tvarkymo, projekto aplankų tvarkymo ir daugybės kitų dalykų, kurie C atveju yra ad hoc, tvarkymas daugeliu atveju, kiekvienam projektui ir komandai juos tvarkant skirtingai.

Vis dėlto tai, kas „Rust“ įvardijama kaip pranašumas, C kūrėjui gali neatrodyti viena. Negalima išjungti „Rust“ kompiliavimo laiko saugos funkcijų, todėl net ir nereikšmingiausia „Rust“ programa turi atitikti „Rust“ atminties saugumo griežtumą. Pagal numatytuosius nustatymus C gali būti mažiau saugus, tačiau prireikus jis yra daug lankstesnis ir atlaidesnis.

Kitas galimas trūkumas yra „Rust“ kalbos dydis. C turi palyginti nedaug funkcijų, net atsižvelgiant į standartinę biblioteką. „Rust“ funkcijų rinkinys plečiasi ir auga. Kaip ir C ++, didesnis „Rust“ funkcijų rinkinys reiškia daugiau galios, bet ir sudėtingesnį. C yra mažesnė kalba, tačiau ją daug lengviau modeliuoti mintimis, todėl galbūt geriau tinka projektams, kuriuose „Rust“ būtų per daug.

C ir „Python“

Šiais laikais, kai kalbama apie programinės įrangos kūrimą, atrodo, kad „Python“ visada įeina į pokalbį. Galų gale, „Python“ yra „antra geriausia kalba viskam“ ir neabejotinai viena iš universaliausių, turima tūkstančiai trečiųjų šalių bibliotekų.

Tai, ką pabrėžia „Python“ ir kur jis labiausiai skiriasi nuo „C“, teikia pirmenybę kūrimo, o ne vykdymo greičiui. Programa, kurią sudaryti kita kalba, pavyzdžiui, C, gali užtrukti valandą, gali būti surenkama „Python“ per kelias minutes. Kita vertus, ta programa gali užtrukti kelias sekundes, kol ji bus vykdoma C, bet minutę - Python. (Gera nykščio taisyklė: „Python“ programos paprastai veikia lėčiau nei jų „C“ kolegos.) Tačiau daugelyje šiuolaikinės aparatūros darbų „Python“ yra pakankamai greitas, ir tai buvo raktas į jo įsisavinimą.

Kitas svarbus skirtumas yra atminties valdymas. „Python“ programas visiškai valdo atmintis „Python“ vykdymo metu, todėl kūrėjams nereikia jaudintis dėl atminties paskirstymo ir atlaisvinimo. Bet vėlgi, kūrėjų paprastumas kainuoja vykdymo metu. Rašant C programas reikia kruopštaus dėmesio atminties valdymui, tačiau gautos programos dažnai yra auksinis gryno mašinos greičio standartas.

Tačiau po oda „Python“ ir „C“ palaiko gilų ryšį: nuoroda „Python“ vykdymo laikas parašyta C. Tai leidžia „Python“ programoms suvynioti bibliotekas, parašytas C ir C ++. Reikšmingi trečiųjų šalių bibliotekų „Python“ ekosistemos gabalai, pvz., Skirti mašininiam mokymuisi, turi C kodą.

Jei kūrimo greitis turi daugiau reikšmės nei vykdymo greitis ir jei didžiąją dalį vykdomų programos dalių galima išskirti į atskirus komponentus (priešingai nei skleisti visame kode), grynas „Python“ arba „Python“ ir „C“ bibliotekų derinys geresnis pasirinkimas nei vien C. Priešingu atveju C vis dar valdo.