it-swarm-eu.dev

Nevím C. A proč bych se to měl naučit?

Můj první programovací jazyk byl PHP ( gasp ). Poté jsem začal pracovat s JavaScript: Nedávno jsem pracoval v C #.

Nikdy jsem se nedíval na jazyky nízké nebo střední úrovně, jako je C.

Obecný konsenzus v programovací komunitě obecně je, že „programátor, který se nenaučil něco jako C, upřímně řečeno, prostě nedokáže zvládnout programovací koncepty, jako jsou ukazatele, datové typy, předávání hodnot odkazem atd.“

Nesouhlasím. Tvrdím, že:

  1. Protože jazyky na vysoké úrovni jsou snadno dostupné, ponoří se do nich více „neprogramátorů“ a udělá si nepořádek
  2. Abychom opravdu dokázali něco udělat v jazyce na vysoké úrovni, musíme pochopit stejné podobné pojmy, o kterých většina zastánců „učení se na nejnižší úrovni“ evangelizuje.

Někteří lidé potřebují znát C; tito lidé mají práci, která vyžaduje, aby psali kód nízké až střední úrovně. Jsem si jistý, že C je úžasné, a jsem si jistý, že existuje několik špatných programátorů, kteří znají C.

Proč zkreslení? Jako dobrý, čestný, hladový programátor, kdybych se musel učit C (z nějakého nepředvídaného důvodu), naučil bych se C. Vzhledem k množství jazyků tam venku, neměli by se dobrí programátoři soustředit na učení toho, co nás vylepšuje? Neměli bychom se dozvědět, co nás zajímá? Neměli bychom využít náš konečný čas k posunu vpřed ? Proč s tím někteří programátoři nesouhlasí?

Věřím, že snaha o dokonalost v tom, co děláte, je základní deterministickou vlastností mezi dobrými a špatnými programátory.

Má někdo nějaké příklady skutečného světa, jak něco, co je napsáno v jazyce na vysoké úrovni - řekněme Java, Pascal, PHP nebo JavaScript - skutečně těží z předchozí znalosti C? Příklady by byly nejvíce oceněny.

58
Stephen

Výhodou znalosti C je, že máte velmi dobrou představu o tom, jak počítač funguje. Nejen to, jak funguje váš programovací model, ale jak je rozvržena paměť a podobně.

Jedinou úrovní pod C je Shromáždění, které mluví konkrétní CPU.

(Dodal bych, že znalost C vám také umožní ocenit, o kolik práce musíte udělat v jazyce vyšší úrovně. A doufejme, že oceníte náklady zapojené do práce v tomto jazyce vyšší úrovně.)

113
Frank Shearar

Nemyslím si, že žádná z odpovědí je opravdu to, co OP hledal, takže budu házet podle mého vlastního názoru.

Podívej, jsem unapologetický C snob. Můj postoj je, že pokud nevíte C, pak do jisté míry ne opravd nevíte, co děláte jako programátor. Takže si myslím, že jsem druh "zaujatého" člověka, o kterém tady mluvíš.

V praxi však to, zda opravd víte, co děláte jako programátor, vám nemusí nutně bránit ve vývoji opravdu úžasného užitečného softwaru pomocí nástrojů na vysoké úrovni. Tvůrce Stack Overflow, Jeff Atwood, zjevně ani neví C, a přesto bych řekl, že Stack Overflow je docela zatraceně dobrá webová aplikace.

Zda se rozhodnete učit C (nebo C++, nebo Assembly), záleží na tom, jaký typ programátoru chcete být. Pokud chcete pouze vyvíjet skvělé webové aplikace nebo obchodní aplikace, je to v pořádku - není třeba se učit C. Ale pokud chcete opravdu Excel, co děláte - pokud chcete opravdu pracovat - cool projekty, které tlačí na nejmodernější techniku, pak se musíte opravdu brát vážně jako programátor, abyste opravdu rozuměli, jak počítače fungují. Protože C je v podstatě OS lingua franca, stejně jako jazyk, který pohání téměř všechno ostatní (od linuxového jádra po většinu Java VMs, do Python) = a Ruby tlumočníci, databáze SQL, webové servery a téměř každý ovladač zařízení), intimní porozumění jazyku jde dlouhou cestou.

Nemluvě o tom, že znalost C (nebo C++) otevírá obrovskou příležitost přispívat k velkým open-source projektům, které mají dopad na miliony (nebo stovky milionů) lidí. Chcete pracovat na zdokonalení tlumočníka Python nebo webového prohlížeče Chromium? No, musíte znát C pro první a C++ pro druhý).

Proto je porovnání C s mrtvými přirozenými jazyky, jako je latina nebo zastaralé technologie, jako je kůň a kočár, úplně špatné. Velká část naší softwarové infrastruktury ve 21. století je poháněna kódem C, a proto zůstává C dnes stejně relevantní jako vždy.

Takže, zda byste se měli naučit C, opravdu záleží na tom, co chcete od své kariéry programátora.

72
Charles Salvia

Praktickým pravidlem je, že musíte pochopit alespoň jednu úroveň abstrakce pod úrovní, ve které obvykle pracujete. Zvažte, že váš PHP nebo interpret jazyka JavaScript může být skutečně implementován v C nebo C++). Nakonec narazíte na chybu v tlumočníku nebo dokonce na chybu runtime C. Pokud nerozumíte C, budete omezeni na zasílání hlášení o chybách správci, doufajíc, že ​​to dokážou reprodukovat a starat se o to, a pak otáčet palce. Pokud víte, že C, můžete jim přesně říci, kde je problém a co to je.

To také znamená, že pokud pracujete v C/C++, měli byste mít alespoň možnost číst sestavení na vaší platformě.

Pokud jde o učení C, když to potřebujete: moje pozorování je, že většina programátorů se může naučit Perl/Python/Javascript na vyžádání, ale zdá se, že assembler/C/LISP vyžaduje mnohem více času, takže stojí za to se naučit alespoň některé základy před potřebou vzniká.

12
Charles E. Grant

Nesouhlasím s tím, že se musíte učit C první, ale věřím, že byste se měli učit C nakonec. Všechny abstrakce jsou netěsné a porozumění C usnadňuje pochopení toho, co se skutečně děje, když používáte nějakou fantastickou abstrakci na vysoké úrovni. To znamená, že si myslím, že by se všichni seriózní programátoři nakonec měli naučit alespoň číst assembler ze stejného důvodu.

Studium těchto konceptů na nízké úrovni dává překvapivou schopnost uvažovat o věcech na vysoké úrovni. Například v C++ a D jsou výchozí argumenty pro virtuální funkce určeny statickým typem (kompilační čas) typu objektu, nikoli dynamickým (runtime) typem. To nedává smysl, pokud nerozumíte tomu, jak fungují vtables a konvence volání a proč by bylo extrémně obtížné implementovat virtuální funkce opačným způsobem.

7
dsimcha

Předpojatost je stav quo. Za starých časů (80. a starší roky) byl C/C++ do značné míry požadavkem na výkonové aplikace. To se změnilo, ale starší vývojáři obvykle pocházejí z tohoto prostředí starých věcí a sledují věci v tomto kontextu.

Pro skutečný vývoj se používají jiné jazyky jso - C # je populární, stejně jako Java, zatímco PHP a Python jsou oblíbené pro interní projekty a vždy je užitečné mít v této oblasti někoho, kdo má alespoň základní znalosti v případě, že si vyberete open source PHP projekt pro, řekněme, váš systém pro sledování chyb). Zdá se, že specifikace pocházejí z této standardní šablony, která byla napsána před 25 lety.

7
JohnL

Jak skvělý slimák! (Jak prý říkají: Je to soukromý boj nebo se může někdo připojit?)

Byl jsem profesorem a zjistil jsem (po několika pokusech a omylech), že je mnohem snazší vést studenty složitými koncepty programování, pokud na základní úrovni rozumějí tomu, co počítač dělá. Ne ve všech dusných detailech, ale základním principem, jako je paměť, jaké jsou instrukce atd. Co se mi na C líbí, je to blízko ke stroji.

To neznamená, že jiní učitelé přišli na stejné místo. Začali v jazyce na vysoké úrovni (BASIC :-) a odtud šli vpřed, bez zjevných špatných účinků.

Takže spodní řádek, Stephene, můžeš mít pravdu. To bych si nemyslel, ale předtím jsem se mýlil.

6
Mike Dunlavey

Pokud nenávidím příspěvek povinného příspěvku na blogu Joel, souhlasím s ním zde . C je lingua franca programování. Nedokážu vymyslet žádný jazyk na vysoké úrovni, který by s ním nějak nesouhlasil. Z tohoto důvodu je C stále populární volbou pro systémy typu programování typu. Prostě nemůžete rozhraní s některými věcmi na úrovni OS bez C.

Co navíc plánujete, když váš jazyk na vysoké úrovni není dostatečně rychlý? Vědět, jak psát C, je zvláště důležité, pokud používáte vysoce dynamický typ jazyka jako Ruby, Python nebo PHP. Ale i Java a C # programátoři musí čas od času klesnout na C).

6
Jason Baker

Myslím, že to je pokrok.

Před dvaceti lety bylo obvyklou moudrostí, že jste se museli učit assembleru, abyste pochopili, co jste získali z jazyků vyšší úrovně, jako je C (proto jsem musel vzít třídu assembleru na vysokou školu pomocí VAX Macro; hádejte jak užitečné to dopadlo po absolvování).

Je pověra, že protože C je poněkud obtížné se naučit a že poskytuje téměř ne abstrakce (ukazatele a bajtové proudy jsou do značné míry to), učení se to nějak z vás udělá lepšího programátora nebo vám poskytne lepší přehled jak věci fungují na hardwarové úrovni.

To není (nutně) pravda. Standard C vás nepřibližuje k metalu než k jiným 3GL (Pascal, Fortran, atd.). Některé C implementace mohou poskytovat háčky, které vám poskytují lepší přístup k některým oblastem, ale obecně jsou nahé ukazatele přibližně tak blízko, jak se dostanete, což není vůbec blízko. Nemůžete například přímo přistupovat k registrům nebo stavovým slovům.

Nakonec to všechno dopadne na opcodes a režimy adresování, takže pokud máte opravd zájem o to, jak věci fungují na nižší úrovni, měli byste lépe sloužit jako učební sestavovatel nad C.

Samotné učení C vás (nutně) z vás nestane lepším programátorem. Určitě vám však poskytne ocenění pro skutečné typy řetězců a standardizované knihovny kontejnerů.

4
John Bode

Procoatively zeptal se: Žádáte o potvrzení, že se nemusíte učit C? Pokud se naučíte čistě C (nutně ne C++), získáte důkladné pochopení modelu provedení počítače. Zejména o paměti a alokaci. To záleží také na programování lidí na vyšších úrovních langaugů.

Pro programátora PHP) je jeho méně transparentní způsob provádění kódu v daném počítači. Nezáleží na tom pro programátora PHP), protože síťový přenos je hrdlem láhve v aplikaci atd.

Obyčejný PHP/Python/C # má spoustu abstrakčních vrstev mezi jazykem a CPU. tyto vrstvy jsou tak silné, že vám neumožňují prohlédnout si je. Když se naučíte C, je mezi vámi a CPU a operačním systémem tenký list. To neusnadňuje programování (a nemusí být ani lepší). Ve skutečnosti se ale můžete naučit, jak CPU funguje. Jakmile znáte „středně pokročilý“ C, můžete začít tyto znalosti spojovat směrem nahoru s jazykem vyšší úrovně. To je okamžitá výhoda, kterou získáte.

Podle mého názoru by měl programátor vždy strávit nějaký čas učením různých programovacích konceptů. Rozhodně se vyplatí podívat se na C, ale také podívat se na ještě vyšší úrovně programovacích jazyků jako Clojure, Haskell, Prolog.

Nemusíte se v nich stát mistrem, pouze vás naučí lekci, že „úrovně“ programovacích jazyků nejsou binární, ale existuje mnoho úrovní. Seznamte se s nimi shora dolů (Assembler). Z vás udělá lepšího programátora.

2
wirrbel

Musíte znát dost C, abyste mohli číst kód napsaný v jazyce C, protože bylo napsáno velké množství velmi důležitého kódu. To je asi vše, co si budete udržovat v tom, abyste prošli důkladnou příručkou k danému tématu (použil jsem Kochanovo „programování v C“), aniž byste vlastně museli kódovat jazykem. Pokud byste někdy skončili v situaci, která vyžaduje rozsáhlé používání jazyka, budete mít dobrý základ, na kterém budete stavět. Pravděpodobně budete chtít studovat něco jako knihu Duntemannsova shromáždění, pokud je pro vás stroj abstraktovanou černou skříňkou. Doporučuji také Petzoldův „kód“.

Mimo to - základní gramotnost v C a základní znalost základního stroje - nejlépe byste strávili studiem času skutečnými věcmi, jako je SICP, ilustrovaný protokol TCP/IP nebo knihy o betonové matematice, algoritmech nebo struktuře dat . Skutečné věci.

Trávit spoustu času studiem C při kódování v PHP prostě nestojí za náklady na příležitost. Další užitečné věci se učit. C je opravdu jen další jazyk, který se můžete dobře učit pouze studiem a používat, ale v případě potřeby je můžete vyzvednout.

Pot tvrdé věci.

2
naftalimich

Jazyk je nástroj. Pokud musíte pouze psát webové stránky a podobně, jsem si jistý, že se můžete dostat pryč, aniž byste se museli učit C, stejným způsobem, že pokud budete jen vyrábět plastové modely, budete potřebovat pouze ostrý nůž a lepidlo, klíč není obvykle vyžadován.

Píšu kód pro vestavěné systémy s velmi omezenými paměťovými zdroji (největší, co jsem v poslední době udělal, je 16 kbyte a to byl obrovský). Na tomto trhu jsou C nebo assembler jedinou možností a žádný z nadýchaných jazyků vyšší úrovně prostě nefunguje.

2
uɐɪ

Podle mých zkušeností byl C/C++ na chvíli dobrý buffer, který oddělil dobré programátory od VB6 kodérů. Poté, co jsem dělal pět lichých let C/C++, dostal jsem práci ve VB6. Byl jsem ohromen kvalitou (nebo nedostatkem) kodérů. Neměli velký zájem na vnitřnosti jazyka, designu nebo výkonu. Bohužel, když se společnost přestěhovala do .Net, kodéry C/C++ a .Net kodéry používaly stejné nástroje. The VB kodéry byly ještě horší VB.Net kodéry. Situace se zhoršila, když veškerý vývoj šel do ASP.NET. Najednou někdo, kdo mohl přetáhnout a ovládat ovládání, byl programátor.

Na trhu práce však nebylo co rozlišovat mezi hardwarovými kodéry (ex C/C++) a turisty.

Jako takový, s C nebo C++ ve vašem životopisu vám může pomoci odlišit vás od riff-raff.

2
dave

C (a možná C++) je moře, ve kterém se plavíte. OS, který spustí váš kód, je pravděpodobně kódován v C (a C++). Vaše nativní API pro přístup ke službám OS bude tedy v C.

Pokud to dokážete, aniž byste věděli, co je níže, není třeba vědět C. Většina programátorů se však musí někdy v životě ponořit do nižších úrovní.

Je také založeno na vaší specializaci rozvojových oblastí. Například webový vývojář, který píše HTML, Javascript a některé skripty na straně serveru, nemusí nikdy vědět nic o C, ale vývojář distribuovaného systému nebo hry to bude potřebovat.

Nikdy neuškodí strávit pár týdnů učením něčeho tak zásadního pro vaši profesi.

1
Mert Akcakaya

C je jazyk, který se používá k psaní jiných jazyků. To vám umožní získat tak intimní s CPU a jiným hardwarem, jak chcete.

Pokud neznáte C, nevíte, jak jiné jazyky dosahují svých výsledků.

Abstrakce je samozřejmě důležitý pojem a ne každý musí vědět, jak jejich rámec výběru dosahuje výsledků, které slibuje. Nemusíte trávit 20 let psaním C, nebo dokonce přemýšlet o tom, co se stane s vašimi vtables, když používáte vícenásobné dědictví, abyste mohli psát dobrý kód.

Nyní můžete řídit auto bez pochopení toho, jak funguje čtyřtaktní motor, nebo dokonce bez možnosti použít řadicí páku (manuální převodovka).

Pokud však pochopíte, co se děje pod kapotou, budete z času na čas schopni dosáhnout výjimečných výsledků, které se někdo bez těchto znalostí bude snažit replikovat.

1
Bill Michell

C má mnoho výhod:

  1. C je jazyk nízké úrovně. Můžete použít c pro vývoj jádra a ovladače.
  2. C je nejrychlejší jazyk. Mnoho energetického softwaru je vyvíjeno c. Například: memcached, redis, nginx, Apache, mysql atd.
  3. C je jazyk napříč platformami. Program vyvinutý c může běžet na každé platformě. Jiné jazyky napříč platformami to nemohou udělat. Java, python, php atd. Nelze spustit na platformě iOS.
  4. C++ nemůže běžet na mnoha vestavěných systémech.
1
Edward Shen