Programovanie

Prečo stále vládne programovací jazyk C.

Žiadna technológia nezostane stáť 50 rokov, pokiaľ nebude robiť svoju prácu lepšie ako väčšina ostatných - najmä počítačová technológia. Programovací jazyk C je živý a živý od roku 1972 a stále vládne ako jeden zo základných stavebných kameňov nášho softvérovo definovaného sveta.

Niekedy sa však technológia drží, pretože ľudia sa k jej výmene jednoducho nedostali. Za posledných pár desaťročí sa objavilo niekoľko ďalších jazykov - niektoré boli výslovne navrhnuté tak, aby spochybnili dominanciu C, iné sa štiepili na C zboku ako vedľajší produkt ich popularity.

Nie je ťažké tvrdiť, že je potrebné C vymeniť. Postupy výskumu programovacieho jazyka a postupy vývoja softvéru naznačujú, že existujú oveľa lepšie spôsoby, ako robiť veci, ako je to v prípade jazyka C. Ale C pretrváva stále rovnako, sú za tým desaťročia výskumu a vývoja. Len máloktorý iný jazyk ho dokáže poraziť kvôli výkonu, kompatibilite s kovovými kovmi alebo všadeprítomnosti. Stále stojí za to vidieť, ako sa C v roku 2018 postaví proti jazykovej súťaži veľkých mien.

C vs. C ++

Prirodzene, C sa porovnáva najčastejšie s C ++, jazykom, ktorý - ako sám názov napovedá - bol vytvorený ako rozšírenie C. Rozdiely medzi C ++ a C by sa dali charakterizovať ako rozsiahle, príp.nadmerný, podľa toho, koho sa pýtate.

Aj napriek tomu, že C ++ je vo svojej syntaxi a prístupe podobný C, poskytuje mnoho skutočne užitočných funkcií, ktoré v C natívne nie sú k dispozícii: menné priestory, šablóny, výnimky, automatická správa pamäte atď. Projekty vyžadujúce špičkový výkon - databázy, systémy strojového učenia - sú často písané v C ++ pomocou týchto funkcií, aby vytlačili zo systému každý pokles výkonu.

C ++ sa ďalej rozširuje oveľa agresívnejšie ako C. Pripravovaný program C ++ 20 prináša do tabuľky ešte viac, vrátane modulov, korutín, synchronizačnej knižnice a konceptov, ktoré uľahčujú používanie šablón. Posledná revízia štandardu C pridáva len málo a zameriava sa na zachovanie spätnej kompatibility.

Je zrejmé, že všetky plusy v C ++ môžu fungovať aj ako mínusy. Veľkí. Čím viac funkcií jazyka C ++ použijete, tým zložitejšiu predstavíte a bude zložitejšie skrotiť výsledky. Vývojári, ktorí sa obmedzia na podmnožinu C ++, sa môžu vyhnúť mnohým najhorším nástrahám a excesom. Niektoré obchody sa však chcú chrániť pred zložitosťou C ++. Držanie sa C núti vývojárov obmedziť sa na túto podmnožinu. Napríklad tím pre vývoj jadra Linuxu sa vyhýba C ++.

Výber jazyka C nad C ++ je spôsob, ako sa môžete - a všetci vývojári, ktorí po vás udržiavajú kód - vyhnúť tomu, aby ste sa nemuseli miešať s excesmi v C ++, a to prijatím vynúteného minimalizmu. C ++ má samozrejme z dobrého dôvodu bohatú sadu funkcií na vysokej úrovni. Ale ak je minimalizmus vhodnejší pre súčasné a budúce projekty - a projekt tímy- potom má C väčší zmysel.

C vs. Java

Po desaťročiach zostáva Java základom vývoja podnikového softvéru - a základom vývoja všeobecne. Mnoho z najvýznamnejších projektov podnikového softvéru bolo napísaných v prostredí Java - vrátane veľkej väčšiny projektov Apache Software Foundation - a Java zostáva životaschopným jazykom pre vývoj nových projektov s požiadavkami na podnikovej úrovni.

Syntax jazyka Java si veľa požičiava od jazykov C a C ++. Na rozdiel od C sa však Java v predvolenom nastavení nekompilováva s natívnym kódom. Namiesto toho runtime prostredie Java, JVM, JIT (just-in-time) kompiluje kód Java tak, aby sa spustil v cieľovom prostredí. Za správnych okolností môže JITted Java kód priblížiť alebo dokonca prekročiť výkon C.

Filozofia „napísať raz, spustiť kdekoľvek“ stojaca za programom Java tiež umožňuje, aby programy Java bežali s relatívne malým vylepšením cieľovej architektúry. Naopak, aj keď je C portovaný na veľké množstvo architektúr, akýkoľvek daný program C môže stále potrebovať prispôsobenie, aby mohol správne fungovať, povedzme, Windows oproti Linuxu.

Táto kombinácia prenosnosti a vysokého výkonu spolu s rozsiahlym ekosystémom softvérových knižníc a rámcov robia z Javy jazyk go-to a runtime pre vytváranie podnikových aplikácií.

Tam, kde Java nedosahuje C, je oblasť, v ktorej Java nikdy nemala konkurovať: beh blízko kovu alebo priama práca s hardvérom. C kód je kompilovaný do strojového kódu, ktorý je vykonávaný priamo procesom. Java sa kompiluje do bytecode, čo je medzikód, ktorý interpret JVM potom prevádza na strojový kód. Aj keď je automatická správa pamäte Java vo väčšine prípadov požehnaním, program C je vhodnejší pre programy, ktoré musia optimálne využívať obmedzené zdroje pamäte.

To znamená, že existujú oblasti, kde sa Java môže priblížiť rýchlosťou C k C. Engine JVM JIT optimalizuje rutiny za behu na základe správania programu, čo umožňuje mnoho tried optimalizácie, ktoré nie sú možné s vopred kompilovaným C. A zatiaľ čo runtime Java automatizuje správu pamäte, niektoré novšie aplikácie to obchádzajú. Napríklad Apache Spark optimalizuje spracovanie v pamäti čiastočne pomocou vlastného kódu správy pamäte, ktorý obchádza JVM.

C vs. C # a .Net

Takmer dve desaťročia po zavedení zostávajú C # a .Net Framework hlavnou súčasťou sveta podnikového softvéru. Hovorilo sa, že C # a .Net boli odpoveďou spoločnosti Microsoft na Javu - systém kompilátora spravovaného kódu a univerzálny runtime - a toľko porovnaní medzi C a Javou platí aj pre C a C # /. Net.

Rovnako ako Java (a do istej miery aj Python), .Net ponúka prenosnosť na rôznych platformách a rozsiahly ekosystém integrovaného softvéru. To nie sú malé výhody vzhľadom na to, koľko podnikovo orientovaného vývoja sa deje vo svete .Net. Keď vyvíjate program v C # alebo v inom jazyku .Net, môžete čerpať z vesmíru nástrojov a knižníc napísaných pre behové prostredie .Net.

Ďalšou výhodou .NET typu Java je optimalizácia JIT. Programy C # a .Net je možné kompilovať vopred podľa C, ale sú to hlavne kompilácie typu just-in-time za behu .Net a optimalizované s informáciami za behu. Kompilácia JIT umožňuje najrôznejšie miestne optimalizácie pre spustený program .Net, ktorý nie je možné vykonať v jazyku C.

Rovnako ako C, C # a .Net poskytujú rôzne mechanizmy na priamy prístup k pamäti. Halda, zásobník a nespravovaná systémová pamäť sú všetky prístupné cez .Net API a objekty. A vývojári môžu používať nebezpečné režim v .Net, aby ste dosiahli ešte vyšší výkon.

Nič z toho však nepríde zadarmo. Spravované objekty a nebezpečné objekty nie je možné ľubovoľne vymieňať a zoradenie medzi nimi stojí náklady na výkon. Preto maximalizácia výkonu aplikácií .Net znamená obmedziť pohyb medzi spravovanými a nespravovanými objektmi na minimum.

Ak si nemôžete dovoliť zaplatiť pokutu za spravovanú a nespravovanú pamäť, alebo ak je runtime .Net zlou voľbou pre cieľové prostredie (napr. Priestor jadra) alebo nemusí byť k dispozícii vôbec, potom C je to, čo potreba. A na rozdiel od C # a .Net, C predvolene odblokuje priamy prístup do pamäte.

C vs. Go

Go syntax dlhuje veľa C - zložené zátvorky ako oddeľovače, výroky zakončené bodkočiarkami atď. Vývojári ovládajúci jazyk C môžu zvyčajne bez väčších problémov skočiť priamo do systému Go, a to aj pri zohľadnení nových funkcií Go, ako sú menné priestory a správa balíkov.

Jedným z hlavných cieľov dizajnu spoločnosti Go bol čitateľný kód: Umožnite vývojárom ľahké sa dostať do tempa s akýmkoľvek projektom Go a v krátkom čase zdokonaliť základňu kódov. C codebases môže byť ťažké pochopiť, pretože sú náchylné k premene na krysie hniezdo makier a #ifdefsú špecifické pre projekt aj pre daný tím. Syntax spoločnosti Go a jej vstavané nástroje na formátovanie kódu a riadenie projektu sú určené na udržanie týchto inštitucionálnych problémov na uzde.

Go tiež obsahuje doplnky, ako sú goroutiny a kanály, nástroje na úrovni jazyka na spracovanie súbežnosti a prenos správ medzi komponentmi. C by vyžadoval, aby sa také veci ručne rolovali alebo dodávali v externej knižnici, ale Go ich poskytuje hneď po vybalení, takže je oveľa jednoduchšie vytvárať softvér, ktorý ich potrebuje.

To, kde sa Go najviac líši od C pod kapotou, je správa pamäte. Objekty Go sú predvolene automaticky spravované a zhromažďované odpadky. Pre väčšinu programovacích úloh je to nesmierne výhodné. Znamená to však tiež, že akýkoľvek program, ktorý vyžaduje deterministické narábanie s pamäťou, bude ťažšie napísať.

Go obsahuje nebezpečné balík na obchádzanie niektorých bezpečnostných záruk typu Go, ako je čítanie a zápis ľubovoľnej pamäte pomocou a Ukazovateľ typu. ale nebezpečné prichádza s varovaním, že programy, ktoré sú s ním napísané, „môžu byť neprenosné a nie sú chránené pokynmi pre kompatibilitu Go 1“.

Go je vhodný na vytváranie programov, ako sú pomocné programy príkazového riadku a sieťové služby, pretože tieto jemné manipulácie potrebujú len zriedka. Ale ovládače zariadení na nízkej úrovni, komponenty operačného systému v priestore jadra a ďalšie úlohy, ktoré si vyžadujú náročnú kontrolu nad rozložením a správou pamäte, sú najlepšie vytvorené v C.

C vs. Rust

V niektorých ohľadoch je Rust odpoveďou na rébusy na správu pamäte vytvorené v C a C ++ a na mnoho ďalších nedostatkov týchto jazykov. Rust sa kompiluje s natívnym strojovým kódom, takže sa to porovnáva s C, pokiaľ ide o výkon. Bezpečnosť pamäte je predvolene hlavným Rustovým predajným miestom.

Rustove pravidlá syntaxe a kompilácie pomáhajú vývojárom vyhnúť sa bežným omylom pri správe pamäte. Ak má program problém so správou pamäte, ktorý prekračuje syntax Rust, jednoducho sa nezkompiluje. Nováčikovia v jazyku, najmä v jazyku ako C, ktorý poskytuje dostatok priestoru pre tieto chyby, trávia prvú fázu svojho vzdelávania Rust učením sa, ako upokojiť kompilátor. Navrhovatelia Rust však tvrdia, že táto bolesť v krátkodobom horizonte má dlhodobú výplatu: bezpečnejší kód, ktorý neobetuje rýchlosť.

Rust tiež vylepšuje C pomocou svojich nástrojov. Správa projektov a komponentov je súčasťou reťazca nástrojov dodávaného s programom Rust v predvolenom nastavení, rovnako ako v prípade systému Go. Existuje predvolený odporúčaný spôsob správy balíkov, organizácie priečinkov projektu a riešenia mnohých ďalších vecí, ktoré sú v jazyku C v najlepšom prípade ad-hoc, pričom každý projekt a tím s nimi zaobchádzajú odlišne.

Čo sa však hovorí o výhode v Ruste, vývojárovi C to nemusí pripadať ako jedno. Bezpečnostné funkcie Rustu v čase kompilácie nemožno deaktivovať, takže aj ten najtriviálnejší program Rust musí vyhovovať bezpečnostným obmedzeniam Rustovej pamäte. C môže byť predvolene menej bezpečný, ale je oveľa flexibilnejší a v prípade potreby zhovievavý.

Ďalším možným nedostatkom je veľkosť jazyka Rust. C má relatívne málo funkcií, aj keď vezmeme do úvahy štandardnú knižnicu. Sada funkcií Rust je rozľahlá a neustále rastie. Rovnako ako v prípade jazyka C ++, väčšia sada funkcií Rust znamená viac výkonu, ale aj väčšiu zložitosť. Jazyk C je menší jazyk, ale je oveľa jednoduchšie ho psychicky modelovať, takže sa lepšie hodí pre projekty, kde by bol Rust nadmerný.

C vs. Python

V dnešnej dobe, kedykoľvek sa hovorí o vývoji softvéru, sa zdá, že do konverzácie vstupuje vždy Python. Nakoniec, Python je „druhý najlepší jazyk pre všetko“ a je nepochybne jedným z najvšestrannejších, s tisíckami knižníc tretích strán.

To, čo Python zdôrazňuje a kde sa najviac líši od C, je uprednostňovanie rýchlosti vývoja pred rýchlosťou prevedenia. Program, ktorého zostavenie v inom jazyku - napríklad C -, môže trvať hodinu, sa dá v Pythone zostaviť za pár minút. Na druhej strane, spustenie tohto programu v jazyku C môže trvať sekundy, ale spustenie v Pythone minútu. (Dobré pravidlo: Programy Python spravidla pracujú o rádovo pomalšie ako ich náprotivky C.) Ale pre mnoho úloh na modernom hardvéri je Python dostatočne rýchly a to bolo kľúčom k jeho prijatiu.

Ďalším veľkým rozdielom je správa pamäte. Programy v jazyku Python sú plne spravované pamäťou za behu programu Python, takže vývojári sa nemusia obávať zbytočných problémov pri prideľovaní a uvoľňovaní pamäte. Ľahkosť pre vývojárov tu ale opäť stojí za cenu výkonu za behu. Písanie programov C si vyžaduje dôkladnú pozornosť pri správe pamäte, ale výsledné programy sú často zlatým štandardom pre čistú rýchlosť stroja.

Pod kožou však zdieľajú Python a C hlboké spojenie: referenčný runtime Pythonu je napísaný v jazyku C. To umožňuje programom Python zabaliť knižnice napísané v jazykoch C a C ++. Významné časti pythonového ekosystému knižníc tretích strán, napríklad pre strojové učenie, majú jadro kódu C.

Ak na rýchlosti vývoja záleží viac ako na rýchlosti vykonania a ak je možné väčšinu výkonných častí programu izolovať do samostatných komponentov (na rozdiel od rozšírenia v celom kóde), urobte buď čistý Python, alebo kombináciu knižníc Python a C lepšia voľba ako samotná C. Inak stále vládne C.

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