{"id":399435,"date":"2024-06-29T14:40:34","date_gmt":"2024-06-29T14:40:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=399435"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=399435","title":{"rendered":"<span>\u041e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 TypeScript Native (AOT) Compiler<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/11d\/be2\/7d5\/11dbe27d50b78cc8878084837268e92f.gif\" width=\"846\" height=\"392\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/11d\/be2\/7d5\/11dbe27d50b78cc8878084837268e92f.gif\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442<\/h3>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e <strong>TypeScript Native (AOT) Compiler<\/strong>(\u0434\u0430\u043b\u0435\u0435 <strong>tsc<\/strong>) <a href=\"https:\/\/habr.com\/ru\/post\/581308\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/581308\/<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u0437\u043e\u0440\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0437 command line(\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438). \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LLVM<\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 tsc<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0431 \u043e\u043f\u0446\u0438\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>QC:\\dev>tsc.exe --help  <\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e &#171;<strong>&#8212;emit=&lt;value><\/strong>&#171;. \u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u0430\u0436\u043d\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 \u0432\u044b\u0432\u043e\u0434\u0430, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a &#171;obj&#187;, LLVM IR \u0438 \u0442.\u0434.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 OBJ (\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b)<\/h2>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <strong>example1.ts<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/p>\n<pre><code class=\"javascript\">function main() {   print(\"Hello World!\"); }<\/code><\/pre>\n<p>\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c obj. \u0444\u0430\u0439\u043b, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=jit -nogc -dump-object-file -object-filename=out.o example.ts<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b <strong>example.ts <\/strong>\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 OBJ \u0432 <strong>out.o<\/strong>. \u0414\u0430\u043b\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <strong>lld <\/strong><\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 EXE (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)<\/h2>\n<p>\u0411\u0435\u0440\u0435\u043c <strong>out.o<\/strong> \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>c:\\LLVM\\lld.exe -flavor link out.o \/libpath:%LIBPATH% \/libpath:%SDKPATH% \/libpath:%UCRTPATH% msvcrt.lib ucrt.lib kernel32.lib user32.lib.lib<\/code><\/pre>\n<h2>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f EXE(\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)<\/h2>\n<pre><code>C:\\dev>tsc.exe --emit=llvm example1.ts 2>example1.ll C:\\LLVM\\llc.exe --filetype=obj -o=out.o example1.ll C:\\LLVM\\lld.exe -flavor link out.o<\/code><\/pre>\n<p>\u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f C \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 .Exe \u0444\u0430\u0439\u043b (\u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0438 batch \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438)<\/p>\n<h2>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 TypeScript \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --jit example1.ts<\/code><\/pre>\n<h2>\u0428\u0430\u0433\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a <strong>tsc <\/strong>\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 example1.ts<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir example1.ts<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0432 MLIR (\u0431\u043e\u043b\u044c\u0448\u0435 \u043e MLIR \u0442\u0443\u0442 <a href=\"https:\/\/mlir.llvm.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/mlir.llvm.org\/<\/a>)<\/p>\n<pre><code>module @\"1.ts\"  {   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.UnresolvedSymbolRef {identifier = @print} : none     %1 = ts.Constant {value = \"Hello World!\"} : !ts.string     ts.Print(%1) : !ts.string     \"ts.Exit\"() : () -> ()   } }<\/code><\/pre>\n<p>TypeScript \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435. <\/p>\n<p>\u0427\u0442\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir-affine example1.ts<\/code><\/pre>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433. <\/p>\n<pre><code>module @\"example1.ts\"  {   ts.Func @main () -> ()  {     %0 = ts.Constant {value = \"Hello World!\"} : !ts.string     ts.Print(%0) : !ts.string     ts.ReturnInternal   } }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 &#171;<strong>example1.ts<\/strong>&#187; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;@main&#187; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u043c\u0430\u043d\u0434\u044b &#171;Print&#187; \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041a\u0430\u043a \u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 &#171;Hello World!&#187;.<\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0431\u043b\u0438\u0437\u043a\u0438\u0439 \u043a \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir-llvm example1.ts<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<pre><code>module @\"1.ts\"  {   llvm.func @puts(!llvm.ptr&lt;i8>) -> i32   llvm.mlir.global internal constant @s_10092224619179044402(\"Hello World!\\00\")   llvm.func @main() {     %0 = llvm.mlir.addressof @s_10092224619179044402 : !llvm.ptr&lt;array&lt;13 x i8>>     %1 = llvm.mlir.constant(0 : i64) : i64     %2 = llvm.getelementptr %0[%1, %1] : (!llvm.ptr&lt;array&lt;13 x i8>>, i64, i64) -> !llvm.ptr&lt;i8>     %3 = llvm.call @puts(%2) : (!llvm.ptr&lt;i8>) -> i32     llvm.return   } } <\/code><\/pre>\n<p>\u041d\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u0442 &#171;\u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c&#187; <strong>ll\u0441 <\/strong>\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <strong>obj-\u0444\u0430\u0439\u043b\u0430<\/strong> \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>C:\\dev>tsc.exe --emit=llvm example1.ts<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434<\/p>\n<pre><code>; ModuleID = 'LLVMDialectModule' source_filename = \"LLVMDialectModule\" target datalayout = \"e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128\" target triple = \"x86_64-pc-windows-msvc\"  @s_10092224619179044402 = internal constant [13 x i8] c\"Hello World!\\00\"  declare i32 @puts(i8*)  define void @main() {   %1 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @s_10092224619179044402, i64 0, i64 0)), !d   ret void }  <\/code><\/pre>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438\u0441\u044c \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u0430\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0448\u0430\u0433\u0438 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c &#171;&#8212;emit=mlir-affine&#187;<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (\u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b)<\/p>\n<h2>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/h2>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<pre><code class=\"javascript\">function defaultArgs(x: number, y = 3, z = 7) {     return x + y + z; }<\/code><\/pre>\n<p>\u0418 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e<\/p>\n<pre><code class=\"javascript\">function optargs(x: number, y?: number, z?: number) {     if (y == undefined) y = 0;     return x + y; }<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<strong> <\/strong>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &#171;<strong>y&#187; <\/strong>\u0438<strong> &#171;z&#187; <\/strong>\u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &#171;<strong>y&#187; <\/strong>\u0438<strong> &#171;z&#187; <\/strong>\u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043a\u0430\u043a \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442.\u043a. \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<pre><code class=\"javascript\">defaultArgs(1); defaultArgs(1, 4); defaultArgs(1, 4, 8);  optargs(1); optargs(1, 2); optargs(1, 2, 3);<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435)<\/p>\n<pre><code class=\"javascript\">function defaultArgs(x: number, y = 3, z = 7) {     return x + y + z; }  function main() {     defaultArgs(1);     defaultArgs(1, 4);     defaultArgs(1, 4, 8);      optargs(1);     optargs(1, 2);     optargs(1, 2, 3); }  function optargs(x: number, y?: number, z?: number) {     if (y == undefined) y = 0;     return x + y; } <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>tsc &#8212;emit=mlir example1.ts<\/strong>)<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @defaultArgs (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.number, %arg1: !ts.optional&lt;i32>, %arg2: !ts.optional&lt;i32>):  \/\/ no predecessors     %0 = \"ts.Entry\"() : () -> !ts.ref&lt;!ts.number>     %1 = \"ts.Param\"(%arg0) : (!ts.number) -> !ts.ref&lt;!ts.number>     %2 = \"ts.ParamOpt\"(%arg1) ( {       %11 = ts.Constant {value = 3 : i32} : i32       ts.DefaultValue %11 : i32     }) : (!ts.optional&lt;i32>) -> !ts.ref&lt;i32>     %3 = \"ts.ParamOpt\"(%arg2) ( {       %11 = ts.Constant {value = 7 : i32} : i32       ts.DefaultValue %11 : i32     }) : (!ts.optional&lt;i32>) -> !ts.ref&lt;i32>     %4 = ts.Load(%1) : !ts.ref&lt;!ts.number> -> !ts.number     %5 = ts.Load(%2) : !ts.ref&lt;i32> -> i32     %6 = ts.Cast %5 : i32 to !ts.number     %7 = ts.ArithmeticBinary %4(39) %6 : !ts.number, !ts.number -> !ts.number     %8 = ts.Load(%3) : !ts.ref&lt;i32> -> i32     %9 = ts.Cast %8 : i32 to !ts.number     %10 = ts.ArithmeticBinary %7(39) %9 : !ts.number, !ts.number -> !ts.number     \"ts.ReturnVal\"(%10, %0) : (!ts.number, !ts.ref&lt;!ts.number>) -> ()     \"ts.Exit\"() : () -> ()   }   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %1 = ts.Constant {value = 1 : i32} : i32     %2 = ts.Cast %1 : i32 to !ts.number     %3 = ts.Undef : !ts.optional&lt;i32>     %4 = ts.Undef : !ts.optional&lt;i32>     %5 = ts.CallIndirect %0(%2, %3, %4) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %6 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %7 = ts.Constant {value = 1 : i32} : i32     %8 = ts.Cast %7 : i32 to !ts.number     %9 = ts.Constant {value = 4 : i32} : i32     %10 = ts.Cast %9 : i32 to !ts.optional&lt;i32>     %11 = ts.Undef : !ts.optional&lt;i32>     %12 = ts.CallIndirect %6(%8, %10, %11) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %13 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %14 = ts.Constant {value = 1 : i32} : i32     %15 = ts.Cast %14 : i32 to !ts.number     %16 = ts.Constant {value = 4 : i32} : i32     %17 = ts.Cast %16 : i32 to !ts.optional&lt;i32>     %18 = ts.Constant {value = 8 : i32} : i32     %19 = ts.Cast %18 : i32 to !ts.optional&lt;i32>     %20 = ts.CallIndirect %13(%15, %17, %19) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %21 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %22 = ts.Constant {value = 1 : i32} : i32     %23 = ts.Cast %22 : i32 to !ts.number     %24 = ts.Undef : !ts.optional&lt;!ts.number>     %25 = ts.Undef : !ts.optional&lt;!ts.number>     %26 = ts.CallIndirect %21(%23, %24, %25) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %27 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %28 = ts.Constant {value = 1 : i32} : i32     %29 = ts.Cast %28 : i32 to !ts.number     %30 = ts.Constant {value = 2 : i32} : i32     %31 = ts.Cast %30 : i32 to !ts.optional&lt;!ts.number>     %32 = ts.Undef : !ts.optional&lt;!ts.number>     %33 = ts.CallIndirect %27(%29, %31, %32) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %34 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %35 = ts.Constant {value = 1 : i32} : i32     %36 = ts.Cast %35 : i32 to !ts.number     %37 = ts.Constant {value = 2 : i32} : i32     %38 = ts.Cast %37 : i32 to !ts.optional&lt;!ts.number>     %39 = ts.Constant {value = 3 : i32} : i32     %40 = ts.Cast %39 : i32 to !ts.optional&lt;!ts.number>     %41 = ts.CallIndirect %34(%36, %38, %40) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     \"ts.Exit\"() : () -> ()   }   ts.Func @optargs (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.number, %arg1: !ts.optional&lt;!ts.number>, %arg2: !ts.optional&lt;!ts.number>):  \/\/ no predecessors     %0 = \"ts.Entry\"() : () -> !ts.ref&lt;!ts.number>     %1 = \"ts.Param\"(%arg0) : (!ts.number) -> !ts.ref&lt;!ts.number>     %2 = \"ts.Param\"(%arg1) : (!ts.optional&lt;!ts.number>) -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %3 = \"ts.Param\"(%arg2) : (!ts.optional&lt;!ts.number>) -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %4 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %5 = ts.Undef : !ts.optional&lt;!ts.undef_ph>     %6 = ts.LogicalBinary %4(34) %5 : !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.undef_ph> -> !ts.boolean     \"ts.If\"(%6) ( {       %11 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>       %12 = ts.Constant {value = 0 : i32} : i32       %13 = ts.Cast %12 : i32 to !ts.optional&lt;!ts.number>       ts.Store %13, %2 : !ts.optional&lt;!ts.number> -> !ts.ref&lt;!ts.optional&lt;!ts.number>>       \"ts.Result\"() : () -> ()     },  {     }) : (!ts.boolean) -> ()     %7 = ts.Load(%1) : !ts.ref&lt;!ts.number> -> !ts.number     %8 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %9 = ts.Cast %8 : !ts.optional&lt;!ts.number> to !ts.number     %10 = ts.ArithmeticBinary %7(39) %9 : !ts.number, !ts.number -> !ts.number     \"ts.ReturnVal\"(%10, %0) : (!ts.number, !ts.ref&lt;!ts.number>) -> ()     \"ts.Exit\"() : () -> ()   } }<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u0430\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u044b \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>tsc &#8212;emit=mlir-affine example1.ts<\/strong>)<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @defaultArgs (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.number, %arg1: !ts.optional&lt;i32>, %arg2: !ts.optional&lt;i32>):  \/\/ no predecessors     %c7_i32 = constant 7 : i32     %c3_i32 = constant 3 : i32     %0 = ts.Variable() {false} :  -> !ts.ref&lt;!ts.number>     %1 = ts.Variable(%arg0) {false} : !ts.number -> !ts.ref&lt;!ts.number>     %2 = \"ts.HasValue\"(%arg1) : (!ts.optional&lt;i32>) -> !ts.boolean     %3 = ts.Cast %2 : !ts.boolean to i1     cond_br %3, ^bb1, ^bb2(%c3_i32 : i32)   ^bb1:  \/\/ pred: ^bb0     %4 = \"ts.Value\"(%arg1) : (!ts.optional&lt;i32>) -> i32     br ^bb2(%4 : i32)   ^bb2(%5: i32):  \/\/ 2 preds: ^bb0, ^bb1     %6 = ts.Variable(%5) {false} : i32 -> !ts.ref&lt;i32>     %7 = \"ts.HasValue\"(%arg2) : (!ts.optional&lt;i32>) -> !ts.boolean     %8 = ts.Cast %7 : !ts.boolean to i1     cond_br %8, ^bb3, ^bb4(%c7_i32 : i32)   ^bb3:  \/\/ pred: ^bb2     %9 = \"ts.Value\"(%arg2) : (!ts.optional&lt;i32>) -> i32     br ^bb4(%9 : i32)   ^bb4(%10: i32):  \/\/ 2 preds: ^bb2, ^bb3     %11 = ts.Variable(%10) {false} : i32 -> !ts.ref&lt;i32>     %12 = ts.Load(%1) : !ts.ref&lt;!ts.number> -> !ts.number     %13 = ts.Load(%6) : !ts.ref&lt;i32> -> i32     %14 = ts.Cast %13 : i32 to !ts.number     %15 = ts.ArithmeticBinary %12(39) %14 : !ts.number, !ts.number -> !ts.number     %16 = ts.Load(%11) : !ts.ref&lt;i32> -> i32     %17 = ts.Cast %16 : i32 to !ts.number     %18 = ts.ArithmeticBinary %15(39) %17 : !ts.number, !ts.number -> !ts.number     ts.Store %18, %0 : !ts.number -> !ts.ref&lt;!ts.number>     %19 = ts.Load(%0) : !ts.ref&lt;!ts.number> -> !ts.number     ts.ReturnInternal %19 : !ts.number   }   ts.Func @main () -> ()  {     %c3_i32 = constant 3 : i32     %c2_i32 = constant 2 : i32     %c8_i32 = constant 8 : i32     %c4_i32 = constant 4 : i32     %c1_i32 = constant 1 : i32     %0 = ts.Cast %c1_i32 : i32 to !ts.number     %1 = ts.Undef : !ts.optional&lt;i32>     %2 = ts.Undef : !ts.optional&lt;i32>     %3 = ts.CallInternal @defaultArgs(%0, %1, %2) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %4 = ts.Cast %c4_i32 : i32 to !ts.optional&lt;i32>     %5 = ts.Undef : !ts.optional&lt;i32>     %6 = ts.CallInternal @defaultArgs(%0, %4, %5) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %7 = ts.Cast %c8_i32 : i32 to !ts.optional&lt;i32>     %8 = ts.CallInternal @defaultArgs(%0, %4, %7) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %9 = ts.Undef : !ts.optional&lt;!ts.number>     %10 = ts.Undef : !ts.optional&lt;!ts.number>     %11 = ts.CallInternal @optargs(%0, %9, %10) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %12 = ts.Cast %c2_i32 : i32 to !ts.optional&lt;!ts.number>     %13 = ts.Undef : !ts.optional&lt;!ts.number>     %14 = ts.CallInternal @optargs(%0, %12, %13) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %15 = ts.Cast %c3_i32 : i32 to !ts.optional&lt;!ts.number>     %16 = ts.CallInternal @optargs(%0, %12, %15) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     ts.ReturnInternal   }   ts.Func @optargs (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.number, %arg1: !ts.optional&lt;!ts.number>, %arg2: !ts.optional&lt;!ts.number>):  \/\/ no predecessors     %c0_i32 = constant 0 : i32     %0 = ts.Variable() {false} :  -> !ts.ref&lt;!ts.number>     %1 = ts.Variable(%arg0) {false} : !ts.number -> !ts.ref&lt;!ts.number>     %2 = ts.Variable(%arg1) {false} : !ts.optional&lt;!ts.number> -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %3 = ts.Variable(%arg2) {false} : !ts.optional&lt;!ts.number> -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %4 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %5 = ts.Undef : !ts.optional&lt;!ts.undef_ph>     %6 = ts.LogicalBinary %4(34) %5 : !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.undef_ph> -> !ts.boolean     %7 = ts.Cast %6 : !ts.boolean to i1     cond_br %7, ^bb1, ^bb2   ^bb1:  \/\/ pred: ^bb0     %8 = ts.Cast %c0_i32 : i32 to !ts.optional&lt;!ts.number>     ts.Store %8, %2 : !ts.optional&lt;!ts.number> -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     br ^bb2   ^bb2:  \/\/ 2 preds: ^bb0, ^bb1     %9 = ts.Load(%1) : !ts.ref&lt;!ts.number> -> !ts.number     %10 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %11 = ts.Cast %10 : !ts.optional&lt;!ts.number> to !ts.number     %12 = ts.ArithmeticBinary %9(39) %11 : !ts.number, !ts.number -> !ts.number     ts.Store %12, %0 : !ts.number -> !ts.ref&lt;!ts.number>     %13 = ts.Load(%0) : !ts.ref&lt;!ts.number> -> !ts.number     ts.ReturnInternal %13 : !ts.number   } } <\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>tsc &#8212;emit=jit -nogc example1.ts<\/strong><\/p>\n<p>\u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0441\u0435 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0431\u0443\u0434\u0443 \u043f\u043e \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443 \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u0430. <\/p>\n<h2>\u0418\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432<\/h2>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432<\/p>\n<pre><code class=\"javascript\">function main() {     const trees = [[1], [2, 3], [4, 5, 6]];      for (const a of trees) {         print(\"array\");         for (const b of a) {             print(b);         }     }      print(\"done.\"); }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b (<strong>tsc &#8212;emit=jit -nogc example1.ts<\/strong>)<\/p>\n<pre><code>C:\\>tsc.exe --emit=jit -nogc example1.ts   array 1 array 2 3 array 4 5 6 done.<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 (<strong>tsc &#8212;emit=mlir example1.ts<\/strong>)<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.Constant {value = 1 : i32} : i32     %1 = ts.Constant {value = [1 : i32]} : !ts.const_array&lt;i32,1>     %2 = ts.Constant {value = 2 : i32} : i32     %3 = ts.Constant {value = 3 : i32} : i32     %4 = ts.Constant {value = [2 : i32, 3 : i32]} : !ts.const_array&lt;i32,2>     %5 = ts.Constant {value = 4 : i32} : i32     %6 = ts.Constant {value = 5 : i32} : i32     %7 = ts.Constant {value = 6 : i32} : i32     %8 = ts.Constant {value = [4 : i32, 5 : i32, 6 : i32]} : !ts.const_array&lt;i32,3>     %9 = ts.Constant {value = [[1 : i32], [2 : i32, 3 : i32], [4 : i32, 5 : i32, 6 : i32]]} : !ts.const_array&lt;!ts.array&lt;i32>,3>     %10 = ts.Constant {value = 0 : i32} : i32     %11 = ts.Variable(%10) {false} : i32 -> !ts.ref&lt;i32>     ts.For :  -> ( {       %14 = ts.Load(%11) : !ts.ref&lt;i32> -> i32       %15 = ts.Constant {value = 3 : i32} : i32       %16 = ts.LogicalBinary %14(29) %15 : i32, i32 -> !ts.boolean       ts.Condition(%16) :      },  {       %14 = ts.Load(%11) : !ts.ref&lt;i32> -> i32       %15 = ts.PrefixUnary %14(45) : i32 -> i32       \"ts.Result\"() : () -> ()     })  {       %14 = ts.Load(%11) : !ts.ref&lt;i32> -> i32       %15 = ts.ElementRef %9[%14] : !ts.const_array&lt;!ts.array&lt;i32>,3>[i32] -> !ts.ref&lt;!ts.array&lt;i32>>       %16 = ts.Load(%15) : !ts.ref&lt;!ts.array&lt;i32>> -> !ts.array&lt;i32>       %17 = ts.UnresolvedSymbolRef {identifier = @print} : none       %18 = ts.Constant {value = \"array\"} : !ts.string       ts.Print(%18) : !ts.string       %19 = ts.Constant {value = 0 : i32} : i32       %20 = ts.Variable(%19) {false} : i32 -> !ts.ref&lt;i32>       ts.For :  -> ( {         %21 = ts.Load(%20) : !ts.ref&lt;i32> -> i32         %22 = ts.Load(%15) : !ts.ref&lt;!ts.array&lt;i32>> -> !ts.array&lt;i32>         %23 = \"ts.LengthOf\"(%22) : (!ts.array&lt;i32>) -> i32         %24 = ts.LogicalBinary %21(29) %23 : i32, i32 -> !ts.boolean         ts.Condition(%24) :        },  {         %21 = ts.Load(%20) : !ts.ref&lt;i32> -> i32         %22 = ts.PrefixUnary %21(45) : i32 -> i32         \"ts.Result\"() : () -> ()       })  {         %21 = ts.Load(%20) : !ts.ref&lt;i32> -> i32         %22 = ts.Load(%15) : !ts.ref&lt;!ts.array&lt;i32>> -> !ts.array&lt;i32>         %23 = ts.ElementRef %22[%21] : !ts.array&lt;i32>[i32] -> !ts.ref&lt;i32>         %24 = ts.Load(%23) : !ts.ref&lt;i32> -> i32         %25 = ts.UnresolvedSymbolRef {identifier = @print} : none         ts.Print(%24) : i32         \"ts.Result\"() : () -> ()       }       \"ts.Result\"() : () -> ()     }     %12 = ts.UnresolvedSymbolRef {identifier = @print} : none     %13 = ts.Constant {value = \"done.\"} : !ts.string     ts.Print(%13) : !ts.string     \"ts.Exit\"() : () -> ()   } }<\/code><\/pre>\n<h2>\u0417\u0430\u0445\u0432\u0430\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438<\/h2>\n<pre><code class=\"javascript\">function func_in_object(a: number | undefined) {     const s = {         f() {             assert(a == 11);             print(a);         },     };      s.f(); }  function main() {     func_in_object(11);     print(\"done.\"); }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<pre><code>C:\\temp>C:\\tsc.exe --emit=jit -nogc example1.ts   11 done. <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#171;<strong>a<\/strong>&#187; \u0441 \u0442\u0438\u043f\u043e\u043c &#171;<strong>number | undefined<\/strong>&#171;. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e, &#171;<strong>\u0430&#187;<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442.\u0435. \u0430\u043d\u0430\u043b\u043e\u0433 &#171;<strong>a?: number<\/strong>&#171;. \u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 &#171;<strong>f()<\/strong>&#187; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 &#171;<strong>s<\/strong>&#171;<\/p>\n<p>\u0418 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @__uf14725333033948923702 (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> () {arg_attrs = [{ts.nest}, {}], sym_visibility = \"private\", ts.nest}  {   ^bb0(%arg0: !ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, %arg1: !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>):  \/\/ no predecessors     \"ts.Entry\"() : () -> ()     %0 = \"ts.Param\"(%arg1) : (!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> !ts.ref&lt;!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>>     %1 = ts.PropertyRef %arg0&lt;0> : !ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>> -> !ts.ref&lt;!ts.ref&lt;!ts.optional&lt;!ts.number>>>     %2 = ts.Load(%1) : !ts.ref&lt;!ts.ref&lt;!ts.optional&lt;!ts.number>>> -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %3 = ts.UnresolvedSymbolRef {identifier = @assert} : none     %4 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %5 = ts.Constant {value = 11 : i32} : i32     %6 = ts.Cast %4 : !ts.optional&lt;!ts.number> to i32     %7 = ts.LogicalBinary %6(34) %5 : i32, i32 -> !ts.boolean     ts.Assert %7, \"assert\"     %8 = ts.UnresolvedSymbolRef {identifier = @print} : none     %9 = ts.Load(%2) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     ts.Print(%9) : !ts.optional&lt;!ts.number>     \"ts.Exit\"() : () -> ()   }   ts.Func @func_in_object (!ts.optional&lt;!ts.number>) -> () {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.optional&lt;!ts.number>):  \/\/ no predecessors     \"ts.Entry\"() : () -> ()     %0 = \"ts.Param\"(%arg0) : (!ts.optional&lt;!ts.number>) -> !ts.ref&lt;!ts.optional&lt;!ts.number>>     %1 = ts.SymbolRef {identifier = @__uf14725333033948923702} : (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()     %2 = ts.Load(%0) : !ts.ref&lt;!ts.optional&lt;!ts.number>> -> !ts.optional&lt;!ts.number>     %3 = \"ts.Capture\"(%0) : (!ts.ref&lt;!ts.optional&lt;!ts.number>>) -> !ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>     %4 = \"ts.Trampoline\"(%1, %3) {allocInHeap = false} : ((!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> (), !ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>) -> ((!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ())     %5 = ts.Constant {value = [unit]} : !ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>     %6 = ts.Variable(%5) {false} : !ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}> -> !ts.ref&lt;!ts.tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>>     %7 = ts.PropertyRef %6&lt;0> : !ts.ref&lt;!ts.tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>> -> !ts.bound_ref&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()>     %8 = ts.Load(%7) : !ts.bound_ref&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()> -> !ts.this_func&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>,!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()>     %9 = ts.Cast %4 : (!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> () to (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()     ts.Store %9, %7 : (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> () -> !ts.bound_ref&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()>     %10 = ts.Load(%6) : !ts.ref&lt;!ts.tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>> -> !ts.tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>     %11 = ts.PropertyRef %6&lt;0> : !ts.ref&lt;!ts.tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()}>> -> !ts.bound_ref&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()>     %12 = ts.Load(%11) : !ts.bound_ref&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()> -> !ts.this_func&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>,!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()>     %13 = ts.GetThis %12 : !ts.this_func&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>,!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()> -> !ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>     %14 = ts.GetMethod %12 : !ts.this_func&lt;(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>,!ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()> -> (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()     %15 = ts.Undef : !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>     ts.CallIndirect %14(%13, %15) : (!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.object&lt;!ts.const_tuple&lt;{\"f\",(!ts.ref&lt;!ts.tuple&lt;{\"a\",!ts.ref&lt;!ts.optional&lt;!ts.number>>}>>, !ts.opaque) -> ()}>>) -> ()     \"ts.Exit\"() : () -> ()   }   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.SymbolRef {identifier = @func_in_object} : (!ts.optional&lt;!ts.number>) -> ()     %1 = ts.Constant {value = 11 : i32} : i32     %2 = ts.Cast %1 : i32 to !ts.optional&lt;!ts.number>     ts.CallIndirect %0(%2) : (!ts.optional&lt;!ts.number>) -> ()     %3 = ts.UnresolvedSymbolRef {identifier = @print} : none     %4 = ts.Constant {value = \"done.\"} : !ts.string     ts.Print(%4) : !ts.string     \"ts.Exit\"() : () -> ()   } } <\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0433\u0434\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442, \u0438\u043c\u0435\u044e\u0442 \u0438\u043c\u0435\u043d\u0430 &#171;<strong>ts.Capture<\/strong>&#187; \u0438 &#171;<strong>ts.Trampoline<\/strong>&#171;. \u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e &#171;<strong>\u0430<\/strong>&#171;<\/p>\n<h2>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044e<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u0430\u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0430<\/p>\n<pre><code class=\"javascript\">class S { \/\/ \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \/\/ class S implements IPrn     print() {         print(\"Hello World\");     } }  interface IPrn {     print(); }  function run(iface: IPrn) {     iface.print(); }  function main() {     const s = new S();     let iface = &lt;IPrn>s;     iface.print();     run(s);      print(\"done.\"); }<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 &#171;<strong>IPrn<\/strong>&#187; \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 &#171;<strong>S<\/strong>&#187; \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432 \u0421++<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 yield \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u0445<\/h2>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &#171;<strong>yield<\/strong>&#171;.<\/p>\n<pre><code class=\"javascript\">function* foo() {     let i = 1;     while (i &lt; 3) {         yield ++i;     } }  function main() {     for (const o of foo3()) {         print(o);     } }<\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430<\/p>\n<pre><code>C:\\>tsc.exe --emit=jit -nogc example1.ts   2 3<\/code><\/pre>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c async\/await<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 <strong>async\/await<\/strong> \u0438 <strong>for await<\/strong><\/p>\n<pre><code>async function f(a = 1) {     return a; }  function main() {     const v = await f(2);     print(v);     print(\"done.\"); } <\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 <\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @f (!ts.optional&lt;i32>) -> i32 {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.optional&lt;i32>):  \/\/ no predecessors     %0 = \"ts.Entry\"() : () -> !ts.ref&lt;i32>     %1 = \"ts.ParamOpt\"(%arg0) ( {       %3 = ts.Constant {value = 1 : i32} : i32       ts.DefaultValue %3 : i32     }) : (!ts.optional&lt;i32>) -> !ts.ref&lt;i32>     %2 = ts.Load(%1) : !ts.ref&lt;i32> -> i32     \"ts.ReturnVal\"(%2, %0) : (i32, !ts.ref&lt;i32>) -> ()     \"ts.Exit\"() : () -> ()   }   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %token, %results = async.execute -> !async.value&lt;i32> {       %4 = ts.SymbolRef {identifier = @f} : (!ts.optional&lt;i32>) -> i32       %5 = ts.Constant {value = 2 : i32} : i32       %6 = ts.Cast %5 : i32 to !ts.optional&lt;i32>       %7 = ts.CallIndirect %4(%6) : (!ts.optional&lt;i32>) -> i32       async.yield %7 : i32     }     %0 = async.await %results : !async.value&lt;i32>     %1 = ts.UnresolvedSymbolRef {identifier = @print} : none     ts.Print(%0) : i32     %2 = ts.UnresolvedSymbolRef {identifier = @print} : none     %3 = ts.Constant {value = \"done.\"} : !ts.string     ts.Print(%3) : !ts.string     \"ts.Exit\"() : () -> ()   } } <\/code><\/pre>\n<p>\u0418 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <strong>for\/await<\/strong><\/p>\n<pre><code class=\"javascript\">function main() {     for await (const v of [1, 2, 3, 4, 5]) {         print(v);     } }<\/code><\/pre>\n<p>\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.Constant {value = 1 : i32} : i32     %1 = ts.Constant {value = 2 : i32} : i32     %2 = ts.Constant {value = 3 : i32} : i32     %3 = ts.Constant {value = 4 : i32} : i32     %4 = ts.Constant {value = 5 : i32} : i32     %5 = ts.Constant {value = [1 : i32, 2 : i32, 3 : i32, 4 : i32, 5 : i32]} : !ts.const_array&lt;i32,5>     %6 = ts.Constant {value = 0 : i32} : i32     %7 = ts.Variable(%6) {false} : i32 -> !ts.ref&lt;i32>     %8 = async.create_group     ts.For :  -> ( {       %9 = ts.Load(%7) : !ts.ref&lt;i32> -> i32       %10 = ts.Constant {value = 5 : i32} : i32       %11 = ts.LogicalBinary %9(29) %10 : i32, i32 -> !ts.boolean       ts.Condition(%11) :      },  {       %9 = ts.Load(%7) : !ts.ref&lt;i32> -> i32       %10 = ts.PrefixUnary %9(45) : i32 -> i32       \"ts.Result\"() : () -> ()     })  {       %9 = ts.Load(%7) : !ts.ref&lt;i32> -> i32       %token = async.execute {         %11 = ts.ElementRef %5[%9] : !ts.const_array&lt;i32,5>[i32] -> !ts.ref&lt;i32>         %12 = ts.Load(%11) : !ts.ref&lt;i32> -> i32         %13 = ts.UnresolvedSymbolRef {identifier = @print} : none         ts.Print(%12) : i32         async.yield       }       %10 = async.add_to_group %token, %8 : !async.token       \"ts.Result\"() : () -> ()     }     async.await_all %8     \"ts.Exit\"() : () -> ()   } } <\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u043e &#171;<strong>async.execute<\/strong>&#187; \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u0432\u0441\u044e \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u043d\u0430 \u0441\u0435\u0431\u044f<\/p>\n<p>\u0425\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 &#171;<strong>runtime<\/strong>&#171;. <\/p>\n<pre><code>C:\\>tsc.exe --emit=jit --shared-libs=TypeScriptRuntime.dll example1.ts   1 2 3 4 5<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0438\u0437 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0447\u0442\u043e \u0431\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#171;<strong>runtime<\/strong>&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#171;&#8212;shared-libs=TypeScriptRuntime.dll&#187;. \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 LLVM IR \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <strong>obj-\u0444\u0430\u0439\u043b<\/strong> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c &#8212;emit=jit \u0442\u043e\u0433\u0434\u0430 &#171;runtime&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c. \u0422\u0430\u043a\u0436\u0435 &#171;<strong>runtime<\/strong>&#187; \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 &#171;<strong>Garbage Collector<\/strong>&#187; (\u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043c\u0443\u0441\u043e\u0440\u0430)<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440\u044b Batch-\u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 Exe-\u0444\u0430\u0439\u043b\u043e\u0432<\/h2>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 GC, async \u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<pre><code>set FILENAME=%1 set LLVMPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\bin set TSCPATH=C:\\dev\\TypeScriptCompiler\\__build\\tsc\\bin set LIBPATH=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\lib\\x64\" set SDKPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64\" set UCRTPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64\" set LLVMLIBPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\lib %TSCPATH%\\tsc.exe --emit=llvm -nogc C:\\temp\\%FILENAME%.ts 2>%FILENAME%.ll %LLVMPATH%\\llc.exe --filetype=obj -o=%FILENAME%.o %FILENAME%.ll %LLVMPATH%\\lld.exe -flavor link %FILENAME%.o \/libpath:%LIBPATH% \/libpath:%SDKPATH% \/libpath:%UCRTPATH% \/defaultlib:libcmt.lib libvcruntime.lib del %FILENAME%.o  echo \"RUN:...\" %FILENAME%.exe <\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/p>\n<pre><code>set FILENAME=%1 set LLVMPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\bin set TSCPATH=C:\\dev\\TypeScriptCompiler\\__build\\tsc\\bin set LIBPATH=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\lib\\x64\" set SDKPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64\" set UCRTPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64\" set CLANGLIBPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\lib\\clang\\13.0.0\\lib\\windows %TSCPATH%\\tsc.exe --emit=llvm -nogc C:\\temp\\%FILENAME%.ts 2>%FILENAME%.ll %LLVMPATH%\\llc.exe --filetype=obj -o=%FILENAME%.o %FILENAME%.ll %LLVMPATH%\\lld.exe -flavor link %FILENAME%.o \/libpath:%LIBPATH% \/libpath:%SDKPATH% \/libpath:%UCRTPATH% \/libpath:%CLANGLIBPATH% \/defaultlib:libcmt.lib libvcruntime.lib clang_rt.builtins-x86_64.lib del %FILENAME%.o  echo \"RUN:...\" %FILENAME%.exe <\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 <strong>GC<\/strong><\/p>\n<pre><code>set FILENAME=%1 set LLVMPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\bin set TSCPATH=C:\\dev\\TypeScriptCompiler\\__build\\tsc\\bin set LIBPATH=\"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\lib\\x64\" set SDKPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\um\\x64\" set UCRTPATH=\"C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.18362.0\\ucrt\\x64\" set LLVMLIBPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\lib set GCLIBPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\gc\\Release %TSCPATH%\\tsc.exe --emit=llvm C:\\temp\\%FILENAME%.ts 2>%FILENAME%.ll %LLVMPATH%\\llc.exe --filetype=obj -o=%FILENAME%.o %FILENAME%.ll %LLVMPATH%\\lld.exe -flavor link %FILENAME%.o \/libpath:%LIBPATH% \/libpath:%SDKPATH% \/libpath:%UCRTPATH% \/libpath:%GCLIBPATH% msvcrt.lib ucrt.lib kernel32.lib user32.lib gcmt-lib.lib del %FILENAME%.o  echo \"RUN:...\" %FILENAME%.exe <\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430 <strong>Ubuntu<\/strong><\/p>\n<pre><code class=\"bash\">#\/bin\/sh .\/tsc --emit=mlir-llvm -nogc \/mnt\/c\/temp\/1.ts -debug-only=llvm 2>1d.mlir .\/tsc --emit=llvm -nogc \/mnt\/c\/temp\/1.ts 2>1.ll llc --filetype=obj --relocation-model=pic -o=1.o 1.ll<\/code><\/pre>\n<p>\u0418 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430  <strong>try\/catch\/finally<\/strong><\/p>\n<pre><code class=\"bash\">#\/bin\/sh .\/tsc --emit=llvm -nogc \/mnt\/c\/temp\/1.ts 2>1.ll llc --filetype=obj --relocation-model=pic -o=1.o 1.ll gcc -o 1.out 1.o -frtti -fexceptions -lstdc++<\/code><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u043b\u044f <strong>WASM<\/strong><\/p>\n<pre><code>set FILENAME=%1 set LLVMPATH=C:\\dev\\TypeScriptCompiler\\3rdParty\\llvm\\release\\bin set TSCPATH=C:\\dev\\TypeScriptCompiler\\__build\\tsc\\bin %TSCPATH%\\tsc.exe --emit=llvm C:\\temp\\%FILENAME%.ts 2>%FILENAME%.ll %LLVMPATH%\\llc.exe -mtriple=wasm32-unknown-unknown -O3 --filetype=obj -o=%FILENAME%.o %FILENAME%.ll %LLVMPATH%\\wasm-ld.exe %FILENAME%.o -o %FILENAME%.wasm --no-entry --export-all --allow-undefined del *.o <\/code><\/pre>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 batch-\u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0443\u0442 <a href=\"https:\/\/github.com\/ASDAlexander77\/TypeScriptCompiler\/tree\/main\/docs\/how\" rel=\"noopener noreferrer nofollow\">TypeScriptCompiler\/docs\/how at main \u00b7 ASDAlexander77\/TypeScriptCompiler (github.com)<\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043f\u0430\u043f\u043a\u0443 test \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u044b <strong>tsc.<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/ASDAlexander77\/TypeScriptCompiler\/tree\/main\/tsc\/test\/tester\/tests\" rel=\"noopener noreferrer nofollow\">TypeScriptCompiler\/tsc\/test\/tester\/tests at main \u00b7 ASDAlexander77\/TypeScriptCompiler (github.com)<\/a><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0412\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0434\u0430\u0439\u0442\u0435 \u043c\u043d\u0435 \u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0412\u044b \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0435\u0449\u0435 \u0443\u0437\u043d\u0430\u0442\u044c.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/583862\/\"> https:\/\/habr.com\/ru\/articles\/583862\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442<\/h3>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e <strong>TypeScript Native (AOT) Compiler<\/strong>(\u0434\u0430\u043b\u0435\u0435 <strong>tsc<\/strong>) <a href=\"https:\/\/habr.com\/ru\/post\/581308\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/post\/581308\/<\/a>. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u0437\u043e\u0440\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0437 command line(\u043a\u043e\u043c\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438). \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 LLVM<\/p>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 tsc<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u043e\u0431 \u043e\u043f\u0446\u0438\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>QC:\\dev>tsc.exe --help  <\/code><\/pre>\n<p>\u041e\u0441\u043d\u043e\u0432\u0430\u043d\u0430 \u043e\u043f\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e &#171;<strong>&#8212;emit=&lt;value><\/strong>&#171;. \u042d\u0442\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u0430\u0436\u043d\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 \u0432\u044b\u0432\u043e\u0434\u0430, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a &#171;obj&#187;, LLVM IR \u0438 \u0442.\u0434.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 OBJ (\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b)<\/h2>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b <strong>example1.ts<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443<\/p>\n<pre><code class=\"javascript\">function main() {   print(\"Hello World!\"); }<\/code><\/pre>\n<p>\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c obj. \u0444\u0430\u0439\u043b, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=jit -nogc -dump-object-file -object-filename=out.o example.ts<\/code><\/pre>\n<p>\u0414\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0444\u0430\u0439\u043b <strong>example.ts <\/strong>\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 OBJ \u0432 <strong>out.o<\/strong>. \u0414\u0430\u043b\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <strong>lld <\/strong><\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 EXE (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)<\/h2>\n<p>\u0411\u0435\u0440\u0435\u043c <strong>out.o<\/strong> \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>c:\\LLVM\\lld.exe -flavor link out.o \/libpath:%LIBPATH% \/libpath:%SDKPATH% \/libpath:%UCRTPATH% msvcrt.lib ucrt.lib kernel32.lib user32.lib.lib<\/code><\/pre>\n<h2>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f EXE(\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)<\/h2>\n<pre><code>C:\\dev>tsc.exe --emit=llvm example1.ts 2>example1.ll C:\\LLVM\\llc.exe --filetype=obj -o=out.o example1.ll C:\\LLVM\\lld.exe -flavor link out.o<\/code><\/pre>\n<p>\u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0448\u0430\u0433 \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f C \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 .Exe \u0444\u0430\u0439\u043b (\u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u0432\u043e\u0438 batch \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438)<\/p>\n<h2>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 TypeScript \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --jit example1.ts<\/code><\/pre>\n<h2>\u0428\u0430\u0433\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0438\u0441\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a <strong>tsc <\/strong>\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 example1.ts<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir example1.ts<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0432\u043e\u0434 \u0432 MLIR (\u0431\u043e\u043b\u044c\u0448\u0435 \u043e MLIR \u0442\u0443\u0442 <a href=\"https:\/\/mlir.llvm.org\/\" rel=\"noopener noreferrer nofollow\">https:\/\/mlir.llvm.org\/<\/a>)<\/p>\n<pre><code>module @\"1.ts\"  {   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.UnresolvedSymbolRef {identifier = @print} : none     %1 = ts.Constant {value = \"Hello World!\"} : !ts.string     ts.Print(%1) : !ts.string     \"ts.Exit\"() : () -> ()   } }<\/code><\/pre>\n<p>TypeScript \u0444\u0430\u0439\u043b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u044f\u0437\u044b\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435. <\/p>\n<p>\u0427\u0442\u043e \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443<\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir-affine example1.ts<\/code><\/pre>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433. <\/p>\n<pre><code>module @\"example1.ts\"  {   ts.Func @main () -> ()  {     %0 = ts.Constant {value = \"Hello World!\"} : !ts.string     ts.Print(%0) : !ts.string     ts.ReturnInternal   } }<\/code><\/pre>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 &#171;<strong>example1.ts<\/strong>&#187; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e &#171;@main&#187; \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u043c\u0430\u043d\u0434\u044b &#171;Print&#187; \u0438 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041a\u0430\u043a \u043d\u0435 \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 &#171;Hello World!&#187;.<\/p>\n<p>\u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u0434 \u0431\u043b\u0438\u0437\u043a\u0438\u0439 \u043a \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>C:\\dev>tsc.exe --emit=mlir-llvm example1.ts<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/p>\n<pre><code>module @\"1.ts\"  {   llvm.func @puts(!llvm.ptr&lt;i8>) -> i32   llvm.mlir.global internal constant @s_10092224619179044402(\"Hello World!\\00\")   llvm.func @main() {     %0 = llvm.mlir.addressof @s_10092224619179044402 : !llvm.ptr&lt;array&lt;13 x i8>>     %1 = llvm.mlir.constant(0 : i64) : i64     %2 = llvm.getelementptr %0[%1, %1] : (!llvm.ptr&lt;array&lt;13 x i8>>, i64, i64) -> !llvm.ptr&lt;i8>     %3 = llvm.call @puts(%2) : (!llvm.ptr&lt;i8>) -> i32     llvm.return   } } <\/code><\/pre>\n<p>\u041d\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u043c\u0430\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u0442 &#171;\u0441\u043a\u043e\u0440\u043c\u0438\u0442\u044c&#187; <strong>ll\u0441 <\/strong>\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <strong>obj-\u0444\u0430\u0439\u043b\u0430<\/strong> \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <\/p>\n<pre><code>C:\\dev>tsc.exe --emit=llvm example1.ts<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434<\/p>\n<pre><code>; ModuleID = 'LLVMDialectModule' source_filename = \"LLVMDialectModule\" target datalayout = \"e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128\" target triple = \"x86_64-pc-windows-msvc\"  @s_10092224619179044402 = internal constant [13 x i8] c\"Hello World!\\00\"  declare i32 @puts(i8*)  define void @main() {   %1 = call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @s_10092224619179044402, i64 0, i64 0)), !d   ret void }  <\/code><\/pre>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438\u0441\u044c \u043f\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u044d\u0442\u0430\u043f\u0430\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0448\u0430\u0433\u0438 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u0430\u043f\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c &#171;&#8212;emit=mlir-affine&#187;<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 (\u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b)<\/p>\n<h2>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/h2>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043a\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<pre><code class=\"javascript\">function defaultArgs(x: number, y = 3, z = 7) {     return x + y + z; }<\/code><\/pre>\n<p>\u0418 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e<\/p>\n<pre><code class=\"javascript\">function optargs(x: number, y?: number, z?: number) {     if (y == undefined) y = 0;     return x + y; }<\/code><\/pre>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435<strong> <\/strong>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &#171;<strong>y&#187; <\/strong>\u0438<strong> &#171;z&#187; <\/strong>\u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &#171;<strong>y&#187; <\/strong>\u0438<strong> &#171;z&#187; <\/strong>\u0443\u043a\u0430\u0437\u0430\u043d\u044b \u043a\u0430\u043a \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0442.\u043a. \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<p>\u0412\u044b\u0437\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<pre><code class=\"javascript\">defaultArgs(1); defaultArgs(1, 4); defaultArgs(1, 4, 8);  optargs(1); optargs(1, 2); optargs(1, 2, 3);<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435)<\/p>\n<pre><code class=\"javascript\">function defaultArgs(x: number, y = 3, z = 7) {     return x + y + z; }  function main() {     defaultArgs(1);     defaultArgs(1, 4);     defaultArgs(1, 4, 8);      optargs(1);     optargs(1, 2);     optargs(1, 2, 3); }  function optargs(x: number, y?: number, z?: number) {     if (y == undefined) y = 0;     return x + y; } <\/code><\/pre>\n<p>\u0418 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>tsc &#8212;emit=mlir example1.ts<\/strong>)<\/p>\n<pre><code>module @\"C:\\\\temp\\\\1.ts\"  {   ts.Func @defaultArgs (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number {sym_visibility = \"private\"}  {   ^bb0(%arg0: !ts.number, %arg1: !ts.optional&lt;i32>, %arg2: !ts.optional&lt;i32>):  \/\/ no predecessors     %0 = \"ts.Entry\"() : () -> !ts.ref&lt;!ts.number>     %1 = \"ts.Param\"(%arg0) : (!ts.number) -> !ts.ref&lt;!ts.number>     %2 = \"ts.ParamOpt\"(%arg1) ( {       %11 = ts.Constant {value = 3 : i32} : i32       ts.DefaultValue %11 : i32     }) : (!ts.optional&lt;i32>) -> !ts.ref&lt;i32>     %3 = \"ts.ParamOpt\"(%arg2) ( {       %11 = ts.Constant {value = 7 : i32} : i32       ts.DefaultValue %11 : i32     }) : (!ts.optional&lt;i32>) -> !ts.ref&lt;i32>     %4 = ts.Load(%1) : !ts.ref&lt;!ts.number> -> !ts.number     %5 = ts.Load(%2) : !ts.ref&lt;i32> -> i32     %6 = ts.Cast %5 : i32 to !ts.number     %7 = ts.ArithmeticBinary %4(39) %6 : !ts.number, !ts.number -> !ts.number     %8 = ts.Load(%3) : !ts.ref&lt;i32> -> i32     %9 = ts.Cast %8 : i32 to !ts.number     %10 = ts.ArithmeticBinary %7(39) %9 : !ts.number, !ts.number -> !ts.number     \"ts.ReturnVal\"(%10, %0) : (!ts.number, !ts.ref&lt;!ts.number>) -> ()     \"ts.Exit\"() : () -> ()   }   ts.Func @main () -> ()  {     \"ts.Entry\"() : () -> ()     %0 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %1 = ts.Constant {value = 1 : i32} : i32     %2 = ts.Cast %1 : i32 to !ts.number     %3 = ts.Undef : !ts.optional&lt;i32>     %4 = ts.Undef : !ts.optional&lt;i32>     %5 = ts.CallIndirect %0(%2, %3, %4) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %6 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %7 = ts.Constant {value = 1 : i32} : i32     %8 = ts.Cast %7 : i32 to !ts.number     %9 = ts.Constant {value = 4 : i32} : i32     %10 = ts.Cast %9 : i32 to !ts.optional&lt;i32>     %11 = ts.Undef : !ts.optional&lt;i32>     %12 = ts.CallIndirect %6(%8, %10, %11) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %13 = ts.SymbolRef {identifier = @defaultArgs} : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %14 = ts.Constant {value = 1 : i32} : i32     %15 = ts.Cast %14 : i32 to !ts.number     %16 = ts.Constant {value = 4 : i32} : i32     %17 = ts.Cast %16 : i32 to !ts.optional&lt;i32>     %18 = ts.Constant {value = 8 : i32} : i32     %19 = ts.Cast %18 : i32 to !ts.optional&lt;i32>     %20 = ts.CallIndirect %13(%15, %17, %19) : (!ts.number, !ts.optional&lt;i32>, !ts.optional&lt;i32>) -> !ts.number     %21 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %22 = ts.Constant {value = 1 : i32} : i32     %23 = ts.Cast %22 : i32 to !ts.number     %24 = ts.Undef : !ts.optional&lt;!ts.number>     %25 = ts.Undef : !ts.optional&lt;!ts.number>     %26 = ts.CallIndirect %21(%23, %24, %25) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %27 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %28 = ts.Constant {value = 1 : i32} : i32     %29 = ts.Cast %28 : i32 to !ts.number     %30 = ts.Constant {value = 2 : i32} : i32     %31 = ts.Cast %30 : i32 to !ts.optional&lt;!ts.number>     %32 = ts.Undef : !ts.optional&lt;!ts.number>     %33 = ts.CallIndirect %27(%29, %31, %32) : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %34 = ts.SymbolRef {identifier = @optargs} : (!ts.number, !ts.optional&lt;!ts.number>, !ts.optional&lt;!ts.number>) -> !ts.number     %35 = ts.Constant {value = 1 :<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-399435","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/399435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=399435"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/399435\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=399435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=399435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=399435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}