
Neomacs: GNU Emacs-ის Rust-ზე გადაწერილი ვერსია GPU რენდერით
დეველოპერმა Eval Exec-მა GitHub-ზე Neomacs გამოაქვეყნა. ეს GNU Emacs-ის განშტოებაა, სადაც დაახლოებით 300 ათასი სტრიქონი C კოდი Rust-ით ჩანაცვლდა, რენდერი კი GPU-ზე გადავიდა. მიზანი არსებულ კონფიგურაციებთან და პაკეტებთან სრული თავსებადობაა.
Neomacs, იგივე NEO Emacs, GNU Emacs-ის განშტოებაა, რომელზეც მუშაობა ჯერ არ დასრულებულა. პროექტი GitHub-ზე დეველოპერმა Eval Exec-მა გამოაქვეყნა. ავტორის განცხადებით, ის ინარჩუნებს ყველაფერს, რასაც Emacs-ის მომხმარებლები უკვე იყენებენ: init.el-ს, პაკეტებს, კლავიშთა ჩვევებს. შიგნით კი მექანიზმი თავიდან აშენდა: რენდერი GPU-ზე გადავიდა, დაახლოებით 300 ათასი სტრიქონის C ბირთვი კი Rust-ზე გადაიწერა.
რეპოზიტორიის მიხედვით, გამოშვებულ neomacs ბინარში C ბირთვი საერთოდ აღარ არის: Elisp-ის ინტერპრეტატორი, ბაიტკოდის VM, ნაგვის შემგროვებელი, პორტატული dump-ი, ბუფერები, ფანჯრები, კლავიატურის დამუშავება, პროცესები, განლაგება და რენდერი Rust-ზეა დაწერილი. lisp-ის დირექტორია, ანუ რედაქტორის Elisp ნაწილი, GNU Emacs-იდან არის აღებული და emacs-31-ის განვითარების ხაზთან სინქრონშია.
GPU ძრავა ცალკე ნაკადში
არქიტექტურა სამუშაოს ორ ნაკადს შორის ანაწილებს: Emacs-ის ნაკადი Elisp-ის გარემოსა და რედაქტორის მდგომარეობას ფლობს, რენდერის ნაკადი კი GPU-ს მართავს. დისპლეის ძრავა wgpu-ზეა აგებული და მოიცავს Vulkan-ს, Metal-ს, DX12-სა და OpenGL-ს. xdisp.c-ის დაახლოებით 50 ათას სტრიქონს ცვლის Rust-ის დაახლოებით 4 ათასი სტრიქონი. ბუფერებში მედიის ჩვენებაც შესაძლებელია: 4K ვიდეო GStreamer-ით, GPU-ით გაშიფრული სურათები, WPE WebKit-ის ბრაუზერი და GPU ტერმინალი. ანიმაციების ფენა კურსორის რვა რეჟიმს, სქროლვის 21 ეფექტს და ბუფერებს შორის გადასვლის ათ ანიმაციას გთავაზობს და Elisp-იდან იმართება.
რატომ განშტოება და არა თავიდან დაწერა
რეპოზიტორიის FAQ-ის მიხედვით, Emacs 40 წლის C კოდური ბაზაა, რომელიც თანამედროვე ტექნიკას ვერ მიჰყვა. დასახელებული პრობლემებია მხოლოდ პროცესორზე მომუშავე რენდერი, ვიდეოს ჩაშენებული დაკვრის არარსებობა და უმოქმედო GPU. პროექტის შეფასებით, Elisp-ს აკლია inline caching და მუშაობის დროს JIT ოპტიმიზაცია, ნაგვის შემგროვებელი კი მთელ პროგრამას აჩერებს. ვინაიდან Elisp ერთ ნაკადში მუშაობს, ერთი ნელი გამოძახება მთლიან რედაქტორს აყინავს. ცალკე პრობლემაა დიდი ფაილები და გრძელი სტრიქონები: მთელი ფაილი ერთ gap buffer-ში ინახება, ამიტომ ასეულობით მეგაბაიტიანი ლოგი რედაქტორს მაინც აჩერებს.
თავიდან დაწერის ნაცვლად განშტოება გათვლილი ნაბიჯია: GNU Emacs პროექტში რჩება როგორც საცნობარო და სატესტო ეტალონი. Oracle-ტესტები, TUI ბადის შედარებები და GUI-ის პარიტეტის შემოწმებები Neomacs-ს GNU Emacs-ს განუწყვეტლივ ადარებს, იდენტური ქცევის შესამოწმებლად. FAQ-ის თანახმად, ცვლილებები იმდენად ღრმაა, რომ მათი upstream-ში მიღება შეუძლებელია, ამიტომ პროექტს hard fork-ს უწოდებენ.
მდგომარეობა და თავსებადობა
Neomacs ღიად აღნიშნულია როგორც alpha და დაუმთავრებელი პროექტი: README აფრთხილებს უხეშ კიდეებზე, გარდამტეხ ცვლილებებსა და აკლებულ ფუნქციებზე და ითხოვს ბაგების შეტყობინებებს. დაპირებული კონტრაქტი დაკვირვებად ქცევაში, ანუ სემანტიკაში, ფუნქციონირებასა და ლოგიკურ ჩვენებაში 100%-იანი თავსებადობაა, ამ დონის ქვემოთ კი უკეთესობის თავისუფლება, მაგალითად გაშვების სისწრაფე. შემდეგი მიზნებია ნამდვილი მრავალნაკადიანი Elisp და პარალელური, ყოველგვარი პაუზის გარეშე მომუშავე GC. იგივე ბინარი GPU-ზეც და ტერმინალშიც მუშაობს, მზა იმიჯები კი Docker Hub-სა და GitHub Container Registry-ზეა. სტატიის დაწერის დროს რეპოზიტორიას დაახლოებით 1 177 ვარსკვლავი და 47 განშტოება ჰქონდა.
SiTech — AI-გაძლიერებული ვებ დეველოპმენტი
ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.