Co jest maszynopis i dlaczego miałbym go używać zamiast JavaScript?

głosy
1k

Czy możesz opisać językiem maszynopis jest?

Co można zrobić, że JavaScript lub dostępne biblioteki nie może zrobić, że da mi powód, żeby go wziąć pod uwagę?

Utwórz 02/10/2012 o 17:37
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
979

I pierwotnie napisał tę odpowiedź kiedy Maszynopis był jeszcze gorący-off-the-prasy. Pięć lat później, to jest OK, przegląd, ale spojrzeć na odpowiedź Lodewijk za poniżej dla bardziej szczegółowo

1000ft widok ...

Maszynopis jest rozszerzeniem JavaScript, która przede wszystkim zapewnia opcjonalne statyczne typowanie, klas i interfejsów. Jedną z największych korzyści jest umożliwienie IDE, aby zapewnić bogatsze środowisko dla plamienia typowych błędów podczas wpisywania kodu .

Aby zorientować się, o co mi chodzi, oglądać wprowadzający wideo Microsoftu na języku.

Dla dużego projektu JavaScript, przyjmując maszynopis może skutkować bardziej stabilne oprogramowanie, a jednocześnie jest rozmieszczenia w których regularne stosowanie JavaScript będzie działać.

Jest open source, ale można dostać tylko sprytny Intellisense podczas pisania jeśli używasz obsługiwanego IDE. Początkowo był to tylko Visual Studio Microsoftu (także zauważyć w poście z Miguel de Icaza ). Te dni, inne oferują wsparcie IDE maszynopis zbyt .

Czy istnieją inne technologie, takie jak to?

Jest coffeescript , ale to naprawdę służy innemu celowi. IMHO, coffeescript zapewnia czytelność dla człowieka, ale także głęboki maszynopis zapewnia czytelność dla narzędzi poprzez swoją opcjonalnego typowania statycznego (zobacz tę ostatnią blogu coś więcej krytyki). Jest też Dart ale to jest pełne zastąpienie dla JavaScript (choć może produkować kodu JavaScript )

Przykład

Jako przykład, oto niektóre maszynopis (można grać z tym w maszynopisie Playground )

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

A oto JavaScript byłoby produkować

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

Zauważ, że maszynopis definiuje typ zmiennych składowych i parametrów metody klasy. To jest usuwany podczas tłumaczenia do JavaScriptu, ale używany przez IDE i kompilator do wykrycia błędów, jak przepuszczenie typ liczbowy do konstruktora.

Jest również możliwość wnioskowania typów, które nie są wyraźnie zadeklarowane, na przykład, byłoby określić greet()metoda zwraca łańcuch.

debugowanie Typescript

Wiele przeglądarek i IDE oferują bezpośrednie wsparcie debugowania poprzez sourcemaps. Zobacz to pytanie przepełnieniem stosu więcej szczegółów: debugowanie kodu maszynopis z Visual Studio

Chcieć wiedzieć więcej?

I pierwotnie napisał tę odpowiedź kiedy Maszynopis był jeszcze gorący-off-the-prasy. Sprawdź odpowiedź Lodewijk za to pytanie dla niektórych bardziej aktualnej szczegółach.

Odpowiedział 02/10/2012 o 17:41
źródło użytkownik

głosy
674

Choć przyjął odpowiedź jest w porządku, czułem, że naprawdę nie robi maszynopis sprawiedliwości w tym momencie. To nie jest już wczesne dni. Maszynopis jest znalezienie dużo więcej przyjęcie teraz z kilkoma popularnymi ramy jest napisane na maszynie. Powody, dla których warto wybrać maszynopis zamiast JavaScriptu są teraz wiele.

Relacja do JavaScript

JavaScript jest standaryzowany przez standardy ECMAScript. Nie wszystkie przeglądarki wspierające korzystanie z wszystkich funkcji nowszych standardów ECMAScript (zobacz tę tabelę ). Maszynopis obsługuje nowe standardy ECMAScript i zestawia je do celów (starszy) ECMAScript swojego wyboru (obecne cele są 3, 5 i 6 [aka 2015]). Oznacza to, że można użyć funkcji ES2015 i poza nią, jak moduły, funkcje lambda, klas, operator spread, rozpad, dzisiaj. Dodaje również typ wsparcia oczywiście, który nie jest częścią żadnego standardu ECMAScript i może prawdopodobnie nigdy nie będzie ze względu na charakter interpretowane zamiast skompilowany charakteru JavaScript. System typ maszynopis jest stosunkowo bogata i obejmuje: interfejsy, teksty stałe, typy generyczne, hybrydowe, typy związków i skrzyżowania, modyfikatory dostępu i wiele innych. Oficjalna strona maszynopisu zawiera przegląd tych cech.

Stosunek do innych języków kierowania JavaScript

Maszynopis posiada unikalną filozofię w porównaniu do innych języków, które skompilować JavaScript. Kod JavaScript jest poprawny kod maszynopis; Maszynopis jest rozszerzeniem JavaScript. Można niemal zmieniać nazwy .jsplików do .tsplików i rozpocząć korzystanie maszynopis. Pliki maszynopis są kompilowane do czytelny JavaScript, tak że migracja do tyłu jest możliwa i zrozumienia skompilowany maszynopis nie jest trudno w ogóle. W ten sposób maszynopis opiera się na sukcesach JavaScript, poprawiając jednocześnie na jego słabości.

Z jednej strony, masz dowód przyszłych narzędzi, które mają nowoczesne standardy ECMAScript i skompilować go do starszych wersji JavaScript z Babel jest najbardziej popularna. Z drugiej strony, trzeba języki, które mogą całkowicie różnią się od JavaScriptu, które kierują JavaScript, jak coffeescript, Clojure, Dart, wiąz, Haxe, ScalaJs, i całe mnóstwo innych (patrz tę listę ). Języki te, choć mogą one być wyższe niż gdzie Javascript w przyszłości może kiedyś doprowadzić uruchomić większe ryzyko nie znalezienia wystarczającej przyjęcie dla ich futures być zagwarantowane. Można również mieć więcej problemów ze znalezieniem doświadczonych programistów do niektórych z tych języków, choć te znajdą Państwo często może być bardziej entuzjastycznie. Współdziałanie z JavaScript może być również nieco bardziej zaangażowane, ponieważ są one usuwane z co dalej JavaScript w rzeczywistości.

Maszynopis siedzi między tymi dwoma skrajnościami, równoważąc w ten sposób ryzyko. Maszynopis nie jest ryzykowny wybór przez żadnego standardu. Zajmuje bardzo niewiele wysiłku, aby przyzwyczaić się, jeśli jesteś zaznajomiony z JavaScript, ponieważ nie jest zupełnie inny język, ma doskonałą obsługę JavaScript interoperacyjności i widział wiele przyjęciu niedawno.

Opcjonalnie statyczne typowanie i rodzaj wnioskowania

JavaScript jest dynamicznie wpisane. Oznacza to, JavaScript nie wie, jakiego typu jest zmienna, dopóki nie zostanie faktycznie wystąpienia w czasie wykonywania. Oznacza to również, że może to być zbyt późno. Maszynopis dodaje typu wsparcie dla JavaScript. Błędy, które są spowodowane przez fałszywych założeń jakiejś zmiennej bytu pewnego typu mogą być całkowicie wyeliminowane, jeśli grasz swoje karty w prawo; jak ścisłe wpisać kod lub po wpisaniu kodu w ogóle jest do ciebie.

Maszynopis sprawia, że pisanie nieco łatwiejsze i dużo mniej wyraźny przez użycie typu wnioskowania. Na przykład: var x = "hello"w maszynie jest taki sam jak var x : string = "hello". Typ jest po prostu wywnioskować z jego użytkowania. Nawet to nie jawnie wpisać typy, nadal są tam, aby cię ocalić od robienia czegoś, co w przeciwnym razie prowadziłoby do błędu w czasie.

Maszynopis jest ewentualnie wpisany domyślnie. Na przykład function divideByTwo(x) { return x / 2 }jest ważna funkcja w maszynie, która może być wywołana z dowolnego rodzaju parametru, choć nazywając go sznurkiem będą oczywiście skutkować wykonawczego błędu. Tak jak są używane w JavaScript. To działa, ponieważ gdy nie została jednoznacznie przypisany typ i rodzaj nie można wywnioskować, jak w przykładzie divideByTwo, maszynopis będzie pośrednio przypisać typ any. Oznacza to podpis wpisać funkcję divideByTwo automatycznie staje function divideByTwo(x : any) : any. Jest flag kompilatora, aby nie pozwolić na to zachowanie: --noImplicitAny. Włączenie tej flagi daje większy stopień bezpieczeństwa, ale oznacza również trzeba będzie zrobić więcej pisać.

Rodzaje mają koszty związane z nimi. Przede wszystkim jest krzywa uczenia się, a po drugie, oczywiście, będzie to kosztować trochę więcej czasu utworzenia codebase za pomocą właściwego wpisywania zbyt ścisłe. Z mojego doświadczenia wynika, że koszty te są całkowicie warto na każdego poważnego kodzie dzielisz się z innymi. Dużym badaniu Skala języków programowania i Kodeksu Jakości w Github sugeruje, że „statycznie wpisywanych języków w ogóle są mniej podatne niż wada dynamicznych typów, a silny wpisywanie jest lepsza od słabego typowania w tym samym zakresie”.

Interesujące jest to, aby pamiętać, że tego samego papieru stwierdzi, że maszynopis jest mniej podatny na błędy następnie JavaScript:

Dla tych z współczynnikami dodatnimi możemy spodziewać się, że język jest związany z, ceteris paribus, większą liczbę poprawek wady. Języki te obejmują C, C ++, JavaScript , Objective-C, PHP i Python. Języki Clojure, Haskell, Ruby, Scala i maszynopis , wszystkie mają współczynniki ujemne co oznacza, że języki te są mniej prawdopodobne niż średnia doprowadzić do mocowania wada zobowiązuje.

Ulepszone wsparcie IDE

Doświadczenia z rozwoju maszynopis jest wielki postęp w stosunku JavaScript. IDE jest informowany w czasie rzeczywistym przez kompilator maszynopis na swojej bogatej informacji typu. To daje kilka ważnych zalet. Na przykład, w maszynie można bezpiecznie robić refaktoryzacji jak zmienia nazwę na terenie całego kodzie. Poprzez uzupełnianie kodu można uzyskać pomoc na cokolwiek inline funkcjonuje biblioteka może zaoferować. Nie trzeba je zapamiętać lub wyszukać je w odnośnikach internetowych. Błędy kompilacji są zgłaszane bezpośrednio w IDE z czerwoną linią falowane, gdy jesteś zajęty kodowania. W sumie pozwala na znaczny przyrost wydajności w porównaniu do pracy z JavaScript. Można poświęcić więcej czasu kodowania mniej czasu debugowanie.

Istnieje szeroka gama IDE, które mają doskonałą obsługę maszynopis, jak Visual Studio i VS kodu, atom, Sublime, a IntelliJ / WebStorm.

Rygorystyczne kontrole zerowe

Błędy czasu wykonania formularza cannot read property 'x' of undefinedlub undefined is not a functionsą bardzo często spowodowane przez błędy w kodzie JavaScript. Out of the box maszynopis już zmniejsza prawdopodobieństwo tego rodzaju błędy występujące, ponieważ nie można użyć zmiennej, która nie jest znany kompilator maszynopisu (z wyjątkiem właściwości anywpisywanych zmiennych). Jest jeszcze możliwość choć błędnie wykorzystują zmienną, która jest ustawiony undefined. Jednak wraz z wersją 2.0 maszynopis można wyeliminować te rodzaje błędów razem dzięki wykorzystaniu non-pustych typów. Działa to w następujący sposób:

Z ścisłe kontrole zerowe włączona ( --strictNullChecksflag kompilatora) kompilator maszynopis nie pozwoli undefined, aby być przypisana do zmiennej, chyba że wyraźnie oświadczyć, że jest od wartości pustych typu. Na przykład, let x : number = undefinedspowoduje błąd kompilacji. To doskonale pasuje do teorii typów, ponieważ undefinednie jest liczbą. Można określić xjako rodzaj suma numberi undefinedpoprawić w ten sposób: let x : number | undefined = undefined.

Gdy typ jest znany jako pustych, co oznacza, że jest to typ, który może być również wartości nulllub undefinedkompilator maszynopis można określić poprzez analizę typu na podstawie przepływu sterowania, czy Twój kod można bezpiecznie użyć zmiennej lub nie. Innymi słowy, kiedy sprawdzić zmienną jest undefinedpoprzez na przykład ifdeklaracja kompilator maszynopis będzie wywnioskować, że typ w tej gałęzi przepływ sterowania kodzie nie jest już pustych i dlatego mogą być bezpiecznie stosowane. Oto prosty przykład:

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.

Podczas budowy 2016 konferencyjnej współpracy projektanta maszynopis Anders Hejlsberg dał szczegółowe wyjaśnienie i demonstrację tej funkcji: wideo (od 44:30 do 56:30).

Kompilacja

Aby korzystać maszynopis trzeba procesu kompilacji do kompilacji kodu JavaScript. Proces kompilacji zwykle trwa tylko kilka sekund, w zależności oczywiście od wielkości projektu. Kompilator maszynopis obsługuje przyrostowe kompilacji ( --watchflag kompilatora), tak, że wszystkie późniejsze zmiany mogą być skompilowane przy większej prędkości.

Kompilator maszynopis może inline źródło informacji mapa w generowanych plikach .js lub utworzyć oddzielne pliki .map. Źródło informacji mapa może być używana przez narzędzia debugowania Podobnie jak DevTools chrom i inne IDE odnosić linie w JavaScripcie do tych, które wygenerowały je w maszynopisie. To sprawia, że możliwe, aby ustawić punkty przerwania i sprawdzić zmienne w czasie wykonywania bezpośrednio na kodzie maszynopis. Informacje źródłowe mapa działa całkiem dobrze, to było około długo przed maszynopis, ale debugowanie maszynopis generalnie nie jest tak wielka, jak przy użyciu JavaScript bezpośrednio. Weźmy thissłowo kluczowe np. Z powodu zmienionych semantyki thissłowa kluczowego wokół zamknięć od ES2015, thismoże rzeczywiście istnieje w czasie wykonywania jako zmiennej o nazwie _this(zobacz tę odpowiedź ). To może mylić się podczas debugowania, ale ogólnie nie jest problemem, jeśli wiesz o tym czy sprawdzać kod JavaScript. Należy zauważyć, że Babel cierpi dokładnie ten sam rodzaj problemu.

Istnieje kilka innych sztuczek kompilator maszynopis może zrobić, jak generowanie kodu na podstawie przechwytując dekoratorów , generowanie kodu modułu ładowania dla różnych systemów modułowych i analizowania JSX . Jednakże, będzie prawdopodobnie wymagać narzędzia kompilacji oprócz kompilatora maszynopis. Na przykład, jeśli chcesz skompresować kod trzeba będzie dodać inne narzędzia do procesu kompilacji, aby to zrobić.

Istnieje maszynopis kompilacji wtyczki dostępne dla WebPACK , Gulp , Grunt i prawie każdym innym narzędziem budowania JavaScript tam. Dokumentacja maszynopis posiada sekcję na integrację z narzędziami budowania pokrywających je wszystkie. Linter dostępny jest również w przypadku chcesz jeszcze czas budowy sprawdzanie. Istnieje również duża liczba projektów z nasion, które obecnie nie będzie Ci rozpoczął maszynopis w połączeniu z wieloma innymi technologiami jak kątowa 2, React, Ember, SystemJs, WebPack, Gulp, etc.

interoperacyjność JavaScript

Od maszynopis jest tak ściśle związana z JavaScriptu ma wielkie możliwości interoperacyjności, ale niektóre dodatkowa praca jest wymagane do pracy z bibliotekami JavaScript w maszynopisie. Maszynopis definicje są potrzebne tak, że kompilator maszynopis rozumie, że funkcja zwraca jak _.groupBylub angular.copyczy $.fadeOutnie są w rzeczywistości nielegalnych wypowiedzi. Definicje te funkcje są umieszczone w .d.tsplikach.

Najprostszą formą definicji może jest umożliwienie identyfikator do wykorzystania w dowolny sposób. Na przykład, podczas korzystania Lodash , plik definicji pojedyncza linia declare var _ : anypozwoli Ci wywołać dowolną funkcję, którą chcesz na _, ale to oczywiście jesteś także nadal zdolny do popełniania błędów: _.foobar()byłby prawny wezwanie maszynopis, ale jest oczywiście nielegalne połączenia W czasie wykonywania. Jeśli chcesz odpowiedni rodzaj wsparcia i uzupełniania kodu plik definicji musi być bardziej dokładna (patrz lodash definicje dla przykładu).

Moduły NPM , które przychodzą fabrycznie zapakowane z własnymi definicjami typu są automatycznie rozumiane przez kompilator maszynopis (patrz dokumentacja ). Dla prawie każdego innego pół-popularnej biblioteki JavaScript, który nie zawiera własnej definicji ktoś tam ma już definicji typu nie jest dostępna za pośrednictwem innego modułu npm. Moduły te są poprzedzone „typów @ /” i pochodzą z repozytorium GitHub zwanego DefinitelyTyped .

Jest jedno zastrzeżenie: definicje typu musi być zgodna z wersją biblioteki używanego w czasie wykonywania. Jeśli tego nie zrobią, maszynopis może zabronić Ci z wywołaniem funkcji lub dereferencing zmienną, która istnieje lub pozwalają wywołać funkcję lub nieprawidłowego zmiennej, która nie istnieje, po prostu dlatego, typy się nie zgadzają okresie czasu w czasie kompilacji , Więc upewnij się załadować odpowiednią wersję definicji typu dla prawego wersją biblioteki używasz.

Szczerze mówiąc, istnieje niewielkie kłopotów do tego i może to być jeden z powodów nie wybierzesz maszynopis, ale zamiast pójść na coś takiego Babel, który nie cierpi z konieczności uzyskania definicje typów w ogóle. Z drugiej strony, jeśli wiesz, co robisz, można łatwo przezwyciężyć wszelkiego rodzaju problemów spowodowanych przez niewłaściwe lub ich brakuje plików definicji.

Konwersja z JavaScript do maszynopis

Dowolny .jsplik może zostać zmieniona na .tsi prowadził przez kompilator maszynopis dostać składniowo tego samego kodu JavaScript jako wyjście (jeśli był poprawny składniowo w pierwszej kolejności). Nawet wtedy, gdy kompilator maszynopis wystąpią błędy kompilacji będzie nadal produkować .jspliku. Można nawet przyjąć .jspliki jako dane wejściowe z --allowJsflagą. Pozwala to na początek maszynopis razu. Niestety błędy kompilacji są prawdopodobne na początku. One nie muszą pamiętać, że nie są one pokazać jak zatrzymanie błędów może być wykorzystywany do innych kompilatorów.

Błędy kompilacji jeden dostaje na początku przy konwersji projektu JavaScript projektu maszynopis są nieuniknione z natury jest maszynopis. Maszynopis sprawdza cały kod dla ważności i dlatego musi wiedzieć o wszystkich funkcjach i zmiennych, które są używane. Zatem definicje typów muszą znajdować się w miejscu dla nich wszystkich błędów inaczej kompilacji są zobowiązane do wystąpienia. Jak wspomniano w powyższym rozdziale, na prawie każdym ramach JavaScript istnieją .d.tspliki, które mogą być łatwo uzyskane z instalacją pakietów DefinitelyTyped . To może być jednak, że użyłeś niejasnych bibliotekę, dla których nie są dostępne żadne definicje maszynopis lub że już polyfilled jakieś prymitywy JavaScript. W takim przypadku należy podać definicje typów dla tych bitów w celu błędów kompilacji do znikają. Wystarczy utworzyć .d.tsplik i włączyć go do tsconfig.json na filestablicy, tak, że jest zawsze uważany przez kompilator maszynopis. W niej oświadczyć, że te bity maszynopis nie wie o co typu any. Po wyeliminować wszystkie błędy można stopniowo wprowadzać wpisywanie do tych części w zależności od potrzeb.

Konieczne będą także niektóre prace na (re) Konfigurowanie gromadzeniu rurociągu dostać maszynopis do budowy rurociągu. Jak wspomniano w rozdziale dotyczącym kompilacji istnieje wiele dobrych zasobów tam i zachęcam was do poszukiwania projektów nasiennych, które korzystają z kombinacji narzędzi, które mają pracować z.

Największą przeszkodą jest krzywa uczenia się. Zachęcam do zabawy z małym projekcie w pierwszej kolejności. Zobacz, jak to działa, jak to buduje, które pliki używa, jak jest skonfigurowany, jak funkcjonuje ona w swoim IDE, jak to jest zbudowane, jakie narzędzia wykorzystywane, itp Konwersja dużą codebase JavaScript, żeby maszynopis jest bardzo wykonalne, kiedy wiedzieć, co robisz, ale może to być frustrujące, kiedy nie masz.

Przyjęcie

Maszynopis jest open source (Apache 2 licencjonowany zobacz GitHub ) i wspierany przez Microsoft. Anders Hejlsberg , główny architekt C # jest pionierem projektu. To bardzo aktywny projekt; Zespół maszynopis został uwalniając wiele nowych funkcji, w ciągu ostatnich kilku lat i wiele wspaniałych te są nadal planowane przyjść (patrz plan ).

W 2017 roku badania StackOverflow deweloper maszynopis był najpopularniejszym transpiler JavaScript (9. miejsce w klasyfikacji generalnej) i zajął trzecie miejsce w kategorii najbardziej kochał języka programowania.

Odpowiedział 27/01/2016 o 21:23
źródło użytkownik

głosy
49

Maszynopis robi coś podobnego do tego, co robi mniej lub Sass dla CSS. Są super zestawy go, co oznacza, że ​​każdy kod JS piszesz jest poprawny kod maszynopis. Plus można korzystać z innych bajerów, że dodaje się do języka, a transpiled kod będzie ważny js. Można nawet ustawić wersję JS, który chcesz swój kod na wynikowy.

Obecnie maszynopis jest super zestaw ES2015, więc może być dobrym wyborem, aby rozpocząć naukę nowego js funkcje i transpile do niezbędnego standardu dla swojego projektu.

Odpowiedział 11/02/2016 o 20:32
źródło użytkownik

głosy
29

Maszynopis Fundamentals ” - Program Pluralsight wideo Oczywiście przez Dan Wahlin i John Papa jest naprawdę dobry, obecnie (25 marca 2016) aktualizowane w celu odzwierciedlenia maszynopis 1.8, wprowadzenie do maszynopis.

Dla mnie naprawdę dobrych cech, obok ładne możliwości intellisense, są klasy , interfejsy , moduły , łatwość wdrożenia AMD, a także możliwość korzystania z programu Visual Studio maszynopisu debuggera gdy wywołany z IE.

Podsumowując : Jeżeli używane zgodnie z przeznaczeniem, maszynopis może programowanie JavaScript bardziej niezawodne i łatwiejsze. To może zwiększyć produktywność programisty JavaScript znacząco na całej SDLC.

Odpowiedział 27/12/2015 o 04:18
źródło użytkownik

głosy
7

ECMA script 5 (ES5), które wszyscy wsparcie przeglądarki i prekompilowana. ES6 / ES2015 i ES / 2016 przyszedł w tym roku z dużą ilością zmian tak pop-up do tych zmian jest coś w między którymi powinny dba o tak maszynopis. • maszynopis jest Rodzaje -> oznacza, że ​​musimy określić typ danych poszczególnych właściwości i metod. Jeśli znasz C # następnie Maszynopis jest łatwe do zrozumienia. • Duża zaletą jest to typ maszynopis tożsamość kwestie związane wcześnie przed pójściem do produkcji. Pozwala to testy jednostkowe na niepowodzenie, jeżeli istnieje jakikolwiek rodzaj niezgodności.

Odpowiedział 06/06/2016 o 12:14
źródło użytkownik

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