Что такое машинопись и почему бы его использовать вместо JavaScript?

голоса
1k

Можете ли вы описать, что язык машинописи есть?

Что это может сделать JavaScript или доступные библиотеки не могут сделать, что бы дать мне основания считать это?

Задан 02/10/2012 в 17:37
источник пользователем
На других языках...                            


5 ответов

голоса
979

Изначально я писал этот ответ , когда Машинопись была еще горячей вне-прессы. Пять лет спустя, это обзор ОК, но посмотрите на ответ Lodewijk в поле ниже для более глубокого

вид 1000ft ...

Машинописи является подмножеством JavaScript , который в первую очередь обеспечивает дополнительные статические набора текста, классы и интерфейсы. Одно из самых больших преимуществ является то, чтобы позволить Иде , чтобы обеспечить более богатую среду для обнаружения наиболее распространенных ошибок при вводе коды .

Для того, чтобы получить представление о том , что я имею в виду, смотреть вступительное видео от Microsoft на языке.

Для большого проекта JavaScript, принимая машинопись может привести к более надежным программным, в то же время развертываемых, где регулярное применение JavaScript будет работать.

Он является открытым исходным кодом, но вы получите только умный Intellisense , как вы наберете , если вы используете поддерживаемый IDE. Первоначально это был только Microsoft Visual Studio (также отметил в блоге от Мигель де Икаса ). В эти дни, другие Иды предлагают поддержку машинописи тоже .

Существуют ли другие технологии, как это?

Там в CoffeeScript , но это действительно служит другой цели. ИМХО, CoffeeScript обеспечивает читаемость для человека, но машинопись также обеспечивает глубокую читаемость для инструментов через ее необязательную статическую типизацию (см этого недавний пост в блоге на немного больше критики). Там же Дарт , но это полный на замену для JavaScript (хотя это может создавать код JavaScript )

пример

В качестве примера, вот некоторые машинопись (вы можете играть с этим в машинописном Playground )

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}  

И вот JavaScript он будет производить

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();

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

Он также способен выводя типы , которые явно не объявлены, например, было бы определить greet()метод возвращает строку.

Отладка Машинопись

Многие браузеры и Иды предлагают прямую поддержку отладки через sourcemaps. Смотрите этот вопрос переполнения стека для получения более подробной информации: Отладка кода машинопись с Visual Studio

Хотите узнать больше?

Изначально я писал этот ответ , когда Машинопись была еще горячей вне-прессы. Проверьте ответ Lodewijk по этому вопросу в течение некоторой более текущей детали.

Ответил 02/10/2012 в 17:41
источник пользователем

голоса
674

Хотя принятый ответ хорошо, я чувствовал, что это на самом деле не делает машинопись справедливости в этой точке. Это не первые дни больше. Машинопись находит намного больше принятия теперь несколько популярных структур записываются в машинописи. Причины, почему вы должны выбрать машинопись вместо JavaScript сейчас много.

Отношение к JavaScript

JavaScript стандартизирован по стандартам ECMAScript. Не все браузеры в поддержке использовать все возможности новых стандартов ECMAScript (см этой таблицы ). Машинопись поддерживает новые стандарты ECMAScript и компилирует их (старше) ECMAScript цели по вашему выбору (текущие цели являются 3, 5 и 6 [ака 2015]). Это означает , что вы можете использовать функции ES2015 и выше, как модули, лямбда - функции, классы, оператор спреда, деструктуризации, сегодня. Он также добавляет поддержку типа, конечно, что не является частью какого - либо стандарта ECMAScript и не может , вероятно , никогда не будет из - за интерпретируемые природы вместо скомпилированного природы JavaScript. Система тип машинописи относительно богат и включает в себя: интерфейсы, перечислений, гибридные типы, дженерики, объединение и пересечение типов, модификаторы доступа и многое другое. Официальный сайт машинописного текста дает обзор этих возможностей.

Отношение к другим JavaScript, ориентированных языков

Машинопись имеет уникальную философию по сравнению с другими языками , которые компилируются в JavaScript. JavaScript код действительный код машинопись; Машинопись является подмножеством JavaScript. Вы можете почти переименовывать .jsфайлы в .tsфайлы и начать использовать машинопись. Машинопись файлы компилируются в читаемой JavaScript, так что миграция обратно можно и понять скомпилированную машинопись не трудно. Таким образом , машинопись основывается на успехах JavaScript, улучшая на его слабые стороны.

С одной стороны, у вас есть будущие инструменты доказательства , которые имеют современные стандарты ECMAScript и компилировать его вниз к более старым версиям JavaScript с Бабель является наиболее популярной. С другой стороны, у вас есть языки , которые могут полностью отличаться от JavaScript , которые нацелены на JavaScript, как CoffeeScript, Clojure, Dart, Elm Haxe, ScalaJs, и целый ряд более (см этот список). Эти языки, хотя они могли бы быть лучше, чем там, где будущее в JavaScript может когда-нибудь привести, запустить больший риск не находя достаточно для принятия их будущее должно быть гарантировано. Вы также можете иметь больше проблем с поиском опытных разработчиков для некоторых из этих языков, хотя те, которые вы найдете часто с большим энтузиазмом. Interop с JavaScript также может быть немного сложнее, так как они дальше удалены от того, что JavaScript на самом деле.

Машинопись находится между этими двумя крайностями, тем самым уравновешивая риск. Машинопись не является рискованным выбором по любым стандартам. Она занимает очень мало усилий, чтобы привыкнуть к тому, если вы знакомы с JavaScript, так как это не совсем другой язык, имеет отличную поддержку JavaScript совместимости и видел много принятия в последнее время.

Опционально статическая типизация и вывод типов

JavaScript динамически типизированный. Это означает, что JavaScript не знает, какой тип переменной является до тех пор, пока не будет на самом деле экземпляр во время выполнения. Это также означает, что это может быть слишком поздно. Машинопись добавляет тип поддержку JavaScript. Ошибки, вызванные ложными предположениями некоторых переменных существ определенного типа могут быть полностью ликвидированы, если вы играете свои карты; насколько строги вы набираете код или если вы набираете код на всех до вас.

Машинопись делает набор немного проще и гораздо менее откровенными использованием логического вывода типа. Например: var x = "hello"в машинописи такое же , как var x : string = "hello". Тип просто вытекает из его использования. Даже вы явно не вводить типы, они все еще там , чтобы спасти вас от делать то , что в противном случае приведет к ошибке времени выполнения.

Машинопись необязательно набирается по умолчанию. Например function divideByTwo(x) { return x / 2 }действительная функция машинописи , которая может быть вызвана с любым видом параметра, даже если называть его со строкой, очевидно , приведет к выполнению ошибки. Так же , как вы привыкли в JavaScript. Это работает, потому что , когда тип не был явно назначен и тип не может быть выведен, как в примере divideByTwo, машинопись неявно присвоить тип any. Это означает , что тип подпись функции divideByTwo автоматически становится function divideByTwo(x : any) : any. Существует флаг компилятора , чтобы запретить это поведение: --noImplicitAny. Включение этого флага дает большую степень безопасности, но также означает , что вам придется делать больше печатать.

Типы имеют расходы , связанные с ними. В первую очередь есть кривая обучения, а во - вторых, конечно, это будет стоить вам немного больше времени , чтобы создать в кодовую с помощью соответствующего строгой типизации тоже. По моему опыту, эти затраты полностью стоит на каком - либо серьезном кодовом вы делитесь с другими. Широкомасштабное исследование языков программирования и качество коды в Github предполагает , что «что статический типизированные языки в целом менее склонен дефект , чем динамические типов, и строгая типизация лучше , чем слабая типизация в том же отношении».

Интересно отметить, что этот же документ считает, что машинопись менее подвержены ошибкам, то JavaScript:

Для тех , с положительными коэффициентами , мы можем ожидать , что язык связан с, при прочих равных условиях, большее число дефектных исправлений. Эти языки включают C, C ++, JavaScript , Objective-C, PHP и Python. Языки Clojure, Haskell, Ruby Scala, и машинопись , все имеют отрицательные коэффициенты подразумевая , что эти языки являются менее вероятно , чем в среднем , чтобы привести к фиксации дефектов совершает.

Улучшенная поддержка IDE

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

Существует широкий спектр Иды, которые имеют отличную поддержку машинопись, как Visual Studio и VS кода, Atom, Sublime и IntelliJ / WebStorm.

Строгие нулевые чеки

Ошибки времени выполнения вида cannot read property 'x' of undefinedили undefined is not a functionочень часто вызваны ошибками в коде JavaScript. Из коробки машинописи уже уменьшает вероятность этих видов ошибок происходит, так как нельзя использовать переменную , которая не известно, машинописи компилятором (за исключением свойств anyтипизированных переменных). Это все еще возможно , хотя ошибочно использовать переменную , которая устанавливается в undefined. Тем не менее, с версией 2.0 машинопись вы можете устранить эти виды ошибок все вместе за счет использования ненулевых типов. Это работает следующим образом :

С строгими проверками нуля включена ( --strictNullChecksфлаг компилятора) машинопись компилятор не позволит , undefinedчтобы быть присвоен переменным , если явно не объявлять ее обнуляемый типа. Например, let x : number = undefinedприведет к ошибке компиляции. Это прекрасно согласуется с теорией типов, так как undefinedэто не число. Можно определить x, что тип суммы numberи undefinedисправить это: let x : number | undefined = undefined.

После того, как тип , как известно, обнуляемым, то есть он относится к типу , который также может быть значения nullили undefined, машинописи компилятор может определить с помощью анализа типа на основе потока управления или не ваш код может безопасно использовать переменную или нет. Другими словами , когда вы проверяете переменная undefinedчерез например, ifоператор машинописи компилятор будет считать , что тип в той ветви потока управления вашего кода не больше обнуляемым и поэтому можно безопасно использовать. Вот простой пример:

let x: number | undefined;
if (x !== undefined) x += 1; // this line will compile, because x is checked.
x += 1; // this line will fail compilation, because x might be undefined.

Во время сборки конференции 2016 года совместно дизайнера машинопись Хейлсберг дал подробное объяснение и демонстрацию этой функции: видео (с 44:30 до 56:30).

компиляция

Для того, чтобы использовать машинопись вам нужен процесс сборки для компиляции кода на JavaScript. Процесс сборки обычно занимает всего несколько секунд , в зависимости, конечно , от размера вашего проекта. Машинописи компилятор поддерживает инкрементную компиляцию ( --watchфлаг компилятора), так что все последующие изменения могут быть скомпилированы с большей скоростью.

Машинописи компилятор может встраивать информацию источника карты в сгенерированных .js файлы или создавать отдельные файлы .map. Источник на карте информация может быть использована отладочных утилит , таких как Chrome DevTools и другие IDE, чтобы связать строки в JavaScript , чтобы те , которые произвели их в машинописи. Это делает возможным для вас , чтобы установить контрольные точки и проверять переменные во время выполнения непосредственно на коде машинописи. Исходная информация карты работает довольно хорошо, это было задолго до машинописи, но отладка машинопись , как правило , не столь велика , как при использовании JavaScript непосредственно. Возьмите thisключевое слово, например. В связи с изменившейся семантикой thisключевого слова вокруг закрытия с момента ES2015, thisможет на самом деле существует во время выполнения , как переменный с именем _this(см этого ответа). Это может запутать вас во время отладки, но в целом это не проблема, если вы знаете об этом или проверить код JavaScript. Следует отметить, что Бабель страдает точно такой же вид вопроса.

Есть несколько других трюков машинописи компилятор может сделать, как генерировать код перехвата на основе декораторов , модуль генерации кода загрузки для различных модульных систем и анализа JSX . Тем не менее, вы, вероятно , потребуется инструмент сборки , кроме машинописного компилятора. Например , если вы хотите сжать ваш код , вам придется добавить другие инструменты в процессе сборки , чтобы сделать это.

Есть машинопись плагины компиляции доступна для WebPack , Глотка , Грунта и в значительной степени любого другого инструмента JavaScript сборки там. Документация Машинописи имеет раздел интеграции с строительными инструментами , охватывающими все. ЛИНТЕР также доступен в случае , если вы хотели бы еще больше строить время проверки. Есть также большое количество семян проектов, которые там будут , чтобы вы начали с машинопись в сочетании с кучей других технологий , таких как угловые 2, React, Ember, SystemJs, WebPack, Глоток, и т.д.

JavaScript совместимости

Поскольку машинопись так тесно связана с JavaScript имеет большие возможности взаимодействия, но некоторые дополнительные работы , необходимые для работы с библиотеками JavaScript в машинописи. Определения машинописи необходимы , так что машинописи компилятор понимает , что вызовы функции , как _.groupByили angular.copyили $.fadeOutфактически не являются незаконным заявлением. Определения этих функций помещаются в .d.tsфайлы.

Простейшие определение может принять это позволить идентификатор будет использоваться в любом случае. Например, при использовании Lodash , файл определение одной строки declare var _ : anyпозволит вызвать любую функцию , которую вы хотите на _, но тогда, конечно , вы также все еще в состоянии сделать ошибки: _.foobar()было бы законное вызов машинописи, но, конечно , незаконный призыв во время выполнения. Если вам нужна поддержка надлежащего типа и автозавершения кода файл определение должно быть более точным (см lodash определения для примера).

Модули НПЕ , которые приходят расфасованным с их собственными определениями типа автоматически поняты машинописью компилятором (см документации ). Для почти любой другой-популярной библиотеки JavaScript , который не включает в свой кого - то определений там уже сделаны определения типа , доступные через другой модуль НПМ. Эти модули с префиксом «@ типов /» и происходят из хранилища Github под названием DefinitelyTyped .

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

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

Преобразование из JavaScript в машинописном

Любой .jsфайл может быть переименован к .tsи побежал через машинопись компилятор , чтобы получить синтаксический тот же код JavaScript в качестве выходного сигнала (если он был синтаксический правильно , в первую очередь). Даже когда машинопись компилятор получает ошибку компиляции он все равно будет производить .jsфайл. Он даже может принимать .jsфайлы в качестве входных данных с --allowJsфлагом. Это позволяет начать с машинописью сразу. К сожалению , ошибка компиляции , которые могут произойти в самом начале. Вовсе нужно помнить , что они не показывают замирать ошибки , как вы можете использовать для других компиляторов.

Ошибки компиляции один получает в начале при преобразовании проекта JavaScript в проект машинописи неизбежны по своей природе машинописи в. Машинопись проверяет весь код действия и , таким образом , он должен знать обо всех функциях и переменных, которые используются. Таким образом , определения типов должны быть на месте для всех из них в противном случае компиляции ошибки неизбежны. Как уже упоминалось в главе выше, почти любой структуры JavaScript есть .d.tsфайлы , которые могут быть легко приобретены с установкой пакетов DefinitelyTyped, Это , однако, может быть , что вы использовали какую - то неясную библиотеку , для которых нет определений машинописи не доступны или что вы polyfilled некоторых примитивов JavaScript. В этом случае вы должны поставить определения типа для этих бит для того , чтобы ошибки компиляции в пропадают. Просто создайте .d.tsфайл и включить его в tsconfig.json в filesмассиве, так что она всегда рассматривается машинописи компилятором. В нем объявить те биты , которые машинопись не знает о качестве типа any. После того, как вы устранили все ошибки , вы можете постепенно вводить ввод тех частей в соответствии с вашими потребностями.

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

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

Принятие

Машинопись является открытым исходным кодом (Apache 2 лицензии, см GitHub ) и при поддержке Microsoft. Хейлсберг , ведущий архитектор C # является инициатором проекта. Это очень активный проект; команда машинописи выпускала много новых функции , в последние несколько лет , и много великих все еще планируется ввести (см дорожной карты ).

В 2017 году обследования StackOverflow разработчик машинопись был самым популярным JavaScript transpiler (девятое место в общем зачете) и занял третье место в самой любимой категории языка программирования.

Ответил 27/01/2016 в 21:23
источник пользователем

голоса
49

Машинопись делает что-то подобное тому, что делает меньше или дерзость для CSS. Они супер наборы, которое означает, что каждый код JS писать валидный код машинописи. Кроме того, вы можете использовать другие лакомства, которые он добавляет к языку, и transpiled код будет действителен в JS. Вы даже можете установить версию JS, что вы хотите, чтобы ваш полученный код на.

В настоящее время машинопись супер набор ES2015, поэтому может быть хорошим выбором, чтобы начать изучать новые JS функции и transpile до необходимого стандарта для вашего проекта.

Ответил 11/02/2016 в 20:32
источник пользователем

голоса
29

« Машинопись Основа » - это Pluralsight видео-курс по Dan Wahlin и Джону Папе действительно хорошо, в настоящее время (25 марта 2016) обновляется с учетом машинописи 1.8, введение в машинопись.

Для меня действительно хороших черт, рядом с хорошими возможностями для IntelliSense, являются классы , интерфейсы , модулей , простота реализации AMD, а также возможность использовать визуальный отладчик студии машинописи при вызове с IE.

Резюмируя : При использовании по назначению, Машинопись может сделать программирование JavaScript более надежным, и проще. Это может увеличить производительность программиста JavaScript значительно более полной SDLC.

Ответил 27/12/2015 в 04:18
источник пользователем

голоса
7

Ecma сценарий 5 (ES5), который все поддерживают браузер и прекомпилирована. ES6 / ES2015 и ES / 2016 пришли в этом году с большим количеством изменений так выскакивают эти изменения есть что-то, между которыми должны принимать заботы о так машинописи. • Машинопись это типы -> означает, что мы должны определить тип данных каждого свойства и методы. Если вы знаете, C #, то Машинопись легко понять. • Большим преимуществом Машинопись является мы Тип личности связаны проблемы на ранней стадии, прежде чем в производство. Это позволяет юнит-тесты, чтобы потерпеть неудачу, если есть какое-либо несоответствие типов.

Ответил 06/06/2016 в 12:14
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more