Programmēšana

Kāpēc joprojām valda C programmēšanas valoda

Neviena tehnoloģija nepielec 50 gadus, ja vien tā savu darbu veic labāk nekā lielākā daļa jebkas cits - it īpaši datortehnoloģija. C programmēšanas valoda ir dzīva un sākusi darboties kopš 1972. gada, un tā joprojām valda kā viens no mūsu programmatūras definētās pasaules pamatelementiem.

Bet dažreiz kāda tehnoloģija pieturas pie tā, ka cilvēki vienkārši nav izdomājuši to nomainīt. Pēdējo gadu desmitu laikā ir parādījušās desmitiem citu valodu - dažas ir nepārprotami izstrādātas, lai apstrīdētu C dominējošo stāvokli, bet dažas no malas šķeļ C, kas ir viņu popularitātes blakusprodukts.

Nav grūti apgalvot, ka C ir jāaizstāj. Programmēšanas valodas izpēte un programmatūras izstrādes prakse liecina, ka ir daudz labāki veidi, kā darīt lietas, nevis C veids. Bet C turpina visu to pašu, aiz tā ir gadu desmitiem ilga pētniecība un izstrāde. Dažas citas valodas to var pārspēt veiktspējas, kailmetāla savietojamības vai visuresamības dēļ. Tomēr ir vērts redzēt, kā C 2018. gadā konkurē ar lielu vārdu konkurenci.

C pret C ++

Protams, C visbiežāk tiek salīdzināts ar C ++, valodu, kas, kā norāda pats nosaukums, tika izveidota kā C pagarinājums. Atšķirības starp C ++ un C varēja raksturot kā plašas vaipārmērīgs, atkarībā no tā, kam jūs jautājat.

Lai gan tā savā sintaksē un pieejā joprojām ir līdzīga C, C ++ nodrošina daudzas patiešām noderīgas funkcijas, kas C dabiski nav pieejamas: vārdu vietas, veidnes, izņēmumi, automātiska atmiņas pārvaldība utt. Projekti, kuriem nepieciešama augstākā līmeņa veiktspēja, - datu bāzes, mašīnmācīšanās sistēmas, bieži tiek rakstīti C ++, izmantojot šīs funkcijas, lai izspiestu katru veiktspējas kritumu no sistēmas.

Turklāt C ++ turpina paplašināties daudz agresīvāk nekā C. Gaidāmais C ++ 20 tabulā iekļauj vēl vairāk, iekļaujot moduļus, korutīnas, sinhronizācijas bibliotēku un koncepcijas, kas atvieglo veidņu lietošanu. Jaunākā C standarta pārskatīšana neko daudz nedod un koncentrējas uz savietojamības saglabāšanu atpakaļ.

Patiesībā visi C ++ plusi var darboties arī kā mīnusi. Lielie. Jo vairāk izmantojat C ++ funkcijas, jo sarežģītāk jūs ieviešat un jo grūtāk ir pieradināt rezultātus. Izstrādātāji, kas aprobežojas ar C ++ apakškopu, var izvairīties no daudziem tās vissliktākajiem trūkumiem un pārmērībām. Bet daži veikali vēlas pasargāt no C ++ sarežģītības. Pieturēšanās pie C liek izstrādātājiem aprobežoties ar šo apakškopu. Piemēram, Linux kodola izstrādes komanda izvairās no C ++.

C izvēle pa C ++ ir veids, kā jūs un visi izstrādātāji, kuri uztur kodu pēc jums, lai izvairītos no nepieciešamības mocīties ar C ++ pārmērībām, aptverot piespiedu minimālismu. Protams, C ++ pamatotu iemeslu dēļ ir bagātīgs augsta līmeņa funkciju kopums. Bet, ja minimālisms ir labāk piemērots pašreizējiem un nākamajiem projektiem - un projektiem komandas—Tad C ir jēdzīgāks.

C pret Java

Pēc gadu desmitiem Java joprojām ir uzņēmuma programmatūras izstrādes galvenā sastāvdaļa - un kopumā tā ir galvenā sastāvdaļa. Daudzi no nozīmīgākajiem uzņēmuma programmatūras projektiem tika uzrakstīti Java valodā, ieskaitot lielāko daļu Apache Software Foundation projektu, un Java joprojām ir dzīvotspējīga valoda jaunu projektu izstrādei ar uzņēmuma līmeņa prasībām.

Java sintakse ļoti daudz aizņemas no C un C ++. Atšķirībā no C, tomēr Java pēc noklusējuma neapkopo vietējo kodu. Tā vietā Java izpildlaika vide JVM, JIT (tieši laikā) apkopo Java kodu, lai palaistu mērķa vidē. Pareizos apstākļos JITted Java kods var tuvoties vai pat pārsniegt C veiktspēju.

Java filozofija “rakstīt vienreiz, palaist jebkur” ļauj arī Java programmām darboties, salīdzinoši maz pielāgojot mērķa arhitektūru. Turpretī, lai arī C ir pārnests uz ļoti daudzām arhitektūrām, jebkurai konkrētai C programmai joprojām var būt nepieciešama pielāgošana, lai tā pareizi darbotos, teiksim, Windows pret Linux.

Šī pārnesamības un spēcīgās veiktspējas kombinācija kopā ar milzīgu programmatūras bibliotēku un ietvaru ekosistēmu padara Java par sākumvalodu un izpildlaiku uzņēmuma lietojumprogrammu veidošanai.

Ja Java nepārsniedz C, ir joma, kurā Java nekad nebija domāta konkurencei: skriešana tuvu metālam vai darbs tieši ar aparatūru. C kods tiek apkopots mašīnkodā, kuru process izpilda tieši. Java tiek apkopots baitkodā, kas ir starpkods, kuru JVM tulks pēc tam pārveido par mašīnkodu. Turklāt, kaut arī Java automātiskā atmiņas pārvaldība lielākajā daļā gadījumu ir svētība, C ir labāk piemērots programmām, kurām optimāli jāizmanto ierobežotie atmiņas resursi.

Tas nozīmē, ka ir dažas jomas, kurās Java ātruma ziņā var tuvoties C. JVM JIT dzinējs optimizē rutīnas izpildes laikā, pamatojoties uz programmas uzvedību, ļaujot veikt daudzas optimizācijas klases, kuras nav iespējams, izmantojot iepriekš apkopotu C. Un, lai gan Java izpildlaiks automatizē atmiņas pārvaldību, dažas jaunākas lietojumprogrammas to apstrādā. Piemēram, Apache Spark daļēji optimizē atmiņas apstrādi, izmantojot pielāgotu atmiņas pārvaldības kodu, kas apiet JVM.

C pret C # un

Gandrīz divas desmitgades pēc to ieviešanas C # un .Net Framework joprojām ir galvenā uzņēmuma programmatūras pasaules daļa. Ir teikts, ka C # un .Net bija Microsoft atbilde uz Java - pārvaldītu kodu kompilatoru sistēmu un universālu izpildlaiku -, un tik daudz C un Java salīdzinājumu atbalsta arī C un C # /. Net.

Tāpat kā Java (un zināmā mērā arī Python), .Net piedāvā pārnesamību dažādās platformās un plašu integrētas programmatūras ekosistēmu. Šīs nav mazas priekšrocības, ņemot vērā, cik liela attīstība uz uzņēmējdarbību notiek .Net pasaulē. Izstrādājot programmu C # vai kādā citā. Net valodā, jūs varat izmantot rīku un bibliotēku visumu, kas rakstīts .Net izpildlaika laikā.

Vēl viena Java līdzīga .NET priekšrocība ir JIT optimizācija. C # un .Net programmas var apkopot pirms laika, kā norādīts C, taču tās galvenokārt ir tieši laikā apkopotas .Net izpildlaika laikā un optimizētas ar izpildlaika informāciju. JIT kompilācija ļauj veikt visdažādākās vietas optimizācijas darbojošai .Net programmai, kuru nevar izpildīt C.

Tāpat kā C, C # un. Net nodrošina dažādus mehānismus, lai tieši piekļūtu atmiņai. Kaudze, kaudze un nepārvaldīta sistēmas atmiņa ir pieejama, izmantojot .NET API un objektus. Un izstrādātāji var izmantot nedrošs režīmā .Net, lai sasniegtu vēl lielāku veiktspēju.

Tomēr nekas no tā nenāk par velti. Pārvaldītie objekti un nedrošs objektus nevar patvaļīgi apmainīt, un marshalings starp tiem rada veiktspējas izmaksas. Tādēļ, lai maksimizētu .Net lietojumprogrammu veiktspēju, minimizējiet kustību starp pārvaldītajiem un nepārvaldītajiem objektiem.

Kad nevarat atļauties samaksāt sodu par pārvaldīto vai nepārvaldīto atmiņu vai ja .Net izpildlaiks ir slikta izvēle mērķa videi (piem., Kodola vieta) vai var nebūt pieejama vispār, tad C ir tas, ko jūs vajadzība. Atšķirībā no C # un. Net, C pēc noklusējuma atbloķē tiešu piekļuvi atmiņai.

C pret Go

Go sintakse ir parādā daudz C - cirtainās iekavas kā norobežotājus, ar semikoliem izbeigtus apgalvojumus utt. Izstrādātāji, kas pārzina C, parasti bez lielām grūtībām var pāriet tieši uz Go, pat ņemot vērā jaunās Go funkcijas, piemēram, vārdu vietas un pakotņu pārvaldību.

Lasāms kods bija viens no galvenajiem Go dizaina mērķiem: Ļaujiet izstrādātājiem viegli sasniegt ātrumu ar jebkuru Go projektu un īsā laikā pārzināt koda bāzi. C koda bāzes var būt grūti grok, jo tās ir tendētas pārvērsties žurku makro ligzdā un #ifdefs raksturīgi gan projektam, gan noteiktai komandai. Go sintakse un tās iebūvētie kodu formatēšanas un projektu vadības rīki ir domāti, lai novērstu šāda veida institucionālās problēmas.

Go piedāvā arī tādas ekstras kā gorutines un kanālus, valodas līmeņa rīkus vienlaicīguma un ziņojumu nodošanas starp komponentiem apstrādei. C prasītu, lai šādas lietas ar roku velmētu vai piegādātu ārēja bibliotēka, taču Go tās nodrošina tieši no kastes, padarot daudz vienkāršāku programmatūras izveidi, kurai tās nepieciešamas.

Kur Go visvairāk atšķiras no C zem pārsega, tas ir atmiņas pārvaldībā. Go objekti tiek automātiski pārvaldīti un pēc noklusējuma tiek savākti atkritumi. Lielākajai daļai programmēšanas darbu tas ir ārkārtīgi ērti. Bet tas arī nozīmē, ka jebkuru programmu, kurai nepieciešama deterministiska atmiņas apstrāde, būs grūtāk rakstīt.

Go ietver arī nedrošs pakete, lai apietu dažus Go veida apstrādes drošumus, piemēram, patvaļīgas lasīšanas un rakstīšanas ar a Rādītājs tips. Bet nedrošs nāk ar brīdinājumu, ka ar to rakstītās programmas “var nebūt pārnēsājamas un nav aizsargātas ar Go 1 saderības vadlīnijām”.

Go ir labi piemērots tādu programmu izveidei kā komandrindas utilītprogrammas un tīkla pakalpojumi, jo tām reti ir nepieciešamas tik sīkas manipulācijas. Bet zema līmeņa ierīču draiverus, kodola un kosmosa operētājsistēmas komponentus un citus uzdevumus, kas prasa precīzu kontroli pār atmiņas izkārtojumu un pārvaldību, vislabāk var izveidot C.

C pret Rūsu

Dažos veidos Rust ir atbilde uz atmiņas pārvaldības problēmām, ko rada C un C ++, kā arī uz daudziem citiem šo valodu trūkumiem. Rust kompilē pēc vietējā mašīnkoda, tāpēc tas tiek uzskatīts par līdzvērtīgu C, ciktāl tas attiecas uz veiktspēju. Atmiņas drošība pēc noklusējuma tomēr ir galvenā Rust pārdošanas vieta.

Rust sintakses un apkopošanas kārtulas palīdz izstrādātājiem izvairīties no parastām atmiņas pārvaldības kļūdām. Ja programmai ir atmiņas pārvaldības problēma, kas šķērso Rust sintaksi, tā vienkārši netiks apkopota. Valodas jaunpienācēji, it īpaši no tādas valodas kā C, kas nodrošina daudz vietas šādām kļūdām, savas Rust izglītības pirmajā posmā pavada mācību, kā nomierināt kompilatoru. Bet Rust atbalstītāji apgalvo, ka šīm īslaicīgajām sāpēm ir ilgtermiņa atmaksa: drošāks kods, kas nezaudē ātrumu.

Rūsa arī uzlabo C ar instrumentiem. Projektu un komponentu vadība ir daļa no rīku ķēdes, kas pēc noklusējuma tiek piegādāta ar Rust, tāpat kā ar Go. Ir noklusējuma ieteicamais veids, kā pārvaldīt paketes, organizēt projektu mapes un rīkoties ar daudzām citām lietām, kas C labākajā gadījumā ir ad hoc, un katrs projekts un komanda tos apstrādā atšķirīgi.

Tomēr tas, kas Rustā tiek minēts kā priekšrocība, C izstrādātājam var nešķist tāds. Rust kompilēšanas laika drošības funkcijas nevar atspējot, tāpēc pat visnopietnākajai Rust programmai ir jāatbilst Rust atmiņas drošības ierobežojumiem. C pēc noklusējuma var būt mazāk droša, taču vajadzības gadījumā tā ir daudz elastīgāka un piedodošāka.

Vēl viens iespējamais trūkums ir Rust valodas lielums. C ir salīdzinoši maz funkciju, pat ja ņem vērā standarta bibliotēku. Rūsas funkciju kopums izplešas un turpina pieaugt. Tāpat kā C ++ gadījumā, lielāks Rust funkciju komplekts nozīmē lielāku jaudu, bet arī sarežģītību. C ir mazāka valoda, taču to ir daudz vieglāk modelēt garīgi, tāpēc varbūt labāk piemērota projektiem, kur Rust būtu pārspīlēts.

C pret Python

Mūsdienās, kad vien tiek runāts par programmatūras izstrādi, šķiet, ka Python vienmēr ienāk sarunā. Galu galā Python ir “otra labākā valoda visam” un neapšaubāmi ir viena no daudzpusīgākajām, un tajā ir pieejami tūkstošiem trešo pušu bibliotēku.

Tas, ko uzsver Python un kur tas visvairāk atšķiras no C, dod priekšroku attīstības ātrumam, nevis izpildes ātrumam. Programmu, kuras sastādīšana citā valodā, piemēram, C, var aizņemt stundu, Python var samontēt dažu minūšu laikā. No otras puses, šīs programmas izpildei C var būt nepieciešamas sekundes, bet Python - minūte. (Labs īkšķis: Python programmas parasti darbojas lēnāk nekā viņu C kolēģi.) Bet daudziem mūsdienu aparatūras darbiem Python ir pietiekami ātrs, un tas ir bijis galvenais tā ieviešanai.

Vēl viena būtiska atšķirība ir atmiņas pārvaldība. Python programmas pilnībā atmiņā pārvalda Python izpildlaiks, tāpēc izstrādātājiem nav jāuztraucas par atmiņas piešķiršanas un atbrīvošanas sīkumiem. Bet šeit atkal izstrādātāja vienkāršība ir saistīta ar izpildlaika veiktspējas cenu. C programmu rakstīšana prasa rūpīgu uzmanību atmiņas pārvaldībai, taču iegūtās programmas bieži vien ir tīra mašīnas ātruma zelta standarts.

Tomēr zem ādas Python un C ir dziļa saikne: atsauces Python izpildlaiks ir rakstīts C. Tas ļauj Python programmām ietīt bibliotēkas, kas rakstītas C un C ++. Nozīmīgiem trešo pušu bibliotēku Python ekosistēmas gabaliem, piemēram, mašīnmācībai, pamatā ir C kods.

Ja izstrādes ātrumam ir lielāka nozīme nekā izpildes ātrumam un ja lielāko daļu programmas izpildāmo daļu var izolēt atsevišķos komponentos (pretstatā izplatīšanai visā kodā), tīrs Python vai Python un C bibliotēku maisījums labāka izvēle nekā tikai C. Pretējā gadījumā C joprojām valda.

$config[zx-auto] not found$config[zx-overlay] not found