Apple oznámil, že iPhone a iPad jako první a jediná zařízení pro koncové uživatele splňují požadavky členských států NATO na zabezpečení informací. Díky tomu je možné je používat pro práci s utajovanými informacemi až do stupně „NATO Restricted“, a to bez nutnosti instalovat speciální software nebo měnit nastavení. Žádné jiné běžně dostupné mobilní zařízení tak vysokou úroveň státní certifikace dosud nezískalo.
Americký provozovatel streamovací platformy Netflix odmítl zvýšit nabídku na převzetí filmových studií a streamovací divize konglomerátu Warner Bros. Discovery (WBD). Netflix to ve čtvrtek oznámil v tiskové zprávě. Jeho krok po několikaměsíčním boji o převzetí otevírá dveře k akvizici WBD mediální skupině Paramount Skydance, a to zhruba za 111 miliard dolarů (2,28 bilionu Kč).
Americká společnosti Apple přesune část výroby svého malého stolního počítače Mac mini z Asie do Spojených států. Výroba v závodě v Houstonu by měla začít ještě v letošním roce, uvedla firma na svém webu. Apple také plánuje rozšířit svůj závod v Houstonu o nové školicí centrum pro pokročilou výrobu. V Houstonu by měly vzniknout tisíce nových pracovních míst.
Vědci Biotechnologické společnosti Cortical Labs vytvořili biopočítač nazvaný CL1, který využívá živé lidské mozkové buňky vypěstované z kmenových buněk na čipu. Po úspěchu se hrou PONG se ho nyní snaží naučit hrát DOOM. Neurony přijímají signály podle toho, co se ve hře děje, a jejich reakce jsou převáděny na akce jako pohyb nebo střelba. V tuto chvíli systém hraje velmi špatně, ale dokáže reagovat, trochu se učit a v reálném čase se hrou
… více »Pro testování byl vydán 4. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
Ben Sturmfels oznámil vydání MediaGoblinu 0.15.0. Přehled novinek v poznámkách k vydání. MediaGoblin (Wikipedie) je svobodná multimediální publikační platforma a decentralizovaná alternativa ke službám jako Flickr, YouTube, SoundCloud atd. Ukázka například na LibrePlanet.
TerminalPhone (png) je skript v Bashi pro push-to-talk hlasovou a textovou komunikaci přes Tor využívající .onion adresy.
Před dvěma lety zavedli operátoři ochranu proti podvrženým hovorům, kdy volající falšuje čísla anebo se vydává za někoho jiného. Nyní v roce 2026 blokují operátoři díky nasazeným technologiím v průměru 3 miliony pokusů o podvodný hovor měsíčně (tzn., že k propojení na zákazníka vůbec nedojde). Ochrana před tzv. spoofingem je pro zákazníky a zákaznice všech tří operátorů zdarma, ať už jde o mobilní čísla nebo pevné linky.
Společnost Meta (Facebook) předává React, React Native a související projekty jako JSX nadaci React Foundation patřící pod Linux Foundation. Zakládajícími členy React Foundation jsou Amazon, Callstack, Expo, Huawei, Meta, Microsoft, Software Mansion a Vercel.
Samsung na akci Galaxy Unpacked February 2026 (YouTube) představil své nové telefony Galaxy S26, S26+ a S26 Ultra a sluchátka Galaxy Buds4 a Buds4 Pro. Telefon Galaxy S26 Ultra má nový typ displeje (Privacy Display) chránící obsah na obrazovce před zvědavými pohledy (YouTube).
Zajímají vás programovací jazyky? Ještě jste neslyšeli o Elixiru? Zkusím vám ho krátce přiblížit.
Elixir je dle Wikipedie jazyk "vícero paradigmat, funkcionální, souběžný (concurrent), orientovaný na procesy a homoikonický". Pokud vám tyto termíny moc neříkají, ale Erlang něco ano, tak vězte, že se jedná o jazyk, který se překládá do Erlang VM (BEAM formát). Odtud si berou ty první čtyři termíny definice. Pátý přijde na řadu za chvíli.
Erlang je fajn jazyk. Je vyspělý, takže se vám jen tak nerozsype pod rukama (koukám na tebe, C++11). Je příjemně paralelní a distribuovaný, založený na myšlence nesdílené paměti a posílání zpráv (to řeší spoustu běžných problémů paralelních aplikací, ale přináší některé jiné). Je funkcionální, ale ne pedant (můžete bez problémů napsat printf). Všechno je výraz a má tedy hodnotu. Má pattern matching, který neuvěřitelně zkracuje kód. Má prostředky pro budování robustních aplikací. Jsou v něm psány velké projekty. Na root.cz o něm teď vychází česky psaný seriál.
Bohužel není všechno zlato, co se třpytí. Není zdaleka vhodný na všechny problémy - výše zmíněné projekty mají relativně dost věcí společných. Zároveň je v něm pár nepříjemných vlastností daných návrhem jazyka a jedna velká kategorie je syntax. V Erlangu není vždy příjemné psát. A bohužel ono pověstné "user experience" člověka může dovést k tomu, že se ho snaží vylepšit a občas zajde za hranu (jako já s makry, šablonami a lambda funkcemi v C++11).
Elixir je jazyk, který vylepšuje Erlang po stránce organizace kódu. Dosahuje toho trochu jinou syntaxí, jinými možnosti uspořádání kódu a silnými makry. Jako třešničku na dortu přidává vyřešený problém se stringy. Zde je hezké srovnání.
Syntax Erlangu byla inspirována Prologem, Smalltalkem a CSP (jak píše sám autor Erlangu), což bohužel nejsou jazyky, kterým dnešní programátoři úplně rozumí. Pro mnoho z nich proto může být těžko srozumitelný. Krom toho má pár nepraktických vlastností - jako jediné přiřazení do proměnné. Přidat transformaci promenné doprostřed funkce tak znamená najednou přepsat všechna její další použití. Nebo nelze vždy prohodit řádky, neboť poslední musí končit tečkou. Tyto nepříjemnosti člověka štvou, a on si na ně buď zvykne, nebo odejde. A ideálně stvoří něco jako Elixir.
Elixir má syntax inspirovaný především Ruby a Clojure. Tyto jazyky jsou dnes lidem bližší, takže již ze začátku jazyk působí familiárněji. Proměnné je možné přepisovat, řádky prohazovat.
-module(recursive). -export([fac/1]). fac(N) when N == 0 -> 1; fac(N) when N > 0 -> N*fac(N-1).Zdroj
defmodule Recursive do
def fac(n) when n == 0 do
1
end
def fac(n) when n > 0 do
n * fac(n - 1)
end
end
Ale tady nekončí. Oproti Erlangu nabízí polymorfismus fungující na principu protokolů. Přibyl 'pipe' operátor - ten vezme výsledek posledního výrazu a předá ho jako první argument další funkci. Výraz
scale(translate(multiply(matrix1, matrix2), vector), 0.5)se dá v Elixiru zapsat takto:
matrix1 |> multiply(matrix2) |> translate(vector) |> scale(0.5)Co je pro vás čitelnější?
Zde zase pomůže Wikipedie: je to jazyk, jehož vnitřní reprezentace (AST) je stejná jako jeho syntax (je mu izomorfní). Díky tomu lze ke kódu přistupovat a transformovat ho jako jakákoliv jiná vstupní data. Tato vlastnost vede k umožňuje velmi silná makra, která jsou přímo v jazyce a jsou "hygienická" (implicitně nekolidují s identifikátory v místě, odkud jsou vyvolána). Je tedy jednoduché a bezpečné makra psát a používat. Tato vlastnost umožňuje elegantně tvořit DSL - Domain specific languages. Toho využívá například testovací framework ExUnit, který je součástí standardní distribuce:
defmodule ProjectTest do
use ExUnit.Case
test "the truth" do
assert 1 + 1 == 2
end
end
Makro test vytvoří a zaregistruje funkci testu. ExUnit díky tomu ví o všech testech, umí je filtrovat, při chybě ví, o který test se jedná a podle toho vytiskne adekvátní chybovou zprávu. Vše použitelné jedním nově definovaným klíčovým slovem. A implementace bez nutnosti použít cokoliv jiného, než sám jazyk nabízí.
Dalším příkladem je implementace Unicode, která si při kompilaci přečte definici formátu a podle toho vygeneruje nativní kód, který za běhu již nic takového nepotřebuje. Jazyk jde dokonce tak daleko do extrému, že většina základních konstrukcí jsou interně makra.
Elixir běží na Erlang VM a lze díky tomu snadno používat všechny jeho existující nástroje a knihovny. Je zde vestavěný build nástroj mix, který spravuje projekty a umí pracovat se závislostmi. Rozvíjí se hex.pm, seznam knihoven, které lze snadno začlenit do vašeho projektu. Zároveň je s otevřeným zdrojovým kódem (Apache licence).
V rámci sebereflexe je vhodné uvést pár argumentů proti Elixiru. Je to mladý jazyk (založen 2012), takže není moc známý. Není tolik lidí, co jazyk znají a co v něm programují (a mohli by s vámi spolupracovat). Přestože už došel ke stabilní verzi 1.0, jsou v něm chyby. Není tolik dostupných zdrojů, i když se objevují nové. Je postaven na Erlangu, který je principiálně vhodný jen na určitou sadu problémů (a s tím Elixir nic moc neudělá). Paralelismus je sám o sobě obtížný a přestože metoda posílání zpráv spoustu neduhů řeší, není zdaleka všelékem. Přístup k paralelismu přináší problémy, na které člověk není z jiných jazyků zvyklý (vše se kopíruje, takže velké datové struktury umí být nepříjemně pomalé).
Nejlepší je začít na oficiální stránce. Je zde mimo jiné obsáhlý tutoriál. K dispozici je již i pár knih a série screencastů. Krom toho je spousta projektů veřejně dostupných na Githubu a komunita živě diskutuje na IRC a emailových konferencích.
Pracuji teď na demu projektu, ze kterého bych rád udělal start-up. Toto demo programuji v několika jazycích, ale jeho hlavní část je v Elixiru. Zatím mohu prozradit jen to, že cílovou skupinou jsou programátoři - takže o něm určitě ještě uslyšíte.
Tiskni
Sdílej:
je to jazyk, jehož vnitřní reprezentace (AST) je stejná jako jeho syntax (je mu izomorfní)Zcela jistě platí, že když je to stejné, tak je to i izomorfní. Naopak už to platit nemusí. Krom toho bych pochyboval o správnosti slova izomorfní v té definici.
a+b*cmůže být reprezentován jako
Expr(Plus, Var "a", Expr(Mult, Var "b", Var "c"))a bude to izomorfní reprezentace. Budete však takový jazyk nazývat homoikonický?
Každopádně mezi uvedenými výrazy nevidím velký rozdíl.Tohle ale platí pro většinu programovacích jazyků. Tím pádem to není zajímavé. Na druhou stranu, pokud budeme chtít skutečně izomorfismus mezi konkrétní syntaxí (co píše programátor) a AST, tak ten nebude skoro nikde – např. různé zápisy téhož se naparsují na 1 AST – konkrétním příkladem může být různý počet mezer na konci programu.
Tak řada jazyků nemá výsledný kód izomorfní se zdrojovým kódem - z kompilovaných jazyků to nemá žádný a například jazyky nad JVM to taky nemají (bytekód je kód zásobníkového počítače). A dokážu si představit, že když si člověk nedá pozor, tak se mohou objevit rozdíly mezi zdrojákem a AST i u čistě interpretovaných jazyků. Co jiného, než izomorfismus zdrojového a výstupního kódu by mělo být zajímavé?Každopádně mezi uvedenými výrazy nevidím velký rozdíl.Tohle ale platí pro většinu programovacích jazyků. Tím pádem to není zajímavé.
Na druhou stranu, pokud budeme chtít skutečně izomorfismus mezi konkrétní syntaxí (co píše programátor) a AST, tak ten nebude skoro nikde – např. různé zápisy téhož se naparsují na 1 AST – konkrétním příkladem může být různý počet mezer na konci programu.Nevím, proč by to měl být problém. I více reprezentací může být navzájem izomorfní. Jak to vidím já, tak programy s různým počtem mezer na konci jsou spolu izomorfní.
Nevím, proč by to měl být problém. I více reprezentací může být navzájem izomorfní. Jak to vidím já, tak programy s různým počtem mezer na konci jsou spolu izomorfní.Pokud se dva programy s různým počtem mezer na konci naparsují na stejný AST, tak už parsování nemůže být izomorfismus, neboť nemůže existovat levý inverz.
Nevím, proč by to měl být problém. I více reprezentací může být navzájem izomorfní.Pokud máte na mysli ekvivalentní místo izomorfní, tak ano.
Tak řada jazyků nemá výsledný kód izomorfní se zdrojovým kódemMyslel jsem, že tu jde o izomorfismus mezi AST a zdrojovým kódem.
Pokud se dva programy s různým počtem mezer na konci naparsují na stejný AST, tak už parsování nemůže být izomorfismus, neboť nemůže existovat levý inverz.Homoikonicita se zabývá programem na syntaktické, nikoliv lexikální úrovni.
je to jazyk, jehož vnitřní reprezentace (AST) je stejná jako jeho syntax (je mu izomorfní)a já jsem si pod syntaxí představil konkrétní syntax, tj. zdrojový kód. Ještě bych si mohl představit abstraktní syntax, tj. AST, ale to by ta definice pak byla tautologie.
BTW ten faktoriál mi přijde přehlednější v Erlangu.+1
If a language is homoiconic, it means that the language text has the same structure as its abstract syntax treeExistuji snad jazyky kde tohle neplati? Jaky smysl by melo vytvaret AST ktery nezachycuje strukturu kodu?
a(); b = c + d; e(b);Vznikne z toho strom, ve kterém kořen odpovídá celému bloku kódu a v jeho synech jsou jednotlivé příkazy, nebo z toho vznikne spoják těch příkazů? Podle toho, co potřebuju, je výhodnější buď to první, nebo to druhé. Zdrojáku pochopitelně odpovídají obě možnosti, záleží na tom, jak se na něj dívám.
Homoikonicita (jak ji chápu já) znamená, že AST je jednoduchý, přístupný a editovatelný.To by musel být zcela nevhodně zvolený pojem. Z jeho názvu se zdá, že znamená, že máš více věcí a jsou v něčem stejné, v tomto případě jsem to pochopil tak, že se mají ve struktuře shodovat kód a AST, ale to jsem vždycky považoval za samozřejmost. Jediné, co mě napadá je, že chtějí nějak explicitně vyjádřit absenci preprocessingu, optimalizací a podobných věcí. A protože jim přišlo hloupé se vytahovat absencí funkcionality (byť dobře odůvodněnou), tak tomu chtěli dát nějaký pozitivní název.
Vznikne z toho strom, ve kterém kořen odpovídá celému bloku kódu a v jeho synech jsou jednotlivé příkazy, nebo z toho vznikne spoják těch příkazů?Když z toho uděláš strom, vznikne z toho kupodivu strom. Zda je ten strom reprezentován v paměti pomocí spojových seznamů, je implementační detail. Žádné dvě možnosti v tom nevidím.
Když z toho uděláš strom, vznikne z toho kupodivu strom. Zda je ten strom reprezentován v paměti pomocí spojových seznamů, je implementační detail. Žádné dvě možnosti v tom nevidím.
Ano, AST je strom. Bavím se o tom, jak ten strom vypadá. Je plochý (otec s mnoha syny) nebo vysoký (hlava a ocas)?
Bison:
commands: command
| commands SEMICOLON command
;
Z tohohle přímočarým způsobem vyjde ten spoják. Na editaci ale není nic moc, protože ho při každé změně musím procházet.
Implementační detail to není, protože se jedná o rozhraní.
Samozřejmě, že skoro každý AST, který přímo vznikne naparsováním zdrojáku (čili bez optimalizací a tak) tomu zdrojáku odpovídá.Ty optimalizace dokonce zmiňuješ, pak je tu ještě ten preprocessing, protože makra jsou třeba v céčku řešena zcela nezávisle na AST. Na druhou stranu bych očekával, že makra pracující s AST projdou preprocesingem a z toho AST během své expanze úplně zmizí, takže by ten výsledný AST taky nemusel vypadat jako původní kód, jen by byl z něj dobře předvídatelný.
VýrazZ mého pohledu je pro takovýhle případ nejčitelnější chaining, tzn:scale(translate(multiply(matrix1, matrix2), vector), 0.5)se dá v Elixiru zapsat takto:matrix1 |> multiply(matrix2) |> translate(vector) |> scale(0.5)Co je pro vás čitelnější?
matrix1.multiply(matrix2).translate(vector).scale(0.5)
Ale o Erlangu vim prd, takže nevim, jestli tam je tohle možný...
defmodule Main do
def factorial(0) do
1
end
def factorial(n) do
n * factorial(n - 1)
end
end