Jazyk C je univerzálny procedurálne orientovaný programovací jazyk. Je to jazyk štruktúrovaný a strojovo nezávislý. Vyvinul ho Dennis Ritchie v roku 1972 v AT&T Bell Labs. Bol vyvinutý spolu s operačným systémom UNIX a je s ním silno prepojený. Medzi jeho hlavné vlastnosti patrí nízkoúrovňový prístup k pamäti, praktická sada kľúčových slov a elegantný a čistý štýl. Vďaka týmto vlastnostiam je programovací jazyk C vhodný pre systémové programovanie. Podporuje širokú škálu vstavaných funkcií, štandardných knižníc a hlavičkových súborov. Mnoho jazykov odvodilo syntax priamo alebo nepriamo z jazyka C. Napríklad C++ je jeho blízkou nadmnožinou.
Raný vývoj
Aby sme sa dozvedeli o histórii jazyka C viac, začnime najprv s jeho predchodcom. Predchodcom všetkých moderných jazykov je ALGOL (Algorithmic Language). ALGOL bol prvý počítačový programovací jazyk, ktorý používal blokovú štruktúru a bol predstavený v roku 1960. V roku 1967 Martin Richards vyvinul jazyk s názvom BCPL (Basic Combined Programming Language), ktorý bol od jazyka ALGOL odvodený. V roku 1970 Ken Thompson vytvoril jazyk vychádzajúci z BCPL s názvom B. Programovacie jazyky BCPL aj B boli beztypové. Následne, v roku 1972, bol Dennisom Ritchiem v Bell Labs vyvinutý jazyk C, vychádzajúci práve z BCPL a B. Z historického hľadiska bol jazyk C používaný najmä v akademickom prostredí, ale nakoniec, s vydaním mnohých kompilátorov C na komerčné použitie a rastúcou popularitou UNIXu, si začal získavať rozsiahlu podporu medzi profesionálnymi programátromi.
K&C a štandardizácia
Začiatkom roku 1973 boli podľa správy Bell Labs základy jazyka C dokončené. Jazyk aj kompilátor boli dostatočne výkonné na to, aby sa UNIXové jadro pre počítač PDP-11 mohlo prepísať do C. V roku 1978 publikovali Brian Kernighan a Dennis Ritchie knihu „The C Programming Language“, ktorá slúžila ako referencia jazyka až kým nebol ustanovený jeho formálny štandard. V rokoch 1973 až 1980 sa jazyk mierne vyvinul: do typovej štruktúry boli pridané typy bez znamienka (unsigned), typy long, union a enum. Prostredie jazyka, ako aj technológia, ktorá ho sprevádzala, zaznamenali výrazné zmeny. V lete 1983 Americký národný inštitút pre štandardizáciu (ANSI) vytvoril výbor X3J11 s cieľom vytvoriť štandard jazyka C. Tento výbor koncom roka 1989 zverejnil svoju správu ANSI X3.159-1989. Norma uvedená v dokumente je známa ako ANSI C. Tento pôvodný štandard v podstate zjednotil existujúce postupy a pridal pár doplnkov. Bol však rýchlo nahradený, keď bola ustanovená norma ISO/IEC 9899:1990 ako medzinárodná norma, známa ako C89, prípadne C99.
ANSI C, C89/C90: ANSI C zaviedol niekoľko nových funkcií a objasnil nejednoznačnosti prítomné v skorších verziách jazyka. Štandard ANSI C bol prijatý medzinárodne a stal sa známym ako C89 (alebo C90, v závislosti od roku ratifikácie). Dlhé roky slúžil ako základ pre kompilátory a vývojové nástroje.
C99: V roku 1999 ISO/IEC schválila aktualizovanú verziu normy C známu ako C99. C99 zaviedol nové funkcie, vrátane inline funkcií, niekoľko nových dátových typov, ako je typ reprezentujúci komplexné čísla, polia s premenlivou dĺžkou atď. Pridal tiež podporu pre jednoriadkové komentáre v štýle C++ začínajúce na // .
C11: Štandard C11, publikovaný v roku 2011, je ďalšou veľkou revíziou normy C. Pridáva novú funkcionalitu, ako podpora viacerých vlákien, anonymné štruktúry a uniony a vylepšená podpora Unicode. Má vylepšenú kompatibilitu s C++.
C17: Štandard C17 bol zverejnený v júni 2018. S touto štandardnou revíziou neboli zavedené žiadne nové funkcie. Vykonáva iba určité technické opravy a objasnenia chýb v C11.
C18: Zverejnený v roku 2018. Zahŕňa menšie revízie a opravy chýb v porovnaní s C11.
C23: Začal sa tvoriť v roku 2016, neformálne ako C2x, a bol publikovaný 31. októbra 2024. Jednou zo zaujímavostí je pridanie typu char8_t na ukladanie údajov kódovaných UTF-8.
História JavaScriptu začala s firmou Netscape Communications Corporation — americkou nezávislou spoločnosťou poskytujúcou počítačové služby. V roku 1994 spoločnosť ovládla trh prehliadačov so svojím webovým prehliadačom Netscape Navigator. Koncom roku 1995 však do arény vsúpila spoločnosť Microsoft s prehliadačom Internet Explorer. Snažili sa prevziať kontrolu nad vznikajúcou technológiou od Netscape, takže Microsoft sa stal pre spoločnosť hrozbou. Je ľahké uhádnuť, že Netscape s Microsoftom vo vojne prehliadačov prehral, spoločnosť ale uspela v inej oblasti.
Potreba dynamického webu
Aby zostal konkurencieschopným, snažil sa Netscape rozšíriť svoje publikum začlenením skriptovacieho jazyka, ktorý by umožnil interakciu s DOM (Document Object Model). Marc Andreessen, zakladateľ Netscape Communications, mal víziu, že web potrebuje spôsob, ako sa stať dynamickejším. V tom čase bol web veľmi obmedzený a pomalý, pretože ľudia používali pripojenie cez telefónne linky a modemy. Pri vypĺňaní formulárov na webových stránkach bolo potrebné overenie vstupných polí vykonať prostredníctvom celej spiatočnej cesty na server. Bol to pomalý proces a mohol viesť k strate údajov, ak formulár nebol vyplnený správne. Na vyriešenie tohto problému spoločnosť Netscape Communications prišla s riešením. Rozhodli sa povoliť validáciu vstupných polí na strane klienta, aby sa vyhli potrebe úplnej spiatočnej cesty na server. Tento proces si vyžadoval malý skriptovací jazyk, ktorý by bol dostupný pre softvérových inžinierov aj pre ľudí bez rozsiahlych skúseností s programovaním.
Zrod JavaScriptu
Netscape Communications sa dohodol na spolupráci so spoločnosťou Sun Microsystems, s cieľom predstihnúť Microsoft Internet Explorer. Ich plán zahŕňal začlenenie programovacieho jazyka Java od Sunu do prehliadača Netscape Navigator 2. V apríli 1995 teda spoločnosť Netscape Communications najala Brendana Eicha, aby vyvinul a predstavil nový skriptovací jazyk pre prehliadač. Eich mal na vytvorenie prototypu len 10 dní, no výzvu zvládol.
Nový jazyk sa pôvodne nazýval Mocha a bol navrhnutý tak, aby pripomínal Javu, čo bolo dôležité pre Netscape aj Sun. Na dosiahnutie tohto cieľa Eich využil syntax ovplyvnenú jazykom C a implementoval konvencie pomenovania podobné Jave. Začlenil prototypový objektový model inšpirovaný jazykom Self, čo umožnilo objektom dediť priamo z iných objektov. Pridal tiež funkcie prvej triedy (first-class functions) podobné tým, ktoré nájdeme v Lispe. Tento prístup považoval funkcie za premenné, čo viedlo k jazyku, ktorý kombinoval syntax Javy, objektovú orientáciu Self a funkcionálny štýl Scheme.
V blízkosti vydania sa názov zmenil z Mocha na LiveScript a neskôr na JavaScript. Išlo najmä o marketingovú taktiku vykresliť nový jazyk ako podporný skriptovací jazyk pre Javu. V septembri 1995 bol teda vydaný nový skriptovací jazyk pre web, jednoduchý, dynamický a dostupný aj pre nevývojárov.
Prijatie
Spočiatku nebol JavaScript prijatý dobre. Skúsení Java vývojári verili, že jazyk je príliš základný a nezodpovedá ich štandardom, zatiaľ čo pre dizajnérov a autorov bola práca s ním príliš náročná. JavaScript však zmenil spôsob, akým verejnosť vnímala internet a dal webovým dizajnérom možnosť vytvárať kreatívne a interaktívne návrhy webových stránok. A na chvíľu pomohol Netscape Navigator udržať si pozíciu lídra na trhu.
JScript a ECMAScript
V čase predstavenia JavaScriptu spoločnosťou Netscape existovala na trhu intenzívna konkurencia medzi predajcami prehliadačov. Iní dodávatelia vytvárali svoje vlastné verzie JavaScriptu s použitím rôznych názvov a syntaxe. V roku 1996, krátko po spustení Netscape Navigator 3, spoločnosť Microsoft vydala novú verziu svojho webového prehliadača s názvom Internet Explorer 3, ktorý mal implementáciu vlastnej verzie JavaScriptu s názvom JScript. Keďže JavaScript bol otvorený a voľne licencovaný, Microsoft dokázal spätne analyzovať jeho implementáciu. Existovali teda dve verzie JavaScriptu bez zavedenej štandardizácie. To sa stalo problémom pre vývojárov, pretože kód, ktorý perfektne fungoval v jednom prehliadači, bol v inom zbytočný.
Aby sa predišlo ďalším konfliktom, v roku 1997 sa Netscape obrátil na Európsku asociáciu výrobcov počítačov (ECMA) a požiadal ich o štandardizáciu JavaScriptu. Výbor ECMA vytvoril štandard známy ako ECMA-262, ktorý definoval nový skriptovací jazyk s názvom ECMAScript. Tento univerzálny skriptovací jazyk prijali všetky prehliadače ako základ pre svoje vlastné implementácie JavaScriptu, čím sa zabezpečilo dodržiavanie spoločného štandardu.
Bol založený na jazyku JavaScript a zahŕňal funkcie, ako sú premenné, funkcie a základné príkazy toku riadenia.
ECMAScript 2 (ES2)
Urobil menšie zmeny v jazyku a zameral sa hlavne na to, aby bol štandard konzistentnejší.
ECMAScript 3 (ES3)
Zaviedol niekoľko dôležitých funkcií, ako sú regulárne výrazy, príkazy try-catch a vylepšené spracovanie reťazcov.
// Príklad použitia regulárneho výrazu v ES3
var text = "Hello, World!";
var regex = /Hello/;
console.log(regex.test(text)); // Vystup: true
// Príklad použitia bloku try/catch v ES3
try {
var x = y + 1;
} catch (error) {
console.log(error); // Vystup: ReferenceError: y is not defined
}
ECMAScript 4
ECMAScript 4 bol plánovaný ako štvrtá verzia štandardu ECMAScript, ale nebol nikdy vydaný. Jeho zámerom bolo zaviesť významné zmeny do jazyka, vrátane tried, rozhraní a menných priestorov. Návrh však narazil na značný odpor a od vývoja sa nakoniec upustilo.
ECMAScript 5 (ES5)
Zaviedol niekoľko dôležitých vlastností, ako je striktný režim, podpora JSON a vylepšená manipulácia s poľami.
ECMAScript 5.1 (ES5.1)
ECMAScript 5.1 bol menšou aktualizáciou ECMAScript 5. Väčšinou sa zameriaval na to, aby bol štandard konzistentnejší a opravoval chyby.
ECMAScript 6 (ES6)
Zaviedol niekoľko dôležitých vlastností, ako sú let a const, „arrow functions“, „template literals“ (šablónové literály) a triedy.
// Príklad použitia let a const v ES6
let name = "John Doe";
const age = 30;
// Príklad na arrow function v ES6
let add = (a, b) => a + b;
console.log(add(1, 2)); // Vystup: 3
// Príklad použitia šablónového literálu v ES6
let message = `Hello, ${name}!`;
console.log(message); // Vystup: "Hello, John Doe!"
// Príklad triedy v ES6
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
return `Hello, ${this.name}!`;
}
}
let john = new Person("John Doe", 30);
console.log(john.greet()); // Vystup: "Hello, John Doe!"
ECMAScript 2016 (ES7)
Zaviedol dve hlavné funkcie: operátor umocňovania a Array.prototype.includes().
// Príklad použitia umocňovacieho operátora v ES7
let square = 2**2;
console.log(square); // Output: 4
// Príklad použitia Array.prototype.includes v ES7
let numbers = [1, 2, 3, 4, 5];
console.log(numbers.includes(3)); // Vystup: true
ECMAScript 2017 (ES8)
Zaviedol niekoľko nových funkcií vrátane async/await Object.values(), Object.entries(), a string padding.
// Príklad použitia async/await v ES8
async function fetchData() {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
return data;
}
ECMAScript 2018 (ES9)
Táto verzia priniesla významné aktualizácie, ako sú asynchrónne iterácie, Promise.prototype.finally() a operátory rest/spread.
// Príklad použitia Promise.prototype.finally() v ES9
fetch('https://api.example.com/data')
.then(data => console.log(data))
.catch(error => console.log(error))
.finally(() => console.log('Finished!'));
// Príklad použitia operátorov rest/spread v ES9
let person = { name: "John Doe", age: 30, country: "USA" };
let {name, ...rest} = person;
console.log(name); // Vystup: "John Doe"
console.log(rest); // Vystup: { age: 30, country: "USA" }
ECMAScript 2019 (ES10)
Zviedol funkcie ako
Array.prototype.flat(), Array.prototype.flatMap(), a
Object.fromEntries().
ECMAScript 2020 (ES11)
Táto verzia prišila s vlastnosťami, ako sú BigInt pre väčšie celé čísla, Promise.allSettled(), „Nullish Coalescing Operator“ (??) a voliteľné reťazenie (?.).
// Príklad použitia "nullish coalescing" v ES11
let value = null;
console.log(value ?? "default"); // Vystup: "default"
ECMAScript 2021 (ES12)
Zaviedol ďalšie logické operátory priraďovania, číselné oddeľovače, Promise.any() a String.prototype.replaceAll().
// Príklad použitia číselných oddeľovačov v ES12
let billion = 1_000_000_000; // Ekvivalent: let billion = 1000000000;
console.log(billion); // Vystup: 1000000000
ECMAScript 2022 (ES13)
Zaviedol niekoľko významných nových vlastností, napríklad:
Schopnosť používať najvyššiu úroveň await, vďaka čomu je možné použiť kľúčové slovo mimo asynchrónnej funkcie.
Nové prvky triedy: súkromné a verejné atribúty a metódy inštancií, súkromné a verejné statické atribúty a metódy.
Syntax #x in obj, ktorá vám umožňuje testovať prítomnosť súkromných polí na objektoch.
Metóda at pre reťazce a polia, ktorá umožňuje relatívne indexovanie.
V tejto verzii pribudlo niekoľko nových metód na Array.prototype a TypedArray.prototype, vrátane toSorted, toReversed, with, findLast a findLastIndex. Okrem toho do Array.prototype bola pridaná metóda toSpliced.
Táto verzia začala podporovať #! komentáre na začiatku súborov, čím sa pripravila pôda pre priamo spustiteľné súbory ECMAScript.