SoFCheck
Я в последнее время занимался своей шахматной либой на Rust, а именно, пытался слегка прокачать ее перф. В итоге я лишь пришел к тому, что перестал понимать микробенчмарки ;( Для бенчмарков, понятное дело, я использую criterion. С помощью него я измеряю время…
Тем не менее, я немного поломал обратную совместимость и выпустил версию 0.4.0 :)
Основное изменение: теперь ход (который содержится в
Основное изменение: теперь ход (который содержится в
struct Move) содержит в себе походившую фигуру. Это позволяет лучше валидировать ход на самом раннем этапе (например, можно задолго до make_move проверить, что конь походил буквой Г или что слон походил по диагонали, а не на произвольное поле)Решил написать шахматную библиотеку на Go:
https://github.com/alex65536/go-chess/tree/master
Battlefield тоже переписан теперь на Go и находится здесь:
https://github.com/alex65536/day20/tree/master/cmd/bfield
Более долгосрочный план — написать платформу, которая позволяет смотреть онлайн за сражениями шахматных движков. Чтобы это сделать, мне понадобилось легко запускать матчи между движками и отдавать по HTTP прогресс партии. Можно было, конечно, приспособить старый Battlefield на Паскале для этих целей, только надо разобраться, как в нем посылать HTTP-запросы по сети. Это реально, но я решил, чтодавно я не переписывал код с нуля лучше иметь единый код для собственно сервера и компоненты, которая запускает движки, и поэтому переписал все необходимые части на Go.
Еще, пока я писал, понял, что задумывался над написанием реализации UCI куда дольше, чем когда я реализовывал тоже самое на Object Pascal в далеком 2016 году. Вероятно потому, что тогда мне и в голову не приходило думать про всякие проблемы вроде синхронизации и таймаутов при зависании. А при попытке реализовать UCI сейчас то и дело пришлось думать над тем, как прокинуть контексты и что делать в случае, если их отменят. Еще захотелось сделать так, чтобы в движок можно было направлять команды из разных горутин параллельно, и библиотека применяла их в каком-то порядке, но корректно :) Короче, реализация получилась несколько сложнее, но «правильнее»
А с реализацией собственно шахматных правил проблем не было, тем более, что там не надо думать про сложные concurrency штуки, а надо просто написать код, который делает вычисления. Здесь могу лишь отметить, что на бенчмарках реализация на Go раза в три медленее, чем аналогичная на C++ и Rust, что совпадает с моими представлениями о том, насколько CPU intensive код работает медленнее на Go.
https://github.com/alex65536/go-chess/tree/master
Battlefield тоже переписан теперь на Go и находится здесь:
https://github.com/alex65536/day20/tree/master/cmd/bfield
Более долгосрочный план — написать платформу, которая позволяет смотреть онлайн за сражениями шахматных движков. Чтобы это сделать, мне понадобилось легко запускать матчи между движками и отдавать по HTTP прогресс партии. Можно было, конечно, приспособить старый Battlefield на Паскале для этих целей, только надо разобраться, как в нем посылать HTTP-запросы по сети. Это реально, но я решил, что
Еще, пока я писал, понял, что задумывался над написанием реализации UCI куда дольше, чем когда я реализовывал тоже самое на Object Pascal в далеком 2016 году. Вероятно потому, что тогда мне и в голову не приходило думать про всякие проблемы вроде синхронизации и таймаутов при зависании. А при попытке реализовать UCI сейчас то и дело пришлось думать над тем, как прокинуть контексты и что делать в случае, если их отменят. Еще захотелось сделать так, чтобы в движок можно было направлять команды из разных горутин параллельно, и библиотека применяла их в каком-то порядке, но корректно :) Короче, реализация получилась несколько сложнее, но «правильнее»
А с реализацией собственно шахматных правил проблем не было, тем более, что там не надо думать про сложные concurrency штуки, а надо просто написать код, который делает вычисления. Здесь могу лишь отметить, что на бенчмарках реализация на Go раза в три медленее, чем аналогичная на C++ и Rust, что совпадает с моими представлениями о том, насколько CPU intensive код работает медленнее на Go.
👍2
И кстати да, платформа для сражений шахматных движков будет называться
day20 (как заметно по названию репы). Почему — говорить не буду, но небольшая подсказка есть в описании репы ;)
SoFCheck
Решил написать шахматную библиотеку на Go: https://github.com/alex65536/go-chess/tree/master Battlefield тоже переписан теперь на Go и находится здесь: https://github.com/alex65536/day20/tree/master/cmd/bfield Более долгосрочный план — написать платформу…
А, и еще, основная логика новой версии утилиты Battlefield реализована в двух пакетах —
internal/battle и internal/field :) :)