Подтвердить что ты не робот

JSIL vs Script # против SharpKit

Я смотрю Script #, JSIL и SharpKit как инструмент для компиляции С# в Javascript, поэтому я могу программировать функции на стороне клиента AJAX с помощью С# в Visual Studio.

Каковы плюсы и минусы каждого JSIL, Script # и SharpKit?

Мой проект - проект MVC4 с использованием механизма бритвы и С#, если это имеет значение.

4b9b3361

Ответ 1

Если вы хотите интегрировать напрямую с проектом MVC, то вроде Script # или SharpKit или что-то, вероятно, лучше всего - я знаю, что Script # имеет встроенный материал, чтобы сделать этот вид интеграции, поэтому я бы начал там.

Если вы хотите попробовать использовать JSIL, у него, вероятно, есть основные функции, которые вам нужны, но то, что вам может понадобиться - например, интеграция с Visual Studio, автоматическое развертывание и т.д. - не существует. В настоящее время он ориентирован прежде всего на кросс-компиляцию приложений, поэтому он хорошо справляется с этим, но не так хорошо работает в других случаях использования.

Я попытаюсь дать краткое описание причин, по которым вы можете рассмотреть JSIL по этим другим альтернативам - я не могу подробно прокомментировать плюсы и минусы этих альтернатив, так как я их не использовал:


JSIL имеет чрезвычайно широкую поддержку функций, доступных на С# 4. Известные (либо потому, что другие инструменты не поддерживают их, либо они сложны) включают:

динамический, yield, Структуры, ref/ out, Delegates, Generics, Nullables, Interfaces и Enums.

Некоторые из вышеперечисленных, конечно, не имеют полной поддержки - чтобы получить представление о вещах, которые абсолютно будут работать, вы можете посмотреть тест случаев - каждый из них представляет собой небольшой автономный файл .cs, который протестирован для обеспечения того, чтобы JSIL и собственный С# выдавали один и тот же результат.

Причина такой обширной поддержки заключается в том, что моя цель состоит в том, чтобы JSIL позволял вам переводить полностью немодифицированное приложение С# в работу JS. Для всех демонстраций на сайте JSIL это верно, и у меня есть несколько почти готовых портов больших реальных игр на крыльях, для которых это также верно.


Другая причина заключается в том, что JSIL делает это относительно простым для вашего С# и вашего JavaScript для обсуждения.

Все ваши типы и методы С# отображаются через интерфейс, который максимально удобен для javascript. В версиях JS есть базовое разрешение перегрузки и отправка, чтобы родные С#-интерфейсы вызывались из script кода, как если бы они были родными JS в большинстве случаев. Вам не нужно предпринимать какие-либо шаги для специфического тегирования методов, которые вы хотите предоставить JS, или дать им особые имена или что-то в этом роде, если вы этого не хотите.

Если вы хотите позвонить из С# в JS, вы можете сделать это несколькими способами:

  • JSIL.Verbatim.Expression позволяет вставлять исходный javascript непосредственно в переведенную версию функции.
  • JSIL.Builtins.Global можно комбинировать с динамическим и var для записи JavaScript-код непосредственно в ваших телах функций С#.
  • Атрибут JSReplacement можно использовать для замены вызовов функции С# с помощью параметризованного выражения JavaScript.
  • Все вышеперечисленные функции могут быть объединены с механизмом JSIL для изменения информации о типе, называемой Proxies, чтобы вы могли изменять информацию о типе библиотек, которые вы используете, даже если у вас нет исходного кода, чтобы сопоставить их методы для JavaScript, которые вы написали.
  • И, наконец, методы С#, не переведенные в JS, создают пустой метод, называемый External, который вы можете заменить на JavaScript во время выполнения, чтобы он снова работал. Любые внешние методы, которые вы не заменили, вызывают четкое предупреждающее сообщение во время выполнения, поэтому вы знаете, что отсутствует.

JSIL делает агрессивное использование информации о типе наряду с предоставленными вами метаданными, чтобы попытаться безопасно оптимизировать JavaScript, который он создает для вас. В некоторых случаях это может привести к более эффективному эквивалентному JavaScript, чем вы бы написали вручную - основная область, где это правда в настоящее время, это код, который использует структуры, но он также может применяться в других случаях.

Например, в этом фрагменте кода, JSIL может статически определять, что, несмотря на количество структурных копий, подразумеваемых кодом, ни одна из копий не является действительно необходимой для правильного поведения кода. В результате JavaScript заканчивается тем, что у него нет лишних копий, поэтому он работает намного быстрее, чем вы получите, если вы наивно перевели семантику оригинала С#. Это хорошая промежуточная точка между написанием наивной структурированной вещи (Vector2s всюду!) И перехода полностью орехов с оптимизацией значения имен с именем по умолчанию, который, как я уже говорил в прошлом, довольно подвержен ошибкам.


Хорошо, теперь для некоторых недостатков. Не считайте этот список исчерпывающим:

  • Большие части .NET BCL не имеют реализаций, предоставляемых JSIL. В будущем это можно решить, переведя весь Mono mscorlib на JavaScript, но у меня нет такой работы достаточно хорошо, чтобы отстаивать это как немедленное решение. (Это нормально для игр до сих пор, поскольку они не используют большую часть BCL.) Эта проблема в первую очередь связана с проблемами IP, связанными с переводом Microsoft mscorlib - если бы я мог сделать это на законных основаниях, я бы делал это правильно теперь - он работал в последний раз, когда я его тестировал.
  • Как уже упоминалось выше, нет интеграции с визуальной студией. JSIL довольно прост в использовании - вы можете подавать его .sln файл, чтобы получить кучу .js-выходов автоматически и настраивать его автоматически с помощью файла конфигурации рядом с проектом, но он нигде не близок, как отполирован или интегрирован, скажем, Script #.
  • Отсутствует поставщик или вспомогательный персонал. Если вы хотите, чтобы ошибка была исправлена ​​вчера или у вас возникли проблемы, я в значительной степени ваша единственная ставка в настоящее время (хотя есть несколько плодовитых вкладчиков, помогающих улучшить ситуацию, и больше всегда приветствуются!)
  • Эксплуатация JavaScript - проклятый лабиринт, полный невидимых наземных мин. Если вы просто хотите, чтобы приложения работали, у вас, вероятно, не будет никаких проблем, но если вы, как я, пытаетесь сделать настоящие игры быстрыми в браузерах, JavaScript сделает вашу жизнь ад, а в некоторых случаях JSIL сделает это хуже. Единственное, что я могу сказать здесь, это то, что я над этим работаю.:)
  • JavaScript minifiers и оптимизаторы, такие как Closure, явно не поддерживаются, потому что они требуют, чтобы ваш генератор кода прыгал через кучу обручей. Я мог видеть, что это реальный блокиратор в зависимости от того, как вы собираетесь использовать свой код.
  • Статический анализатор по-прежнему является хрупким, и в языковой поддержке все еще есть пробелы. Каждое большое приложение, использующее JSIL, обычно обнаруживает одну или две ошибки в JSIL - не огромные игровые прерыватели, а те, которые определенно нарушают функцию или замедляют работу.

Надеюсь, что эта информация полезна! Спасибо за ваш интерес.

Ответ 2

Script # pros:

  • Free
  • Открытый исходный код
  • Генерирует чистый JavaScript

Script # cons:

  • Поддерживает только подмножество языка С# 2.0
  • Может быть скомпилирован только в отдельном проекте, не может смешивать/повторно использовать код между клиентом и сервером.
  • Низкая частота обновлений версий.
  • Не предлагает поддержку.
  • Ограниченная поддержка сторонних библиотек, API С# отличается от API JavaScript.
  • Не с открытым исходным кодом
  • Отладка только в JavaScript

Возможности SharpKit:

  • Коммерческий продукт
  • Поддерживает полный язык С# 4.0
  • Высокая частота обновлений версий.
  • Поддержка доступна
  • Клиентский/серверный код можно смешивать и повторно использовать в рамках одного проекта
  • Расширенная поддержка сторонних библиотек, поддерживаемая как open-source - API С# точно соответствует JavaScript API
  • Поддержка базовой отладки С# для браузеров Chrome.
  • Генерирует чистый JavaScript

SharpKit минус:

  • Имеет бесплатную версию без ограничения по времени, но ограничивается небольшими/открытыми проектами
  • Не с открытым исходным кодом (только библиотеки с открытым исходным кодом)

JSIL:

  • Free
  • с открытым исходным кодом

JSIL cons:

  • Преобразует из IL (промежуточный язык), а не из С#, что означает более низкий уровень абстракции, поскольку код уже низкоуровневый.
  • Сложный сгенерированный код JavaScript - почти как IL, трудно читать и отлаживать

Ответы на отзывы:

Кевин: выход JSIL неплох, он просто генерируется для достижения полного поведения в .NET, как и режим SharpKit CLR. С другой стороны, SharpKit поддерживает генерацию собственного кода, в котором любой родной код JavaScript может быть сгенерирован с С#, как это было бы написано вручную.

Образец кода генерирования JavaScript с открытым кодом SharpKit: http://sharpkit.net/Wiki/Using_SharpKit.wiki

Разработчик может выбрать создание более сложного генерации кода и получение дополнительных функций, таких как поддержка перегрузок методов во время компиляции. Когда указано, SharpKit генерирует суффиксы методов для перегруженных методов.

Script # требует .NET 4 для запуска, но он не поддерживает полный синтаксис С# 4.0, такой как Generics, параметры ref и out, псевдонимы пространства имен и т.д.

Ответ 3

Другой альтернативой является WootzJs. Полное раскрытие, я его автор.

WootzJs является открытым исходным кодом и стремится быть довольно легким кросс-компилятором, который позволяет использовать все основные возможности языка С#.

Поддерживаемые поддерживаемые языки:

  • yield (генерируется как эффективный конечный автомат)
  • async/await (сгенерированный как конечный автомат, такой как компилятор С#)
  • ref и out параметры
  • деревья выражений
  • lambdas и делегаты (с надлежащим захватом this)
  • поддержка generics как в компиляторе, так и во время выполнения (неверное кастинг на T будет генерировать исключение литья)
  • Семантика С# (в отличие от семантики Javascript) для закрытых varaibles

Он реализуется с использованием Roslyn, что означает, что он будет первым в преимущество будущих улучшений языка, поскольку они теперь будут реализованы через самого Рослина. Он предоставляет пользовательскую версию mscorlib, чтобы вы точно знали, какие функции библиотеки действительно доступны вам в ваших сценариях.

Каковы его недостатки?

  • Javascript не предназначен для того, чтобы выглядеть "красивым". Это явно сгенерировано машиной, хотя отдельные методы должны быть легко рассуждать, глядя на них.
  • Благодаря своей обширной поддержке основных библиотек и отражения, сгенерированный вывод не является самым маленьким на блоке. Для Minification должен быть создан файл размером ~ 100 тыс. JS, но мини-код еще не поддерживается.
  • WootzJs беззастенчиво загрязняет собственные типы функциями для инкапсуляции поведения для тех типов, которые будут найдены только на С#. Например, все методы System.String добавляются в собственный тип Javascript String.
  • В настоящее время существует небольшая поддержка для привязки к сторонним библиотекам Javascript. (В настоящее время только jQuery)

Сравнение с другими кросс-компиляторами:

  • Script # очень стабилен и имеет обширную интеграцию с сторонними библиотеками Javascript. Кроме того, он имеет отличную интеграцию с Visual Studio и обеспечивает пользовательскую реализацию mscorlib. Это означает, что вы точно знаете, какие функциональные возможности были реализованы на уровне инструментария. Если, например, Console.Write() не реализован, этот метод не будет доступен в вашем редакторе.

    Однако из-за своего настраиваемого анализатора он все еще застрял в С# 2.0 (даже без генериков, найденных в этой версии С#). Это означает, что современный разработчик С# отказывается от огромного набора языковых функций, от которых большинство из нас зависит без оговорок - особенно вышеупомянутые дженерики в дополнение к лямбдам и LINQ. Это делает Script # по существу не стартером для многих разработчиков.

  • JSIL - чрезвычайно впечатляющая работа, которая перекрестно скомпилирует IL в Javascript. Он настолько прочен, что легко справляется с кросс-компиляцией больших 3D-видеоигр. Недостатком является то, что из-за его полноты результирующие файлы Javascript огромны. Если вы просто хотите mscorlib.dll и System.dll, это примерно 50 Мб загрузки. Кроме того, этот проект действительно не предназначен для использования в контексте веб-приложения, и объем усилий, необходимых для начала, немного сложнее.

    Этот инструментарий также реализует пользовательский mscorlib, снова позволяющий вам узнать, какие возможности доступны для вас. Однако он имеет плохую интеграцию Visual Studio, заставляя вас создавать все шаги пользовательской сборки, необходимые для вызова компилятора и копирования вывода в нужное место.

  • SharpKit: этот коммерческий продукт стремится обеспечить поддержку большинства функций языка С# 4.0. Это вообще преуспевает, и есть достойный шанс, что этот продукт удовлетворит ваши потребности. Это легкие (небольшие .JS файлы), поддерживает современные возможности языка С# (generics, LINQ и т.д.) И, как правило, надежны. Он также имеет большое количество привязок для сторонних библиотек Javascript. Тем не менее, есть удивительное количество краевых случаев, с которыми вы всегда столкнетесь, которые не поддерживаются.

    Например, система типов неглубока и не поддерживает представление дженериков или массивов (т.е. typeof(Foo[]) == typeof(Bar[]), typeof(List<string>) == typeof(List<int>)). Поддержка рефлексии ограничена, причем различные типы членов не могут поддерживать атрибуты. Поддержка дерева выражений не существует, а реализация доходности неэффективна (без конечного автомата). Кроме того, пользовательский mscorlib недоступен, а script файлы С# и обычные файлы С# перемежаются в ваших проектах, заставляя вас украшать каждый файл script атрибутом [JsType], чтобы отличить их от обычно скомпилированных классы.

Ответ 4

У нас есть SharpKit в течение двух лет, и я должен сказать, что он улучшил способ написания кода. Профи, как я их вижу:

  • Код гораздо более структурирован - теперь мы можем развивать инфраструктуру так же, как мы делали на С# без "ударов наших головок" с прототипом.
  • Рефакторинг очень редок
  • Мы можем использовать фрагменты кода, которые приводят к повышению производительности и меньшему времени разработки.
  • Вы можете контролировать способ рендеринга JS (у вас есть несколько режимов на выбор).
  • Мы можем отлаживать наш код С# в браузере (в настоящее время поддерживается только в Chrome, но все же: → )
  • Отличная поддержка! Если вы отправите им запрос, вы получите ответ очень быстро.
  • Поддержка большого количества библиотек и легко расширяемых

Против:

  • Документация немного бедна, однако, как только вы ее повесите, вы повысите свою эффективность.