Ohjelmointi

Miksi C-ohjelmointikieli hallitsee edelleen

Mikään tekniikka ei tartu 50 vuoden ajan, ellei se tee työtään paremmin kuin useimmat muut - etenkin tietotekniikka. C-ohjelmointikieli on ollut elossa ja potkimassa vuodesta 1972 lähtien, ja se on edelleen yksi ohjelmistomääritellyn maailman tärkeimmistä rakennuspalikoista.

Mutta joskus tekniikka tarttuu ympärille, koska ihmiset eivät vain ole päässeet vaihtamaan sitä. Muutaman viime vuosikymmenen aikana on ilmestynyt kymmeniä muita kieliä - jotkut on nimenomaisesti suunniteltu haastamaan C: n määräävä asema, toiset haittaavat C: tä sivulta suosionsa sivutuotteena.

Ei ole vaikea väittää, että C tarvitsee vaihtaa. Ohjelmointikielentutkimus ja ohjelmistokehityskäytännöt viittaavat siihen, kuinka on paljon parempia tapoja tehdä asioita kuin C: n tapa. Mutta C jatkuu samalla tavalla vuosikymmenien tutkimus- ja kehitystyön takana. Harvat muut kielet voivat voittaa sen suorituskyvyn, paljaiden metallien yhteensopivuuden tai yleisyyden vuoksi. Silti on syytä nähdä, kuinka C pärjää suurten nimien kielikilpailussa vuonna 2018.

C vs. C ++

Luonnollisesti C: tä verrataan yleisimmin C ++: iin, kieleen, joka - kuten nimi itse kertoo - luotiin C: n jatkeena. C ++: n ja C: n välisiä eroja voidaan luonnehtia suuriksi tailiiallinen, riippuen siitä, keneltä kysyt.

Vaikka C ++ on edelleen syntaksiltaan ja lähestymistavaltaan C-tyyppinen, se tarjoaa monia aidosti hyödyllisiä ominaisuuksia, joita ei ole luonnollisesti saatavana C: ssä: nimitilat, mallit, poikkeukset, automaattinen muistinhallinta ja niin edelleen. Huipputason suorituskykyä vaativat projektit - tietokannat, koneoppimisjärjestelmät - kirjoitetaan usein C ++ - kielellä käyttäen näitä ominaisuuksia vääntämään kaikki suorituskyvyn pudotukset järjestelmästä.

Lisäksi C ++ laajenee edelleen paljon aggressiivisemmin kuin C. Tuleva C ++ 20 tuo vielä enemmän taulukkoon sisältäen moduulit, korutiinit, synkronointikirjaston ja käsitteet, jotka helpottavat mallien käyttöä. Viimeisin versio C-standardiin lisää vain vähän ja keskittyy taaksepäin yhteensopivuuden säilyttämiseen.

Asia on, että kaikki C ++: n plussat voivat toimia myös miinuksina. Suuret. Mitä enemmän C ++ -ominaisuuksia käytät, sitä monimutkaisempi otat käyttöön ja sitä vaikeampi on kesyttää tuloksia. Kehittäjät, jotka rajoittuvat C ++: n osajoukkoon, voivat välttää monia sen pahimpia sudenkuoppia ja ylikuormituksia. Jotkut kaupat haluavat kuitenkin suojautua C ++ - monimutkaisuudelta. Tarttuminen C: hen pakottaa kehittäjät rajoittumaan vain tähän osajoukkoon. Esimerkiksi Linux-ytimen kehitystiimi välttää C ++: ta.

C: n valitseminen C ++: n yli on tapa sinulle - ja kaikille kehittäjille, jotka ylläpitävät koodia jälkesi - välttää joutumasta sotkeutumaan C ++: n ylilyönteihin omaksumalla pakotettu minimalismi. Tietysti C ++: lla on hyvä joukko korkean tason ominaisuuksia hyvästä syystä. Mutta jos minimalismi sopii paremmin nykyisiin ja tuleviin projekteihin - ja projektiin joukkueet- sitten C: llä on järkevämpää.

C vs. Java

Vuosikymmenien jälkeen Java on edelleen keskeinen osa yrityksen ohjelmistokehitystä - ja yleensä kehitystyötä. Monet merkittävimmistä yritysohjelmistoprojekteista kirjoitettiin Java-kielellä - mukaan lukien valtaosa Apache Software Foundation -projekteista - ja Java on edelleen käyttökelpoinen kieli uusien projektien kehittämiseen yritystason vaatimuksilla.

Java-syntaksista lainataan paljon C: ltä ja C ++: lta. Toisin kuin C, Java ei kuitenkaan oletusarvoisesti käänny natiivikoodiksi. Sen sijaan Java-ajo-ympäristö, JVM, JIT (just-in-time) kokoaa Java-koodin suoritettavaksi kohdeympäristössä. Oikeissa olosuhteissa JITted Java -koodi voi lähestyä tai jopa ylittää C: n suorituskyvyn.

Javan takana oleva "kirjoita kerran, suorita minne tahansa" -filosofia antaa Java-ohjelmille mahdollisuuden toimia suhteellisen vähän säätämällä kohdearkkitehtuuria. Sitä vastoin, vaikka C on siirretty hyvin moniin arkkitehtuureihin, mikä tahansa C-ohjelma saattaa silti tarvita mukautusta toimiakseen oikein esimerkiksi Windows vs. Linux.

Tämä yhdistelmä siirrettävyyttä ja vahvaa suorituskykyä sekä massiivinen ohjelmistokirjastojen ja -rakenteiden ekosysteemi tekevät Java: sta kielen ja käyttöajan yrityssovellusten rakentamiseen.

Jos Java jää C: n alapuolelle, on alue, jolla Javaa ei koskaan ollut tarkoitus kilpailla: juosta lähellä metallia tai työskennellä suoraan laitteiston kanssa. C-koodi kootaan konekoodiksi, joka suoritetaan prosessilla suoraan. Java käännetään tavukoodiksi, joka on välikoodi, jonka JVM-tulkki muuntaa konekoodiksi. Lisäksi, vaikka Javan automaattinen muistinhallinta on siunaus useimmissa olosuhteissa, C soveltuu paremmin ohjelmille, joiden on hyödynnettävä rajalliset muistiresurssit optimaalisesti.

Siitä huolimatta on joitain alueita, joilla Java voi tulla nopeuden suhteen lähelle C: tä. JVM: n JIT-moottori optimoi rutiinit ajon aikana ohjelmakäyttäytymisen perusteella, mikä sallii monia optimointiluokkia, jotka eivät ole mahdollisia etukäteen kootulla C: llä. Ja vaikka Java-ajonaika automatisoi muistin hallinnan, jotkut uudemmat sovellukset kiertävät sitä. Esimerkiksi Apache Spark optimoi muistin käsittelyn osittain käyttämällä mukautettua muistinhallintakoodia, joka kiertää JVM: ää.

C vs. C # ja

Lähes kaksi vuosikymmentä käyttöönoton jälkeen C # ja .Net Framework ovat edelleen merkittävä osa yritysohjelmistomaailmaa. On sanottu, että C # ja .Net olivat Microsoftin vastaus Java - hallittu koodin kääntäjäjärjestelmä ja yleinen ajonaika - ja niin monet vertailut C: n ja Java: n välillä pitävät yllä myös C: tä ja C # /. Netiä.

Kuten Java (ja jossain määrin Python), .Net tarjoaa siirrettävyyden useilla alustoilla ja laajan integroidun ohjelmiston ekosysteemin. Nämä eivät ole pieniä etuja, kun otetaan huomioon kuinka paljon yrityskeskeistä kehitystä tapahtuu .Net-maailmassa. Kun kehität ohjelman C #: lla tai muulla .Net-kielellä, voit hyödyntää .Net-ajonaikaa varten kirjoitettuja työkaluja ja kirjastoja.

Toinen Java-tyyppinen .NET-etu on JIT-optimointi. C #- ja .Net-ohjelmat voidaan koota etukäteen C: n mukaisesti, mutta ne on pääasiassa juuri ajoissa koottu .Net-ajon aikana ja optimoitu ajonaikaisilla tiedoilla. JIT-kokoelma sallii kaikenlaiset optimoinnit käynnissä olevalle .Net-ohjelmalle, jota ei voida suorittaa C-muodossa.

Kuten C, C # ja .Net tarjoavat erilaisia ​​mekanismeja päästäksesi suoraan muistiin. Kone, pino ja hallitsematon järjestelmämuisti ovat kaikki käytettävissä .Net-sovellusliittymien ja objektien kautta. Ja kehittäjät voivat käyttää vaarallinen tilassa .Net saavuttaa entistä parempi suorituskyky.

Mikään näistä ei kuitenkaan tule ilmaiseksi. Hallinnoidut objektit ja vaarallinen esineitä ei voida vaihtaa mielivaltaisesti, ja niiden välinen järjestäminen maksaa suorituskykyä. Siksi .Net-sovellusten suorituskyvyn maksimointi tarkoittaa, että hallittujen ja hallitsemattomien objektien välinen liike pidetään minimissä.

Kun sinulla ei ole varaa maksaa sakkoa hallitusta tai hallitsemattomasta muistista tai kun .Net-ajonaika on huono valinta kohdeympäristöön (esim. Ytintila) tai se ei ehkä ole käytettävissä ollenkaan, niin C on mitä sinä tarve. Ja toisin kuin C # ja .Net, C avaa oletusarvoisen suoran muistin käytön.

C vs. Go

Go-syntaksissa on paljon velkaa C: lle - kiharat aaltosulku erotimina, puolipisteillä päätetyt lauseet ja niin edelleen. Kehittäjät, jotka hallitsevat C: tä, voivat tyypillisesti hypätä suoraan Go: iin ilman suurempia vaikeuksia, jopa ottamalla huomioon uudet Go-ominaisuudet, kuten nimitilat ja pakettien hallinta.

Luettavissa oleva koodi oli yksi Go: n ohjaavista suunnittelutavoitteista: Kehittäjien on helppo päästä vauhtiin minkä tahansa Go-projektin kanssa ja oppia tuntemaan koodikanta nopeasti. C-koodipohjia voi olla vaikea tarttua, koska ne ovat alttiita muuttumaan rotan makrojen pesäksi ja #ifdefovat ominaisia ​​sekä projektille että tiimille. Go: n syntaksin ja sen sisäänrakennetun koodin muotoilun ja projektinhallintatyökalujen on tarkoitus pitää tällaiset institutionaaliset ongelmat loitolla.

Go sisältää myös lisäominaisuuksia, kuten gorutiineja ja kanavia, kielitason työkaluja samanaikaisuuden ja komponenttien välisen viestin välittämiseen. C vaatii, että tällaiset asiat rullataan käsin tai toimitetaan ulkoisessa kirjastossa, mutta Go tarjoaa ne heti laatikosta, mikä helpottaa niitä tarvitsevien ohjelmistojen rakentamista.

Missä Go eroaa eniten hupun alla olevasta C: stä, on muistinhallinta. Go-objekteja hallitaan ja roskat kerätään oletusarvoisesti. Useimmissa ohjelmointityöissä tämä on erittäin kätevää. Mutta se tarkoittaa myös sitä, että mitä tahansa muistin determinististä käsittelyä vaativaa ohjelmaa on vaikea kirjoittaa.

Go sisältää vaarallinen paketti joidenkin Go-tyyppisten käsittelyturvallisuuksien kiertämiseen, kuten mielivaltaisen muistin lukeminen ja kirjoittaminen a Osoitin tyyppi. Mutta vaarallinen mukana tulee varoitus, että sen kanssa kirjoitetut ohjelmat "eivät ehkä ole kannettavia eivätkä ole Go 1 -yhteensopivuusohjeiden suojaamia".

Go sopii hyvin ohjelmien, kuten komentorivipalvelujen ja verkkopalvelujen, rakentamiseen, koska ne tarvitsevat harvoin tällaisia ​​hienojakoisia manipulointeja. Mutta matalatasoiset laiteohjaimet, ytimistilan käyttöjärjestelmän komponentit ja muut tehtävät, jotka edellyttävät tarkkaa muistin asettelun ja hallinnan hallintaa, luodaan parhaiten C.

C vs. ruoste

Joillakin tavoin Rust on vastaus C: n ja C ++: n luomiin muistinhallinnan ongelmiin ja myös moniin muihin näiden kielten puutteisiin. Ruosti kääntyy alkuperäiseen konekoodiin, joten sitä pidetään suorituskyvyn suhteen C: n tasolla. Muistin turvallisuus on oletuksena Rustin tärkein myyntivaltti.

Rustin syntaksin ja kokoamissääntöjen avulla kehittäjät voivat välttää tavallisia muistinhallinnan virheitä. Jos ohjelmalla on muistinhallintaongelma, joka ylittää Rust-syntaksin, se ei yksinkertaisesti käänny. Kielen uudet tulokkaat, erityisesti C-kielestä, joka tarjoaa runsaasti tilaa tällaisille virheille, viettävät Rust-koulutuksensa ensimmäisen vaiheen oppimalla kääntäjän rauhoittamista. Mutta Rustin kannattajat väittävät, että tällä lyhytaikaisella kivulla on pitkäaikainen hyöty: turvallisempi koodi, joka ei uhraa nopeutta.

Myös ruoste parantaa C: tä työkaluillaan. Projektin ja komponenttien hallinta ovat oletusarvoisesti Rustin mukana toimitettua työkaluketjua, sama kuin Go. On oletussuositeltu tapa hallita paketteja, järjestää projektikansioita ja käsitellä monia muita asioita, jotka C: ssä ovat parhaimmillaan tapauskohtaisia, ja jokainen projekti ja tiimi käsittelevät niitä eri tavalla.

Silti se, mitä mainitaan eduksi Rustissa, ei välttämättä näytä siltä kuin yksi C-kehittäjälle. Rustin kokoamisaikaisia ​​turvaominaisuuksia ei voida poistaa käytöstä, joten kaikkein vähäpätöisimmän Rust-ohjelman on noudatettava Rustin muistiturvarajoituksia. C voi olla oletusarvoisesti vähemmän turvallinen, mutta se on paljon joustavampi ja anteeksiantavampi tarvittaessa.

Toinen mahdollinen haittapuoli on Rust-kielen koko. C: llä on suhteellisen vähän ominaisuuksia, vaikka otettaisiin huomioon vakiokirjasto. Ruosteen ominaisuusjoukko on rönsyilevä ja jatkaa kasvuaan. Kuten C ++, suurempi Rust-ominaisuusjoukko tarkoittaa enemmän tehoa, mutta myös monimutkaisempaa. C on pienempi kieli, mutta sitä on paljon helpompi mallintaa henkisesti, joten se sopii ehkä paremmin projekteihin, joissa Rust olisi ylivoimainen.

C vs. Python

Nykyään aina kun puhutaan ohjelmistokehityksestä, Python näyttää aina saapuvan keskusteluun. Loppujen lopuksi Python on "toiseksi paras kieli kaikelle" ja kiistatta yksi monipuolisimmista, ja käytettävissä on tuhansia kolmannen osapuolen kirjastoja.

Se mitä Python korostaa ja missä se eroaa eniten C: stä, on kehityksen nopeuden suosiminen suorituksen nopeuden sijaan. Ohjelma, jonka kokoaminen toisella kielellä voi kestää tunnin - kuten C -, voidaan koota Pythoniin muutamassa minuutissa. Kääntöpuolella kyseisen ohjelman suorittaminen saattaa kestää sekunteja C: ssä, mutta minuutin ajaa Pythonissa. (Hyvä nyrkkisääntö: Python-ohjelmat toimivat yleensä suuruusluokkaa hitaammin kuin niiden C-vastaavat.) Mutta monille nykyaikaisen laitteiston työpaikoille Python on tarpeeksi nopea, ja se on ollut avain sen käyttöönottoon.

Toinen suuri ero on muistin hallinta. Python-ajoaika hallitsee Python-ohjelmia täysin muistissa, joten kehittäjien ei tarvitse huolehtia muistin varaamisesta ja vapauttamisesta. Mutta tässäkin kehittäjien helppous tulee maksamaan ajonaikaisesta suorituskyvystä. C-ohjelmien kirjoittaminen vaatii tarkkaa huomiota muistin hallintaan, mutta tuloksena olevat ohjelmat ovat usein puhtaan koneen nopeuden kultastandardi.

Ihon alla Pythonilla ja C: llä on kuitenkin syvä yhteys: viittaus Python-ajonaikaan on kirjoitettu C: llä. Tämä antaa Python-ohjelmille mahdollisuuden kietoa kirjastot, jotka on kirjoitettu C- ja C ++ -järjestelmiin. Muiden valmistajien kirjastojen, kuten koneoppimisen, Python-ekosysteemin merkittävissä paloissa on C-koodi ytimessään.

Jos kehityksen nopeudella on enemmän kuin suorituksen nopeus ja jos suurin osa ohjelman esiintyvistä osista voidaan eristää erillisiksi komponenteiksi (toisin kuin levitetään koko koodissa), joko puhdas Python tai yhdistelmä Python- ja C-kirjastoja tekevät parempi valinta kuin pelkästään C. Muuten C hallitsee edelleen.

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