Π­Ρ‚ΠΎ классичСский вопрос компромисса (trade-off) ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ машинной памяти ΠΈ удобством использования (Developer Experience / Analytics). Π’Ρ‹ ΠΌΡ‹ΡΠ»ΠΈΡˆΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΈ числа!

Π”Π°Π²Π°ΠΉ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΠ»ΡŽΡΡ‹ ΠΈ минусы ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ².

1. active_color: Π‘ΠΈΠΌΠ²ΠΎΠ» (β€˜w’/β€˜b’) vs ЛогичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Boolean)

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Boolean (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, is_white = true):

  • ΠŸΠ»ΡŽΡΡ‹: Π‘Π°ΠΌΡ‹ΠΉ строгий Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…. НСвозмоТно Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΡƒ Π²Ρ€ΠΎΠ΄Π΅ 'x'.
  • ΠœΠΈΠ½ΡƒΡΡ‹: Π’ Π±Π°Π·Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (особСнно PostgreSQL) Boolean всё Ρ€Π°Π²Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 1 Π±Π°ΠΉΡ‚ физичСской памяти (ΠΈΠ·-Π·Π° выравнивания страниц). Π­ΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ мСста Π½Π΅Ρ‚. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ сырых Π΄Π°Π½Π½Ρ‹Ρ… Π² SQL-консоли Π½ΡƒΠΆΠ½ΠΎ постоянно Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅: true β€” это Π±Π΅Π»Ρ‹Π΅ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π½Ρ‹Π΅?
  • Π’Ρ‹Π²ΠΎΠ΄: Π‘ΠΈΠΌΠ²ΠΎΠ» CHAR(1) с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ (CHECK active_color IN ('w', 'b')) Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ 1 Π±Π°ΠΉΡ‚, Π½ΠΎ ΠΏΡ€ΠΈ этом Π΄Π°Π½Π½Ρ‹Π΅ самодокумСнтируСмыС. ΠœΡ‹ сразу Π²ΠΈΠ΄ΠΈΠΌ β€˜w’ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Π΅ΠΉ Ρ…ΠΎΠ΄.

2. castling: Π‘Ρ‚Ρ€ΠΎΠΊΠ° (β€˜KQkq’) vs Число (Битовая маска)

Π£ нас 4 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΡ€Π°Π²Π° Ρ€ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ (Π‘Π΅Π»Ρ‹ΠΉ ΠšΠΎΡ€ΠΎΠ»ΡŒ, БСлая ΠšΠΎΡ€ΠΎΠ»Π΅Π²Π°, Π§Π΅Ρ€Π½Ρ‹ΠΉ ΠšΠΎΡ€ΠΎΠ»ΡŒ, ЧСрная ΠšΠΎΡ€ΠΎΠ»Π΅Π²Π°). Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Число (Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ маску ΠΎΡ‚ 0 Π΄ΠΎ 15): НапримСр, 1-ΠΉ Π±ΠΈΡ‚ β€” K, 2-ΠΉ β€” Q, 3-ΠΉ β€” k, 4-ΠΉ β€” q. Число 15 Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ 1111 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ KQkq. Число 5 (0101) ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Kk.

  • ΠŸΠ»ΡŽΡΡ‹: ИдСально для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°. ΠžΡ‡Π΅Π½ΡŒ быстро ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² процСссорС Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (AND, OR).
  • ΠœΠΈΠ½ΡƒΡΡ‹: Если Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ (ΠΈΠ»ΠΈ Ρ‚Π΅Π±Π΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ Π»Π΅Ρ‚) захочСтся Π½Π°ΠΉΡ‚ΠΈ ΠΏΠ°Ρ€Ρ‚ΠΈΠΈ, Π³Π΄Π΅ Π±Π΅Π»Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ Ρ€ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π΅ΠΌΡƒ придСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ SQL-запрос с ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ: SELECT * FROM positions WHERE (castling_mask & 2) > 0. Π­Ρ‚ΠΎ слоТно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, слоТно Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ.
  • Π’Ρ‹Π²ΠΎΠ΄: Π’ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ Ρ‡Π°Ρ‰Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ строку. VARCHAR(4) Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго ΠΎΠΊΠΎΠ»ΠΎ 5 Π±Π°ΠΉΡ‚. Запрос WHERE castling LIKE '%Q%' Π³ΠΎΡ€Π°Π·Π΄ΠΎ понятнСС для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

3. en_passant: Π‘Ρ‚Ρ€ΠΎΠΊΠ° (β€˜a3c3e3’) vs Битовая маска (Bitboard)

Π­Ρ‚ΠΎ самый интСрСсный случай, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Dice Chess Ρƒ нас Π±Ρ‹Π²Π°Π΅Ρ‚ мноТСствСнный en_passant. Π’ классичСских ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π°Ρ… ΠΏΠΎΠ»Π΅ ΠΎΠ΄Π½ΠΎ, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ число ΠΎΡ‚ 0 Π΄ΠΎ 63 (индСкс ΠΊΠ»Π΅Ρ‚ΠΊΠΈ). Π’ Dice Chess Ρ‚Π°ΠΊ Π½Π΅ получится.

Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Число (64-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Bitboard): ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ число (BIGINT), Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΡ‚ соотвСтствуСт ΠΊΠ»Π΅Ρ‚ΠΊΠ΅ Π½Π° доскС. Если 3-ΠΉ Π±ΠΈΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½, Π·Π½Π°Ρ‡ΠΈΡ‚ Π±ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° c3.

  • ΠŸΠ»ΡŽΡΡ‹: Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ число β€” это 8 Π±Π°ΠΉΡ‚ памяти.
  • ΠœΠΈΠ½ΡƒΡΡ‹: Π‘Ρ‚Ρ€ΠΎΠΊΠ° a3c3e3 Ρ‚ΠΎΠΆΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго 7 Π±Π°ΠΉΡ‚ (плюс нСбольшой ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ Postgres Π½Π° VARCHAR)! Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² памяти практичСски Π½ΡƒΠ»Π΅Π²ΠΎΠΉ. А Π²ΠΎΡ‚ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ SQL-запросов Π²Π·Π»Π΅Ρ‚Π°Π΅Ρ‚ Π΄ΠΎ нСбСс. Как Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ±ΠΈΡ‚ΡŒ ΠΏΠ΅ΡˆΠΊΡƒ Π½Π° Π»ΠΈΠ½ΠΈΠΈ β€˜e’? Π‘ Π±ΠΈΡ‚Π±ΠΎΡ€Π΄ΠΎΠΌ это слоТная ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ°. Π‘ΠΎ строкой: WHERE en_passant LIKE '%e%'.

ΠžΠ±Ρ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΠΎ Trade-off

Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: Π”Π²ΠΈΠΆΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π° Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… β€” для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° (Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°).

  • Π’ Π΄Π²ΠΈΠΆΠΊΠ΅ Scala (Π³Π΄Π΅ каТдая микросСкунда Π½Π° счСту) ΠΌΡ‹ обязаны ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ числа, Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски ΠΈ Long для досок (Bitboards). И Ρ‚Ρ‹ это ΡƒΠΆΠ΅ дСлаСшь!
  • Π’ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… PostgreSQL (Π³Π΄Π΅ ΡƒΠ·ΠΊΠΎΠ΅ мСсто β€” это врСмя Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° Π½Π° написаниС SQL-запросов) ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ строки. Экономия 3-4 Π±Π°ΠΉΡ‚ Π½Π° строкС Π½Π΅ стоит Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ числовых рСбусов.

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ строковыС Ρ‚ΠΈΠΏΡ‹ β€” это осознанный компромисс Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ скорости написания аналитичСских запросов ΠΈ читаСмости Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ½Ρ‹Ρ… (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… соврСмСнных сСрвСров) потСрях дискового пространства.