Сайт Данила

Розумне сортування

Кількість слів: ~408

Нещодавно я дізнався про lsr. Це ls імплементація на Zig з особливістю. Вони використовують io_uring для отримання інформації про файли. Але результатом є те що ця імплементація швидше працює й робить менше системних викликів.

Написавши маленький Nix пакет, я замінив ним eza. lsr ще молодий, а тому це хороший проєкт, щоб розібратися в коді й зробити свій внесок.

Першою проблемою було те що параметром на вхід воно очікувало директорію, якщо передати шлях до файлу — отримаєш помилку. Але це досить швидко виправив сам автор програми.

Інша проблема виявилася в сортуванні файлів по назві. Тут наче нічого складного, кожна мова може сортувати стрічки, але як виявилося, люди очікують що сортування працює за їх правилами. Наприклад:

file1
file10
file3

Виглядає неправильно, чи не так? Але це результат сортування звичайним порівнянням символів, без розумного алгоритму. Я ніколи не помічав, але всі ls імплементації сортують назви файлів так, як усі люди того й очікують!

Тоді я вирішив подивився, а як же сортує eza. Виявив що вони використовують natord, а natord брав натхнення з https://github.com/sourcefrog/natsort. Подивившись на вкладені match’і в Rust імлпементації — я вирішив переписати C імплементацію на Zig.

Подивитися на Zig код можна тут https://codeberg.org/knightpp/natural-ordering-zig.

Чому Zine?
Розумний будинок