Nejlepší programovací jazyk pro začátečníky

Tento problém trápí spoustu začátečníků. Ti mohou na internetu najít různé, více čí méně správné odpovědi. V tomto článku bych rád shrnul celou tuto problematiku.

V tomto článku bych velmi nerad vnucoval ostatním svůj pohled na programování. Naopak budu rád, když se k němu v komentářích vyjádříte, já to zvážím a článek patřičně upravím :) Chtěl bych, aby tento článek reprezentoval názor odborné většiny a aby ti zkušenější programátoři sem mohli s důvěrou odkázat své mladší kolegy, které trápí stejná otázka.

Který programovací jazyk je nejlepší?

To je stejné jako se ptát, které auto je nejlepší?. Obě tyto věci, auta i programovací jazyky, jsou nástroje, které používáme za nějakým účelem. Každé auto se hodí na něco jiného. Pokud chceme převážet náklady, dáme přednost dodávce či kamionu před osobním autem. Rovněž záleží na osobních prioritách. Někdo upřednostňuje rychlost, jiný zase komfort nebo bezpečnost.

Který jazyk toho umí nejvíc?

Model počítače

Ve 30. letech 20. století britský matematik Alan Turing zkoumal, co všechno lze a co naopak nelze čistě mechanickou prací "vypočítat". Přišel s myšlenkou tzv. Turingova stroje. Je to matematický model počítače a lze na něm zkoumat, co všechno může nějaký stroj umět. Tímto Turing už před 70 lety přesně stanovil možnosti a hranice nejen současných, ale i budoucích počítačů. Tyto stroje, takzvané automaty, zkoumá teoretická informatika. Kromě turingových strojů existují další matematické struktury, kterými lze zkoumat "inteligenci mechanické práce", a to např. Lambda kalkul nebo koncept Hornových klauzulí predikátové logiky.

Programovací jazyk

Programovací jazyk je prostředek, jak sdělit počítači, co po něm chceme. V našem jazyce by mělo jít vyjádřit všechno, co na daném počítači lze provést. To jest všechno, co dokáže udělat Turingův stroj. U jazyků se tak zkoumá "turingovská úplnost". Všechny dnes používané programovací jazyky jsou "turingovsky úplné", tedy "umí stejné věci", jako Turingův stroj.

Není snad nikdo, kdy by se učil sčítat jablka, a pak se znovu učil sčítat hrušky. Stejně tak se nikdo neučí programovat v Pascalu a potom se znovu učí programovat v Javě. Sčítání má základní pravidla, která nezáleží na tom, jaké věci sčítáme. Stejně tak i programování má svá pravidla, která nezáleží na programovacím jazyce, platformě ani hardwaru.

Každou věc, kterou napíšete v jednom jazyce, lze napsat i v jiném. Nezávisí na tom, zda je to kalkulačka, 3D střílečka nebo operační systém. Všechno tyto věci (hra, kaluklačka, operační systém) jsou jen programy, které lze napsat v libovolném jazyce, jelikož si všechny jazyky odpovídají svými schopnostmi.

Rozdělení programovacích jazyků

Podle mě je správné rozdělovat jazyky podle tzv. "programovacího paradigmatu". To, co se doopravdy učíte, není jazyk, ale paradigma. Toto paradigma určuje, jakým způsobem musí programátor přemýšlet. V každém paradigmatu se musí přemýšlet trochu jinak. Pokud ovládáte jedno paradigma, ovládáte více-méně všechny jazyky z dané skupiny. Přechod z jednoho paradigmatu na jiné může být velmi náročný. Když jste zvyklí jen na jedno paradigma, kód z jiného paradigmatu vám nemusí dávat smysl.

  • Procedurální ( = imperativní = přikazovací)
    - masivně používané v praxi
    - píše se posloupnost instrukcí, které počítač provádí jednu za druhou
    - jazyky: "Assembler", C, C++, Pascal, Basic, Fortran, Java, C#, PHP, ActionScript, JavaScript, ...
  • Neprocedurální ( = deklarativní = popisovací)
    - používané ve velmi specifických případech. Buď proto, že se tam opravdu víc hodí, nebo proto, že programátor je má rád.
    - píše se logika programu a vztahy mezi prvky programu
    • Funkcionální
      - jazyky: Lisp, Scheme, Haskell
    • Logické
      - jazyky: Prolog, Gödel, Fril

Existují však i jazyky, umožňující zápis programu podle více paradigmat. Je to například Perl, Python nebo F#. Tyto jazyky mívají spoustu "vychytávek", které ušetří programátorovi čas a zkrátí kód. Podle mě jsou dost nepřehledné a nemám je příliš rád, ale opět - je to individuální. Někdo má rád složité věci, někdo ne.

Nativní vs. interpretovaný program

Dále můžeme jazyky rozlišovat podle způsobu provádění programu na počítači.

Většina dnešních počítačů jsou elektronické, vybavené tzv. mikroprocesorem. Každý mikroprocesor má svoji sadu instrukcí, které umí provádět.

Nativní je program, který je převeden (kompilován) přímo do instrukcí pro daný mikroprocesor (těmto instrukcím se říká strojový kód). Procesor čte instrukce jednu za druhou a provádí je. Je to velmi rychlé a procesory jsou na to stavěné. Bohužel různé mikroprocesory mohou mít různé instrukční sady (rozšířené jsou sady x86, x64, ARM, MIPS, ...), a podle toho musíme udělat několik verzí našeho programu.

Interpretovaný je program, který se převádí do "virtuálních" instrukcí pro nějaký virtuální stroj. Tento stroj je zase program, který čte tyto instrukce a převádí je na instrukce pro daný mikroprocesor, na kterém právě běží (říká se tomu, že je "interpretuje"). Samotný převod je často důvodem pomalého běhu oproti nativním programům. Stačí nám však jen jedna verze programu pro konkrétní virtuální stroj, ale musíme mít víc verzí virtuálních strojů pro každý procesor nebo operační systém, na kterém to chceme spouštět. Virtuální stroje jsou třeba:

  • Java Virtual Machine (JVM) pro Javu
  • Common Language Runtime (CLR) pro jazyky z .NET (součást .NET frameworku)
  • Adobe Virtual Machine (AVM/AVM2) pro ActionScript (součást Flash Playeru)
  • virtuální stroje pro JavaScript (Spider Monkey, V8, Chakra) - jsou součástí webových prohlížečů

Nízkoúrovňové a vysokoúrovňové jazyky

Za úroveň jazyka se obvykle označuje to, jak "blízko" je kód v daném jazyce ke strojovému kódu. Dříve se za nízkoúrovňový jazyk považoval Assembler a vysokoúrovňový byl Pascal. Nyní máme mnohem "vyšší" jazyky (C#, Java, Python, ...) a Pascal a C se považují za nízkoúrovňové. Na nízké úrovni se mluví o jedničkách, nulách, bajtech, na vysoké úrovni se mluví o datových typech, objektech, socketech, ...

Ve většině případů se nízkoúrovňové jazyky kompilují do strojového kódu, vysokoúrovňové se interpretují, ale nemusí to být pravda. Je možné udělat kompilátor vysokoúrovňového jazyka nebo interpret nízkoúrovňového. Je to však dost náročné a často neefektivní.

Rychlost jazyků

Obecně se předpokládá, že nativní jazyky jsou rychlé / interpretované jsou pomalé a že nízkoúrovňové jsou rychlé / vysokoúrovňové pomalé. To však nemusí být pravda. Pokud nativní jazyk má nekvalitní kompilátor a interpretovaný jazyk má velmi kvalitní virtuální stroj, interpretovaný program může běžet mnohem rychleji.

Jak tedy začít

Je důležité si uvědomit, že začínající programátor se neučí jazyk. Učí se programovat a jazyk je jen prostředek pro zápis programu. Umění programovat není vázáno na žádný programovací jazyk. Pokud umíte programovat třeba imperativním způsobem, tak se naučíte nový jazyk z dané skupiny během 2 dnů, maximálně týdne. Počet jazyků neříká vůbec nic o schopnostech programátora.

Doporučuje se začít programovat s imperativním jazykem. Nejdříve nízkoúrovňový, potom vysokoúrovňový jazyk.

Nízkoúrovňový jazyk

S nízkoúrovňovým jazykem lépe pochopíte, jak počítač pracuje s daty v paměti, jak je ukládá, načítá a zpracovává. Doporučuji začít s jazykem Pascal. Masochisté začínají s jazykem C, ten bych ale doporučil až ve chvili, kdy trochu ovládnete programování.

Vysokoúrovňový jazyk

Vysokoúrovňové jazyky nám nabídnou spoustu hotových "zkratek" a "vzorů", které jsme si museli v nízkoúrovňových jazycích sami programovat. Tím je například pohodlnější práce s dynamicky alokovanou pamětí a Objektově orientované programování. Doporučuji začít s jazyky Java nebo C#.

C++

C++ je zvláštní jazyk. Je nízkoúrovňový, ale tváří se velmi vysokoúrovňově. Z obou kategorií přebírá to nejlepší. Kompiluje se do strojového kódu (je nativní), a proto je velmi rychlý. Navíc obsahuje spoustu konstrukcí, "zkratek" a "vzorů", které jsou obvyklé ve vysokoúrovňových jazycích a usnadní programátorovi práci. Kvůli rozsáhlosti těchto konstrukcí a tím i složitosti celkové syntaxe, tento jazyk začátečníkům rozhodně nedoporučuji.

Algoritmy a datové struktury

Při praktickém programování programátoři hojně využívají algoritmů a datových struktur. Algoritmy a datové struktury však s programováním přímo nijak nesouvisí! Algoritmy a datové struktury se používaly už před stovkami let, kdy žádné moderní počítače nebyly.

Zkusme přirovnat programátora ke spisovateli. Znalost programování odpovídá znalosti pravopisu. Znalost algoritmů a matematiky pak odpovídá celkovému slohovému nadání. Je jasné, že když chcete být dobrý spisovatel, znalost pravopisu nestačí!

Přeji vám hodně štěstí, nápadů a trpělivosti při vašich prvních krocích, ať se vám daří! :)

5 komentářů:

  1. Luky ... (20. prosince 2011 v 3:13)

    Pěkné shrnutí. Líbí se mi poučení čtenáře o programovacích paradigmatech - což je podle mě také hodně podstatné. Více méně máš vše fakticky správně, jen k té "ose rychlosti", chtělo by to podložit nějakou referencí :) Pak tam máš pár drobností - začátečník asi nikdy neslyšel "jazyk symbolických adres", za to "assembler" mu asi neco rekne (ale ano, terminologicky to neni uplne spravne, ale je to tak vzite). A halvně bych nešetřil odkazi, když si čtenář bude chtít o něčem dozvědět více - jednotlivé jazyky, paradigma, co je turinguv stroj apod. Třeba aspon na wikipedii, nebo se pokusit najit treba nejaky zajimavy clanek, ktery se problematikou zabyva hloubeji.

  2. Anonymní ... (27. března 2012 v 8:28)

    Já jsem začátečník a Tenhle článek se mi zdá sice dost náročný, ale za to mi přiblížil programování. Myslím, že takovíhle články by se měli ukazovaT častěji. Díky. FILIP.

  3. Anonymní ... (25. dubna 2013 v 7:30)

    ↑ Z Tebe by ale nebyl dobrý spisovatel, Filipe - znalost pravopisu sice nestačí, ale je esenciální! :)

    T.

  4. Anonymní ... (28. října 2013 v 6:50)

    Začínajícímu programátorovi je jedno v jakém bude psát jazyce a proto jsou nejdůležitější dvě věci: 1) Zdroj ze kterého se učí musí být dobře napsaný aby i úplný začátečník pochopil základy a 2) Musí ho to BAVIT, chytnout a nepustit. Já jsem se učil C# z učebnice Moderní programování od Radka Vystavěla a jenom díky tomu, že splňuje oba výše zmiňované body mě baví do dnes a kdykoliv kdy mám volnou chvilku si sednu a něco nakodím. Proto C# a tuto knížku doporučuju všem kdo neví jak začít a i když souhlasím s tím, že není úplně nejlepší začít se učit hned vysokoúrovňový jazyk, který půlku věcí udělá za vás, ale je důležité aby to člověka bavilo. Proto jedině podlě učebnice Moderní programování

  5. Ivan ... (9. listopadu 2013 v 17:31)

    Děkujeme Radkovi za doporučení knihy.

Okomentovat