<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zmatení (programovacích) jazyků</title>
	<atom:link href="http://babel.blog.root.cz/feed/" rel="self" type="application/rss+xml" />
	<link>http://babel.blog.root.cz</link>
	<description>O vývoji a návrhu programovacích jazyků</description>
	<lastBuildDate>Thu, 03 May 2012 21:11:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Naprogramujte si satelit</title>
		<link>http://babel.blog.root.cz/2012/05/03/naprogramujte-si-satelit/</link>
		<comments>http://babel.blog.root.cz/2012/05/03/naprogramujte-si-satelit/#comments</comments>
		<pubDate>Thu, 03 May 2012 21:11:36 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=435</guid>
		<description><![CDATA[Nedávno jsem se dostal k vývoji softwaru pro satelitní přijímače. Protože mi používané řešení přijde poměrně zajímavé a ne zrovna všeobecně známé, rozhodl jsem se napsat o něm pár poznatků.
K experimentům jsem použil Clarktech ET9000. Ten má procesor MIPS (na 400 MHz), 128MB úložiště na desce (flash) a 512MB operační paměti (a ještě 8 MB [...]]]></description>
			<content:encoded><![CDATA[<p>Nedávno jsem se dostal k vývoji softwaru pro satelitní přijímače. Protože mi používané řešení přijde poměrně zajímavé a ne zrovna všeobecně známé, rozhodl jsem se napsat o něm pár poznatků.</p>
<p>K experimentům jsem použil Clarktech ET9000. Ten má procesor MIPS (na 400 MHz), 128MB úložiště na desce (flash) a 512MB operační paměti (a ještě 8 MB pro bootloader). Operačním systémem je upravený Linux a nad ním Enigma.</p>
<p>Samotný systém (aspoň ten, co tam byl původně) není příliš stabilní. Po několika počátečních experimentech se přijímač zaseknul a po restartu už nenabootoval. Po rutinním flashnutí nového bootloaderu (přes USB) taky nenabootoval, tak nezbylo než flashnout celý nový image. Takto jsem poněkud nedobrovolně updatoval na nejnovější verzi Enigmy a mohl začít s vývojem.</p>
<p>Enigma je napsaná v C++ a původně se v něm psaly i pluginy. Jenže kompilovat pro MIPS je neskutečný vopruz, a tak se vývojáři rozhodli (ve verzi Enigma2) poskytnout pro pluginy jen nativní rozhraní a psát jen v nějakém (interpretovaném) jazyce na vyšší úrovni. Volba padla na Python.</p>
<p>O Pythonu jsem do té doby nevěděl téměř nic. Naštěstí je snadný na naučení a navíc dost dobře navržený. Jedná se o dynamický jazyk výrazně inspirovaný Smalltalkem, ovšem s několika vychytávkami navíc. Předně má něco na způsob <em>doesNotUnderstand</em>, takže v něm snadno napíšete proxy. Má generátory (<em>yield</em>), iterátory a "správu kontextů" (tím je myšleno něco na způsob <em>using</em> a <em>IDisposable</em> v C# pro korektní správu nepaměťových zdrojů). Python, ač primárně objektově orientovaný, podporuje také funkcionální styl programování. A v neposlední řadě moderní překladače podporují JIT.</p>
<p>Zajímavě je řešena správa paměti. Používá se čítač referencí a navíc klasický mark-and-sweep GC pro cykly referencí. Pokud jste dobří a referenčním cyklům se umíte vyhnout, můžete GC vypnout. Toto chování bylo důležité pro volbu Pythonu jako jazyka pro pluginy v Enigmě, protože tehdy byla operační paměť v běžných přístrojích opravdu malá a latence byla znát.</p>
<p>Celé řešení tak trochu připomíná Windows Phone 7 posazený na prastarém Windows Mobile. Aplikace sice píšete ve verzi Silverlightu, ale ten jen obaluje staré dobré (nebo špatné?) COM objekty. V Enigmě máte jádro v C++ a nad ním Python. Vzhledem k tomu, že typický plugin tak nanejvýš zobrazí seznam programů, umožní vám přidat časovač pro nahrávání, případně zobrazí obraz v obraze, není nic výkonnějšího potřeba. Navíc pro Python existuje množství knihoven, takže nic vám nebrání v pár řádcích načíst data, např. předpověď počasí, z nějaké webové služby a zobrazit je na obrazovce přes právě běžící program.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/05/03/naprogramujte-si-satelit/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Komu patří jazyk</title>
		<link>http://babel.blog.root.cz/2012/04/23/komu-patri-jazyk/</link>
		<comments>http://babel.blog.root.cz/2012/04/23/komu-patri-jazyk/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 07:40:24 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=429</guid>
		<description><![CDATA[Před pár lety byl Bill Gates nemálo překvapen dopisem, ve kterém byl obviňován z "intelektuálního pirátství". Tentokrát nešlo o grafické uživatelské rozhraní nebo podobný softwarový artefakt. Dopis poslala mapučská rada starších, jíž se nelíbilo, že Microsoft přeložil Windows do jejich jazyka, nazývaného mapudungun. Přitom předchozí překlad do několika jiných jazyků původních obyvatel Ameriky nikoho nepobouřil. [...]]]></description>
			<content:encoded><![CDATA[<p>Před pár lety byl Bill Gates nemálo překvapen dopisem, ve kterém byl obviňován z "intelektuálního pirátství". Tentokrát nešlo o grafické uživatelské rozhraní nebo podobný softwarový artefakt. Dopis poslala mapučská rada starších, jíž se nelíbilo, že Microsoft přeložil Windows do jejich jazyka, nazývaného mapudungun. Přitom předchozí překlad do několika jiných jazyků původních obyvatel Ameriky nikoho nepobouřil. Případ nakonec skončil u soudu. Pokud vám připadá zvláštní, že si někdo může nárokovat autorská práva na jazyk, nejste sami.</p>
<p>Lidé mají různé koníčky. Někdo sbírá známky, někdo brouky, někdo jezdí po práci na zahrádce s bagrem a někdo se soudí, kudy chodí. Nevím, jestli Larry Ellison vlastní kromě několika jachet také bagry, ale soudy jsou evidentně jeho vášní. V poslední době budí pozornost proces Oracle vs. Google. Android se prostě hlavně díky nízkým cenám rychle rozšířil a každý chce svůj kus koláče. Microsoft na to šel lstivě a místo frontálního útoku zaútočil na mnohem slabší soupeře, tj. výrobce hardwaru, což mu vynáší několikanásobně více než vlastní Windows Phone 7 (nemluvě o štědrých dotacích pro Nokii). Oraclu něco takového asi připadalo nedůstojné, protože zažaloval přímo Google. Obě obří firmy se hádají o použití Javy v Androidu, již Oracle převzal společně se Sunem.</p>
<p>Sázka na patenty Oraclu nevyšla (soud některé nepřipustil a patentový úřad jich několik dokonce zneplatnil) a běžný objekt chráněný autorským zákonem, tedy kód, používá Google pouze svůj. A zde se situace začíná podobat výše zmíněnému sporu mapučských indiánů s Microsoftem. Oracle začal tvrdit, že vlastní API Javy a Google mu musí platit, i když kromě zmíněného API je vše ostatní jeho vlastní produkce, tedy zejména knihovny a virtuální stroj (VM). Ano, je tu jeden podstatný rozdíl, mapudungun je přirozený jazyk, zatímco API Javy je uměle vytvořené. Nicméně celé to je stejné, jako kdyby Ústav pro jazyk český (nebo nějaká jiná hypotetická autorita) prohlásil, že cizinci sice mohou mluvit česky, ale nesmí přitom používat česká slova.</p>
<p>Výsledek procesu bude, narozdíl od mapučské frašky, zásadní pro celé odvětví IT. Rozhodovat bude porota, v níž sedí například řidič autobusu, sekretářka nebo listonoš (ne, to není vtip).</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/23/komu-patri-jazyk/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Objective-C populárnější než C#</title>
		<link>http://babel.blog.root.cz/2012/04/14/objective-c-popularnejsi-nez-c/</link>
		<comments>http://babel.blog.root.cz/2012/04/14/objective-c-popularnejsi-nez-c/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 11:21:24 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Programovací jazyky]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=426</guid>
		<description><![CDATA[Podle indexu TIOBE předstihlo Objective-C v popularitě C#. A nastoupený trend naznačuje, že by mohlo brzy předstihnout i C++. Otázkou samozřejmě zůstává, jak spolehlivé toto hodnocení je, vzhledem k tomu, že Java je s odstupem údajně mnohem populárnější než vše ostatní s výjimkou C.
]]></description>
			<content:encoded><![CDATA[<p>Podle indexu TIOBE předstihlo Objective-C v popularitě C#. A nastoupený trend naznačuje, že by mohlo brzy předstihnout i C++. Otázkou samozřejmě zůstává, jak spolehlivé toto hodnocení je, vzhledem k tomu, že Java je s odstupem údajně mnohem populárnější než vše ostatní s výjimkou C.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/14/objective-c-popularnejsi-nez-c/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Clang, bloky a std::function</title>
		<link>http://babel.blog.root.cz/2012/04/11/clang-bloky-a-stdfunction/</link>
		<comments>http://babel.blog.root.cz/2012/04/11/clang-bloky-a-stdfunction/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 17:16:29 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Programovací jazyky]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=417</guid>
		<description><![CDATA[Uživatele clangu potěší, že můžou napsat něco jako
std::function&#60;void()&#62; lambda = ^{ /* neco */ };
(Při překladu je nutné použít volbu -stdlib=libc++, se standardním libstdc++ se kód nepřeloží.)
Člověk by přitom naivně předpokládal, že vzhledem k explicitní deklaraci se už o správu paměti nemusí starat. Jenže pokud proměnnou lambda například vrátíte z funkce, blok zanikne (protože je na [...]]]></description>
			<content:encoded><![CDATA[<p>Uživatele clangu potěší, že můžou napsat něco jako</p>
<p><code>std::function&lt;void()&gt; lambda = ^{ /* neco */ };</code></p>
<p>(Při překladu je nutné použít volbu <em>-stdlib=libc++</em>, se standardním <em>libstdc++</em> se kód nepřeloží.)</p>
<p>Člověk by přitom naivně předpokládal, že vzhledem k explicitní deklaraci se už o správu paměti nemusí starat. Jenže pokud proměnnou <em>lambda</em> například vrátíte z funkce, blok zanikne (protože je na zásobníku). Zdá se, že pro vývojáře clangu je více než bezpečnost důležitější maximální výkon (a proto nechávají blok na zásobníku). Dokud tedy nebude clang podporovat lambda výrazy podle C++11, zůstaneme odkázáni na vlastní wrapper, jenž korektně (a transparentně) překopíruje blok v případě potřeby ze zásobníku na haldu.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/11/clang-bloky-a-stdfunction/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Správa paměti v C++</title>
		<link>http://babel.blog.root.cz/2012/04/11/sprava-pameti-v-c/</link>
		<comments>http://babel.blog.root.cz/2012/04/11/sprava-pameti-v-c/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 09:08:01 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Programovací jazyky]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=411</guid>
		<description><![CDATA[Na diskusních fórech se stále dokola opakuje tvrzení, že v C++ hrozí úniky paměti, že je na ně náchylné, případně že je pro programátora náročné psát kód bez úniků paměti a že právě proto je psaní kódu v C++ méně efektivní. Kdo toto tvrdí, je veleosel.
Sám tvůrce C++ Bjarne Stroustrup vysvětluje, jak správa paměti vzhledem [...]]]></description>
			<content:encoded><![CDATA[<p>Na diskusních fórech se stále dokola opakuje tvrzení, že v C++ hrozí úniky paměti, že je na ně náchylné, případně že je pro programátora náročné psát kód bez úniků paměti a že právě proto je psaní kódu v C++ méně efektivní. Kdo toto tvrdí, je veleosel.</p>
<p>Sám tvůrce C++ Bjarne Stroustrup vysvětluje, jak správa paměti vzhledem k objektům funguje, nemá cenu vše opakovat. Stručně shrnuto, díky RAII se paměť uvolňuje automaticky, jakmile se proměnná dostane mimo lexikální rozsah platnosti, čímž je zajištěna korektkní správa paměti i v případě výjimek nebo jiného typu opuštění funkce někde zprostředka. Pokud se instance objektu nepředává referencí, typicky se použije <em>move</em> konstruktor (jeho použití si lze vynutit v případech, kdy by ho překladač nepoužil explicitně). Celá STL tyto konstruktury používá. Kdo se chce vyhnout <em>move</em> sémantice úplně, použije <em>shared_ptr</em> (nebo nějaký jiný <em>xxx_ptr</em> podle toho, co vlastně potřebuje) a k tomu <em>make_shared</em>, čímž opět přenechá správu paměti překladači a STL.</p>
<p>Výhoda GC spočívá v deterministické alokaci (v C++ můžete mít svůj alokátor, ale ten standardní deterministický není). Platíte za to ovšem nedeterministickým uvolňováním paměti (a hlavně vyšším footprintem). Opět lze namítnout, že existují deterministické GC, jenže ty se používají jen ve speciálních případech (typicky real-time systémech, i když tam se většinou GC nepoužívá vůbec), neboť mají spoustu jiných nevýhod.</p>
<p>Kdo stále ještě nechápe, nechť se prosím nevěnuje programování.</p>
<p><strong>P.S.</strong> Některá rozšíření C(++) jdou ještě dále, co se týká činnosti překladače. V Objective-C(++) se díky ARC nemusíte starat o uvolňování, prostě jen alokujete. Navíc překladač inteligentně vyhazuje instrukce pro aktualizace čítače referencí všude tam, kde nejsou potřeba, a takových případů je většina (pokud to řeší knihovna bez podpory překladače, jako např. STL, není taková optimalizace možná). Velice podobnou optimalizaci ma C++/CX ve Windows 8, také jen alokujete (pomocí <em>ref new</em>) a instrukce pro správu čítače referencí generuje překladač jen tam, kde jsou nezbytné.</p>
<p><strong>P.P.S.</strong> Je vhodné doplnit (v reakci na diskusi), že použití operátoru <em>new</em> se lze prakticky vždy vyhnout. Je-li z nějakého důvodu žádoucí použít explicitní ukazatel, nahradí jej <em>make_shared</em>. Jedinou výjimkou, která mě napadá, je použití nativní třídy v řizené třídě v C++/CLI. Tam překladač vyžaduje <em>raw pointer</em>. K uvolnění paměti se na první pohled nabízí metoda <em>!Trida</em> (finalizér). Správné je ovšem použití řízeného destruktoru <em>~Trida</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/11/sprava-pameti-v-c/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Apple a jazyk</title>
		<link>http://babel.blog.root.cz/2012/04/07/apple-a-jazyk/</link>
		<comments>http://babel.blog.root.cz/2012/04/07/apple-a-jazyk/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 22:43:08 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Zpracování přirozeného jazyka]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=402</guid>
		<description><![CDATA[Cocoa v OS X 10.7 (Lion) a iOS 5 obsahuje velice zajímavou třídu: NSLinguisticTagger. Co to je tagger? Agentivní substantivum od to tag, kteréžto sloveso je odvozené od substantiva tag, jež znamená "značka". V kontextu zpracování přirozeného jazyka můžeme méně krkolomně napsat, že se jedná o komponentu, jež morfologicky analyzuje (a zpravidla zjednoznačňuje) text.
Mějme například [...]]]></description>
			<content:encoded><![CDATA[<p>Cocoa v OS X 10.7 (Lion) a iOS 5 obsahuje velice zajímavou třídu: <em>NSLinguisticTagger</em>. Co to je tagger? Agentivní substantivum od <em>to tag</em>, kteréžto sloveso je odvozené od substantiva <em>tag</em>, jež znamená "značka". V kontextu zpracování přirozeného jazyka můžeme méně krkolomně napsat, že se jedná o komponentu, jež morfologicky analyzuje (a zpravidla zjednoznačňuje) text.</p>
<p>Mějme například tento vstup:</p>
<p><code>NSString* text = @"The girl reads books.";</code></p>
<p>Obvyklým způsobem můžeme získat instanci taggeru:</p>
<p><code>NSLinguisticTagger* tagger = [[[NSLinguisticTagger alloc] initWithTagSchemes: [NSArray arrayWithObject: NSLinguisticTagSchemeNameTypeOrLexicalClass] options: 0] autorelease];</code></p>
<p>Použití je velmi jednoduché:</p>
<p><code>[tagger setString: text];<br />
[tagger enumerateTagsInRange: NSMakeRange(0, [text length])<br />
scheme: NSLinguisticTagSchemeNameTypeOrLexicalClass<br />
options: 0<br />
usingBlock: ^(NSString* tag, NSRange tokenRange, NSRange sentenceRange, BOOL* stop) {<br />
if ([tag isEqualToString: NSLinguisticTagWhitespace] == NO) {<br />
NSLog(@"%@ %@", [text substringWithRange: tokenRange], tag);<br />
}<br />
}];</code></p>
<p>Výsledkem bude toto:</p>
<p><code>The Determiner<br />
girl Noun<br />
reads Verb<br />
books Noun<br />
. SentenceTerminator</code></p>
<p>Samotné POS tagy (POS=part of speech, tedy slovní druh) pocházejí z primitivní databáze. Mnohem složitější je ale zjednoznačnění. Zkuste například tento text:</p>
<p><code>NSString* text = @"The flight he books.";</code></p>
<p>Zcela v souladu s anglickou gramatikou dostaneme pro slovo <em>books</em> nyní "books Verb". Možná vám to přijde samozřejmé, ale algoritmy pro tagger jsou velmi složité, buď jde o nějaký typ unifikační gramatiky, nebo o HMM (Hidden Markov Model) založený obvykle na trigramech vzatých z ručně anotovaného korpusu. Obvyklejší je asi použití HMM, neboť se dá vyvinout rychleji (stačí nějaký dostatečně velký anotovaný korpus). Přiřazení tagů slovům se provede Viterbiho algoritmem.</p>
<p>Pro většinu úloh je sice tato třída nedostatečná (dává jen POS, ne další většinou nezbytné informace o morfologii), ale pro základní hraní třeba s bezkontextovými gramatikami postačuje.</p>
<p><strong>NB: </strong>Pokud vás zajímají všechny možné tagy pro dané slovo, můžete použít metodu <em>possibleTagsAtIndex</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/07/apple-a-jazyk/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pokrok nezastavíš&#8230;</title>
		<link>http://babel.blog.root.cz/2012/04/05/pokrok-nezastavis/</link>
		<comments>http://babel.blog.root.cz/2012/04/05/pokrok-nezastavis/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 10:41:47 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=406</guid>
		<description><![CDATA[Před několika lety měl můj hlavní počítač procesor G4 (1,5 GHz) a 1 GB paměti (to jsem si ovšem musel připlatit). Protože ještě stále funguje (občas používám jeho DVD mechaniku, na notebooku se odebrala do věčných lovišť), pustil jsem nedávno jen tak z hecu jeden program v C++ na tomto počítači a na moderním ARM.
Porovnání [...]]]></description>
			<content:encoded><![CDATA[<p>Před několika lety měl můj hlavní počítač procesor G4 (1,5 GHz) a 1 GB paměti (to jsem si ovšem musel připlatit). Protože ještě stále funguje (občas používám jeho DVD mechaniku, na notebooku se odebrala do věčných lovišť), pustil jsem nedávno jen tak z hecu jeden program v C++ na tomto počítači a na moderním ARM.</p>
<p>Porovnání není úplně košer (o to ani nešlo), na G4 jsem použil GCC 4.8 (clang by tam šel dost těžko), naopak pro ARM jsem kód přeložil clangem (z GCC bych na ARM nedostal novou standardní knihovnu). Výsledky jsou nepříliš překvapivé.</p>
<p>"Stará" gé-čtyřka je zhruba stejně rychlá jako A4 (procesor ve starých iPadech a iPhonech 4). Procesor A5 (stejně jako ona A4 na 1 GHz) je o 30-40% rychlejší (kód běžel na jednom jádře). Jinými slovy, na čem mi před pár lety běžel javovský server s rozsáhlým podnikovým systémem, teď nosím v kapse (a současné počítače jsou pochopitelně mnohem rychlejší, i5 na 1,7 GHz cca. pětkrát, opět pouze na jednom jádře). Jsem velice zvědavý na výkon nové generace ARM procesorů, které se snad už brzy dočkáme (ne že by to v mobilu k něčemu bylo...).</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/05/pokrok-nezastavis/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Jak Microsoft (ne)opravuje bugy</title>
		<link>http://babel.blog.root.cz/2012/04/05/jak-microsoft-neopravuje-bugy/</link>
		<comments>http://babel.blog.root.cz/2012/04/05/jak-microsoft-neopravuje-bugy/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 09:54:26 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=404</guid>
		<description><![CDATA[Když vyšlo na podzim první dev preview Windows 8, docela mě bavilo "hrabat" se ve WinRT, jelikož to bylo něco nového. Podobnost C++/CX s ObjC a Cocoa (jistě "čistě náhodná") sváděla k porovnání různých koceptů. Protože ve WinRT má Microsoft kvůli návaznosti na jiné jazyky (a zejména .NET, tedy CLR) tzv. "projekce", nelze lambda výrazy [...]]]></description>
			<content:encoded><![CDATA[<p>Když vyšlo na podzim první dev preview Windows 8, docela mě bavilo "hrabat" se ve WinRT, jelikož to bylo něco nového. Podobnost C++/CX s ObjC a Cocoa (jistě "čistě náhodná") sváděla k porovnání různých koceptů. Protože ve WinRT má Microsoft kvůli návaznosti na jiné jazyky (a zejména .NET, tedy CLR) tzv. "projekce", nelze lambda výrazy používat přímo, ale zabalují se do "delegátů". Takový delegát se chová stejně jako C++/CX komponenta, tedy zejména má čítač referencí. Na druhou stranu zabalená lambda je nativní C++ objekt a správa paměti (např. při přesunu ze zásobníku na haldu) se řeší kopírováním (nebo novým <em>move</em>). Člověk by čekal, že použití instance komponenty v lambda výrazu jí zvýší čítač referencí a po zániku lambda výrazu jej opět sníží. Tak to i funguje, než ovšem předáte lambda výraz delegátu, kde správa paměti selže a máte memory leak jak vyšitý.</p>
<p>Připomeňme, že Apple, ať už s ARC nebo bez, automaticky zvyšuje čítač referencí (pokud se nepoužije <em>__block</em>, <em>__weak</em> nebo podobný modifikátor), přičemž bloky (obdoba lambda výrazů podle normy) včetně kontextu (closure) kopíruje ze zásobníku na haldu automaticky. Dokud nevytvoříte referenční cyklus (což je u bloků poměrně časté, aniž by si toho člověk všimnul, vzhledem k implicitnímu <em>self</em> u instančních proměnných), vše šlape hladce (blok samotný se chová jako ObjC objekt a má svůj čítač referencí).</p>
<p>V říjnu jsem na tento problém ve WinRT upozornil (na fóru a následně v bug trackingu), reakce byla (po řadě) skepse ("to je tak jednoduchý koncept, tam nemůže být bug"), údiv, uznání a nakonec slíbení nápravy v beta verzi. Schválně si to zkuste teď, co myslíte, došlo k opravě?</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/04/05/jak-microsoft-neopravuje-bugy/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Chart parsing a NP-úplnost</title>
		<link>http://babel.blog.root.cz/2012/03/30/chart-parsing-a-np-uplnost/</link>
		<comments>http://babel.blog.root.cz/2012/03/30/chart-parsing-a-np-uplnost/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 20:05:08 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Zpracování přirozeného jazyka]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=395</guid>
		<description><![CDATA[Už jsem zde stručně představil unifikační gramatiky. Také jsem uvedl, že algoritmus pro parsing podle takové gramatiky je NP-úplný (tj. v nejhorším případě zřejmě exponenciální). Typická unifikační gramatika má generativní sílu větší než bezkontextové gramatiky a dokonce větší než mírně kontextové (angl. mildly context-sensitive), tzn. že délka slova při aplikaci pravidel roste více než lineárně [...]]]></description>
			<content:encoded><![CDATA[<p>Už jsem zde stručně představil unifikační gramatiky. Také jsem uvedl, že algoritmus pro parsing podle takové gramatiky je NP-úplný (tj. v nejhorším případě zřejmě exponenciální). Typická unifikační gramatika má generativní sílu větší než bezkontextové gramatiky a dokonce větší než mírně kontextové (angl. mildly context-sensitive), tzn. že délka slova při aplikaci pravidel roste více než lineárně (např. exponenciálně).</p>
<p>Vzhledem k velké výpočetní i prostorové složitosti algoritmu se používá pro parsing dynamické programování. Speciální datová struktura <em>chart</em> reprezentuje dílčí zpracované podřetězce, čímž výrazně zvyšuje rychlost parsingu (omezením backtrackingu, algoritmus ovšem i nadále zůstane exponenciální).</p>
<p>Chart parsing je typu bottom-up, takže nemá problém s levou rekurzí a v případě zkracujících pravidel vždy skončí (takové gramatiky ovšem nejsou v praxi běžné). Časová náročnost algoritmu není u reálných gramatik až tak strašná, vzhledem k používání dalších omezujících podmínek (subkategorizace) je parsing většinou polynomiální. Spolehnout se na to ale nelze.</p>
<p>Koho problematika zajímá, snadno na internetu najde články k tématu např. od Hanse Uszkoreita.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/03/30/chart-parsing-a-np-uplnost/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows (Phone) 8</title>
		<link>http://babel.blog.root.cz/2012/03/25/windows-phone-8/</link>
		<comments>http://babel.blog.root.cz/2012/03/25/windows-phone-8/#comments</comments>
		<pubDate>Sun, 25 Mar 2012 10:59:34 +0000</pubDate>
		<dc:creator>zboj</dc:creator>
				<category><![CDATA[Nezařazené]]></category>

		<guid isPermaLink="false">http://babel.blog.root.cz/?p=387</guid>
		<description><![CDATA[Britský The Guardian nedávno uveřejnil článek, ve kterém nabádá Microsoft, aby se pro své budoucí tablety vykašlal na plnohodnotný systém a dal tam jednoduchý OS z Windows Phone. Argumentace je zhruba taková, že Apple udělal to samé a iPad je zdaleka nejpopulárnějším tabletem.
Jak je to s těmi procesory
Panu redaktorovi asi uniklo, že Microsoft právě toto [...]]]></description>
			<content:encoded><![CDATA[<p>Britský The Guardian nedávno uveřejnil článek, ve kterém nabádá Microsoft, aby se pro své budoucí tablety vykašlal na plnohodnotný systém a dal tam jednoduchý OS z Windows Phone. Argumentace je zhruba taková, že Apple udělal to samé a iPad je zdaleka nejpopulárnějším tabletem.</p>
<p><strong>Jak je to s těmi procesory</strong></p>
<p>Panu redaktorovi asi uniklo, že Microsoft právě toto už nějakou dobu dělá. Podle dosud známých informací víme, že Windows 8 na procesorech ARM nebude podporovat jiný typ aplikací než Metro (tyto aplikace poběží nad novým WinRT), a také víme, že nová verze OS pro Windows Phone bude také využívat WinRT (jen zatím nevíme, jak se bude jmenovat). Jinými slovy, pokud napíšete aplikaci pro Metro, poběží na desktopu, tabletu i telefonu bez sebemenšího zásahu do kódu (krom přízpůsobení GUI pro různou velikost displejů). Jen ji musíte přeložit pro Intel i ARM.</p>
<p>Zpětně se ukazuje, že systém Windows Phone 7 měl jen vyplnit mezeru mezi zoufale zastaralým předchůdcem a zcela novým WinRT ve Windows 8. Současné aplikace pro WP7 pochopitelně na novém systému poběží (snal lépe než androidí aplikace na Blackberry) a vývojářům konečně nikdo nebude diktovat, jak a v čem můžou psát své aplikace. Je příznačné, že ze všech velkých mobilních OS pouze pro WP7 nelze psát v C++, což je možná jedno pro GUI, ale ne pro složité knihovny, jejichž vývoj stál pár člověkolet.</p>
<p><strong>Moderní OS, moderní vývoj</strong></p>
<p>Řízený kód se všemi vymoženostmi od snadné přenositelnosti přez bajtkód až po primitivní (z hlediska programátora) správu paměti je možná vhodný pro serverové aplikace, ovšem už méně pro mobilní zařízení. Byť dnešní slušné tablety už vesměs mají 1GB RAM, výkonnou grafiku a dvoujádrový procesor ARMv7 je pekelně rychlý (i pro většinu výpočetně náročnějších algoritmů), stále je ale nutné kód (OS i aplikací) psát s ohledem na cílové zařízení, což v první řadě znamená brát ohled na výdrž baterie. První to pochopil Apple, nicméně i vyjádření S. Sinofského na jeho blogu se nesou ve stejném duchu: zpět k nativnímu kódu, minimalizovat spotřebu RAM (čím více RAM, tím větší spotřeba energie), omezit multitasking.</p>
<p>Klíčem k vývoji pro Windows (Phone) 8 je nová verze C++ - C++11 (dříve C++0X). Nebyl by to Microsoft, aby si ho nepřiohnul k obrazu svému (ano, mám na mysli C++/CX), to je ovšem jen trošku modernější (a implementačně podařený) klon Objective-C a jeho rozsáhlých knihoven (Cocoa a spol.).</p>
<p><strong>Úspěch?</strong></p>
<p>O tom, zda bude Windows 8, ať už na tabletech či telefonech, komerčním úspěchem, rozhodne nikoliv technologická vyspělost systému, ale - ne, překvapení se nekoná - prodejní strategie. Pokud pominu vizuální vzhled Metra (ten nijak nehodnotím, je to subjektivní záležitost), jde o to mít kvalitní hardware za rozumnou cenu. Microsoft si se svou pověstí a historií těžko může dovolit prodávat průměrný tablet za 500 dolarů nebo dokonce ještě více. Dobrý hardware (něco à la Playbook, tedy dvoujádro, 1GB RAM, kvalitní zpracování) s Windows 8 za cenu tabletu Amazon Fire by si svůj trh snad najít mohl.</p>
]]></content:encoded>
			<wfw:commentRss>http://babel.blog.root.cz/2012/03/25/windows-phone-8/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
	</channel>
</rss>

