Dnes a zítra probíhá vývojářská konference Google I/O 2025. Sledovat lze na YouTube a na síti 𝕏 (#GoogleIO).
V Bostonu probíhá konference Red Hat Summit 2025. Vybrané přednášky lze sledovat na YouTube. Dění lze sledovat na síti 𝕏 (#RHSummit).
Společnost Red Hat oficiálně oznámila vydání Red Hat Enterprise Linuxu 10. Vedle nových vlastností přináší také aktualizaci ovladačů a předběžné ukázky budoucích technologií. Podrobnosti v poznámkách k vydání.
Tuto sobotu 24. května se koná historicky první komunitní den projektu Home Assistant. Zváni jsou všichni příznivci, nadšenci a uživatelé tohoto projektu. Pro účast je potřebná registrace. Odkazy na akce v Praze a v Bratislavě.
Troy Hunt představil Have I Been Pwned 2.0, tj. nový vylepšený web služby, kde si uživatelé mohou zkontrolovat, zda se jejich hesla a osobní údaje neobjevily v únicích dat a případně se nechat na další úniky upozorňovat.
Microsoft představil open source textový editor Edit bežící v terminálu. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
V Seattlu a také online probíhá konference Microsoft Build 2025. Microsoft představuje své novinky. Windows Subsystem for Linux je nově open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.
Z příspěvku Turris Sentinel – co přinesl rok 2024 na blogu CZ.NIC: "Za poslední rok (únor 2024 – únor 2025) jsme zachytili 8,3 miliardy incidentů a to z 232 zemí a z jejich závislých území. Tyto útoky přišly od 6,2 milionu útočníků (respektive unikátních adres). SMTP minipot je stále nejlákavější pastí, zhruba 79 % útoků bylo směřováno na tento minipot, 16 % útoků směřovalo na minipot Telnet, 3 % útoků směřovaly na minipot HTTP a 2 % na minipot FTP. Dále jsme zaznamenali 3,2 milionu unikátních hesel a 318 tisíc unikátních loginů, které útočníci zkoušeli."
Byla vydána (Mastodon, 𝕏) nová verze 3.0.4 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.
Byla vydána nová stabilní verze 7.4 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 136. Přehled novinek i s náhledy v příspěvku na blogu.
V tomto zápisku vám představím skriptovací jazyk (včetně jeho interpretu), který byl důvodem pro vytvoření generátoru překladačů yapgen. Jazyk se jmenuje uclang a popisuji jej jako dynamicky typovaný, objektově orientovaný, vysokoúrovňový, programovací jazyk.
Tento zápisek obsahuje jen ukázky některých základních vlastností skriptovacího jazyka. Nechci se v něm podrobně rozepisovat o implementačních detailech a motivaci k jeho vytvoření. Zmíním pouze v odrážkách několik bodů týkajících se motivace a zacílení jazyka:
Zde uvádím výčet několika základních vlastností jazyka uclang, které jej charakterizují.
Syntaxe jazyka uclang je odvozena od syntaxe jazyka C/C++ s prvky vypůjčenými z jazyka Java. Prvky syntaxe převzaté z jazyka Java se týkají převážně dědičnosti a zápisů týkajících se dědičnosti.
class Main
{
static fact(num)
{
result = 1;
while (num > 1) result *= num--;
return result;
}
static public main(argv)
{
("fact(10): %d\n" % fact(10)).print();
}
}
Výstup skriptu:
fact(10): 3628800
Jazyk je silně objektově orientovaný. Všechny hodnoty v jazyce jsou reprezentovány objekty a je s nimi jako s objekty zacházeno.
class Main
{
static public main(argv)
{
"String is object\n".print();
num = new Float(9);
("9.0.sqrt(): %f\n" % 9.0.sqrt()).print();
("num.sqrt(): %f\n" % num.sqrt()).print();
}
}
Výstup skriptu:
String is object
9.0.sqrt(): 3.000000
num.sqrt(): 3.000000
Jazyk neobsahuje globální funkce, všechny operace realizované skriptem jsou prováděny metodami jednotlivých objektů. Je definováno několik globálních operací, které není možné realizovat prostřednictvím metod objektů, mezi tyto patří například: new
, free
a type
, které slouží k vytvoření nového objektu, okamžitému uvolnění reference na objekt, a získání identifikace typu objektu.
class Main
{
static public main(argv)
{
integer = new Integer("0xff");
("integer: %d\n" % integer).print();
variable = 10;
("variable: %s\n" % variable.to_string()).print();
free variable;
("variable: %s\n" % variable.to_string()).print();
"types:".print();
(" %s" % (type 1000000).to_string()).print();
(" %s" % (type 10000.0).to_string()).print();
(" %s" % (type "Hello").to_string()).print();
(" %s" % (type [1,2,3]).to_string()).print();
"\n".print();
}
}
Výstup skriptu:
integer: 255
variable: 10
variable: <blank>
types: Integer Float String Array
Popis tříd je oddělen od jejich instancí. Při běhu programu zůstává popis tříd neměnný, obdobně jako v jazyce C/C++. Při překladu zdrojového souboru a následném generování byte kódu proběhne statická analýza založená na výše uvedené vlastnosti jazyka.
class RightName
{
public RightName() {}
}
class Main
{
static public main(argv)
{
right_object = new RightName(); // - OK -
wrong_object = new WrongName(); // - ERROR -
}
}
Chybový výstup (při překladu skriptu):
----------------------------------------
1. ERROR: in file: "_modules/docu.ucl" on line: 11
wrong_object = new WrongName(); // - ERROR -
Class name WrongName cannot be resolved
----------------------------------------
Dědičnost v jazyce uclang je implementována pomocí klíčového slova extends
v rámci deklarace třídy. Klíčovým slovem abstract
je možné definovat třídy reprezentující rozhraní s abstraktními metodami. Metody je možné proti přepsání (overload) chránit klíčovým slovem final
.
class Parent {}
class Child extends Parent {}
abstract class StorageBase
{
abstract public size();
abstract public used();
final public dummy() {}
}
class StorageNull extends StorageBase
{
public size() { return 0; }
public used() { return 0; }
public dummy() {} // - ERROR -
}
class Main
{
static public main(argv) {}
}
Chybový výstup (při překladu skriptu):
----------------------------------------
1. ERROR: in file: "_modules/docu.ucl" on line: 15
public dummy() {} // - ERROR -
^
Class StorageNull cannot override final method StorageBase.dummy#0
----------------------------------------
Jazyk provádí dynamickou typovou kontrolu. Interpret jazyka neprovádí žádné implicitní konverze dat, např.: mezi řetězci, číselnými typy apod. V případě, že je metodě předán parametr, který neumí zpracovat je vyhozena výjimka informující o chybě.
class Main
{
static public main(argv)
{
number = 0;
string = "Hello";
number += 10; // - OK -
number += "10"; // - ERROR -
string += " world!"; // - OK -
string += 10; // - ERROR -
}
}
Výstup skriptu:
----------------------------------------
Exception: ERROR: in file: "_modules/docu.ucl" on line: 9
number += "10"; // - ERROR -
Method Integer.operator_binary_plus_equal#1 is not defined for parameter/s: (String)
----------------------------------------
Jak je pravděpodobně zřejmé z již uvedených příkladů, chybové operace v jazyce uclang vyhazují výjimky. Vyhazované výjimky obsahují popis chyby, která nastala a informace umožňující lokalizaci zdroje této chyby.
class Main
{
static public main(argv)
{
str = "Number: %d,%d,%d" % [1,2,3,4];
}
}
Výstup skriptu:
----------------------------------------
Exception: ERROR: in file: "_modules/docu.ucl" on line: 5
str = "Number: %d,%d,%d" % [1,2,3,4];
Not all arguments converted during string formatting
----------------------------------------
Interpret jazyka umožňuje běh skriptu ve více vláknech, jejichž synchronizaci musí zajistit programátor pomocí standardních prostředků. Interpret jazyka uclang neobsahuje žádný GIL (Global Interpreter Lock). Nové vlákno se spouští zavoláním statické funkce označené klíčovým slovem parallel
.
static public parallel do_work(a_count)
{
result = 0;
idx = 0;
while (idx < a_count)
{
result += idx++;
}
return result;
}
static public main(argv)
{
thread = do_work(100);
...
result = thread.join();
("result: %d\n" % result).print();
}
Výstup skriptu:
result: 4950
Modulový systém umožňuje vytvářet moduly v jazyce C/C++, reprezentované dynamickými knihovnami operačního systému. Vestavěné typy jazyka jsou implementovány v rámci modulu base
, který je importován při každém spuštění interpreta. Práce s vestavěnými datovými typy (v rámci interpretu) je shodná s prací s jinými datovými typy implementovanými v C/C++ modulech.
import containers;
class Main
{
static public main(argv)
{
dict = new Dict();
dict[1] = "Number";
dict["Hello"] = "String";
dict[[1,2,3,4]] = "Array";
dict[new Dict([1,2,3,4])] = "Dict";
("%s\n" % dict[1]).print();
("%s\n" % dict["Hello"]).print();
("%s\n" % dict[[1,2,3,4]]).print();
("%s\n" % dict[new Dict([1,2,3,4])]).print();
}
}
Výstup skriptu:
Number
String
Array
Dict
Všechny objekty tříd implementujících metodu compare#1
porovnávající objekt s objektem stejného typu, jsou porovnatelné se všemi definovanými objekty. Implementace datových typů Tree
, Set
a Dict
využívají red-black strom pro uložení jednotlivých prvků, respektive klíčů.
import containers;
class Key
{
m_id;
public Key(a_id) { m_id = a_id; }
public compare(a_second)
{
return m_id.compare(a_second.m_id);
}
public to_string()
{
return "Key(%d)" % m_id;
}
}
class Main
{
static public main(argv)
{
dict = new Dict();
idx = 0;
do {
dict[new Key(idx)] = "*"*idx;
} while(++idx < 7);
("dict: %s\n" % dict.to_string()).print();
}
}
Výstup skriptu:
dict: [Key(0):,Key(1):*,Key(2):**,Key(3):***,Key(4):****,Key(5):*****,Key(6):******]
Interpret jazyka byl zamýšlen pro běh na embedded zařízeních s operačním systémem linux či podobným. Interpret samotný a jeho základní moduly nejsou závislé na žádných knihovnách třetích stran. Interpret a jeho základní moduly jsou multiplatformní, doposud testováno na platformách: linux (x86, arm, mpc5200), android (arm), raspberry pi (arm) a win (xp,7).
Jazyk a jeho interpret jsem ze začátku tvořil ze zvědavosti, ale později se ukázal i jako vhodný nástroj pro lepení C/C++ knihoven a při řešení některých úloh. Pokud by vám to nevadilo, občas by jsem se tu upsal o nějaké jeho zajímavé vlastnosti, případně o problému, který jsem musel při implementaci řešit, apod.
Odkazy na zdrojové soubory interpretu jazyka uclang.
Demonstrace použití některých modulů prostřednictvím samostatných skriptů. Embryonální fáze dokumentace. Dokumentace některých modulů prostřednictvím skriptů demonstrujících jejich vlastnosti.
Překladač, který je součástí interpretu jazyka uclang byl vygenerován programem yapgen. Implementace interpretu jazyka uclang byla realizována nad kontejnery generovanými programem cont.
Tiskni
Sdílej:
Tak je to takove horsi D a s mensim vykonem. Kazdopadnej zajimavej projekt.
zato U++ je orientované na programátorov C++ ktorí chcú niečo naviacNevim o tom, že by U++ poskytovalo něco navíc. IMHO všechno, co v U++ prezentují jako velkou revoluci, je v C++ bežná praxe (RAII, apod.).
Nemám Arch, ale toto nefunguje? TheIde je Idečko a upp je framework, je tam verzia aj bez GTK.Aha, dík, nenapadlo mě hledat
upp
...
Mrkni na príklady, vyber si niektorý z nich hoď do vyhľadávača QT názov aplikácie, alebo GTK názov aplikácie a porovnaj si kód.Já na ty příklady koukal onehdá. Jako není to špatný, vypadá to relativně dobře (když jim odpustim to naprosto haluzný použití operátorů), ale není tam nic, co by mě fakt nějak zaujalo - to "Radical and innovative" tam úplně nevidim
Pohľad autorov, stojí za prečítanie.Jo, to jsem čet. Vlastní kontejnery nemám rád ani u Qt ani u víceméně jakýhokoli jinýho projektu, zas někdo znovuvynalézá kolo. "Všechno někam patří" - tím mají na mysli, že všechno se narve na stack. "Kód vlastní widgety" - ditto. Ta callback syntaxe se mi nelíbí hlavně pro to, že z toho kódu vůbec není jasné, jaká událost ten callback vyvolá.
Ešte by som dopnil prístup k vyhýbaniu sa omylom, vrátane minimalizácie používania pointrov, ale to je vlastne v tom linku čo som dával.Jo, tím, že všechno narvou na stack, to je teda řešení...
U++ je proste o priečku vyššie nad C++To ani náhodou.
a stále je to C++ a môžeš si ďalej písať častí programov ako si bol zvyknutý, no môžeš využiť práve tie vychytávky ktoré sa tebe nepáčiaNejde o to, že by se mi nepáčily vychytávky, jde o to, že tam IMHO žádný nejsou
Eliminácie pointrovU++ "eliminuje pointery" tím, že všechno narve na stack. V C++11 máš samozřejmě možnost dávat věci na stack taky, ale krom toho máš k dispozici smart pointery, které se dají použít i v situacích, kde striktně stack-based alokace nestačí (sdílený přístup apod.). Qt dále kromě zmíněného nabízí thread-safe COW (QSharedData). Až bude mít U++ něco z toho, dej mi vědět...
Nejdůležitějším je, že Ultimate++ nevyžaduje aby byly widgety alokované na haldě.Qt tohle taky nevyžaduje, widgety si můžeš dát na stack. Nicméně v Qt je zvyk (ne nutnost) dávat widgety na heap, protože jejich lifetime se spravuje tím jejich QObject stromem, což osobně filosoficky vzato moc nemusim, nicméně v praxi tofunguje poměrně dobře.
Tak schvále napíš tie Bohoušovi lívance na ten príklad čo som tu odkazoval, ten prvý kód v QT.Ok, tady to máš
~date1
? Netušim, co tam ten operátor ~
dělá.
2) Když mám kód nejakyWidget <<= THISBACK(nejakaFunkce);
, jak poznám, kdy se ta funkce zavolá?
Ja tam furt nevidim to pravidlo, proc by kod v Qt mel byt delsi. Spis naopak.
Spustim QtCreator. Nakreslim GUI v navrhari, kliknu pravym na tlacitko, dam jit na slot clicked, vyplnim co se stane v vygenerovanem kodu prehledym C++. Hotovo, zbyde mi main.cpp, .h s tridou, .cpp s funkci clicked, .ui s GUI a .pro pro qmake. Ty C++ zdrojaky dohromady stejne dlouhy jako ekvivalent s U++. Ale napsal jsem jen vnitrek ty funkce clicked.
Nechci se v něm podrobně rozepisovat o implementačních detailech a motivaci k jeho vytvoření.To by mě ale zrovna docela zajímalo, zejména ta motivace