
рд╣рдорд╛рд░реА рдЯреАрдо рдЗрдореНрдпреБрдиреЗрдВрдЯ рд░рд╕реНрдЯ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ C2Rust рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ, рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреЛ рд░рд╕реНрдЯ рдХреЛ рдкреНрд░рд╡рд╛рд╕ рдХрд░рдиреЗ рдХреА рд╕рдВрдкреВрд░реНрдг рджрд┐рдирдЪрд░реНрдпрд╛ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИред рд╣рдо рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрдиреБрд╡рд╛рджрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЫреЛрдЯреЗ рд╕реАрдПрд▓рдЖрдИ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХреНрд╡реЗрдХ 3 рдХреЛ рд░рд╕реНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд░рд╕реНрдЯ рдкрд░ рдХреНрд╡реЗрдХ 3 рдЦреЗрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рдереЗ!
рддреИрдпрд╛рд░реА: рдХреНрд╡реЗрдХ 3 рд╕реНрд░реЛрдд
рдореВрд▓ рдХреНрд╡реЗрдХ 3 рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рдВрдЯреЗ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо
ioquake3 рдкрд░ рдЖ рдЧрдПред рдпрд╣ рдХреНрд╡реЗрдХ 3 рдХрд╛ рдПрдХ рд╕рдореБрджрд╛рдп-рдирд┐рд░реНрдорд┐рдд рдХрд╛рдВрдЯрд╛ рд╣реИ, рдЬреЛ рдЕрднреА рднреА рдЖрдзреБрдирд┐рдХ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╕рдорд░реНрдерд┐рдд рдФрд░ рдирд┐рд░реНрдорд┐рдд рд╣реИред
рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЙрд╕рдХреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ make release
Ioquake3 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ:
$ tree --prune -I missionpack -P "*.so|*x86_64" . тФФтФАтФА build тФФтФАтФА debug-linux-x86_64 тФЬтФАтФА baseq3 тФВ тФЬтФАтФА cgamex86_64.so
рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдпреВрдЖрдИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдпрд╛ рддреЛ
рдХреНрд╡рд┐рдХ рд╡реАрдПрдо рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреЗрд╢реА X86 рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдордиреЗ рджреЗрд╢реА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред VM рдХреЛ Rust рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдФрд░ QVM рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо C2Rust рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
рд╣рдорд╛рд░реЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдордиреЗ UI, рдЧреЗрдо, рдХреНрд▓рд╛рдЗрдВрдЯ, OpenGL1 рд░реЗрдВрдбрд░рд░ рдФрд░ рдореБрдЦреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ред рд╣рдо OpenGL2 рд░реЗрдВрдбрд░рд░ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣
.glsl
shader
.glsl
рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо C рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред рдЬрдВрдЧ рдХреЗ рддрд╛рд░реЛрдВ рдореЗрдВ GLSL рдХреЛрдб, рд▓реЗрдХрд┐рди рдЗрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ рд╕рд┐рд░реНрдл OpenGL1 рд░реЗрдВрдбрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдФрд░ рдЧреЗрдо рдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рд░реЗрдВрдбрд░рд░ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рд╕рдорд░реНрдкрд┐рдд рд╕рд░реНрд╡рд░ рдФрд░ рдкреИрдХреЗрдЬреНрдб рдорд┐рд╢рди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╡реЗ рдЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВред
рд╕рдВрдХреНрд░рдордг рей
рдХреНрд╡реЗрдХ 3 рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдореВрд▓ рдЕрд╕реЗрдВрдмрд▓реА рдХреА рддрд░рд╣ рд╣реА рдмрд╛рдЗрдирд░реА рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЕрд░реНрдерд╛рддреН рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдпред
рдЪреВрдВрдХрд┐ C2Rust рдХрд╛рд░реНрдЧреЛ рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдирд░реА рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд
Cargo.toml
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЬрдВрдЧ рдХреНрд░реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
C2Rust рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдЖрдЙрдЯрдкреБрдЯ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдПрдХ рдХреНрд░реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдпрд╛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд▓рд┐рдВрдХрд░ рдХреЙрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ)ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рдПрдХ рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдЖрдП рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ C2Rust рджреЗрд╢реА рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: C2Rust рдЗрдирдкреБрдЯ рдкрд░ рдПрдХ
рд╕рдВрдХрд▓рди рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рди рдХрдорд╛рдВрдб рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ рдЬреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдВрдХрд░ рдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛
рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдХрдорд╛рдВрдб рд╣реИрдВред рдЗрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреВрд▓ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реАрдорд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
CMAKE_EXPORT_COMPILE_COMMANDS
,
bear
рдФрд░
compiledb
рд╕рд╛рде
CMAKE_EXPORT_COMPILE_COMMANDS
ред рд╣рдорд╛рд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, рдПрдХрдорд╛рддреНрд░ рдЙрдкрдХрд░рдг рдЬрд┐рд╕рдореЗрдВ
build-logger
рдХрдорд╛рдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ,
CodeChecker
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд
build-logger
, рдЬрд┐рд╕рдХрд╛ рд╣рдордиреЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛ (рд╡реЗ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдХрдИ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ
compile_commands.json
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ
рд╕рдВрдХрд▓рдХ рдФрд░
рд▓рд┐рдВрдХрд░ рдЖрд╡рд░рдг рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ
рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░
рд▓рд┐рдВрдХрд░ рдХреЗ рд╕рднреА рдХреЙрд▓реЛрдВ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбрдВрдк рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд
compile_commands.json
рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕рднрд╛ рдХреЗ рдмрдЬрд╛рдп рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ:
$ make release
рд╣рдордиреЗ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХреЛ рдЬреЛрдбрд╝рд╛:
$ make release CC=/path/to/C2Rust/scripts/cc-wrappers/cc
рд░реИрдкрд░ рдПрдХ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐ рдХреЙрд▓ред рджреВрд╕рд░реА
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рдирдИ
compile_commands.json
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рди рдФрд░ рд╕рдВрдХрд▓рди рджреЛрдиреЛрдВ рдХрдорд╛рдВрдб рд╣реИрдВред рдлрд┐рд░ рд╣рдордиреЗ C2Rust рдХреЛ рдмрдврд╝рд╛рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдмрд┐рд▓реНрдб рдХрдорд╛рдВрдб рдХреЛ рдкрдврд╝реЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдмрд╛рдЗрдирд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрд░рд╛ рдмрдирд╛рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, C2Rust рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рднреА рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмрдВрдзрд┐рдд
build.rs
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ
рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдВрджрд░ рд░рдЦрдХрд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред C2Rust рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░
Cargo.toml
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо
quake3-rs
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓
cargo build
рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ tree -L 1 . тФЬтФАтФА Cargo.lock тФЬтФАтФА Cargo.toml тФЬтФАтФА cgamex86_64 тФЬтФАтФА ioquake3 тФЬтФАтФА qagamex86_64 тФЬтФАтФА renderer_opengl1_x86_64 тФЬтФАтФА rust-toolchain тФФтФАтФА uix86_64 $ cargo build --release
рдЦреБрд░рджрд░рд╛рдкрди рджреВрд░ рдХрд░реЗрдВ
рдЬрдм рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рд╣рдо рдХреНрд╡реЗрдХ 3 рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рдЧрдП: рдРрд╕реЗ рд╕реАрдорд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЗ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ C2Rust рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрд╛ (рди рддреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ, рди рд╣реА рдХрд┐рд╕реА рднреА рддрд░рд╣)ред
рдПрд░рд┐рдпрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕
рдореВрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдРрд╕реЗ рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдВрддрд┐рдо рд╕рд░рдгреА рддрддреНрд╡ рдХреЗ рдмрд╛рдж рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рд╕реА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реИ:
int array[1024]; int *p;
рд╕реА рдорд╛рдирдХ (рджреЗрдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
C11, рдзрд╛рд░рд╛ 6.5.6 ) рдПрдХ рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд░реЗ рдПрдХ рддрддреНрд╡ рдХреЛ
рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдВрдЧ рдЗрд╕ рдмрд╛рдд рдХреЛ рдордирд╛ рдХрд░рддреА рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдХреЗрд╡рд▓ рддрддреНрд╡ рдХрд╛ рдкрддрд╛ рд▓реЗрдВред рд╣рдореЗрдВ
AAS_TraceClientBBox
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдРрд╕реЗ рдкреИрдЯрд░реНрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗред
рд░рд╕реНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рднреА рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
G_TryPushingEntity
рдореЗрдВ
G_TryPushingEntity
рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд╢рд░реНрдд рдЕрдиреБрджреЗрд╢ рдлреЙрд░реНрдо рдХрд╛ рд╣реИ
>
рдирд╣реАрдВ
>=
ред рдПрдХ рд╕реВрдЪрдХ рдЬреЛ рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж dereferenced рд╣реИ, рдЬреЛ рдПрдХ рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдмрдЧ рд╣реИред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ C2Rust рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓рд░ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рд╕рд░рдгреА рддрддреНрд╡ рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред рдЗрд╕ рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреЛрдб рдЬреЛ рд╕рдорд╛рди рдкреИрдЯрд░реНрди "рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рддрддреНрд╡ рдкрддрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЕрдм рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЪрд░ рд▓рдВрдмрд╛рдИ рд╕рд░рдгреА рддрддреНрд╡
рд╣рдордиреЗ рд╣рд░ рдЪреАрдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛, рдФрд░ рддреБрд░рдВрдд рдЬрдВрдЧ рд╕реЗ рдШрдмрд░рд╛ рдЧрдП:
thread 'main' panicked at 'index out of bounds: the len is 4 but the index is 4', quake3-client/src/cm_polylib.rs:973:17
cm_polylib.c
рдкрд░ рдПрдХ рдирдЬрд╝рд░
cm_polylib.c
, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдлрд╝реАрд▓реНрдб
p
рдХреЛ dereferences рдХрд░рддрд╛ рд╣реИ:
typedef struct { int numpoints; vec3_t p[4];
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ
p
рдлрд╝реАрд▓реНрдб рд▓рдЪреАрд▓реА рд╕рд░рдгреА рд╕рджрд╕реНрдп рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ C99 рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА
gcc
рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред C2Rust рд╕рд┐рдВрдЯреИрдХреНрд╕ C99 (
vec3_t p[]
) рдХреЗ рд╕рд╛рде рдЪрд░-рд▓рдВрдмрд╛рдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ C99 рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓
vec3_t p[]
рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ 0 рдФрд░ 1 рдХреЗ рдЖрдХрд╛рд░); рд╣рдордиреЗ ioquake3 рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рднреА рдХрдИ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рд╣реИрдВред
рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЛ C99 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ
рдмрджрд▓рдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ:
typedef struct { int numpoints; vec3_t p[];
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ (0 рдФрд░ 1 рд╕реЗ рднрд┐рдиреНрди рд╕рд░рдгреА рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде) рдЕрддреНрдпрдВрдд рдХрдард┐рди рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рдордирдорд╛рдиреА рдЖрдХрд╛рд░реЛрдВ рдХреА рдЪрд░ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдореВрд▓ C рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ ioquake3 рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред
рдЗрдирд▓рд╛рдЗрди рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдореЗрдВ рдмрдВрдзреЗ рдСрдкрд░реЗрдВрдб
рдХреНрд░реИрд╢ рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╕реНрд░реЛрдд
/usr/include/bits/select.h
рд╕рд┐рд╕реНрдЯрдо рд╣реЗрдбрд░ рд╕реЗ рд╕реА-рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдХреЛрдб рдерд╛:
# define __FD_ZERO(fdsp) \ do { \ int __d0, __d1; \ __asm__ __volatile__ ("cld; rep; " __FD_ZERO_STOS \ : "=c" (__d0), "=D" (__d1) \ : "a" (0), "0" (sizeof (fd_set) \ / sizeof (__fd_mask)), \ "1" (&__FDS_BITS (fdsp)[0]) \ : "memory"); \ } while (0)
__FD_ZERO
рдореИрдХреНрд░реЛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛
gcc
рдХрд╛ рдПрдХ рджреБрд░реНрд▓рдн рд╕реАрдорд╛ рд░реЗрдЦрд╛ рдорд╛рдорд▓рд╛ рдЙрдард╛рддреА рд╣реИ: рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде
рдмрдВрдзреЗ рдСрдкрд░реЗрдВрдб I / Oред рдЖрдЙрдЯрдкреБрдЯ рдСрдкрд░реЗрдЯрд░
"=D" (__d1)
рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ 32-рдмрд┐рдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░
__d1
рдореЗрдВ
__d1
, рдФрд░
"1" (&__FDS_BITS (fdsp)[0])
рдЙрд╕реА рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдкрддрд╛
fdsp->fds_bits
рд╕реЗ 64-рдмрд┐рдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ
fdsp->fds_bits
ред
gcc
рдФрд░
clang
рдЗрд╕ рдмреЗрдореЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред 64-рдмрд┐рдЯ
rdi
рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдорд╛рди
__d1
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЫреЛрдЯрд╛
__d1
, рдФрд░ рдЬрдВрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ LLVM рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╣рддрд╛ рд╣реИред рдбреАрдмрдЧ рдмрд┐рд▓реНрдб рдореЗрдВ (рд░рд┐рд▓реАрдЬрд╝ рд╡рд╛рд▓реЗ рдореЗрдВ рдирд╣реАрдВ, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛), рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдВрдб рдХреЛ
edi
рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рд╕реЗ рдкрд╣рд▓реЗ 32 рдмрд┐рдЯреНрд╕ рддрдХ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рд░рд╕реНрдЯ рдмрд╣реБрдд рдХрдо рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдЯ-рдЗрди
rustc
рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛрдб рдХреЛ
rustc
рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ C2Rust рдореЗрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╣рдордиреЗ рдПрдХ рдирдпрд╛ рдЯреЛрдХрд░рд╛
c2rust-asm-casts
рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ
c2rust-asm-casts
рдФрд░ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ
c2rust-asm-casts
рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЖрдХрд╛рд░ рдореЗрдВ рдмрдВрдзреЗ рд╣реБрдП рдСрдкрд░реЗрдВрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрдиреЛрдВ рдЧреНрд░рдВрдерд┐рдпреЛрдВ рдХреЛ рдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ:
let mut __d0: c_int = 0; let mut __d1: c_int = 0;
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ
fresh6
рдХреЛрдб рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╡реИрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬрдм рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдШрд░реНрд╖реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдкреНрд░рдХрд╛рд░ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ
fresh6
рдФрд░
fresh8
)ред
рдЧреНрд▓реЛрдмрд▓ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛
рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕реНрд░реЛрдд рдПрд╕рдПрд╕рдИ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдерд╛:
static unsigned char ssemask[16] __attribute__((aligned(16))) = { "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00\x00\x00" };
рдЬрдВрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЕрд░реНрдерд╛рддреНред
static
рддрддреНрд╡ред рд╣рдордиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рдпрд╛ рддреЛ рдЬрдВрдЧ рдореЗрдВ рдпрд╛ C2Rust рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрдм ioquake3 рдореЗрдВ рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдЫреЛрдЯреА
рдкреИрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред рдпрд╣ рдкреИрдЪ рдлрд╝рд╛рдЗрд▓ Rust
ssemask
рдирд┐рдореНрди рдХреЗ
ssemask
рдмрджрд▓ рджреЗрддреА рд╣реИ:
#[repr(C, align(16))] struct SseMask([u8; 16]); static mut ssemask: SseMask = SseMask([ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, ]);
рд░рдирд┐рдВрдЧ рдХреНрд╡реЗрдХ3-рдЖрд░рдПрд╕
рдЬрдм
cargo build --release
, рддреЛ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХрд╛
cargo build --release
, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде
target/release
рдХреЗ рддрд╣рдд рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐
ioquake3
рдмрд╛рдЗрдирд░реА рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдПрдХ рдРрд╕реА
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рд╣реИ рдЬреЛ рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ (
.pk3
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ
.pk3
рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕рд╣рд┐рдд) рдХреЛ рдкреБрдирдГ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдмрдирд╛рддреА рд╣реИ:
$ /path/to/make_quake3_rs_links.sh /path/to/quake3-rs/target/release /path/to/paks
рдкрде
/path/to/paks
.pk3
рдХреЛ
.pk3
рдлрд╝рд╛рдЗрд▓реЛрдВ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм рдЪрд▓рд┐рдП рдЦреЗрд▓ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ! рд╣рдореЗрдВ
+set vm_game 0
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрджрд┐, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд░реВрд╕реНрдЯ рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░
cl_renderer
рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рд╕рд╛рде рд╣реА рдУрдкрди_рез рд░реЗрдВрдбрд░рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cl_rendererред
$ ./ioquake3 +set sv_pure 0 +set vm_game 0 +set vm_cgame 0 +set vm_ui 0 +set cl_renderer "opengl1"
рдФрд░ ...
рд╣рдордиреЗ рд░рд╕реНрдЯ рдкрд░ Quake3 рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛!
рдпрд╣рд╛рдБ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рдо рдХреНрд╡реЗрдХ 3 рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЧреЗрдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВ:
рдЖрдк рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА
transpiled
рд╢рд╛рдЦрд╛ рдореЗрдВ
рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рдб рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ
refactored
рд╢рд╛рдЦрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкреВрд░реНрд╡-рд▓рд╛рдЧреВ
рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдХрдорд╛рдВрдб рдХреЗ рд╕рдорд╛рди
рд╕реНрд░реЛрдд рд╣реИрдВ ред
рд╕рдВрдХреНрд░рдордг рдХреИрд╕реЗ рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдк рдХреНрд╡реЗрдХ 3 рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд╡реЗрдХ 3 рдЧреЗрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдпрд╛ рдбреЗрдореЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ C2Rust рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рд░рд╛рдд рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг
nightly-2019-12-05
, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП C2Rust
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдпрд╛
crates.io рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
$ cargo +nightly-2019-12-05 install c2rust
рдФрд░ рд╣рдорд╛рд░реЗ C2Rust рдФрд░ ioquake3 рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ:
$ git clone <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dcbbb5a89cbbb5a8b4a9bef2bfb3b1">[email protected]</a>:immunant/c2rust.git $ git clone <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dcbbb5a89cbbb5a8b4a9bef2bfb3b1">[email protected]</a>:immunant/ioq3.git
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
c2rust
рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк
cargo build --release
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ C2Rust рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, C2Rust рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ ioquake3 рдЯреНрд░рд╛рдВрд╕рдкреНрд▓рд┐рдореЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЖрд╡рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд╣рдордиреЗ рдПрдХ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЛрд╕реНрдЯ рдХреА рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реА рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИ рдФрд░
ssemask
рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
ioq3
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рд╕реЗ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
$ ./transpile.sh </path/to/C2Rust repository> </path/to/c2rust binary>
рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ Rust рдХреЛрдб рдпреБрдХреНрдд рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛
quake3-rs
рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдк
cargo build --release
рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╢реЗрд╖ рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред