it-swarm-eu.dev

Proč nevychází rychlejší „lepší“ jazyk než C?

Jak jsou dnes všechny nové „moderní“ jazyky, jak je to, že C je stále ohlašována jako nejrychlejší a „nejblíže ke stroji“? Opravdu nevěřím, že by existoval jen jeden správný způsob, jak dělat věci, a C je už opravdu dlouho (od 60. let!). Opravdu jsme nepřišli s něčím lepším než s něčím, co bylo napsáno před téměř 50 lety?

Jsem si vědom toho, že moderní jazyky jsou na vyšší úrovni a starají se o určité úkoly, jako je sběr odpadu a přidělování paměti a využívají knihovny a podobně. Jen se ptám, proč nikdy neexistovala skutečná druhá možnost C.

Může to být tak, že C je tak dokonalý, že žádný jiný způsob práce s počítačem nemůže být možný (stranou od vývojářů)?

EDITOVAT Podívej, nesnažím se klepat na C nebo na tvůj oblíbený jazyk. Zajímalo by mě, proč se C stal standardem a proč se jiné alternativy nikdy nevyskytly a C byl prostě „přijat“.

149
Jason

C je velmi jednoduchý jazyk, a proto je díky své dlouhověkosti rychlý a optimalizovaný. Je také mimořádně široce podporován, pokud jde o zabudovaná prostředí, mikroprocesory atd.

Je těžké porazit opravdu jednoduchý a rychlý jazyk. Jedinou věcí, kterou lze v takovém jazyce vylepšit, je použitelnost: zkrátit čas potřebný k vytvoření podobného generického kódu a usnadnit modelování pomocí abstrakcí.

Tady přichází C++. C++ může být stejně rychlé jako C. Věc je, že C++ je mnohem složitější jazyk, což znamená, že rozhodně zvyšuje produktivitu; pokud lidé vědí, jak ji používat. C++ a C jsou ne téměř stejný jazyk.

Nyní byl D dalším krokem nahoru. Stejná schopnost pro rychlý kód, volitelný sběr odpadků atd., Ale nikdy se nezachytil. Doufejme, že se to změní, protože klesá to, co trápí C++: zpětná kompatibilita s C.

Takže odpovědět na vaši otázku, "lepší", je těžké posoudit. Pokud jde o jednoduchost a rychlost, C je pravděpodobně blízko tomu nejlepšímu, co jsme mohli udělat. Pokud jde o produktivitu versus jednoduchost, C++ je pravděpodobně nejlepší, co bychom mohli udělat, i když se tento názor liší mnohem více. A konečně, z hlediska zdokonaleného a vyčištěného jazyka, s rychlostí a jednoduchostí C, D vyhrává tento kontext.

164
GManNickG

Jsou rychlejší než jazyky C.

Existují rychlejší jazyky než C. Například Fortran, jak již bylo uvedeno, se vede velmi dobře, protože má mnohem omezenější pravidla pro aliasy.

Na frontě jsou také experimentální jazyky jako Assembly, které útočí na C, kde je používán jako jazyk na vysoké úrovni, například při vytváření kompilátoru. Slyšeli jste někdy o C - nebo Janusovi? Ale tito dva byli zabiti projektem LLVM.

Vsadil bych se, že APL nebo jiné matematické jazyky vyhodí C z vody v těchto speciálních aplikačních doménách, protože mají podporu pro jednotky pro zpracování vektorů. To je něco, co není možné pro C (a kluci: NE! Speciální optimalizované knihovny s vazbou C nemají nic společného s C jako jazykem).

Také výrobci procesorů odstranili veškerý materiál, který pomáhá spisovatelům kompilátoru v jiných jazycích - pamatujte na tagované aritmetické kódy assembleru pro provádění implementace LISP na SPARC rychle?.

A pokud přecházíte od mikro benchmarků k vývoji aplikací, pak existují rychlejší jazyky pro vývoj aplikací. Můj osobní příklad je zde vždy SmartEiffel. Zaměřuje se na C, ale používá globální optimalizaci systému, která zrychluje vývoj C v reálném světě než C.

V této doméně mohou i celé špatné nebo nízké úrovně abstrakce zabít celý jazykový výkon. Protože C nenabízí vysoké abstrakce, většina lidí tvrdí, že se jedná o problém s programováním, ale není. Podívejte se například na nedostatek generik. V C skončíte pomalými implementacemi, jako je funkce knihovny „qsort“, kterou lze rychleji zapsat pomocí generik (kde je eliminována funkce vyvolávající klíčové porovnání).

Prostě porovnejte volání qsort na megabajtovém poli ints s dobrou ručně psanou implementací, která používá přístup k poli a integrovaný operátor <.

64
Lothar

Dobrá otázka. Myslím, že jazyky uspěly tím, že našli mezeru. Je důležité si uvědomit, že existuje spousta novějších jazyků, které jsou ve svých výklencích lepší než C.

  • C byl kdysi široce používán jako aplikační jazyk a v této doméně neustále ztrácel půdu pro C++, Java a v poslední době všechny druhy dalších jazyků (zejména dynamické jazyky).

  • C býval jazykem pro psaní kódu serveru. Web vtlačil do tohoto prostoru úžasnou škálu jazyků - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - a případy, kdy C dává nějaký smysl pro serverový kód, jsou mezi nimi jen velmi málo.

  • C byl použit pro vědecké výpočty, ale čelí konkurenci jazyků specifických pro danou doménu, jako je Matlab a Mathematica, stejně jako knihoven jako SciPy . Mnoho lidí, kteří píšou kód v tomto výklenku, nejsou obchodníky kodérem a C pro ně není moc vhodný.

Ale výklenek C je systémový kód. Jádra operačního systému. Řidiči. Běhové knihovny. V tomto prostoru je natolik ustálené, že i C++ ho posunuje poměrně pomalu.

C vyhrál v 70. letech kvůli UNIXu, protože konkurenční jazyky byly buď příliš restriktivní nebo příliš pomalé, a protože C kód byl považován za přiměřeně přenosný (lži i tehdy). Ale jeho největší výhody dnes nesouvisejí a pramení zejména z desetiletí dominování jeho výklenku. Existují dobré nástroje pro C: optimalizace kompilátorů, debuggery jádra, efektivní statická analýza k nalezení chyb v kódu ovladače atd. Téměř každá hlavní platforma definuje C ABI a často je to lingua franca pro knihovny. Existuje řada programátorů, kteří vědí, jak kódovat C - a kteří vědí, jaké jsou jeho problémy a úskalí.

Dlouhodobě tato nika nezmizí; a C má nějaké problémy. Každému nováčkovi by však bylo stále velmi obtížné konkurovat.

35
Jason Orendorff

Parafrázuje velmi dobrý komentář: Není mnoho různých způsobů, jak udělat jazyk rychlým a „blízko ke stroji“ - C to udělal dobře, a je téměř nemožné, aby se to zlepšilo.

Původní odpověď:

Rychle vykonávat nebo rychle psát věci do?

Jazyky nejsou rychlé nebo pomalé k provedení, konkrétní implementace jsou. Jazyk lze považovat za rychlejší než ostatní, pokud to nějakým způsobem usnadní získání rychlé implementace. Vždy to znamená „v blízkosti stroje“. Ale s tím, jak se stroje exponenciálně zrychlují, se to postupem času stalo méně zajímavým. Místo toho, snadnost a rychlost vývoje a přenositelnost stala se hodně důležitější, tak “lepší” stal se znamenat “pryč od stroje”. Skoro veškerá snaha v oblasti jazykového designu šla tímto směrem za posledních 5 desetiletí.

Takže jste: blíže ke stroji a existují rychlejší jazyky než C; jsou ti, kteří přišli před C: Assembler, Fortran. Pravděpodobně některé zapomenuté.

25

Fortran je rychlejší než C pro numerické úlohy kvůli způsobu, jakým zpracovává odkazy na paměti (ukazatele C se obtížněji optimalizují). Numerické knihovny o těžké váze na základech věcí jako Matlab a Numpy jsou stále psány ve Fortranu.

Na druhou stranu, C++ může být stejně rychlý jako C, ale má mnohem pokročilejší programovací funkce. Je to mnohem novější jazyk, od poloviny 80. let.

21
zaharpopov

Co to sakra, budu zvonit s mým 0,02 dolarů.

V mnoha případech existuje skutečný nebo vnímaný rozdíl mezi jazyky „systémů“ a jazyky vyšší úrovně. Budu ignorovat většinu „vyšších úrovní“ jazyků, protože nikdo (alespoň ne mnoho) nebude argumentovat, že pro mnoho úkolů jsou jazyky jako Python, Ruby atd. Jednodušší pro práci.

C byl navržen jako systémový jazyk, což znamená, že byl navržen jako jazyk, ve kterém byl napsán operační systém Unix. Jako takový byl navržen tak, aby byl jednoduchý, výkonný a rychlý. Jednoduchý jazyk získává sílu prostředky, které nesystémoví programátoři často považují za nebezpečné: ukazatele, manuální správu paměti atd. Jak již bylo zmíněno, C je poměrně jednoduchý. K&R je zdaleka nejmenší kniha na mé programovací polici (nepočítá se O'Reilly Pocket References) a je to jen okrajově „větší“ než moje Ruby Pocket Reference. C je docela silný. Pokud potřebujete mluvit s hardwarem, ručně kontrolovat a otáčet se pamětí atd. C má schopnost.

Z pohledu programátora však C není tak jednoduché. Rychlost a výkon přicházejí za cenu manuální správy paměti a ne moc OOP zabudovaná do jazyka. C++ (ne můj oblíbený jazyk) je z pohledu programátora mnohem jednodušší, ale mnohem méně jednoduchá z pohledu kompilátoru. Objective-C (možná můj oblíbený jazyk) má stejný kompromis, s mírným sklonem ve směru udržování jazyka jednoduchého (např. sběr odpadu je nováček pro Objective-C, například). jak mnozí z nás vědí, že to bylo napsáno v C, je obtížné pro novější, komplikovanější, ale „jednodušší“ jazyky získat rozšířené přijetí.

V některých případech, zejména když je současný „standard“ stejně dobrý jako C, prostě není příliš motivován k něčemu „lepšímu“ (C++, Objective-C, D atd.) K získání trakce, když tam je je dokonce dost motivující k vytvoření něčeho „lepšího“.

16
alesplin