C ++ рдпрд╛ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ DSL - рдпрд╣ рдЖрд╕рд╛рди рд╣реИ!

рд╢реБрдн рд╕реЛрдорд╡рд╛рд░, рдЦрд╛рдмреНрд░реЛрд╡рд┐рддреНрд╕!

рдЗрд╕ рд╕реБрдмрд╣ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдкрд╛рдЗрдерди рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдирд┐рд░реНрдгрдп рд╢рдХреНрддрд┐ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдХреНрд╕рд░ рдмреЗрд╣рдж рдЕрд╕рд╛рдзрд╛рд░рдг рдФрд░ рдХреЗрд╡рд▓ 5% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреА рд╣реИред рдирддреАрдЬрддрди, рдЖрдкрдХреЛ рд╕реАрдзреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЗ рдкреВрд░реЗ рд╕рдореВрд╣ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдирд┐рд░рд╛рд╢рд╛рд╡рд╛рдж рдФрд░ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рдЕрдкрдиреЗ рджреВрд░ рдХреЗ рдЕрддреАрдд рдХреА рдПрдХ рдРрд╕реА рд╣реА рдХрд╣рд╛рдиреА рдпрд╛рдж рдЖ рдЧрдИ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВред


рд╕рдорд╕реНрдпрд╛


рдпрд╣ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдерд╛ рдФрд░ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдкрд╣рд▓реЗ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╕рдВрд╕реНрдорд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдЖрдЙрдЯрд╕реЛрд░реНрд╕рд┐рдВрдЧ рд╡рд┐рднрд╛рдЧ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдХреНрд░рд┐рдп рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕реНрддрд░ рдкрд░ рдереА, рдФрд░ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдФрд░ рдХреБрдЫ рдмрджрд▓рдиреЗ (рдпрд╛ рд╢рд╛рдпрдж рд╢реБрд░реВ рдореЗрдВ рдЕрд╕рдВрднрд╡) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рдереАред 20 рдЯреИрдмрд▓реЗрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕рд╛рдп-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред C ++ рдореЗрдВред рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рддред Postgres рдпрд╛ Oracle рдореЗрдВ 20 рдЯреИрдмрд▓реЗрдЯред "рд╡реНрдпрд╡рд╕рд╛рдп-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдЧреВрдВрдЧреЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдВрдЬрдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЕрдиреНрдп рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдХреБрдВрдЬреА рдпрд╛ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдЪрдпрди рдХрд░рдиреЗ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХрдиреЗрдХреНрдЯреЗрдб рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЙрд╕ рд╕рдордп рддрдХ, рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрдиреЗ рд▓рдЧрд╛ рдерд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдХрднреА-рдХрднреА рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рд╣реА! рдЗрд╕ рдХрд╛рд░реНрдп рдиреЗ, рдЕрдкрдиреА рдирд┐рд░рд╛рд╢рд╛ рд╕реЗ, рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рддреЛрдбрд╝ рджрд┐рдПред рд░рд╛рдд рднрд░, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЬреВрддреЛрдВ рдореЗрдВ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛, рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд░рдЦрддреЗ рдереЗ, рдФрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдпрд╣ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл, рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдореА рдЗрддрдиреЗ рдмреБрд░реЗ рдирд╣реАрдВ рдереЗ - рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рд┐рд░реНрдл C ++ (C) рд▓рд┐рдмрд╛рд╕ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЫрд╛рдВрдЯрд╛, рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рдерд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рдерд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА, рдмрдпрд╛рдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдУрд░реЗрдХрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЯреНрд╕ред

рд╡рд┐рдЪрд╛рд░


рдпрд╣ рджреГрдврд╝ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЧреВрдВрдЧрд╛ рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдиреЗ рднреА рдореБрдЭреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдзреАрд░реЗ-рдзреАрд░реЗ рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдХреНрдХрд╛ рджрд┐рдпрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдзрд╛рдЧреЗ рдкрд░ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдореЗрд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЗрд╕ рднрд╛рдЧреНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реБрдЖ, рдЗрд╕рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ, рдЙрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рд╕рдореНрдорд╛рди рдорд┐рд▓рд╛ред рдЗрд╕ рдЙрдкрдХреНрд░рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдмрд╛рдд рдереА рдХрд┐ рдЙрд╕ рд╕рдордп рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЪрд╛рд░ рдерд╛ рдХрд┐ рдХреБрдЫ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИред рдКрд╖реНрдорд╛рдпрди рдЕрд╡рдзрд┐ рд╕реЗ, рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдЬреЗрдПрд╕рдкреА, рдбрд┐рдмреНрдмреЗ рдФрд░ рд░рд╛рдд рдХреЗ рдкрдВрдЦреЛрдВ рдкрд░ рдЕрдиреНрдп рдбрд░рд╛рд╡рдиреА рдЙрдбрд╝рд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдбрд┐рдмрдЧ рдХреА рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдореГрддрд┐ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдбреАрдмрдЧрд░ рдиреЗ рдореБрдЭреЗ рдЬреЗрдПрд╕рдкреА (рдЬрд╛рд╡рд╛ рд╕рд░реНрд╡рд░ рдкреЗрдЬ) рдкреЗрдЬ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХреЛрдб рджрд┐рдЦрд╛рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдкреГрд╖реНрда рд╕реЗ:
<ul> <% for (int i = 0; i < 10; i++) { %> <li> <%= i %> <% } %> </ul> 

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ:
 out.println("<ul>"); for (int i = 0; i < 10; i++) { out.print("<li>"); out.print(i); out.println(); } out.println("</ul>"); 

рдпрд╣реА рд╣реИ, рдЬреЗрдПрд╕рдкреА рдХреЛрдб рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ: рд▓рдЧрднрдЧ: рд╕рдм рдХреБрдЫ рдЬреЛ рдЕрдВрджрд░ <%%> рдХреЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рд╕рдм рдХреБрдЫ рдЬреЛ рдмрд╛рд╣рд░ рд╕реЗ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд┐рдВрдЯ ("<рдкрд╛рда>"), рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдереЛрдбрд╝рд╛ рд╕рд╛ рдЪреАрдиреАред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдмрд╕ HTML рдХреЛ C ++ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдХреБрдЫ рд╕рд░рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╡рд╣ рдХреЛрдб рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд C ++ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред "рдХреБрдЫ рдФрд░" рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЪреБрдирд╛ - рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╣реЛрд╕реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдмрд┐рд▓реНрдб рдорд╢реАрди рдкрд░ рдерд╛, рд╣рдо рдХреНрд░рдорд╢рдГ рдЬрд╛рд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдпрд╛ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ)ред

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкрд╛рда рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореВрд▓ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдмрд╣реБрдд рд╕рд╛рд░реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдкрд╣рд▓реЗ рд╣реА рд╕реНрдореГрддрд┐ рд╕реЗ рдорд┐рдЯрд╛ рджрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд▓рд╛рдЗрди рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рдо рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╣реЛрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реНрдордЪрд╛рд░реА, рд╡рд┐рднрд╛рдЧ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдорд╛рдирдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЬреЗрдПрд╕ рдХреЗ рдПрдХ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ - рд░рд╛рдЗрдиреЛ (рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, v8 рджреВрд╕рд░рд╛ рдерд╛)ред рддреЛ, рд░рд╛рдЗрдиреЛ рд░рдЦреЛ, codegen.js рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ, рд╡рд╣рд╛рдВ рдкреНрд░рд┐рдВрдЯ (2 * 2) рд▓рд┐рдЦреЗрдВ; рд░рд╛рдЗрдиреЛ codegen.js: 4, рд╡реЙрдЗрд▓рд╛!
codegen.js
 if (arguments.length < 1) { print("Usage: codegen.js <template>"); quit(); } function produce_text(text) { return "__codegen_output += '" + text.replace("'", "\\'", 'g').replace('\n', '\\n', 'g').replace('\r', '\\r', 'g').replace('\t', '\\t', 'g') + "';\n"; } function produce_code(code) { if (code[0] == '=') { return '__codegen_output += ' + code.substr(1) + ';\n'; } return code + '\n'; } remainder = readFile(arguments[0]); var code = 'var __codegen_output = ""; '; while (remainder.length) { var begin = remainder.indexOf('<%'); if (begin >= 0) { code += produce_text(remainder.substr(0, begin)); remainder = remainder.substr(begin + 2); var end = remainder.indexOf('%>'); if (end >= 0) { code += produce_code(remainder.substr(0, end)); remainder = remainder.substr(end + 2); } else { code += produce_code(remainder); remainder = ''; } } else { code += produce_text(remainder); remainder = ''; } } code += 'print(__codegen_output);' eval(code); 

- рдЧреВрдВрдЧрд╛, рд╕реАрдзреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕реАрдзрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - 50 рд▓рд╛рдЗрдиреЗрдВ - рдкреВрд░реЗ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ред рдкрд░реАрдХреНрд╖рдг:
рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓:
 <% var className = 'MyClass'; var fields = ['Name', 'Description', 'AnotherOne', 'LastOne']; %> class <%= className %> { private: <% for(var i = 0; i < fields.length; i++) { %> int <%= fields[i] %>; <% } %> }; 


  рд░рд╛рдЗрдиреЛ codegen.js рдЯреЗрдореНрдкрд▓реЗрдЯ: 

 class MyClass { private: int Name; int Description; int AnotherOne; int LastOne; }; 

<%%> рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рднреА js рдХреЛрдб рд╣реИ, <% = expr%> рдХреЛ expr рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХреБрдЫ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рд╕рд╛рджрдЧреА рдХрд╛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рднреА рд╣реИ - рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреЛрдб рдмрд╣реБрдд рдШрдирд╛ рд╣реИ рдФрд░ рдЙрдЪрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдВрддрд┐рдо рдлрд┐рдбреЗрд▓ рдЬреЗрдПрд╕ рджреНрд╡рд╛рд░рд╛ рд╣реА рдЦреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рд╕рд╣рдорддрд┐ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЕрдм рд╕рдордп рд╣реИ рдХрд┐ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдПред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓:
 <% var model = [ { name: 'Employee', fields: { Id: { type: 'int' }, Name: { type: 'string' } } } ]; var cppTypeMap = { 'int': 'int', 'string': 'std::string' }; %> <% for (var i = 0; i < model.length; i++) { var entity = model[i];%> struct <%= entity.name %> { <% for (var field in entity.fields) { %> <%= cppTypeMap[entity.fields[field].type] %> <%= field %>; <% } %> }; <% } %> 


  рд░рд╛рдЗрдиреЛ codegen.js рдЯреЗрдореНрдкрд▓реЗрдЯ: 

 struct Employee { int Id; std::string Name; }; 

рдореЙрдбрд▓ рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рддрдерд╛рдХрдерд┐рдд рдбреАрдПрд╕рдПрд▓ (рдбреЛрдореЗрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛) рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЖрджрд┐рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░реЗрдВрдЧреЗред
 var model = [ { name: 'Department', fields: { Id: { type: 'int' }, Name: { type: 'string'} }, primaryKey: 'Id' }, { name: 'Employee', fields: { Id: { type: 'int' }, Name: { type: 'string' }, DepartmentId: { type: 'int', references: 'Department' } }, primaryKey: 'Id' } ]; 


рдирд┐рд░реНрдгрдп


рдЕрдм рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛, рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рджреНрд╡рд╛рд░рд╛, рдЖрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ sql рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИред рдПрдХ рдореЙрдбрд▓ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмрд┐рдЦреЗрд░реЗрдВрдЧреЗ:
рдЖрджрд░реНрд╢
 var model = [ { name: 'Department', fields: { Id: { type: 'int' }, Name: { type: 'string'} }, primaryKey: 'Id' }, { name: 'Employee', fields: { Id: { type: 'int' }, Name: { type: 'string' }, DepartmentId: { type: 'int', references: 'Department' } }, primaryKey: 'Id' } ]; 

рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ DSL рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ,
cpp.template
 <% load('model'); var cppTypeMap = { 'int': 'int', 'string': 'std::string' }; function fieldType(entity, field) { return cppTypeMap[entity.fields[field].type]; } %> <% for (var i = 0; i < model.length; i++) { var entity = model[i];%> struct <%= entity.name %> { <% for (var field in entity.fields) { %> <%= fieldType(entity, field) %> <%= field %>; <% } %> <% var fieldList = []; for (var field in entity.fields) fieldList.push(field); %> static <%= entity.name %> ByKey(<%= fieldType(entity, entity.primaryKey) %> key, pqxx::work& tr) { if (!tr.prepared("<%= entity.name %>ByKey").exists()) { tr.conn().prepare("<%= entity.name %>ByKey", "select <%= fieldList.join() %> from <%= entity.name %> where <%= entity.primaryKey %> = $1"); } pqxx::result rows = tr.prepared("<%= entity.name %>ByKey")(key).exec(query); <%= entity.name %> result; <% for (var j = 0; j < fieldList.length; j++) { %> result.<%= fieldList[j] %> = rows[0][<%= j %>].as<<%= fieldType(entity, fieldList[j]) %>>(); <% } %> return result; } <% for (var field in entity.fields) if (entity.fields[field].references) { var ref = entity.fields[field].references; %> <%= ref %> Get<%= ref %>() { return <%= ref %>::ByKey(<%= field %>); } static std::vector<<%= entity.name %>> By<%= ref %>(<%= fieldType(entity, field) %> key) { if (!tr.prepared("<%= entity.name %>By<%= ref %>").exists()) { tr.conn().prepare("<%= entity.name %>By<%= ref %>", "select <%= fieldList.join() %> from <%= entity.name %> where <%= field %> = $1"); } pqxx::result rows = tr.prepared("<%= entity.name %>By<%= ref %>")(key).exec(query); std::vector<<%= entity.name %>> result; for (pqxx::result::size_type i = 0; i < rows.size(); i++) { <%= entity.name %> row; <% for (var j = 0; j < fieldList.length; j++) { %> row.<%= fieldList[j] %> = rows[i][<%= j %>].as<<%= fieldType(entity, fieldList[j]) %>>(); <% } %> result.push_back(row); } return result; } <% } %> }; <% } %> 

- рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░
sql.template
 <% load('model'); var sqlTypeMap = { 'int': 'integer', 'string': 'text' }; function fieldType(entity, field) { return sqlTypeMap[entity.fields[field].type]; } %> <% for (var i = 0; i < model.length; i++) { var entity = model[i];%> CREATE TABLE <%= entity.name %> ( <% for (var field in entity.fields) { var ref = entity.fields[field].references; %> <%= field %> <%= fieldType(entity, field) %><% if (ref) { %> REFERENCES <%= ref %><% } %>, <% } %> PRIMARY KEY (<%= entity.primaryKey %>) ); <% } %> 

- рдбреЗрдЯрд╛рдмреЗрд╕ рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯред

  рд░рд╛рдЗрдиреЛ codegen.js cpp.template: 

 struct Department { int Id; std::string Name; static Department ByKey(int key, pqxx::work& tr) { if (!tr.prepared("DepartmentByKey").exists()) { tr.conn().prepare("DepartmentByKey", "select Id,Name from Department where Id = $1"); } pqxx::result rows = tr.prepared("DepartmentByKey")(key).exec(query); Department result; result.Id = rows[0][0].as<int>(); result.Name = rows[0][1].as<std::string>(); return result; } }; struct Employee { int Id; std::string Name; int DepartmentId; static Employee ByKey(int key, pqxx::work& tr) { if (!tr.prepared("EmployeeByKey").exists()) { tr.conn().prepare("EmployeeByKey", "select Id,Name,DepartmentId from Employee where Id = $1"); } pqxx::result rows = tr.prepared("EmployeeByKey")(key).exec(query); Employee result; result.Id = rows[0][0].as<int>(); result.Name = rows[0][1].as<std::string>(); result.DepartmentId = rows[0][2].as<int>(); return result; } Department GetDepartment() { return Department::ByKey(DepartmentId); } static std::vector<Employee> ByDepartment(int key) { if (!tr.prepared("EmployeeByDepartment").exists()) { tr.conn().prepare("EmployeeByDepartment", "select Id,Name,DepartmentId from Employee where DepartmentId = $1"); } pqxx::result rows = tr.prepared("EmployeeByDepartment")(key).exec(query); std::vector<Employee> result; for (pqxx::result::size_type i = 0; i < rows.size(); i++) { Employee row; row.Id = rows[i][0].as<int>(); row.Name = rows[i][1].as<std::string>(); row.DepartmentId = rows[i][2].as<int>(); result.push_back(row); } return result; } }; 

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛ рдерд╛ рдпрд╛ рд╕рдВрдХрд▓рди рднреА рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред :)

  рд░рд╛рдЗрдиреЛ codegen.js sql.template: 

 CREATE TABLE Department ( Id integer, Name text, PRIMARY KEY (Id) ); CREATE TABLE Employee ( Id integer, Name text, DepartmentId integer REFERENCES Department, PRIMARY KEY (Id) ); 

рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рдирдпрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХрдИ ORM рд╕рдорд╛рди рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рднрд▓реЗ рд╣реА рдХреЗрд╡рд▓ рдбреАрдПрд╕рдПрд▓, рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЖрдк рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдкрд╛рд░реНрд╕рд░ рдкрд░ рдмрдЪрд╛ рд▓рд┐рдпрд╛ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рдо рдЬреЗрдПрд╕ рдЗрдВрдЬрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рдкрд░ рдорд╢реАрди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд▓рд╕ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдкреНрд▓рд╕ рд╕рдВрдХрд▓рдХ рдХреЛ рднрд╛рд░ рдЙрдард╛рдиреЗ рджреЗрдВред

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


All Articles