ΠΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Π΅ Π΅Π·ΠΈΠΊΡΡ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Solod (So), ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π½Π° Π΅Π·ΠΈΠΊΠ° Go, ΡΡΠ°Π½ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΎ Π² C11 ΠΈΠ·ΡΠ°Π·, ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈΡΠ΅ GCC, Clang ΠΈ zig cc. ΠΠ»ΡΡΠΎΠ²ΠΎΡΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π½Π° Solod ΠΎΡ Go ΠΈ Tinygo Π΅ ΡΡΡΠ½ΠΎΡΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π±Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ±ΠΎΡΡΠΈΠΊ Π½Π° ΠΎΡΠΏΠ°Π΄ΡΡΠΈ, Π±Π΅Π· Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ Π±Π΅Π· Π±ΡΠΎΠ΅Π½Π΅ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ. Π’ΡΠ°Π½ΡΠΏΠ°ΠΉΠ»Π΅ΡΡΡ Π·Π° Solod Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° Go ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡΡΠ° BSD. ΠΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°Π±ΠΎΡΠ° Π² Linux, macOS ΠΈ Windows.
ΠΠ·ΠΈΠΊΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΡΡΡΠΊΡΡΡΠΈ, ΠΌΠ΅ΡΠΎΠ΄ΠΈ, ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ, ΡΠ»Π°ΠΉΡΠΎΠ²Π΅, Π²ΡΡΡΠ°Π½Π΅ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π·ΡΠ»ΡΠ°Ρ + ΠΊΠΎΠ΄ Π½Π° Π³ΡΠ΅ΡΠΊΠ°), Π³Π΅Π½Π΅ΡΠΈΠΊΠΈ ΠΈ ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ (defer). Π‘ ΡΠ΅Π» ΠΎΠΏΡΠΎΡΡΡΠ²Π°Π½Π΅ Π² Π΅Π·ΠΈΠΊΠ° Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΠΊΠ°Π½Π°Π»ΠΈ, ΡΡΠΏΡΠ°ΡΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π·Π°ΡΠ²Π°ΡΡΠ½ΠΈΡ. ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π΅Π·ΠΈΠΊΠ° Solod ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ LSP-ΡΡΡΠ²ΡΡΠΈ, Π»ΠΈΠ½ΡΠ΅ΡΠΈ, ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½ΠΈ ΡΡΠ΅Π΄ΠΈ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΈ Π½Π° ΠΊΠΎΠ΄, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π΅Π·ΠΈΠΊΠ° Go, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΡΠΈΠΏΠ° βgo testβ.
ΠΠΎΠ΄ΡΡ, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Solod, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ° Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Π΅Π·ΠΈΠΊΠ° C (Π΅Π·ΠΈΠΊΡΡ C ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° Solod ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ) ΠΈ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° runtime. ΠΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Ρ Π±Π»ΠΈΠ·ΠΊΠΈ Π΄ΠΎ C Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ, Π½ΠΎ Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π² ΡΡΠΈΠ» Go ΠΈ ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅. Solod ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎΡΡΠΈΡΠΈΡΠ°Π½Π΅ Π½Π° Go-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² C ΠΏΡΠΎΠ΅ΠΊΡΠΈ. ΠΠΎΡΡΠΈΡΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° C ΡΠ° Go-ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ strings, io, bytes, mem, slices ΠΈ Ρ.Π½. ΠΡΠ²Π΅Π½ Π½Π°Π±ΠΎΡΠ° ΠΎΡ ΠΏΠΎΡΡΠΈΡΠΈΡΠ°Π½ΠΈ Go-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Solod ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π½Π°Π΄ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° C-Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° libc.
ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΡΡΠ»Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ ΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ Π² ΡΡΠ΅ΠΊΠ°, Π½ΠΎ ΡΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Alloc / Free Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΏΠ°ΠΌΠ΅Ρ Π² ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ°. Π‘Π±ΠΎΡΡΠΈΠΊ Π½Π° ΠΎΡΠΏΠ°Π΄ΡΡΠΈ ΠΈ Π±ΡΠΎΠ΅Π½Π΅ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, Π½ΠΎ Π² Solod ΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΠΈΠΏΠΎΠ²Π΅ ΠΈ Π°Π²Π°ΡΠΈΠΉΠ½ΠΎ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ ΠΏΡΠΈ ΠΎΠΏΠΈΡ Π·Π° Π΄ΠΎΡΡΡΠΏ ΠΈΠ·Π²ΡΠ½ ΠΌΠ°ΡΠΈΠ²Π°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π·Π° Π²ΡΡΡΠ°Π½Π΅ Π½Π° Π²ΠΈΡΡΡΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ (dangling pointer) ΠΈ Π»ΠΈΠΏΡΠ° Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π½Π΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ. ΠΠ°ΡΠΎ ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ Π·Π° ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°Π²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° AddressSanitizer (-fsanitize=address) Π² ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΠΈ.
ΠΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Solod, Π² ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ»ΡΡΠ°ΠΈ ΡΠ° ΠΏΠΎ-Π±ΡΡΠ·ΠΈ ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ Π½Π° Go. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΠΎΡ ΠΏΠ°ΠΊΠ΅ΡΠ° Byte Π΅ 1.5 ΠΏΡΡΠΈ ΠΏΠΎ-Π²ΠΈΡΠΎΠΊΠ° ΠΏΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ. Π Π°Π±ΠΎΡΠ° Ρ Π±Π°ΠΉΡΠΎΠ²ΠΈ Π±ΡΡΠ΅ΡΠΈ Π΅ ΠΏΠΎ-Π±ΡΡΠ·Π° Ρ 1.3 ΠΏΡΡΠΈ ΠΏΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Ρ 2-4 ΠΏΡΡΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡ. Π ΠΏΠ°ΠΊΠ΅ΡΠ° Map, ΠΈΠ·Π±ΠΎΡΠ° ΠΏΠΎ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½ ΠΊΠ»ΡΡ Π΅ ΠΏΠΎ-Π±ΡΡΠ· Ρ 3.4 ΠΏΡΡΠΈ, Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ Π΅ ΠΏΠΎ-Π±Π°Π²Π½ΠΎ Ρ 1.6 ΠΏΡΡΠΈ. ΠΠ·Π±ΠΎΡΡΡ ΠΏΠΎ ΡΡΡΠΎΠΊΠΎΠ²ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ Π΅ Π½Π° Π΅Π΄Π½ΠΎ Π½ΠΈΠ²ΠΎ Ρ Π΅Π·ΠΈΠΊΠ° Go, Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π΅ ΠΏΠΎ-Π±Π°Π²Π½Π° Ρ 1.5 ΠΏΡΡΠΈ. ΠΠ°ΡΡΠΈΠ½Π³ΡΡ ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π»ΠΈ ΡΠΈΡΠ»Π° ΡΠ° ΠΏΠΎ-Π±ΡΡΠ·ΠΈ Ρ 2 ΠΏΡΡΠΈ, Π° Ρ ΠΏΠ»Π°Π²Π°ΡΠ° Π·Π°ΠΏΠ΅ΡΠ°Ρ β Ρ 1.5/1.2 ΠΏΡΡΠΈ. Π‘ΡΡΠΈΠ½Π³ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΡΠ° ΠΏΠΎ-Π±ΡΡΠ·ΠΈ Ρ 1.3 ΠΏΡΡΠΈ, Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΡΠΈΠ½Π³ΠΎΠ²Π΅ Π΅ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ Ρ 2-4 ΠΏΡΡΠΈ ΠΏΡΠΈ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΎ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Ρ 10-20%.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
