Jazyk Objective-C (ObjC) je (ze současného pohledu právem) spojován především s Applem a jeho systémem OS X (a iOS). Jen ti zasvěcenější ale vědí, jak tento jazyk vznikl a jak se vyvíjel. Zde je tedy stručné shrnutí.
Vznik Objective-C
Objective-C vytvořili Brad Cox a Tom Love jako objektově-orientované rozšíření populárního jazyka C. Základem návrhu jazyka byla úplná zpětná kompatibilita s „céčkem“. Objektovou syntax si vypůjčili ze Smalltalku (s přidanými hranatými závorkami kolem posílání zpráv). Původní verze byla jen jakýmsi prepocesorem převádějícím zdrojový kód v ObjC do čistého C. Výsledný kód využíval malé běhové prostředí (runtime), jehož značně dokonalejší podobu máme k dispozici i v dnešních překladačích pro ObjC.
Proč vlastně ObjC vzniklo? Tehdy bylo C++ ještě neznámé a jiný vhodný OO jazyk neměli autoři k dispozici. Smalltalk se jim zamlouval, ale byl na tehdejším hardwaru relativně pomalý a hlavně drahý. Spojili tedy výhody Smalltalku s rychlostí jazyka C. Navíc existovalo mnoho knihoven napsaných v C, které by při vytvoření zcela nového jazyka nebylo možné jednoduše použít.
Počáteční vývoj
První verze ObjC byla jen holým jazykem bez OO knihoven. K dispozici byla třída Object, jež se starala pouze o vytváření a zánik objektů a posílání zpráv (tedy v podstatě volání metod). Veškerý podpůrný kód byl k dispozici v C.
Hned v začátcích se objevilo několik návrhů, jak ObjC obohatit o uzávěry (closures), které Smalltalk měl. Sám Brad Cox navrhl syntax a implementaci uzávěrů (nazývaných bloky), do hlavní vývojové větvě jazyka se ale nedostaly. Až mnohem později je do C/C++ (nejen ObjC) přidali vývojáři pracující na překladači clang/LLVM (nově je můžeme v poněkud jiné podobě najít také v nejnovější verzi standardu C++ – C++0×, resp. C++11).
NeXT a Sun
V roce 1988 zakoupila licenci na ObjC společnost NeXT a založila na tomto jazyku vývojové nástroje pro svůj systém NextStep. Knihovny pro ObjC byly stále velmi primitivní a vývojáři byli do značné míry odkázaní na C.
Důležitým mezníkem byl pro ObjC ro 1994. V té době byl vydán OpenStep, vývojové prostředí vyvinuté Sunem (za přispění NeXTu) založené na ObjC. V OpenStepu se také poprvé objevily knihovny, jak je známe dnes, se zabudovaným čítačem referencí, poloautomatickou správou paměti (autorelease pools) atd. Z této doby také pochází prefix NS- u knihovních tříd, přičemž „S“ znamená Sun (dřívější verze NextStepu používaly NX-).
Sun na OpenStepu postavil několik produktů (zejména pro servery), ale nakonec v roce 1995 vydal první verzi Javy a OpenStep úplně ignoroval. Zajímavé je, že právě návrh Javy byl jazykem ObjC a jeho knihovnami výrazně ovlivněn. Syntax Javy je sice založená na C++, ale sémanticky je blíže Smalltalku (a tím i ObjC). Mnoho vývojářů, kteří se podíleli na OpenStepu, pracovalo později v Sunu na Javě, a tak se do ní už v zárodku (nazývaném tehdy Oak) dostaly takové věci jako rozhraní (interface, vytvořené podle protokolů v ObjC) a mnohu konceptů z knihoven (kolekce, boxing primitivních datových typů apod.). Sun dokonce koupil firmu Lighthouse, jež vyvíjela pro OpenStep, a nasadil její vývojáře na rozvoj Javy, zcela podle hesla „Java everywhere“.
Apple a OS X
Nový život vdechla jazyku ObjC akvizice NeXTu Applem. Apple potřeboval moderní operační systém a nakonec se rozhodl pro NextStep. Koupí NeXTu tehdy získal skomírající Apple nejen jazyk a operační systém, ale také na tehdejší dobu pokročilé vývojové nástroje (ze kterých se vyvinulo dnešní Xcode). Knihovna pro ObjC (nyní nazývaná Cocoa) se ani dnes výrazně neliší od API OpenStepu z doby „předapplovské“.
Narozdíl od Sunu a později Microsoftu zůstal Apple věrný ObjC a nezavedl nový jazyk s bajtkódem a automatickou správou paměti (tu nakonec ObjC dostalo později ve verzi OS X 10.5), což se nakonec ukázalo s ohledem na první verze iPhonu s minimem operační paměti jako velká výhoda. Ostatně i Microsoft se u Windows 8 vrací k nativnímu kódu (WinRT a C++/CX).
iOS
Když Apple uvedl na trh iPhone, nasadil na něm operační systém založený na OS X. Některé knihovny byly přepsány, většina ale zůstala stejná jako na OS X. Poslední verze (10.7 Lion) dokonce přebrala některé prvky z nejnovější verze iOS.
Některé pojmy spojené s ObjC:
Objective-C++
Jde o „smalltalkovskou“ nadstavbu jazyka C++. Třídy v C++ a ObjC jsou ovšem vzájemně nekompatibilní. Má smysl jen pro využití knihoven v C++. Zdrojový kód funguje zhruba jako u C++/CLI (generuje ale pouze nativní kód) a umožňuje smíchat dva jazyky v jednom souboru.
Objective-C 2.0
Rozšíření původního ObjC (od OS X 10.5 Leopard). Byly přidány vlastnosti (properties) tříd, které pomocí tečkové notace usnadňují správu paměti. Stolní OS X dostal také plnohondotný garbage collector.
Dalším významným rozšířením jsou bloky (uzávěry) zavedené v OS X 10.6 Snow Leopard.
Clang a LLVM
Překladač Clang/LLVM nahrazuje GCC. Je rychlejší, dává rozumnější chybové hlášky a generuje efektivnější kód. Nejnovější verze navíc podporuje automatické počítání referencí (překladač generuje za programátora kód pro správu paměti, podobně jako překladač C++/CX pro Windows 8).
Nejedná se o překladač pouze pro ObjC, stejně dobře jej lze použít i pro C/C++ včetně zcela nové a mnohem efektivnější STL knihovny (ta navíc využívá možností C++11).
"Vzdy ma zaujimalo, ci by apple pouzil objc aj dnes? Ma to nejake zasadne vyhody, alebo to je len z historickeho dovodu?"
Apple zdědil ObjC po NeXTu. NeXT chtěl tehdy vytvořit pro svůj OS OO knihovnu. V té době to zdaleka nebylo samozřejmostí. Na výběr bylo v podstatě jen C++ a ObjC (z praktických důvodů s ohledem na tehdejší HW nepřicházel v úvahu např. Smalltalk). Proč se rozhodli pro ObjC nevím. C++ bylo tehdy používanější, možná byla na vině již vícekrát viděná tendence Jobse odlišit se od ostatních, snížit kompatibilitu vlastních výrobků. Možná proto obskurní jazyk pro vlastní OS. Nicméně tehdy C++ také nemělo knihovny à la dnešní STL, ObjC se mohlo jevit na stejné úrovni a svým způsobem je "objektovější" (ve smyslu teoretického OO paradigmatu). Na druhou stranu C++ je (a dříve to platilo o to více) rychlejší, těžko říct, podle jakých kritérií se tehdy rozhodovali. Každopádně dnes by asi padla volba na C++ (podobně jako u Microsoftu s Windows 8/WinRT).
"Kdyby se udelala lepsi objektove pokracovani jazyka C nez jsou C++, ObjC a pritom
se kompiloval do binarky bylo by to lepsi."
No už delší dobu tu vzniká jazyk Vala - http://live.gnome.org/Vala/Tutorial
s rychlostí na tom není moc špatně... http://code.google.com/p/vala-benchmarks/wiki/BenchResults
Někde jsem četl, že Apple si zvolil objectiveC proto, že mělo propracovaný systém předávání zpráv mezi třídami. Podobně, jak o se pár let později objevilo v Qt. Kombinace objektového programování s možnostmi předávání zpráv značně zefektivnělo programování. Proto se jim podařilo v poměrně krátké době vyrobit spoustu kvalitních programů.
"Kdyby se udelala lepsi objektove pokracovani jazyka C nez jsou C++, ObjC a pritom
se kompiloval do binarky bylo by to lepsi."
Tak takový jazyk už pár let existuje, jmenuje se D a má nejrychlejší kompilátor ve vesmíru :), jak prohlásil C++ a teď už i D guru Alexandrescu na jednom google tech talku :)
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 125×
Přečteno 25 311×
Přečteno 23 755×
Přečteno 20 136×
Přečteno 17 828×