Компиляция .Net в JS. Или пару слов о JSIL

6 Фев
2012

Добрый день, %username%!

Kevin Gadd из Mozilla представил летом 11-го года достаточно интересную тулзу для компиляции CIL в JavaScript. Данная статья представляет из себя достаточно вольный перевод интервью с сайта stateofcode.com и немного своих мыслей.


Компилятор JSIL позволяет компилировать код виртуальной машины .Net в JavaScript, при этом даже сохраняя читаемость и даже стилистику C#. Так например этот код:
using System;
using System.Collections.Generic;

public static class Program {
  public static void Main (string[] args) {
    var array = new[] { 1, 2, 4, 8, 16 };

    foreach (var i in array)
      Console.WriteLine(i);

    var list = new List<int>(array);

    foreach (var j in list)
      Console.WriteLine(j);
  }
}


Внезапно превращается в такой:

JSIL.MakeStaticClass("Program", true);

Program.Main = function (args) {
    var array = JSIL.Array.New(System.Int32,
                      [1, 2, 4, 8, 16]);
    var array2 = array;
__loop0__: 
    for (var k = 0; k < array2.length; ++k) {
        var i = array2[k];
        System.Console.WriteLine(i);
    }
    var list = new (System.Collections.Generic
                        .List$b1.Of(System.Int32))
                       (array);
    var enumerator = JSIL.Cast(list.GetEnumerator(), 
                           System.Collections.Generic
                           .List$b1.Enumerator.Of
                              (System.Int32));
    try {
    __loop1__: 
        while (enumerator.MoveNext()) {
            var j = enumerator.Current;
            System.Console.WriteLine(j);
        }
    } finally {
        enumerator.IDisposable_Dispose();
    }
};



На jsil.org есть отличные примеры, среди которых имеется и Тетрис, и пример платформера(оба были написаны на XNA-фреймворке), и даже Raytracer. Правда стоит заметить, что есть небольшие проблемы с исполнением кода в хроме, как указывает автор из за проблем с ECMAScript.

Конечно, уже существовал Emscripten, который даже позволил запустить Doom в веб-браузере(ныне не доступный по причинам авторского права), но C# уж удобная среда для разработки приложений, в добавок, по утверждениям Kevin Gadd, игры портированые с помощью jsil будут поддерживать аппаратное ускорение браузера.

Еще один удобный плюс — это читаемость кода, который мы получаем после компиляции его в JavaScript. Я думаю это неоспоримый плюс при миграции программ.

Стоит заметить, что автору пришлось реализовать самому основные библиотеки .Net(в самом минимальном их варианте), чтобы избежать проблемы с лицензионными соглашениями.

На самом деле, не все так облачно, как кажется на первый взгляд — пример платформера тормозит просто безбожно и иногда ведет себя несколько не корректно, но сама идея проекта интересна.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх