Drew DeVault, autori i ambientit të përdoruesit Sway, klientit të postës Aerc dhe platformës së zhvillimit të përbashkët SourceHut, ka prezantuar gjuhën e programimit Hare, mbi të cilën ai dhe ekipi i tij kanë punuar gjatë dy viteve e gjysmë të fundit. Hare paraqitet si një gjuhë programimi sistemesh, e afërt me gjuhën C, por më e thjeshtë se C. Një nga parimet kyçe të projektimit të Hare është orientimi ndaj thjeshtësisë dhe besimi të plotë në veprimet e programuesit (për të kryer pikërisht atë që është specifikuar, pa ndërhyrje dhe sjellje të paqarta), me mjete ndihmëse për identifikimin e gabimeve dhe problemeve standarde.
Burimet e kodit të kompilatorit dhe mjeteve shpërndahen nën licencën GPLv3, ndërsa kodi i bibliotekës standarde nën licencën MPL (Mozilla Public License). Në publikimin e parë, është deklaruar mbështetje për sistemet operative Linux dhe FreeBSD në platformat x86_64, aarch64 dhe riscv64, si dhe përdorim të vetë-mjaftueshëm për të operuar mbi hardware pa sistem operativ. Në planet përfshihet mbështetje për sistemet operative NetBSD, OpenBSD, Illumos, Haiku dhe Plan 9 dhe platformat ppc64le, i686 dhe arm32.
Në gjuhë aplikohet menaxhimi manual i memories dhe një sistem statik i tipeve, ku çdo ndryshore duhet t'i caktohet një tip i caktuar në mënyrë të qartë. Për të ekzekutuar aplikacionin bashkëngjitet një runtime minimal. Gjuha është optimizuar për të zgjidhur detyra të nivelit të ulët, si zhvillimi i sistemeve operative, kompilatorëve, aplikacioneve rrjet dhe mjeteve sistemike, për të cilat kërkohet arritja e performancës maksimale dhe kontroll të plotë në ekzekutim.
Për zhvilluesit është përgatitur një bibliotekë standarde funksionesh, e cila ofron qasje në ndërfaqet bazë të sistemit operativ, algoritme standarde dhe implementime të protokolleve dhe formateve. Biblioteka mbulon fusha si hyrja/dalja, punimi me skedarë, shprehje normale, kodim, ndërveprimi rrjet, operacione me kohën dhe datat, qasje në primitivët e zakonshëm Unix (për shembull, poll, fnmatch dhe glob), analizimi dhe verifikimi i tipeve. Veçmas ofrohen lidhje për qasje në mundësitë e OpenGL, SDL2 dhe libui.
Si për shembuj projektesh të shkruara në gjuhën Hare, përmenden mikroirdha Helios, menaxheri i fjalëkalimeve Himitsu, sistemi i gjurmimit të rrezeve raytracing, programi për enkriptimin box, bittorrent-demon btqd, scheduled (analog i sistemit cron), toothbrush (klient dhe për protokollin finger). server Nga planet për të ardhmen, përmendet stabilizimi i specifikimeve të gjuhës dhe përbërjes së bibliotekës standarde, implementimi i mbështetjes për platformat dhe arkitekturët që mungojnë, si dhe shtimi i funksioneve bibliotekore për mbështetje të TLS 1.2 dhe 1.3.
Shembuj kodi në gjuhën Hare: use crypto::sha256; use encoding::hex; use fmt; use hash; use io; use os; export fn main() void = { const hash = sha256::sha256(); const file = os::open(«main.ha»)!; defer io::close(file); io::copy(&hash, file)!; let sum: [sha256::SIZE]u8 = [0…]; hash::sum(&hash, sum); hex::encode(os::stdout, sum)!; fmt::println()!; const greetings = [ «Hello, world!», «¡Hola Mundo!», «Γειά σου Κόσμε!», «Привет, мир!», «こんにちは世界!», ]; for (let i = 0z; i < len(greetings); i += 1) { fmt::println(greetings[i])!; }; let x: *int = alloc(42); fmt::printfln(» x: {}», x)!; fmt::printfln(«*x: {}», *x)!; free(x); const file = os::open(os::args[1])!; defer io::close(file)!; let buffer: *[65535]u8 = alloc([0…]); defer free(buffer); const n = io::read(file, buffer)! as size; io::write(os::stdout, buffer[..n])!; }; fn sort(items: []int) void = { … }; @test fn sort() void = { let items = [5, 4, 3, 2, 1]; sort(items); for (let i = 1z; i < len(items); i += 1) { assert(items[i — 1] <= items[i], «list is unsorted»); }; };
Burimi: opennet.ru
