
Brainfuck-da ray tracer: 23MB proqram, dəqiqədə bir piksel
epestr.com bloqunun müəllifi CMake təlimatındakı bir sətri çağırış kimi qəbul edib, bildiyi ən sadə dil adlandırdığı Brainfuck-da ray tracer yazdı. Proqram 23MB həcmindədir və şəkli dəqiqədə təxminən bir piksel sürəti ilə çəkir.
epestr.com bloqunun müəllifi CMake təlimatındakı bir sətri çağırış kimi qəbul etdi: ray tracer-lər hətta CMake Language ilə də yazılıb, amma bu, tövsiyə olunan üsul deyil. O, əvvəllər ray tracer yazmış və onu GPU üçün yenidən qurmuşdu, ona görə bildiyi ən sadə dil saydığı Brainfuck-a üz tutdu və Ray Tracing in One Weekend dərsliyinin Metal bölməsindəki təsviri təkrar yaratmağı hədəflədi. Kod GitHub-da mTvare6/rayfuck adı ilə dərc olunub.
Səkkiz əmr və bir lent
Brainfuck səkkiz əməliyyat və tək məlumat strukturu təklif edir: hər hüceyrəsində bir işarəsiz bayt saxlayan sonsuz lent. Bir hüceyrədən geniş registr yoxdur, heç bir əmr eyni anda iki hüceyrəyə toxunmur, toplama və vurma isə əmr deyil. Buna görə həqiqi ədədlər əl ilə kodlaşdırıldı: hər dəyər işarəli Q16.16 sabit nöqtə formatında dörd hüceyrə tutur, 16 bit tam hissə və 16 bit kəsr, yəni 1/2^16 dəqiqlik və təxminən [-2^15, 2^15) aralığı. Daha ucuz Q8.8 çox dar oldu, çünki yer rolunda olan sferanın düz görünməsi üçün radiusu 1000 olmalı idi.

Arifmetikanı sıfırdan qurmaq
23 meqabayt Brainfuck əl ilə yazılmadı: proqram SSA-ya bənzər formaya çevrilir, sonra isə copy, mul, sqrt, if və while kimi otuz qədər əməliyyatı olan kiçik ara DSL-ə ayrılır. İşin çoxunu iki primitiv görür: move ([->+<]) bir hüceyrənin dəyərini qonşusuna köçürür, copy ([->+>+<<]) isə dəyəri iki hüceyrədə saxlayır. Vurma dörd hüceyrə boyunca təkrar toplamadır, bölmə isə 256 bazasında məktəb üsulu ilə aparılır: bölən hüceyrə başına ən çoxu 255 dəfə çıxılır.
Riyaziyyat kitabxanası da həmin bloklardan quruldu. Təsadüfi ədədlər balaca generator verir: A = (5*A + 1) % 256; onun 256 dəyərlik tam dövrü səhnədəki supernümunələmə üçün kifayətdir. Kvadrat kök üçün Heron üsulu bölmə səbəbindən, Teylor sırası isə 0,305-dən aşağıda pis uyğunlaşdığı üçün rədd edildi; müəllif uzun bölməyə əsaslanan kökdən istifadə etdi.
Dəqiqədə bir piksel
Hazır proqram 23MB-dır, yəni çəkdiyi təsvirdən böyükdür (təsvir təxminən 0,9MB-dır); müəllif qeyd edir ki, Brainfuck sıxılma üçün pis üsuldur. Sürət dəqiqədə təqribən 100 şüa hesablamasıdır, yəni dəqiqədə bir piksel, buna görə 400×225 təsvir onun noutbukunda təxminən 62,5 gün çəkərdi. Yazı anında təxminən 90 000 pikseldən 1229-u hazır idi və onlardan yalnız 10-u C referansından fərqlənirdi, çoxu bir vahid qədər.
Reddit mövzusundakı bir şərh fork/join primitivlərini təklif edəndən sonra müəllif əvəzində JIT interpretatorunu təkmilləşdirdi və böyük sürət artımı bildirdi; əsl render, onun sözlərinə görə, indi bir az Van Qoq rəsminə bənzəyir, çox güman ki dəqiqlik xətaları üzündən.

SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.