рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреНрд╡реЗрдХ 3 рд╕реЗ рд░рд╕реНрдЯ


рд╣рдорд╛рд░реА рдЯреАрдо рдЗрдореНрдпреБрдиреЗрдВрдЯ рд░рд╕реНрдЯ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ 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 # client тФВ тФЬтФАтФА qagamex86_64.so # game server тФВ тФФтФАтФА uix86_64.so # ui тФЬтФАтФА ioq3ded.x86_64 # dedicated server binary тФЬтФАтФА ioquake3.x86_64 # main binary тФЬтФАтФА renderer_opengl1_x86_64.so # opengl1 renderer тФФтФАтФА renderer_opengl2_x86_64.so # opengl2 renderer 

рдЗрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдпреВрдЖрдИ, рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдпрд╛ рддреЛ рдХреНрд╡рд┐рдХ рд╡реАрдПрдо рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреЗрд╢реА 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; // ... if (p >= &array[1024]) { // error... } 

рд╕реА рдорд╛рдирдХ (рджреЗрдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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]; // variable sized } winding_t; 

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ p рдлрд╝реАрд▓реНрдб рд▓рдЪреАрд▓реА рд╕рд░рдгреА рд╕рджрд╕реНрдп рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ C99 рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА gcc рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред C2Rust рд╕рд┐рдВрдЯреИрдХреНрд╕ C99 ( vec3_t p[] ) рдХреЗ рд╕рд╛рде рдЪрд░-рд▓рдВрдмрд╛рдИ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ C99 рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ vec3_t p[] рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ 0 рдФрд░ 1 рдХреЗ рдЖрдХрд╛рд░); рд╣рдордиреЗ ioquake3 рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рднреА рдХрдИ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рд╣реИрдВред

рдЙрдкрд░реЛрдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЛ C99 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдШрдмрд░рд╛рд╣рдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ:

 typedef struct { int numpoints; vec3_t p[]; // variable sized } winding_t; 

рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ (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; // Reference to the output value of the first operand let fresh5 = &mut __d0; // The internal storage for the first tied operand let fresh6; // Reference to the output value of the second operand let fresh7 = &mut __d1; // The internal storage for the second tied operand let fresh8; // Input value of the first operand let fresh9 = (::std::mem::size_of::<fd_set>() as c_ulong).wrapping_div(::std::mem::size_of::<__fd_mask>() as c_ulong); // Input value of the second operand let fresh10 = &mut *fdset.__fds_bits.as_mut_ptr().offset(0) as *mut __fd_mask; asm!("cld; rep; stosq" : "={cx}" (fresh6), "={di}" (fresh8) : "{ax}" (0), // Cast the input operands into the internal storage type // with optional zero- or sign-extension "0" (AsmCast::cast_in(fresh5, fresh9)), "1" (AsmCast::cast_in(fresh7, fresh10)) : "memory" : "volatile"); // Cast the operands out (types are inferred) with truncation AsmCast::cast_out(fresh5, fresh9, fresh6); AsmCast::cast_out(fresh7, fresh10, fresh8); 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ 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 рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╢реЗрд╖ рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi483142/


All Articles