TypeScript ve Dart arasındaki farklar [kapalı]


85

Microsoft yakın zamanda yeni bir JavaScript benzeri programlama dili olan Typescript'i açıkladı. Bir süre önce, Google tarafından Javascript ile ilgili performans, ölçeklenebilirlik gibi sorunları çözmek için yaratılan yeni bir programlama dili olan Dart'ı duydum.

Her iki yeni dilin amacı da aynı gözüküyor .. Sizce ne düşünüyorsunuz?

Dillerin amaçları aynı mıdır?

Onlarla ilgili gerçek farklar nelerdir?


Yanıtlar:


60

Bob Nystrom'den alıntı :

JS semantiklerini seviyorsanız veya yatırım yaptığınız büyük bir JS kod tabanına sahipseniz TypeScript hoş görünüyor, ancak ölçekte bakım sorunlarınız var. Başarıya giden yol, JS ile geriye dönük uyumlu (çoğunlukla?) Olduğundan çok daha yumuşak.

Dart daha riskli bir bahis alıyor. JS’den çok daha uzak, bence, çoğunlukla günlük bir Dart programcısı olarak iyi, ancak giriş engelini daha da arttırıyor. Ancak bu daha yüksek giriş engeli karşılığında:

  • Ağaç sallayarak
  • Alıcılar ve ayarlayıcılar (TypeScript sonunda bunları alacağını sanıyorum)
  • Operatör aşırı yükleme
  • Gerçek blok kapsamı, kaldırma, IIFE s yok
  • Yerel bir VM
  • Aklı başında eşitlik semantiği
  • Garip örtülü dönüşüm çılgınlığı yok
  • Lexically this her yere bağlı
  • Katmalar
  • Açıklamalar
  • Bir ithalat sistemi
  • Kullanıcı tanımlı abonelik operatörleri
  • Jenerik, reification ile
  • Aynalar
  • Daha iyi toplama sınıfları
  • Daha temiz bir DOM API

Ayrıca, http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd de yazıyor :

Google'ın Dart ekibindeyim, bu yüzden doğal olarak bu açıdan / önyargılı bir şekilde arıyorum. İşte dikkatimi çeken, çoğunlukla Dart'la karşılaştıran rastgele şeyler. Sadece birkaç dakikayı kaymatarak geçirdim, o yüzden bunların hiçbirini ciddiye alma ...

Jenerik yok

Bazı türlerin hiçbir türden daha iyi olmadığını tahmin ediyorum, ancak bunları kaybetmek gerçekten zor. TypeScript yerleşik dizi türlerine sahiptir ve nesne türleri "map" türü kullanım durumlarının bazılarını kapsar. Ancak kendi genel türlerinizi tanımlayamamak bir sürüklemedir. Dokümanlar eklendiğinde, jeneriklerin "silme hafif JS için derleme" tarzı olduğunu umduğum gibi beklediğim türden silme türünü kullanarak çalışacaklarını söylüyorlar, ancak bu bir acı olabilir. Bazen çalışma zamanında tür argümanlarınızla bir şeyler yapabilmek güzeldir.

Tüm türler null

Dart aynı şekilde. Her iki durumda da beni üzüyor.

Ek açıklama sözdizimi türü güzel

İsteğe bağlı tür ek açıklamaları olan hemen hemen her dil (ML, Scala, F #, Kotlin, vb.) "A'dan sonra postfix ile birlikte gelir: Dart, bazı kötü köşe davalarına neden olan C tarzı tip ek açıklamaları kullanmaya çalışır. özellikle işlev türleri için sözdizimi:

function takeCallback(callback : (n : number) => number)
{ ... }

Arayüzler yapısal olarak yazılmıştır, sınıflar nominal olarak yazılmıştır

JavaScript olduğu göz önüne alındığında mantıklı, ama oldukça temiz görünüyor. Bir arayüzü dolaylı olarak uygulayabilmek güzel. Ancak TypeScript diğer tarafa gitmenize izin vermiyor gibi görünüyor: bir sınıf verildiğinde, marka şeyler nedeniyle somut bir şekilde genişletmeden kendisiyle uyumlu yeni bir tür yapamazsınız. Dart'da, gizli arayüzler sayesinde yapabilirsiniz.

En iyi ortak tür başarısız olabilir

Bu, bunun bir tür hatası olduğu anlamına gelir:

[1, true]

Arabirimlerde parametre imzası ile aşırı yükleyebilirsiniz

Bu gerçekten harika, çünkü size bazı dinamik tip değişimi yapan bir fonksiyon çağrısında daha hassas tipte bir çıkarım akışı sağlıyor. Örneğin:

interface Doubler {
  double(s : string) : string;
  double(n : number) : number;
}

Bununla, derleyici iki katına bir çağrı gördüğünde, çıkarılan argüman türünü temel alarak size doğru bir dönüş türü verebilir. Emin değilim, aslında bu arayüzü uygulayan ve tip denetleyicisini mutlu eden bir sınıfın nasıl uygulanacağıdır. Aslında somut yöntemleri aşırı yükleyemezsiniz ve beş dakikalık dinamik tip kontrolüyle mutlu etme girişimim işe yaramadı.

Dizi türleri için özel bir sözdizimi var

Hiçbir jenerik olmadığı için mantıklı. Aynı zamanda hoş ve özlü, ki bu iyi, ama ben şahsen genel amaçlı jenerikleri bir defalık özel durum koleksiyonlarında tercih ederim.

Örtülü bir yayın yok

Dart'ın daha alışılmadık tip sistem özelliklerinden biri, atama uyumluluğunun çift yönlü olmasıdır: Uyarı vermeden yayın yapabilirsiniz. Herhangi bir / başkalarına atama tipik özel durum dışında (diğer dillerde dinamik), TypeScript buna izin vermez. Assert yazmalısın. Şahsen, ben burada TypeScript'in yaklaşımını seviyorum.

Ok fonksiyonları ve bu sözlük

Bu sadece annelik ve elmalı turta. Bunu sevdim. (Dart da buna sahiptir ve bu her zaman sözcüksel olarak bağlıdır.)

Genel olarak, oldukça temiz görünüyor. Eğer tam olarak aynı JS anlambilimine sahip olmak istiyorsanız (iyi ve kötü) ama aynı zamanda bir çeşit saçılma istiyorsanız, TypeScript iyi görünüyor. Closure Compiler gibi fakat daha iyi bir sözdizimine sahip.

JS'nin sözdiziminden ve anlambiliminden daha agresif bir adım uzaklaşan bir şey istiyorsanız, TypeScript öyle değil gibi görünüyor.


17
Ağaç sallamak nedir?
citykid

4
Ağaç sallanması hakkında daha fazla bilgi için: blog.sethladd.com/2013/01/…
Seth Ladd

19
"Dart araçları, kullanılmayan kodu" sallama "yöntemi olan ağaç sallamayı destekler, böylece konuşlandırılmış uygulamanın boyutunu küçültür. Uygulamama yararlı iyilikle dolu zengin kütüphaneleri içe aktarabilirim, ancak gerçekten kullandığım işlevleri ekleyeceğim oluşturulan çıktıda. " thx
citykid

3
Önizleme durumunda, Typescript yarın gönderilecek profesyonel projelerde kullanım için mükemmel bir formda. Dil ve Araçlar ciddi bir sorun olmadan, hatta neredeyse hiç sorun olmadan çalışır.
citykid

4
@JustAnotherUserYouMayKnowOrNot belirtildiği gibi, daktilo versiyonunda 0.9 arasında jenerik ilave blogs.msdn.com/b/typescript/archive/2013/06/18/...
Jon MaBe

60

Soru, "Dillerin amaçları aynı mı ?" .

Her iki proje de bunu göz önünde bulundurmaya çalışıyor

  • programlama dili (TypeScript küçük ama çok temiz bir adım atıyor, Dart hala hareket halindeki daha devrimci hareketi yapıyor)

  • Mevcut js kodu ile birlikte çalışabilirlik (2 VM birbiriyle konuştuğundan, Dart'da karmaşık olan js için derlenen TypeScript'te 0 geçiş)

  • yazılım mühendisliği uygulamaları (sadece Dart, web bileşenleri ve shadow dom)

Son 3 gün içerisinde Dart'a ve daha sonra TypeScript'e daldım. CoffeeScript kod tabanım, 2000'li yılların kod satırına gitti, çok güzel ama kabarık CoffeeScript ile işlenemeyecek kadar fazla. Karşılaştığım problemler CoffeeScript'in orta ila büyük ölçekli programlama için tasarlanan dillerin sahip olmadığı özellikler: arayüzler, modüller, tür güvenliği. Ancak kahve ve js ile ilgili çok daha ciddi bir sorun vardı: js "bu gösterici" garipliği aklımı başımdan aldı ve CoffeeScript burada hiçbir şeye yardımcı olmuyor.

İşte 3 günlük değerlendirme ve kullanımdan sonra sonuçlarım:

Dart oyunu

Öğretici ile iyice gittim, 1 kitap okudum, 2 kitap okudum ve gösterileri denedi. Ben , geleceği Dart düşündük . Sonra da uygulamamı Dart'a taşımaya çalıştım . Bu benim coşkumdu 100'den 10'a düştü. İşte nedeni:

  1. Dart Editör Dart programlamak için tek yoldur. Sublime Text için eklentiler mevcut olsa da, intellisense, kod tamamlama gibi özellikler sunmazlar (yanılıyorsam düzelt). Dart editörü ancak alfa kalitesinde. CSS dosyasını düzenlediğinizde web sayfasını güncelleme gibi süpercool sihirlerini desteklerken (! Gerçekten harika) dakikada birkaç kez kilitleniyor veya çöküyor. Böylece 5 harf yazarsınız ve 2 kere yazarken 2 saniye veya 15 saniye beklemeniz gerekir. Ve bazı kod satırları olan bir projem vardı, bu yüzden 1000'lerin satırları varken ne olacağını beklemek istemedim. Hata ayıklamaDart Editör ile ilk bakışta bildiğim tüm js hata ayıklama araçlarından daha iyi (krom benim seçimim), ama hala çok fazla şey var: Hemen pencere yok (js şu anda çok daha iyi hata ayıklama yapıyor), saat yok.

  2. Politika ve Kaçış Olanakları : Bazıları Apple, MS ve Firefox'un asla Dart VM sağlamayacağını söylüyor. Pek emin değilim, ama en azından Apple için bu şu anda çok kesin görünüyor. Diğerleri için bunun tam tersi daha olasıdır. Yani sorun değil, Dart'ı JavaScript'e dönüştürebiliriz. Bu entegrasyonun çalışma şekli gerçekten harika, Dart, js kodunu Dart Editöre bağlı tutan bir js saplamasını koruyor, bu yüzden print()yine de Dart Editör'de serin bir ifade var. Ama işte geliyor ama: bu dönüştürülen kodun ayak izi yüksek. 150kB ya da öylesine (küçültmeden önce). Tam boyuta çok fazla kazmadım, bu yüzden beni buna batırma.

  3. Dil Olgunluğu . Dart Editor'ın yüzüme dakikada 3 kez çarpmasıyla ilgili çok ciddi sorunların yanı sıra, bulduğunuz Dart koduyla ilgili her kaynağın farklı bir Dart kullandığını da kabul edilemez buldum. Dil her gün değişir. 5 hafta öncesinden bir yazı buldun mu? Modası geçmiş. Google eğitiminden örnekleri denediniz mi? Bir API değiştiğinden en az 1 örnek derlenmiyor. DOM öğesine bir etkinlik eklemek gibi sıradan şeyler bile iyi durumda .

  4. Mevcut js kütüphaneleriyle entegrasyon biraz dahil. 2 VM'nin burada iletişim kurması gerekiyor, zor.

Sonuç olarak, Dart'ı bugünden itibaren ciddi bir şekilde kullanamazsınız ve 1 ve 3'ten dolayı içine dalmak çok eğlenceli değildir. Her iki nokta da zamanla hayal kırıklığına uğrayacaktır. 2 puan hakkında, Google birkaç gün önce derlenmiş j'lerinin elle yazılmış js'den daha iyi olduğunu gösteren performans ölçütlerini yayınladı. İltifatlarım, iyi iş çıkardınız. Belirtildiği gibi ayak izi sorunu nedeniyle yükleme süresi hala geride olabilir. Ancak, footprint kodu birçok site tarafından kullanıldığında, önbellekte saklanabilir ve işten çıkarılabilir.

Bu yüzden: Dart'ı harika bir proje olarak görüyorum, şu anda kullanılması öngörülemeyen risklerin iyi bir bölümünü taşıyor ve bu yıl istikrarlı bir seviyeye gelmesi gerekiyor.

daktilo ile yazılmış yazı

TypeScript'i değerlendirmek çok kolaydır, 1 veya 2 saat sürer ve siz her şeyi bilirsiniz. Okuma dil spesifikasyon dokümanı ve kısa kitap (typescript ortaya) ortaya, ben her şeyi biliyordu ve programlama başladı. TypeScript'in JavaScript'e eklemelerinin müşteri programlamamı geliştirmek için ihtiyaç duyduğum her ciddi ihtiyacı doldurduğuna şaşırdım . İşte olayları:

  1. Arabirimler . Kapsülleme ve arayüzler kodumu kolayca yapılandırmama izin veriyor. Mükemmel!

  2. Sınıf Devleti. . TypeScript, bir sınıfın örneklerinin açıkça taşıdığı veya onu zorlamasının daha iyi olduğu durumunu ifade etmenizi sağlar. Bu, js veya kahve ile karşılaştırıldığında daha iyi bir adımdır.

  3. thisçılgınlığı hafifletti . Ok işlevlerinin içinde, TypeScript thisnormalde davranan herhangi bir vatandaş gibi göstericiyi yapar .

  4. Editör, Intellisense . TypeScript, C # programlanırken Visual Studio'dan kullanıldığı gibi mikro veya milisaniye aralığında tepki veren% 100 en iyi mükemmel intellisense ile birlikte gelir. Tüm önemli js kütüphaneleri için TypeScript başlıkları da var . Harika harika harika

  5. Deneyim ve Risk . TypeScript kullanarak sıfır risk taşır, dil açıkça tanımlanmıştır, tamamen stabildir, sadece js ile şekerdir, öngörülemeyen bir şey değildir.

Aslında, bu geliştirmeler bana ihtiyacım olan her şeyi veriyor. Gelecekte görmek istediğim tek şey genel koleksiyonlar. Ama bu fıstık.

Peki ya performans? Kendimi bir performans düşkünlüğü olarak görmeme rağmen, burada teknoloji tercihini performansa göre yapacak bir proje olduğuna inanmıyorum. Her ikisi de js liga'da.

Web programlamanın geleceği ile ilgileniyorsanız, her ikisi de büyük çabalar, TypeScript şimdi daha pratik ve kullanışlı, Dart, olgun editörler ve hata ayıklayıcılar ve proje kapsamındaki projelerin kapsamına girdikten sonra kullanılabilecek çok ilginç bir laboratuar projesi. siyasete bağlı olacak.

Her halükarda 3 değerlendirme günü çoğunlukla eğlenceliydi ve çok şey öğrendim, eğer zamanı bulursanız Dart'ın 1 günü, TypeScript'in de kendi fikrini yapması 2 saat sürüyor. Dene.

Ekim 2014 Güncellemesi

Bir süre oldu ve eskiden sonrası, Typcript'in gitmek için güvenli ve istikrarlı bir yol olduğu kabul edildi. Typescript, Dart ve Closure hakkında (çok) belirgin bir ifade buldum:

Bir süredir web programlamada büyük zorluklarla ilgilenmekteyim. Google Closure'un şu anda hala büyük ölçekli JavaScript / Web geliştirme için en iyi seçenek olduğuna, ancak sonuçta daha az ayrıntılı bir şeyle değiştirileceğine inanıyorum. Dart önemli bir söz vermesine rağmen, ürettiği JavaScript boyutundan hala korkuyorum. Karşılaştırma yaparak, TypeScript doğrudan Closure Compiler'ın gelişmiş modunu kullanarak derlenebilecek JavaScript'e çevrilebilirse, ayrıntılı bir şekilde kapatılmadan Closure'dan optimize edilmiş JavaScript'in tüm avantajlarından yararlanabiliriz. Üstelik, TypeScript bir JavaScript'in üstünlüğü olduğundan, sözdizimi uzantılarının bir noktada ECMAScript standardına getirme şansına sahip olduğuna inanıyorum,

http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

Michael Bolin uzun bir süredir (eski) google (eski) fb ön uç kahramandır, aynı zamanda google kapanışı ile de ilgilidir (Kapatma hakkında kitabını alın).

Google Traceur

Google’ın bugün ECMA Script 6’yı yaşamaya değer vermesi Traceur projesi: https://github.com/google/traceur-compiler

Typescript ile karşılaştırıldığında, takım desteği muhtemelen bugünden çok geride. Ancak, tersine, yinelemeciler veya anlama gibi aşırı güzel js dili geliştirmelerini kabul etmek çok daha hızlı.

Facebook Akışı, Google AtScript

TypeScript ile benzer özellikler sağlar.

Microsoft’un Jonathan Turner’ı şöyle açıklıyor: “Farklı JavaScript tipi denetleme çözümleri ile nelerin ve bununla ilgili ne yapılması gerektiği merak edilebilir.

TypeScript ekibi, JavaScript yazarak topluluğu tarafından zaten oluşturulmuş olan kaynakların bu araçlarda kullanılabilmesini sağlamak için hem Flow hem de AtScript ekipleriyle birlikte çalışır. Bu projelerin birbirlerinden öğrenebilecekleri çok şey var ve birlikte çalışmayı ve JavaScript topluluğu için yapabileceğimiz en iyi araçları oluşturmayı dört gözle bekliyoruz. Uzun vadede, bu araçların en iyi özelliklerini JavaScript'in standardı olan ECMAScript'e katlamaya da çalışacağız. "

fb akışında infoq makalesi


Google Dart'ı kendi projelerinin çoğunda (uygun olan yerlerde) kullanmaya başlayana kadar beklerdim - köpek mamasını yemeye başka bir deyişle. Ayrıca Dart, yalnızca XAML kısmı olmayan, sadece bir dil, ancak JS / HTML ile daha iyi entegre olan Silverlight gibi ses çıkarır.
Den

1
Evet, Dart laboratuvarda gelecekte izleyebileceğimiz ve bekleyebileceğimiz bir şeydir, daha da Typcript artık profesyonel gelişim için hazır. Typescript'i Dart ile karşılaştırmak, elmaları portakal fideleriyle karşılaştırmaktır.
citykid

7
Bu çok anlayışlı bir cevaptı. Yazdığın için teşekkürler.
Darshan Sawardekar

2
typecript'e nasıl "sabit" geldiğine dair hiçbir fikrim yok this, çünkü thissınıf özelliklerine erişmek için yöntemler içinde bildirilen geri çağırma işlevlerini yöntemin bağlamıyla ilişkilendirmeniz gerekir. Bu bir şeyi nasıl düzeltiyor?
nurettin

1
geçerli nokta iken bağlama hala bazen gereklidir, bu takma ad olduğu ok fonksiyonları iç nedenle, sorun en azından hafifletilir.
citykid

17

Scott Hanselman'dan alıntı:

İnsanlar TypeScript'i Dart ile karşılaştırdılar. Bu, elmaları karbüratörlerle karşılaştırıyor. TypeScript JavaScript'i oluşturur, böylece JS birlikte çalışma sorunu olmaz. Dart sıfırdan yazılmış yerel bir sanal makinedir. Dart, JavaScript ile etkileşime giriyor ... ama bu JS değil. Örneğin JavaScript sayı türünü bile kullanmıyor.

Gönderen Neden typescript şey cevabı var mı?


8
Gerçekten biraz kafam karıştı. TypeScript de gerçekten JS değil, değil mi? var x = {}; x.foo = 5; //Doesn't work in typescriptve var e = window.event ? window.event : e; //Doesn't work in typescriptYukarıdaki örnek, TypeScript derleyicisini alamaz. Bir şey mi eksik? JavaScript'imi "bırakamıyorum" ve istediğim zaman türleri kullanamıyorum. Yeni sözdizimi öğrenmem ve her şeyi türleriyle yapılandırmam gerekiyor.
aikeru

@aikeru Hmmm, haklısın. JS'nin büyüklüğünün bir kısmını ortadan kaldırıyor gibi görünüyor. Bu yeni aracı kullanacaktım, ama şimdi ikinci düşüncelerim var.
Chev

3
Aynı fikirde olmamak, anlaşamamak. Elmaları armutlarla, karbüratörlerle yakıt enjeksiyonunu karşılaştırmak gibi. Bu ikisi hakkında doğal olarak birçok insanın aynı anda düşünmelerini sağlayan birçok şey var.
hippietrail

Kayıt için, bu işleri var x = {}; x['foo'] = 5;ve bunuda yapar var y:any = {}; y.foo = 5;, ama bu konuda haklısın bulmak biraz şaşırdı - algılanan tip {}olduğu {}ziyade any. Bir tür çıkarım sorunu olabilir. Sorunu buraya gönderdim - nasıl tepki verdiklerini göreceğiz.
mindplay.dk

3

Son zamanlarda kendi bulgumla bu tartışmaya katılmalıydım.

1: TypeScript

MS, TS ve JS'ye kolayca girip çıkabilmeniz için hoş bir yaklaşım benimsemiştir. Gelişimimiz için çoğunlukla AngularJS kullanıyoruz ve Angular'ı TypeScript'e dönüştürmek için çok fazla belge bulunmadığını tespit ettik. TypeScript'i Dev iş akışımıza dahil etmek güzel bir ek oldu.

2: Dart

Dart Google için ironik bir adım biraz. Belki de activeX'i ve etrafındaki kabusları hatırlamıyorlar, korkunç bir IE 5 ya da IE 6'dan başka bir şeyle çalışan bir uygulamayı çalıştırmaya çalışıyorlar. MS'in o günlerden itibaren iyileşmesi uzun yıllar aldı.

“Kavramsal” bir dil olarak Dart, bazı güzel OOP özelliklerini birleştirmeye çalışıyor gibi görünüyor. Ek açıklamalar vb Javascript için güzel bir düşüncedir.

Sorun, yeni bir düzenleyici, yeni bir dil, tarayıcılar arasında yeni vm'ler, diğer IDE'ler için eklentiler, javascript'e dönüştürmek için derleyici (çok sayıda meg boyutu olmadan), dönüştürmek veya yeni dart kütüphaneleri oluşturmak için yeterli bant genişliğini hayal etmek zor Binlerce mevcut js kütüphanesini değiştir, birisinin polimerler veya direktifler konusunda karar vermesini sağla, dartlang sitesini dart kullanmaya dönüştür, başımın üstünden düşünebildiğim şey bu.

Dart'i şu anda önemsiz bir uygulamadan başka bir şeyde kullanmaya çalışmak çok korkutucu.

Tüm bunların üstünde ES6 çok uzakta değil. ES6, Dart'ın ES5'te var olanı düzeltmeye çalıştığı birçok özellik sunar. ES6 sokaklara çarptığında değer teklifi ne olacak? En azından şu anda, ES6 çıktıktan sonra TypeScript'te yapmanız gereken tek değişiklik, belki de hedeflemek için farklı bir derleme seçmektir.

Sadece profesyonel bir MS kişisi olduğumu düşünmemek için. MS bazı makul ürünler üretmekte ve OSS topluluğundaki geçmişteki hataları düzeltmek için büyük adımlar atmıştır. Ben hala nadiren MS den TypeScript dışında bir şey kullanıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.