рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдбрд┐рд╡рд╛рдЗрд╕ред рднрд╛рдЧ рек


рдпрд╣ рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдореЗрд░реА рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдПрд╕рдЯреА рд╕реЗ рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реАрдорд╛рдВрдд рдХреНрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ:



рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдЬрдирд░рд▓


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


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрджрд╛рд╣рд░рдг


рдордзреНрдпрд╡рд░реНрддреА рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ LLVM рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ C ++ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ C-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЖрдк рд╕реА-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдУрд░ рд░реБрдЦ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


рдЗрд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдПрдВред рдпрд╣рд╛рдБ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдПрд▓рдПрд▓рд╡реАрдПрдо рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдЖрд╡рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реИред


LLVM-C рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рд░реИрдкрд░ рдПрдХ рд╣реА рдЦрд╛рддреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рджреГрд╢реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд LLVMIRGen рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╢реБрд░реБрдЖрддреА рдореЗрдВ, рдпрд╣ рдкрд╛рд░реНрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдПрд╕рдЯреА рд▓реЗрддрд╛ рд╣реИ:


import cllvm class LLVMIRGen { private let ast: ASTNode init(ast: ASTNode) { self.ast = ast } 

PrintTo (_, рдбрдВрдк) рд╡рд┐рдзрд┐ рдкреАрдврд╝реА рд╢реБрд░реВ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрдардиреАрдп рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддреА рд╣реИред рдбрдВрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рдорд╛рди рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 func printTo(_ fileName: String, dump: Bool) { 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рд╕рд╛рде рд╣реА рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдЪреВрдВрдХрд┐ рдпрд╣ рд╕реА рд╣реИ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдореГрддрд┐ рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, LLVMDisposeModule () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


 let module = generateModule() defer { LLVMDisposeModule(module) } 

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


 let builder = generateBuilder() defer { LLVMDisposeBuilder(builder) } 

рдорд╛рдирдХ рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрд╖реНрдардХ рд╕реЗ рдХрдВрд╕реЛрд▓ рддрдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ generateExternalPutsFunction рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдШреЛрд╖рдгрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред PutFunction рд╕реНрдерд┐рд░рд╛рдВрдХ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:


 let putsFunction = generateExternalPutsFunction(module: module) 

рдПрд╕рдЖрдИрдПрдл рдЪрд░рдг рдореЗрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдмреНрд░реЗрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдРрд╕рд╛ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рддреБрд░рдВрдд рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, generateMainFunction рд╡рд┐рдзрд┐ (рдмрд┐рд▓реНрдбрд░, рдореЙрдбреНрдпреВрд▓, mainInternalGenerator) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:


 generateMainFunction(builder: builder, module: module) { // ... } 

рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрд▓реЛрдЬрд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдВрджрд░ рдПрдПрд╕рдЯреА рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╣реИрдВрдбрд▓ (_, рдкреБрдЯрдлрдВрдХреНрд╢рди, рдмрд┐рд▓реНрдбрд░) рдмрдирд╛рдИ рдЧрдИ рд╣реИ :


 generateMainFunction(builder: builder, module: module) { handleAST(ast, putsFunction: putsFunction, builder: builder) } 

рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкрд░рд┐рдгрд╛рдореА рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 if dump { LLVMDumpModule(module) } LLVMPrintModuleToFile(module, fileName, nil) 

рдЕрдм рдФрд░ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдореЙрдбреНрдпреВрд▓ рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рдХреЗ рд╕рд╛рде LLVMModuleCreateWithName () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:


 private func generateModule() -> LLVMModuleRef { let moduleName = "BraceCompiller" return LLVMModuleCreateWithName(moduleName) } 

рдмрд┐рд▓реНрдбрд░ рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:


 private func generateBuilder() -> LLVMBuilderRef { return LLVMCreateBuilder() } 

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдореЗрдВ Int8 рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП LLVMFunctionType () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдЗрд╕реЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рддрд░реНрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА (рд╕реА-рд╕рд░рдгреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдЧрдд рдЕрдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ) рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ред LLVMAddFunction () рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:


 private func generateExternalPutsFunction(module: LLVMModuleRef) -> LLVMValueRef { var putParamTypes = UnsafeMutablePointer<LLVMTypeRef?>.allocate(capacity: 1) defer { putParamTypes.deallocate() } putParamTypes[0] = LLVMPointerType(LLVMInt8Type(), 0) let putFunctionType = LLVMFunctionType(LLVMInt32Type(), putParamTypes, 1, 0) return LLVMAddFunction(module, "puts", putFunctionType) } 

рдореБрдЦреНрдп рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рдХрд╛рдп рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрд╕рдЖрдИрдПрд▓ рдХреА рддрд░рд╣, рдЗрд╕рдореЗрдВ рдмреЗрд╕ рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LLVMAppendBasicBlock () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХ рдХрд╛ рдирд╛рдо рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред


рдЕрдм рдмрд┐рд▓реНрдбрд░ рдЦреЗрд▓ рдореЗрдВ рдЖрддрд╛ рд╣реИред LLVMPositionBuilderAtEnd () рдХреЙрд▓ рдХрд░рдХреЗ, рдпрд╣ рдЕрднреА рднреА рдЦрд╛рд▓реА рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреНрд▓реЛрдЬрд░ рдореЗрдирдЗрдВрдЯрд░рдЯреЗрдирд░ () рдХреЗ рдЕрдВрджрд░, рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред


рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдирд┐рд░рдВрддрд░ рдорд╛рди 0 рдореБрдЦреНрдп рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдЕрдВрддрд┐рдо рдирд┐рд░реНрджреЗрд╢ рд╣реИ:


 private func generateMainFunction(builder: LLVMBuilderRef, module: LLVMModuleRef, mainInternalGenerator: () -> Void) { let mainFunctionType = LLVMFunctionType(LLVMInt32Type(), nil, 0, 0) let mainFunction = LLVMAddFunction(module, "main", mainFunctionType) let mainEntryBlock = LLVMAppendBasicBlock(mainFunction, "entry") LLVMPositionBuilderAtEnd(builder, mainEntryBlock) mainInternalGenerator() let zero = LLVMConstInt(LLVMInt32Type(), 0, 0) LLVMBuildRet(builder, zero) } 

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


 private func handleAST(_ ast: ASTNode, putsFunction: LLVMValueRef, builder: LLVMBuilderRef) { switch ast { case let .brace(childNode): guard let childNode = childNode else { break } handleAST(childNode, putsFunction: putsFunction, builder: builder) case let .number(value): generatePrint(value: value, putsFunction: putsFunction, builder: builder) } } 

рдкреБрдЯреНрд╕ рдХреЙрд▓ LLVMBuildCall () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдбрд░, рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рддрд░реНрдХ рдФрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред LLVMBuildGlobalStringPtr () рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рддрд╛ рд╣реИред рд╡рд╣ рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ рд╣реЛрдЧрд╛:


 private func generatePrint(value: Int, putsFunction: LLVMValueRef, builder: LLVMBuilderRef) { let putArgumentsSize = MemoryLayout<LLVMValueRef?>.size let putArguments = UnsafeMutablePointer<LLVMValueRef?>.allocate(capacity: 1) defer { putArguments.deallocate() } putArguments[0] = LLVMBuildGlobalStringPtr(builder, "\(value)", "print") _ = LLVMBuildCall(builder, putsFunction, putArguments, 1, "put") } 

LLVM IR рдкреАрдврд╝реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ LLVMIRGen рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ PrintTo (_, рдбрдВрдк) рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :


 let llvmIRGen = LLVMIRGen(ast: ast) llvmIRGen.printTo(outputFilePath, dump: false) 

рдЪреВрдВрдХрд┐ рдЕрдм рдХреЛрд╖реНрдардХ рд╕рдВрдХрд▓рдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ ( рдирд┐рд░реНрджреЗрд╢ ) рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 build/debug/BraceCompiler Example/input.b Example/output.ll 

рдкрд░рд┐рдгрд╛рдо рдпрд╣ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ:


 ; ModuleID = 'BraceCompiller' source_filename = "BraceCompiller" @print = private unnamed_addr constant [5 x i8] c"5678\00" declare i32 @puts(i8*) define i32 @main() { entry: %put = call i32 @puts(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @print, i32 0, i32 0)) ret i32 0 } 

рдПрд▓рдПрд▓рд╡реАрдПрдо рдЖрдИрдЖрд░ рд╕реНрд╡рд┐рдлреНрдЯ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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


рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ % рдХреЗ рд╕рд╛рде b> @ </ b , рд╕реНрдерд╛рдиреАрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ "5678 \ 00" рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░ b> @print </ b рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди b> @puts </ b рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


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


 let x = 16 let y = x + 7 

-Emit-ir рдзреНрд╡рдЬ LLVM IR рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:


 swiftc -emit-ir main.swift 

рдЖрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


 ; ModuleID = '-' source_filename = "-" target datalayout = "em:o-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx10.14.0" %TSi = type <{ i64 }> @"$S4main1xSivp" = hidden global %TSi zeroinitializer, align 8 @"$S4main1ySivp" = hidden global %TSi zeroinitializer, align 8 @__swift_reflection_version = linkonce_odr hidden constant i16 3 @llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 define i32 @main(i32, i8**) #0 { entry: %2 = bitcast i8** %1 to i8* store i64 16, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1xSivp", i32 0, i32 0), align 8 %3 = load i64, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1xSivp", i32 0, i32 0), align 8 %4 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %3, i64 7) %5 = extractvalue { i64, i1 } %4, 0 %6 = extractvalue { i64, i1 } %4, 1 br i1 %6, label %8, label %7 ; <label>:7: ; preds = %entry store i64 %5, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1ySivp", i32 0, i32 0), align 8 ret i32 0 ; <label>:8: ; preds = %entry call void @llvm.trap() unreachable } ; Function Attrs: nounwind readnone speculatable declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64, i64) #1 ; Function Attrs: noreturn nounwind declare void @llvm.trap() #2 attributes #0 = { "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "target-cpu"="penryn" "target-features"="+cx16,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" } attributes #1 = { nounwind readnone speculatable } attributes #2 = { noreturn nounwind } !llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6, !7} !llvm.linker.options = !{!8, !9, !10} !llvm.asan.globals = !{!11} !0 = !{i32 1, !"Objective-C Version", i32 2} !1 = !{i32 1, !"Objective-C Image Info Version", i32 0} !2 = !{i32 1, !"Objective-C Image Info Section", !"__DATA,__objc_imageinfo,regular,no_dead_strip"} !3 = !{i32 4, !"Objective-C Garbage Collection", i32 1536} !4 = !{i32 1, !"Objective-C Class Properties", i32 64} !5 = !{i32 1, !"wchar_size", i32 4} !6 = !{i32 7, !"PIC Level", i32 2} !7 = !{i32 1, !"Swift Version", i32 6} !8 = !{!"-lswiftSwiftOnoneSupport"} !9 = !{!"-lswiftCore"} !10 = !{!"-lobjc"} !11 = !{[1 x i8*]* @llvm.used, null, null, i1 false, i1 true} 

рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдХрд▓рдХ рдХрд╛ рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрд╢рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрджреЗрд╢ рдвреВрдВрдврдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ x рдФрд░ y рд╡рд┐рдХреГрдд рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:


 @"$S4main1xSivp" = hidden global %TSi zeroinitializer, align 8 @"$S4main1ySivp" = hidden global %TSi zeroinitializer, align 8 

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:


 define i32 @main(i32, i8**) #0 { 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рди 16 рдЗрд╕реЗ рд╕реНрдерд┐рд░ x рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 store i64 16, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1xSivp", i32 0, i32 0), align 8 

рдлрд┐рд░ рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ 3 рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╢рд╛рдмреНрджрд┐рдХ 7 рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 %3 = load i64, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1xSivp", i32 0, i32 0), align 8 %4 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %3, i64 7) 

рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЪреЗрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдЯрд░реНрди рд╕рдВрд░рдЪрдирд╛ред рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рдЬреЛрдбрд╝ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдЭрдВрдбрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдерд╛ред


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


 %5 = extractvalue { i64, i1 } %4, 0 %6 = extractvalue { i64, i1 } %4, 1 

рдЕрдм рдУрд╡рд░рдлреНрд▓реЛ рд╕рдВрдХреЗрдд рдЫрдареЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╛рди рд╢рд╛рдЦрд╛ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдерд╛, рддреЛ рд▓реЗрдмрд▓ 7 рдмреНрд▓реЙрдХ рдХреЛ рд╕рдВрдХреНрд░рдордг рд╣реЛрдЧрд╛, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд▓реЗрдмрд▓ 7 рдХреЛ :


 br i1 %6, label %8, label %7 

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


 ; <label>:7: ; preds = %entry store i64 %5, i64* getelementptr inbounds (%TSi, %TSi* @"$S4main1ySivp", i32 0, i32 0), align 8 ret i32 0 ; <label>:8: ; preds = %entry call void @llvm.trap() unreachable 

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛрдб рдкреАрдврд╝реА


рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -рдорд┐рдЯ-рдЕрд╕реЗрдВрдмрд▓реА рдзреНрд╡рдЬ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ:


 swiftc -emit-assembly main.swift 

рдЖрджреЗрд╢ рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


  .section __TEXT,__text,regular,pure_instructions .build_version macos, 10, 14 .globl _main .p2align 4, 0x90 _main: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset %rbp, -16 movq %rsp, %rbp .cfi_def_cfa_register %rbp movq $16, _$S4main1xSivp(%rip) movq _$S4main1xSivp(%rip), %rax addq $7, %rax seto %cl movl %edi, -4(%rbp) movq %rsi, -16(%rbp) movq %rax, -24(%rbp) movb %cl, -25(%rbp) jo LBB0_2 xorl %eax, %eax movq -24(%rbp), %rcx movq %rcx, _$S4main1ySivp(%rip) popq %rbp retq LBB0_2: ud2 .cfi_endproc .private_extern _$S4main1xSivp .globl _$S4main1xSivp .zerofill __DATA,__common,_$S4main1xSivp,8,3 .private_extern _$S4main1ySivp .globl _$S4main1ySivp .zerofill __DATA,__common,_$S4main1ySivp,8,3 .private_extern ___swift_reflection_version .section __TEXT,__const .globl ___swift_reflection_version .weak_definition ___swift_reflection_version .p2align 1 ___swift_reflection_version: .short 3 .no_dead_strip ___swift_reflection_version .linker_option "-lswiftSwiftOnoneSupport" .linker_option "-lswiftCore" .linker_option "-lobjc" .section __DATA,__objc_imageinfo,regular,no_dead_strip L_OBJC_IMAGE_INFO: .long 0 .long 1600 .subsections_via_symbols 

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдордзреНрдпрд╡рд░реНрддреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ 16 рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ % rax рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:


 movq $16, _$S4main1xSivp(%rip) movq _$S4main1xSivp(%rip), %rax 

рдпрд╣рд╛рдБ 7 рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдорд╛рди рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо % rax рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:


 addq $7, %rax 

рдФрд░ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ y рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ:


 movq %rax, -24(%rbp) movq -24(%rbp), %rcx movq %rcx, _$S4main1ySivp(%rip) 

рд╕реНрд░реЛрдд рдХреЛрдб:



рдирд┐рд╖реНрдХрд░реНрд╖


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


рдЬреЛ рднреА рдкрдврд╝реЗ рдЙрд╕рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рд╕реНрд╡рд┐рдлреНрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдЙрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рди рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реЛрдЧреА?


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:


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


All Articles