Je Objective-C moderní jazyk?

19. 11. 2011 18:49 zboj

Objective-C získalo v posledních letech díky rozšíření iOS na popularitě (viz Tiobe index). Pokud jste ObjC kdysi (před ObjC 2.0) viděli a stále soudíte podle tehdejšího dojmu, možná vás překvapí, že současná verze jazyka  je podstatně jiná.

Nejprve se velice stručně podívejme na vývoj ObjC:

  • původní verze (Cox, Love),
  • verze NeXTu,
  • verze Sunu (OpenStep), zde šlo ovšem spíše o změny v knihovnách, ne jazyka jako takového,
  • první verze Applu (zde šlo také ne o jazyk, ale knihovny a runtime),
  • ObjC 2.0 (přibyly např. vlastnosti značně usnadňující správu paměti),
  • lambda výrazy (od verze OS X 10.6/iOS 4.0),
  • nový překladač (clang/LLVM) s rozšířeným runtimem,
  • ARC (automatic reference counting).

Dříve bylo nutné deklarovat instanční proměnné v @interface (z implementačních důvodů), teď už to je možné v @implementation, kam ostatně věci toho typu patří. Například:

@implementation { id something; } @end

Jako prakticky všechny moderní jazyky (možná kromě Javy, ta má ale ekvivalentní anonymní třídy) má teď ObjC lambda výrazy:

[array sortUsingComparator: ^(id obj1, id obj2) { return [[obj1 name] compare: [obj2 name]]; }];

Nejnovější verze překladače zajišťuje automatickou správu paměti (i na iOS). S tím souvisí podpora slabých referencích (__weak) a změněná deklarace instančních proměnných:

@property (nonatomic, weak) id delegate;

Překladač nyní také přísněji kontroluje typy (pokud se nepoužije id), místo některých varování hází chybu. A fungují @private, @protected apod. (dříve jen varování ve stylu „This will not work in future versions“).

V neposlední řadě lze používat C++ a novou standardní knihovnu (libc++), která implementuje C++11 a je značně rychlejší (a navíc open source). Máte-li kód v C++, který chcete použít pod OS X nebo iOS, není nic snazšího než vytvořit si pro něj wrapper v ObjC (podobně jako to je možné v C++/CLI pod Windows). Pro C++ ARC pochopitelně nefunguje.

Sečteno a podtrženo, současná verze ObjC má vše, co ostatní moderní jazyky, kromě odlišné syntaxe není problém přejít z Javy nebo C#. Dny bez výjimek (ještě Apple ze začátku používal makra se setjmp a longjmp) jsou dávno pryč.

Sdílet

  • 21. 11. 2011 10:30

    Albert Blaho (neregistrovaný)

    Java má tu výhodu, že je memory-safe, protože nemá pointery. C# je to stejné, jen má navíc explicitní "unsave" sekce.

    Čisté C++, kde jsou jen reference a šablony a žádná pointerová aritmetika by mělo být taky skoro "safe". ObjC by na tom mělo být stejně, pointerová aritmetika tam je, ale typicky není potřeba.

    ObjC je snad poslední relativně rozšířený jazyk, ve kterém jsem nedělal. Jsem zvědavý zda a kdy to přijde.

  • 21. 11. 2011 10:49

    PH (neregistrovaný)

    V C++ by se nemělo vůbec používat new (nanejvýš nepřímo přes make_shared), s move sémantikou v C++11 je lepší používat value typy. Pak je vše bezpečné.
    ObjC je absolutně bezpečné, když se použije ARC (a nepoužije CoreFoundation nebo nějaký jiný kód v čistém C). Tedy bezpečné ve smyslu, že nikdy nedojde k ilegálnímu přístupu do paměti, úniky paměti lze vytvořit stejně. Nový runtime totiž nuluje slabé reference. Foundation a AppKit (knihovny) jsou bezpečné, např. u polí se kontrolují indexy apod. Tak trochu to funguje jako managed code+managed data nad CLR. Jakmile v ObjC použiju nízkoúrovňové C, je to jako unmanaged data v CLR a bezpečnost je fuč. (ARC je vymoženost posledních pár měsíců.)