{"id":252368,"date":"2015-03-04T10:00:03","date_gmt":"2015-03-04T06:00:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=252368"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=252368","title":{"rendered":"DuoCode: \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u043c C# \u0432 JavaScript"},"content":{"rendered":"<p>     \t\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f C#. \u0418 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0410 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f JavaScript. \u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u043c C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0435\u0441\u0442\u044c \u0437\u0430\u044f\u0434\u043b\u044b\u0439 C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041e\u043d \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 C#, \u0432\u0441\u0435-\u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u043d\u0451\u043c \u043f\u0438\u0448\u0435\u0442. \u041d\u043e \u0441\u0443\u0434\u044c\u0431\u0430 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0434\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0435\u043c\u0443 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0435\u0442\u0435, \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0435\u0431\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u2014 \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0442\u0430\u043c. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0440\u043e\u0434\u0435 \u0431\u044b JavaScript \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0432\u043e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0451\u043c \u043e\u0442\u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0430 \u043d\u0451\u043c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 JavaScript (\u0432\u0441\u044f\u043a\u0438\u0435 <a href=\"http:\/\/www.typescriptlang.org\/\">TypeScript<\/a>, <a href=\"http:\/\/coffeescript.org\/\">CoffeScript<\/a> \u0438 \u0442\u044b\u0441\u044f\u0447\u0438 \u0434\u0440\u0443\u0433\u0438\u0445). \u041d\u043e \u043d\u0430\u0448 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u044f\u043c\u044b\u043c: \u043e\u043d \u0443\u043f\u043e\u0440\u043d\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435\u043c\u0443 \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 C# \u0441 \u00ab\u0432\u0440\u0430\u0436\u0435\u0441\u043a\u0438\u043c\u0438\u00bb \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438.<\/p>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0443\u0436\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/duoco.de\/\">DuoCode<\/a>. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c C#-\u043a\u043e\u0434 \u0432 JavaScript. \u041f\u043e\u043a\u0430 \u043e\u043d \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 beta, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f C# 6.0, Generic-\u0442\u0438\u043f\u044b, Reflection, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 LINQ, \u0430 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 JavaScript \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c C#. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/cf4\/b40\/d9e\/cf4b40d9ed2c41ad93667444b809ecfb.png\"\/><a name=\"habracut\"><\/a><\/p>\n<h3>Hello DuoCode<\/h3>\n<p>\u041f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e *Hello world*. \u0418\u0442\u0430\u043a, \u0438\u043c\u0435\u0435\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 C#-\u043a\u043e\u0434:<\/p>\n<pre><code>\/\/ Original C# code using System; using DuoCode.Dom; using static DuoCode.Dom.Global; \/\/ C# 6.0 'using static' syntax  namespace HelloDuoCode {   static class Program   {     public class Greeter     {       private readonly HTMLElement element;       private readonly HTMLElement span;       private int timerToken;        public Greeter(HTMLElement el)       {         element = el;         span = document.createElement(&quot;span&quot;);         element.appendChild(span);         Tick();       }        public void Start()       {         timerToken = window.setInterval((Action)Tick, 500);       }        public void Stop()       {         window.clearTimeout(timerToken);       }        private void Tick()       {         span.innerHTML = string.Format(&quot;The time is: {0}&quot;, DateTime.Now);       }     }      static void Run()     {       System.Console.WriteLine(&quot;Hello DuoCode&quot;);        var el = document.getElementById(&quot;content&quot;);       var greeter = new Greeter(el);       greeter.Start();     }   } } <\/code><\/pre>\n<p>  \u041b\u0451\u0433\u043a\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0443\u043a\u0438 \u043e\u043d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 JavaScript:<\/p>\n<pre><code class=\"javascript\">\/\/ JavaScript code generated by DuoCode var HelloDuoCode = this.HelloDuoCode || {}; var $d = DuoCode.Runtime; HelloDuoCode.Program = $d.declare(&quot;HelloDuoCode.Program&quot;, System.Object, 0, $asm, function($t, $p) {     $t.Run = function Program_Run() {         System.Console.WriteLine$10(&quot;Hello DuoCode&quot;);          var el = document.getElementById(&quot;content&quot;);         var greeter = new HelloDuoCode.Program.Greeter.ctor(el);         greeter.Start();     }; }); HelloDuoCode.Program.Greeter = $d.declare(&quot;Greeter&quot;, System.Object, 0, HelloDuoCode.Program, function($t, $p) {     $t.$ator = function() {         this.element = null;         this.span = null;         this.timerToken = 0;     };     $t.ctor = function Greeter(el) {         $t.$baseType.ctor.call(this);         this.element = el;         this.span = document.createElement(&quot;span&quot;);         this.element.appendChild(this.span);         this.Tick();     };     $t.ctor.prototype = $p;     $p.Start = function Greeter_Start() {         this.timerToken = window.setInterval($d.delegate(this.Tick, this), 500);     };     $p.Stop = function Greeter_Stop() {         window.clearTimeout(this.timerToken);     };     $p.Tick = function Greeter_Tick() {         this.span.innerHTML = String.Format(&quot;The time is: {0}&quot;, $d.array(System.Object, [System.DateTime().get_Now()])); \/\/ try to put a breakpoint here     }; }); <\/code><\/pre>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/0f8\/5a6\/434\/0f85a64345374ceeafa520fe5d0d634f.png\"\/><\/p>\n<p>  \u041f\u043e\u0434\u0441\u043a\u0430\u0436\u0443, \u043d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<ul>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <code>using static<\/code> \u0438\u0437 C# 6.0.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0438\u0437\u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 DOM-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438<\/li>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u0439\u043c\u0435\u0440<\/li>\n<\/ul>\n<p>\u0414\u0430\u0436\u0435 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0443\u0436\u0435 \u0440\u0430\u0434\u0443\u0435\u0442. \u041d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c JavaScript \u043d\u0435 \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<h3>\u041a\u0440\u0435\u0441\u0442\u0438\u043a\u0438-\u043d\u043e\u043b\u0438\u043a\u0438<\/h3>\n<p>\u0412 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u0432\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 HTML-\u0438\u0433\u0440\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c C#:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/ba7\/c0b\/e13\/ba7c0be13b3940aeb3926fb1d7e8c86f.png\"\/><\/p>\n<p>  \u041a\u043e\u0434 \u0438\u0433\u0440\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>enum<\/code>-\u044b \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0442\u043e\u0440\u044b:<\/p>\n<pre><code>public enum Player {     None = 0,     X = 1,     O = -1 }  public sealed class Board {     public static Player Other(Player player)     {         return (Player)(-(int)player);     }      private readonly Player[] Squares;      public readonly int Count;      public Player this[int position]     {         get         {             return Squares[position];         }     }      public Board() \/\/ empty board     {         \/\/Squares = new Player[9];         Squares = new Player[] { Player.None, Player.None, Player.None, Player.None, Player.None, Player.None, Player.None, Player.None, Player.None };     }      private Board(Board board, Player player, int position) :       this()     {         Array.Copy(board.Squares, Squares, 9);         Squares[position] = player;          Count = board.Count + 1;     }      public bool Full { get { return Count == 9; } }      public Board Move(Player player, int position)     {         if (position &lt; 0 ||             position &gt;= 9 ||             Squares[position] != Player.None)         {             throw new Exception(&quot;Illegal move&quot;);         }          return new Board(this, player, position);     }      public Player GetWinner()     {         if (Count &lt; 5)             return Player.None;          Player result;         bool winning =           IsWinning(0, 1, 2, out result) ||           IsWinning(3, 4, 5, out result) ||           IsWinning(6, 7, 8, out result) ||           IsWinning(0, 3, 6, out result) ||           IsWinning(1, 4, 7, out result) ||           IsWinning(2, 5, 8, out result) ||           IsWinning(0, 4, 8, out result) ||           IsWinning(2, 4, 6, out result);          return result;     }      private bool IsWinning(int p0, int p1, int p2, out Player player)     {         int count = (int)Squares[p0] + (int)Squares[p1] + (int)Squares[p2];         player = count == 3 ? Player.X : count == -3 ? Player.O : Player.None;         return player != Player.None;     } } <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u043b\u043e\u0432\u043d\u043e \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 DOM-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438:<\/p>\n<pre><code>public static void Main(string[] args) {   for (var i = 0; i &lt; 9; i++)   {     Dom.HTMLInputElement checkbox = GetCheckbox(i);     checkbox.checked_ = false;     checkbox.indeterminate = true;     checkbox.disabled = false;     checkbox.onclick = OnClick;   }    if (new Random().Next(2) == 0)     ComputerPlay();    UpdateStatus(); }  private static dynamic OnClick(Dom.MouseEvent e) {   int position = int.Parse(((Dom.HTMLInputElement)e.target).id[1].ToString());    try   {     board = board.Move(Player.X, position);   }   catch   {     Dom.Global.window.alert(&quot;Illegal move&quot;);     return null;   }    Dom.HTMLInputElement checkbox = GetCheckbox(position);   checkbox.disabled = true;   checkbox.checked_ = true;    if (!board.Full)     ComputerPlay();    UpdateStatus();    return null; }  private static Dom.HTMLInputElement GetCheckbox(int index) {   string name = &quot;a&quot; + index.ToString();   Dom.HTMLInputElement checkbox = Dom.Global.document.getElementById(name).As&lt;Dom.HTMLInputElement&gt;();   return checkbox; } <\/code><\/pre>\n<p>  <\/p>\n<h3>WebGL<\/h3>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 WebGL? \u041d\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c! \u0411\u0435\u0440\u0451\u043c C#-\u043a\u043e\u0434:<\/p>\n<pre><code>using DuoCode.Dom; using System;  namespace WebGL {   using GL = WebGLRenderingContext;    internal static class Utils   {     public static WebGLRenderingContext CreateWebGL(HTMLCanvasElement canvas)     {       WebGLRenderingContext result = null;       string[] names = { &quot;webgl&quot;, &quot;experimental-webgl&quot;, &quot;webkit-3d&quot;, &quot;moz-webgl&quot; };       foreach (string name in names)       {         try         {           result = canvas.getContext(name);         }         catch { }         if (result != null)           break;       }       return result;     }      public static WebGLShader CreateShaderFromScriptElement(WebGLRenderingContext gl, string scriptId)     {       var shaderScript = (HTMLScriptElement)Global.document.getElementById(scriptId);        if (shaderScript == null)         throw new Exception(&quot;unknown script element &quot; + scriptId);        string shaderSource = shaderScript.text;        \/\/ Now figure out what type of shader script we have, based on its MIME type       int shaderType = (shaderScript.type == &quot;x-shader\/x-fragment&quot;) ? GL.FRAGMENT_SHADER :                        (shaderScript.type == &quot;x-shader\/x-vertex&quot;)   ? GL.VERTEX_SHADER   : 0;       if (shaderType == 0)         throw new Exception(&quot;unknown shader type&quot;);        WebGLShader shader = gl.createShader(shaderType);       gl.shaderSource(shader, shaderSource);        \/\/ Compile the shader program       gl.compileShader(shader);        \/\/ See if it compiled successfully       if (!gl.getShaderParameter(shader, GL.COMPILE_STATUS))       {         \/\/ Something went wrong during compilation; get the error         var errorInfo = gl.getShaderInfoLog(shader);         gl.deleteShader(shader);         throw new Exception(&quot;error compiling shader '&quot; + shader + &quot;': &quot; + errorInfo);       }       return shader;     }      public static WebGLProgram CreateShaderProgram(WebGLRenderingContext gl, WebGLShader fragmentShader, WebGLShader vertexShader)     {       var shaderProgram = gl.createProgram();       gl.attachShader(shaderProgram, vertexShader);       gl.attachShader(shaderProgram, fragmentShader);       gl.linkProgram(shaderProgram);        bool linkStatus = gl.getProgramParameter(shaderProgram, GL.LINK_STATUS);       if (!linkStatus)         throw new Exception(&quot;failed to link shader&quot;);       return shaderProgram;     }      public static WebGLTexture LoadTexture(WebGLRenderingContext gl, string resourceName)     {       var result = gl.createTexture();       var imageElement = Properties.Resources.duocode.Image;       imageElement.onload = new Func&lt;Event, dynamic&gt;((e) =&gt;       {         UploadTexture(gl, result, imageElement);         return true;       });        return result;     }      public static void UploadTexture(WebGLRenderingContext gl, WebGLTexture texture, HTMLImageElement imageElement)     {       gl.pixelStorei(GL.UNPACK_FLIP_Y_WEBGL, GL.ONE);       gl.bindTexture(GL.TEXTURE_2D, texture);       gl.texImage2D(GL.TEXTURE_2D, 0, GL.RGBA, GL.RGBA, GL.UNSIGNED_BYTE, imageElement);       gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MAG_FILTER, GL.LINEAR);       gl.texParameteri(GL.TEXTURE_2D, GL.TEXTURE_MIN_FILTER, GL.LINEAR_MIPMAP_NEAREST);       gl.generateMipmap(GL.TEXTURE_2D);       gl.bindTexture(GL.TEXTURE_2D, null);     }      public static float DegToRad(float degrees)     {       return (float)(degrees * System.Math.PI \/ 180);     }   } } <\/code><\/pre>\n<p>  \u0418 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 DuoCode-\u043c\u0430\u0433\u0438\u044e:<\/p>\n<pre><code class=\"javascript\">WebGL.Utils = $d.declare(&quot;WebGL.Utils&quot;, System.Object, 0, $asm, function($t, $p) {     $t.CreateWebGL = function Utils_CreateWebGL(canvas) {         var result = null;         var names = $d.array(String, [&quot;webgl&quot;, &quot;experimental-webgl&quot;, &quot;webkit-3d&quot;, &quot;moz-webgl&quot;]);         for (var $i = 0, $length = names.length; $i != $length; $i++) {             var name = names[$i];             try {                 result = canvas.getContext(name);             }             catch ($e) {}              if (result != null)                 break;         }         return result;     };     $t.CreateShaderFromScriptElement = function Utils_CreateShaderFromScriptElement(gl, scriptId) {         var shaderScript = $d.cast(document.getElementById(scriptId), HTMLScriptElement);          if (shaderScript == null)             throw new System.Exception.ctor$1(&quot;unknown script element &quot; + scriptId);          var shaderSource = shaderScript.text;          \/\/ Now figure out what type of shader script we have, based on its MIME type         var shaderType = (shaderScript.type == &quot;x-shader\/x-fragment&quot;) ? 35632 \/* WebGLRenderingContext.FRAGMENT_SHADER *\/ : (shaderScript.type == &quot;x-shader\/x-vertex&quot;) ? 35633 \/* WebGLRenderingContext.VERTEX_SHADER *\/ : 0;         if (shaderType == 0)             throw new System.Exception.ctor$1(&quot;unknown shader type&quot;);          var shader = gl.createShader(shaderType);         gl.shaderSource(shader, shaderSource);          \/\/ Compile the shader program         gl.compileShader(shader);          \/\/ See if it compiled successfully         if (!gl.getShaderParameter(shader, 35713 \/* WebGLRenderingContext.COMPILE_STATUS *\/)) {             \/\/ Something went wrong during compilation; get the error             var errorInfo = gl.getShaderInfoLog(shader);             gl.deleteShader(shader);             throw new System.Exception.ctor$1(&quot;error compiling shader '&quot; + $d.toString(shader) + &quot;': &quot; + errorInfo);         }         return shader;     };     $t.CreateShaderProgram = function Utils_CreateShaderProgram(gl, fragmentShader, vertexShader) {         var shaderProgram = gl.createProgram();         gl.attachShader(shaderProgram, vertexShader);         gl.attachShader(shaderProgram, fragmentShader);         gl.linkProgram(shaderProgram);          var linkStatus = gl.getProgramParameter(shaderProgram, 35714 \/* WebGLRenderingContext.LINK_STATUS *\/);         if (!linkStatus)             throw new System.Exception.ctor$1(&quot;failed to link shader&quot;);         return shaderProgram;     };     $t.LoadTexture = function Utils_LoadTexture(gl, resourceName) {         var result = gl.createTexture();         var imageElement = WebGL.Properties.Resources().get_duocode().Image;         imageElement.onload = $d.delegate(function(e) {             WebGL.Utils.UploadTexture(gl, result, imageElement);             return true;         }, this);          return result;     };     $t.UploadTexture = function Utils_UploadTexture(gl, texture, imageElement) {         gl.pixelStorei(37440 \/* WebGLRenderingContext.UNPACK_FLIP_Y_WEBGL *\/, 1 \/* WebGLRenderingContext.ONE *\/);         gl.bindTexture(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/, texture);         gl.texImage2D(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/, 0, 6408 \/* WebGLRenderingContext.RGBA *\/, 6408 \/* WebGLRenderingContext.RGBA *\/, 5121 \/* WebGLRenderingContext.UNSIGNED_BYTE *\/, imageElement);         gl.texParameteri(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/, 10240 \/* WebGLRenderingContext.TEXTURE_MAG_FILTER *\/, 9729 \/* WebGLRenderingContext.LINEAR *\/);         gl.texParameteri(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/, 10241 \/* WebGLRenderingContext.TEXTURE_MIN_FILTER *\/, 9985 \/* WebGLRenderingContext.LINEAR_MIPMAP_NEAREST *\/);         gl.generateMipmap(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/);         gl.bindTexture(3553 \/* WebGLRenderingContext.TEXTURE_2D *\/, null);     };     $t.DegToRad = function Utils_DegToRad(degrees) {         return (degrees * 3.14159265358979 \/* Math.PI *\/ \/ 180);     }; }); <\/code><\/pre>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c <a href=\"http:\/\/duoco.de\/samples\/webgl\/index\">\u0434\u0435\u043c\u043a\u0443<\/a> \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u0430\u0439\u0442\u0435. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/278\/8bd\/179\/2788bd179edc439aa810cd25bedfa4ff.png\"\/><\/p>\n<h3>RayTracer<\/h3>\n<p>\u0418 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u0435\u043b! \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 RayTracer (\u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0441 \u0446\u0432\u0435\u0442\u043e\u043c \u0438 \u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435\u043c, \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u2014 \u0432\u0441\u0451 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c C#):<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/bb3\/6e5\/268\/bb36e526874c43bba572a79966ed43e7.png\"\/><\/p>\n<h3>\u041e\u0442\u043b\u0430\u0434\u043a\u0430<\/h3>\n<p>\u0417\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0447\u0443\u0434\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. C#-\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/dc7\/0d5\/825\/dc70d5825959491c9b38860fcc416556.png\"\/><\/p>\n<p>  \u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0432 VS 2015, IE, Chrome \u0438 Firefox.<\/p>\n<h3>\u0415\u0449\u0451 \u043f\u0430\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432<\/h3>\n<p>\u041f\u0440\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0438\u0437 C# \u0432 JavaScript \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f DuoCode \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043d\u043e \u0434\u043b\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0445\u0432\u0430\u0442\u0438\u0442\u044c (\u043a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c).<\/p>\n<p>  C#:<\/p>\n<pre><code>public struct Point {     public readonly static Point Zero = new Point(0, 0);      public readonly int X;     public readonly int Y;      public Point(int x, int y)     {         X = x;         Y = y;     } } <\/code><\/pre>\n<p>  JavaScript:<\/p>\n<pre><code class=\"javascript\">HelloDuoCode.Program.Point = $d.declare(&quot;Point&quot;, null, 62, HelloDuoCode.Program, function($t, $p) {     $t.cctor = function() {         $t.Zero = new HelloDuoCode.Program.Point.ctor$1(0, 0);     };     $t.ctor = function Point() {         this.X = 0;         this.Y = 0;     };     $t.ctor.prototype = $p;     $t.ctor$1 = function Point(x, y) {         this.X = x;         this.Y = y;     };     $t.ctor$1.prototype = $p; }); <\/code><\/pre>\n<p>  \u041b\u0438\u0447\u043d\u043e \u043c\u0435\u043d\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0440\u0430\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 LINQ:<\/p>\n<p>  C#:<\/p>\n<pre><code>public static IEnumerable&lt;int&gt; Foo() {     return Enumerable.Range(0, 10).Where(x =&gt; x % 2 == 0).Select(x =&gt; x * 3); } <\/code><\/pre>\n<p>  JavaScript:<\/p>\n<pre><code>$t.Foo = function Program_Foo() {     return System.Linq.Enumerable.Select(System.Int32, System.Int32, System.Linq.Enumerable.Where(System.Int32,          System.Linq.Enumerable.Range(0, 10), $d.delegate(function(x) {             return x % 2 == 0;         }, this)), $d.delegate(function(x) {         return x * 3;     }, this)); }; <\/code><\/pre>\n<p>  \u041c\u0435\u043b\u043a\u0438\u0435 \u0440\u0430\u0434\u043e\u0441\u0442\u0438 \u0432\u0440\u043e\u0434\u0435 <code>Generic<\/code>, <code>params<\/code>, <code>nullable<\/code>, \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0430\u043a\u0436\u0435 \u0438\u0434\u0443\u0442 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435:<\/p>\n<p>  C#:<\/p>\n<pre><code>public class Foo&lt;T&gt; where T : IComparable&lt;T&gt; {     public void Bar(int? x, T y, string z = &quot;value&quot;)     {         System.Console.WriteLine((x ?? -1) + y.ToString() + z);     }     public void Bar(string z, params object[] args)     {     } } \/\/ Main new Foo&lt;int&gt;().Bar(null, 2); <\/code><\/pre>\n<p>  JavaScript:<\/p>\n<pre><code class=\"javascript\">HelloDuoCode.Program.Foo$1 = $d.declare(&quot;Foo`1&quot;, System.Object, 256, HelloDuoCode.Program, function($t, $p, T) {     $t.ctor = function Foo$1() {         $t.$baseType.ctor.call(this);     };     $t.ctor.prototype = $p;     $p.Bar$1 = function Foo$1_Bar(x, y, z) {         System.Console.WriteLine$10($d.toString(($d.ncl(x, -1))) + y.ToString() + z);     };     $p.Bar = function Foo$1_Bar(z, args) {}; }, [$d.declareTP(&quot;T&quot;)]); \/\/ Main new (HelloDuoCode.Program.Foo$1(System.Int32).ctor)().Bar$1(null, 2, &quot;value&quot;); <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e DuoCode \u043f\u043e\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 beta, \u043d\u043e \u0443\u0436\u0435 \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u0447 \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0440\u0430\u0434\u0443\u0435\u0442 \u0433\u043b\u0430\u0437:<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/e1f\/3fb\/f47\/e1f3fbf472084f0296fb150f07518e2a.png\"\/><\/p>\n<p>  \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0434\u0451\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0411\u0443\u0434\u0435\u043c \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043c\u044b \u0443\u0436\u0435 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u043f\u0430\u0440\u0435 \u0448\u0430\u0433\u043e\u0432 \u043e\u0442 \u0442\u043e\u0433\u043e \u0441\u0432\u0435\u0442\u043b\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 C#, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u044e \u043c\u043e\u0449\u044c \u044f\u0437\u044b\u043a\u0430 \u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.      \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/252079\/\"> http:\/\/habrahabr.ru\/post\/252079\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f C#. \u0418 \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0410 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f JavaScript. \u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043e\u043d \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u043c C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0435\u0441\u0442\u044c \u0437\u0430\u044f\u0434\u043b\u044b\u0439 C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041e\u043d \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 C#, \u0432\u0441\u0435-\u0432\u0441\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 \u043d\u0451\u043c \u043f\u0438\u0448\u0435\u0442. \u041d\u043e \u0441\u0443\u0434\u044c\u0431\u0430 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0434\u0438\u043b\u0430\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0435\u043c\u0443 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0435\u0442\u0435, \u0442\u0430\u043a\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0435\u0431\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u2014 \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0442\u0430\u043c. \u0418 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0433\u0435\u0440\u043e\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0432\u0440\u043e\u0434\u0435 \u0431\u044b JavaScript \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u043e \u0432\u043e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0451\u043c \u043e\u0442\u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0430 \u043d\u0451\u043c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 JavaScript (\u0432\u0441\u044f\u043a\u0438\u0435 <a href=\"http:\/\/www.typescriptlang.org\/\">TypeScript<\/a>, <a href=\"http:\/\/coffeescript.org\/\">CoffeScript<\/a> \u0438 \u0442\u044b\u0441\u044f\u0447\u0438 \u0434\u0440\u0443\u0433\u0438\u0445). \u041d\u043e \u043d\u0430\u0448 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u044f\u043c\u044b\u043c: \u043e\u043d \u0443\u043f\u043e\u0440\u043d\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435\u043c\u0443 \u043b\u044e\u0431\u0438\u043c\u043e\u043c\u0443 C# \u0441 \u00ab\u0432\u0440\u0430\u0436\u0435\u0441\u043a\u0438\u043c\u0438\u00bb \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438.<\/p>\n<p>  \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e\u0435 \u0431\u0443\u0434\u0443\u0449\u0435\u0435 \u0443\u0436\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u043e. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"http:\/\/duoco.de\/\">DuoCode<\/a>. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c C#-\u043a\u043e\u0434 \u0432 JavaScript. \u041f\u043e\u043a\u0430 \u043e\u043d \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 beta, \u043d\u043e \u0443 \u043d\u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f: \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f C# 6.0, Generic-\u0442\u0438\u043f\u044b, Reflection, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 LINQ, \u0430 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 JavaScript \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c C#. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442.<\/p>\n<p>  <img decoding=\"async\" src=\"\/\/habrastorage.org\/files\/cf4\/b40\/d9e\/cf4b40d9ed2c41ad93667444b809ecfb.png\"\/><\/p>\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-252368","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/252368","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=252368"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/252368\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=252368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=252368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=252368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}