А я как то попросил написать ChatGPT умножение двух байт на 8-битном MOS 6502 он такой мрак выдал, что видно только то, что он знает как выглядят инструкции на асме 6502 и отдалённо какие то проблески что имена регистров в коде прошивают его какой то связью как в других языках программирования, но даже какого то приближения к понятию умножения у огрызка кода не было. Тупое какое то перекладывание из регистра в регистр. Т.е. он вообще не понимал этот 8-битный ассемблер никак. Видимо всё-таки чем больше по какому то языку открытых проектов на гитхабе и чем обильнее в них комментарии, тем лучше он сопоставляет шаблоны свои. --- Сообщение объединено, 16 янв 2024 --- P.S. Попросил сейчас Copilot "write procedure for multiplication of two bytes for MOS 6502" и он справился намного намного лучше, чем когда то ChatGPT, а именно вот так: Код (Text): ; Multiply two bytes ; Inputs: ; A - Multiplicand ; X - Multiplier ; Outputs: ; A - Lower byte of the result ; Y - Upper byte of the result Multiply: LDA #0 ; Clear the accumulator STA Result ; Clear the result LDX #8 ; Set the loop counter MultiplyLoop: ASL Result ; Shift the result left ROL A ; Rotate the multiplicand left BCC SkipAdd ; If carry is clear, skip the add CLC ; Clear the carry ADC Multiplier ; Add the multiplier to the result SkipAdd: DEX ; Decrement the loop counter BNE MultiplyLoop ; If not zero, continue the loop ; The result is now in the A and Y registers RTS Result: DS 2 ; Reserve 2 bytes for the result Multiplier: DS 1 ; Reserve 1 byte for the multiplier Кхем кхем. Ну на самом деле даже стало просматриваться тело цикла умножения где сдвиги со накоплением происходят. Но. Согласно комментарию на входе в аккумуляторе первое множимое, в регистре X второе множимое, а на выходе в аккумуляторе будет нижний байт результата, а в регистре Y будет верхний байт результата. Но начинаем всматриваться в код и мрачнеем: 1. первым же действием входной параметр в A разрушается перетираясь нулём 2. третьим действием входное значение в X разрушается заменяясь счётчиком цикла по битам 3. далее он начинает перегонять нулевые биты из Result в A на что-то надеясь (всегда будет переход на SkipAdd) 4. регистр Y в кодесе вообще не упоминается, хотя в нём обещали часть результата 5. под переменную Result зачем то выделяется два байта, хотя по коду используется только один 6. внезапно оказывается что параметр Multiplier лежит как еще одна переменная в памяти, но до неё дело никогда не дойдёт В общем намного лучше, чем когда то генерировал ChatGPT, но до рабочего кодеса ну ооооочень далеко.
Кстати, в тему обработки ошибок: есть два распространённых крейта от одного автора: anyhow и thiserror. Anyhow позволяет добавлять к ошибкам контекст и заворачивать разные ошибки в обобщённый тип, а thiserror - более простой и короткий способ создавать свои статусы: https://www.shakacode.com/blog/thiserror-anyhow-or-how-i-handle-errors-in-rust-apps/
если всё же надо использовать крейт, то в cargo.toml лучше записать его так.. some_crate = "=x.y.a" с обратной совместимостью у ржаки весьма туговато.. вообще со ржакой вспоминается анекдот/ Герда: Кай, а чё ты делаешь??? - Снежная Королева сказала мне написать слово ХОРОШО из букв Ж.. О.. П.. А..
А вот скажи, мне просто интересно, когда мы собираем вот такое на Ubuntu 23.10: Код (C): // gcc ./main.c -o ./program #include <stdio.h> int main() { printf("Yo man!\n"); return 0; } …и запускаем на Ubuntu 22.04, получая вот примерно такую ошибку: Код (Text): /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found - это ведь мы считаем хорошей совместимостью, верно? Ну чисто чтобы понимать, что мы берём за эталон.
так совместимость бывает разных видов - одно дело взять бинарь из одной системы и пытаться запустить его на другой версии либы. и совсем иной случай, когда один и тот же сорц перестаёт собираться с обновлённой либой иль собирается и начинает крошиться.
оно то работает, когда ты исполняешься как легальный процесс. но вот с урезанными правами - нет. есть идеи как захватить чей-нить токен посерьёзнее?
даже ОдЭпты ржаки ничего хорошего сказать не могут всех дыренек не опишешь, но можно делать адаптивные модели, кои сами ищут возможный вектор атаки
ржака сам не очень-то годно свою панику перехватывает. а на крейте regex умудрились запаять такое.. Код (Text): impl<'h> core::ops::Index<usize> for Captures<'h> { type Output = str; // The lifetime is written out to make it clear that the &str returned // does NOT have a lifetime equivalent to 'h. fn index<'a>(&'a self, i: usize) -> &'a str { self.get(i) .map(|m| m.as_str()) .unwrap_or_else(|| panic!("no group at index '{}'", i)) } } вернуть нон прям западло?
Рейтинг - это очень часто такое себе, нужно понимать, как они считались. Тот же Тиобе - вообще целиком и полностью бесполезная вещь, зачем его делают - не понятно.