LLVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдмрдирд╛рдирд╛ред рднрд╛рдЧ 1: рдкрд░рд┐рдЪрдп рдФрд░ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ "рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдмрдирд╛рдирд╛" рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЖрдкрдХреЛ рдПрдХ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рднреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рдж рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬреЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдХреЛрдб LLVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреА рд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдкреИрдб рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

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

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

рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд: рд╣рдо рдЖрдкрд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд┐рд╡реЗрдХ рд╕реЗ рдЦреЗрд▓реЗрдВрдЧреЗред рдХреЛрдб рд▓реЗрдВ рдФрд░ рдлреНрд░реИрдВрдЪрд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ, рдкрд╛рдЧрд▓ рд╣реЛ рдЬрд╛рдПрдВ, рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдбрд░рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдмрд╣реБрдд рдордЬреЗрджрд╛рд░ рд╣реИ!

рдЬреАрдн рдХрд╛рд▓реАрджреЛрд╕реНрдХреЛрдк

рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЯреЙрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ " рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк " рдХрд╣рд╛ рд╣реИ (рдирд╛рдо рддреАрди рдЧреНрд░реАрдХ рд╢рдмреНрджреЛрдВ рд╕реЗ рдЖрдпрд╛ рд╣реИ: "рд╕реБрдВрджрд░", "рджреЗрдЦреЛ" рдФрд░ "рджреЗрдЦреЛ, рджреЗрдЦреЛ")ред рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ, рд╢рд░реНрддреЛрдВ, рдЧрдгрд┐рдд рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЕрдзреНрдпрдпрди рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЕрдЧрд░ / рдлрд┐рд░ / рдирд┐рд░реНрдорд╛рдг, рд▓реВрдк, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрдпрд╛рди, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде JIT рд╕рдВрдХрд▓рди, рдЖрджрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдмрд╣реБрд░реВрдкрджрд░реНрд╢рдХ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ - рдПрдХ 64-рдмрд┐рдЯ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рд╕рдВрдЦреНрдпрд╛ (рдЬреИрд╕реЗ "рдбрдмрд▓" рд╕реА рдореЗрдВ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдореВрд▓реНрдп рджреЛрд╣рд░реЗ рд╕рдЯреАрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИрдВ рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:

#  x-   def fib(x) if x < 3 then 1 else fib(x-1)+fib(x-2) #    40- . fib(40) 

рд╣рдордиреЗ рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк рдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ (LLVM JIT рдЗрд╕реЗ рдХрд╛рдлреА рддреБрдЪреНрдЫ рдмрдирд╛рддрд╛ рд╣реИ) рдХреА рдЕрдиреБрдорддрд┐ рджреАред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдПрдХреНрд╕рдЯрд░реНрдирд▓ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 extern sin(arg); extern cos(arg); extern atan2(arg1 arg2); atan2(sin(.4), cos(42)) 

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

рдФрд░ рдЕрдм рдЗрд╕ рднрд╛рд╖рд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБ!

рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ

рдЬрдм рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рдЪрд╛рд╣рд┐рдП рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╛рдЗрд▓ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рдХреЛрдб рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ "рдЯреЛрдХрди" рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП " рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ " (рдпрд╛ "рд╕реНрдХреИрдирд░") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдореЗрдВ рдХреЛрдб рдХреА рдПрдХ рдЗрдХрд╛рдИ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди) рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВрдЧреЗ:

 //     [0-255],   , //       enum Token { tok_eof = -1, //  ( ) tok_def = -2, tok_extern = -3, //  (, ) tok_identifier = -4, tok_number = -5, }; static std::string IdentifierStr; // ,  tok_identifier (  - ) static double NumVal; // ,  tok_number (  - ) 

рд╣рдорд╛рд░реЗ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдпрд╛ рддреЛ рдЯреЛрдХрди рдПрдиреНрдпреВрдорд░реЗрд╢рди рдорд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдВрдЧреЗ рдпрд╛ рдпрд╣ "рдЕрдЬреНрдЮрд╛рдд" рдЬреИрд╕реЗ "+" рд╡рд░реНрдг рдХреЗ рд╣реЛрдВрдЧреЗ, рдЬреЛ рдХрд┐ ASCII рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╢рд╛рдмреНрджрд┐рдХ рд╣реИ (рдЬреИрд╕реЗ 1.0), рддреЛ NumVal рдореЗрдВ рдЗрд╕рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ :)ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдХреЛ рдЧреЗрдЯрдХреЛрдХ рдирд╛рдордХ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреЗрдЯрдЯреЙрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдорд╛рдирдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:

 /// gettok -       . static int gettok() { static int LastChar = ' '; //  . while (isspace(LastChar)) LastChar = getchar(); 

gettok рдорд╛рдирдХ рдЗрдирдкреБрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП getchar () C рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рд▓рд╛рд╕реНрдЯ рдЪреЗрдпрд░ рдореЗрдВ рд▓рд╛рд╕реНрдЯ рд░реАрдб рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рд╕реЗрд╡ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЙрд╕реЗ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдЯреЛрдХрди рдХреЗ рдмреАрдЪ рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдЪрдХреНрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓реА рдЧреЗрдЯрдЯреЙрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рдЬреИрд╕реЗ "рдбреАрдПрдлрд╝" рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдХреИрд▓реАрдбреЛрд╕реНрдХреЛрдк рдЗрд╕ рд╕рд░рд▓ рд▓реВрдк рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ:

 if (isalpha(LastChar)) { // : [a-zA-Z][a-zA-Z0-9]* IdentifierStr = LastChar; while (isalnum((LastChar = getchar()))) IdentifierStr += LastChar; if (IdentifierStr == "def") return tok_def; if (IdentifierStr == "extern") return tok_extern; return tok_identifier; } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ "рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛" рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛ рдХреЗ рдХреАрд╡рд░реНрдб рдПрдХ рд╣реА рдЪрдХреНрд░ рдореЗрдВ рдЬрд╛рдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИ:

 if (isdigit(LastChar) || LastChar == '.') { // : [0-9.]+ std::string NumStr; do { NumStr += LastChar; LastChar = getchar(); } while (isdigit(LastChar) || LastChar == '.'); NumVal = strtod(NumStr.c_str(), 0); return tok_number; } 

рдпрд╣ рдЗрдирдкреБрдЯ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рдХреЛрдб рд╣реИред рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП strtod C рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо NumVal рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдкрд░реНрдпрд╛рдкреНрдд рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ: "1.23.45.67" рдорд╛рди рдкрдврд╝рд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдиреЗ "1.23" рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЛ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :)ред рдЕрдм рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ:

 if (LastChar == '#') { //    . do LastChar = getchar(); while (LastChar != EOF && LastChar != '\n' && LastChar != '\r'); if (LastChar != EOF) return gettok(); } 

рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╡рд░реНрдгреЛрдВ рдХреЛ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рддрдХ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрджрд┐ рдЗрдирдкреБрдЯ рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдпрд╛ рддреЛ "+" рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдЬреИрд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИред рд╡реЗ рдЗрд╕ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

 //   . if (LastChar == EOF) return tok_eof; //         ASCII int ThisChar = LastChar; LastChar = getchar(); return ThisChar; } 

рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд▓рд┐рдбреЛрд╕реНрдХреЛрдк рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реЛрддрд╛ рд╣реИ (рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛрдб рдХреА рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдЙрдкрд▓рдмреНрдз рд╣реИ)ред рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рд╕рд╛рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рддрдм рд╣рдо рд▓реЗрдХреНрд╕рд┐рдХрд▓ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпреБрдкреАрдбреАред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ рдЬреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ:

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


All Articles