Π”Ρ€ΡŽ Π”Π΅Π’ΠΎΠ»Ρ‚ прСдставил язык систСмного программирования Hare

Π”Ρ€ΡŽ Π”Π΅Π’ΠΎΠ»Ρ‚ (Drew DeVault), Π°Π²Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ окруТСния Sway, ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Aerc ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ совмСстной Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ SourceHut, прСдставил язык программирования Hare, Π½Π°Π΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ вмСстС со своСй ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Π» послСдниС Π΄Π²Π° с ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΎΠΉ Π³ΠΎΠ΄Π°. Hare прСподносится ΠΊΠ°ΠΊ язык систСмного программирования, Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ языку Π‘ΠΈ, Π½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ Π‘ΠΈ. Из ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² проСктирования Hare заявлСна ориСнтация Π½Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΊ дСйствиям программиста (Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Π±Π΅Π· ΡΠ°ΠΌΠΎΠ΄Π΅ΡΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ нСявного повСдСния), ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов для выявлСния Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ошибок ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ тСксты компилятора ΠΈ инструмСнтария Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ GPLv3, Π° ΠΊΠΎΠ΄ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MPL (Mozilla Public License). Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌ выпускС заявлСна ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Linux ΠΈ FreeBSD Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… x86_64, aarch64 ΠΈ riscv64, Π° Ρ‚Π°ΠΊΠΆΠ΅ самодостаточноС использованиС для запуска ΠΏΠΎΠ²Π΅Ρ€Ρ… оборудования Π±Π΅Π· ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π’ ΠΏΠ»Π°Π½Π°Ρ… упоминаСтся ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм NetBSD, OpenBSD, Illumos, Haiku ΠΈ Plan 9 ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ppc64le, i686 ΠΈ arm32.

Π’ языкС примСняСтся Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ статичСская систСма Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ явно Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ присвоСн ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ. Для выполнСния прилоТСния прикрСпляСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ runtime. Π―Π·Ρ‹ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, компиляторов, сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ систСмных ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… трСбуСтся достиТСниС максимальной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ.

Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π° стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ доступ ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ интСрфСйсам ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ². Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ области ΠΊΠ°ΠΊ Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄, Ρ€Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, рСгулярныС выраТСния, ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΠ΅, сСтСвоС взаимодСйствиС, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π΄Π°Ρ‚Π°ΠΌΠΈ, доступ ΠΊ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹ΠΌ Unix-ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, poll, fnmatch ΠΈ glob), парсинг ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ². ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ привязки для доступа ΠΊ возмоТностям OpenGL, SDL2 ΠΈ libui.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², написанных Π½Π° языкС Hare, ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ микроядро Helios, ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ Himitsu, систСма трассировки Π»ΡƒΡ‡Π΅ΠΉ raytracing, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ box, bittorrent-Π΄Π΅ΠΌΠΎΠ½ btqd, scheduled (Π°Π½Π°Π»ΠΎΠ³ систСмы cron), toothbrush (ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° finger). Из ΠΏΠ»Π°Π½ΠΎΠ² Π½Π° Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ отмСчаСтся стабилизация спСцификации языка ΠΈ состава стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, рСализация ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ TLS 1.2 ΠΈ 1.3.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π½Π° языкС 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»); }; };

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru