Perbedaan antara TypeScript dan Dart [ditutup]

85

Microsoft baru-baru ini meluncurkan Typecript, bahasa pemrograman baru yang mirip dengan JavaScript. Beberapa waktu lalu, saya mendengar tentang Dart, bahasa pemrograman baru yang dibuat oleh Google untuk menyelesaikan masalah yang berkaitan dengan Javascript seperti kinerja, skalabilitas, dll.

Tujuan dari kedua bahasa baru itu tampak sama bagi saya .. Bagaimana menurut Anda?

Apakah tujuan bahasanya sama?

Apa perbedaan nyata tentang mereka?

margabit
sumber
lihat diskusi di sini: programmers.stackexchange.com/questions/166978/…
diadiora

Jawaban:

60

Mengutip Bob Nystrom :

TypeScript tampak bagus jika Anda menyukai JS semantik atau memiliki basis kode JS besar yang Anda investasikan, tetapi Anda mengalami masalah pemeliharaan pada skala. Jalan menuju sukses jauh lebih mulus karena (sebagian besar?) Kompatibel dengan JS.

Dart mengambil taruhan yang berisiko. Lebih jauh dari JS dalam banyak cara yang, saya pikir, sebagian besar baik sebagai programmer Dart sehari-hari, tetapi itu membuat penghalang masuk lebih tinggi. Namun sebagai imbalan untuk penghalang masuk yang lebih tinggi, Anda mendapatkan:

  • Pohon bergetar
  • Getters dan setters (meskipun saya kira TypeScript akan mendapatkannya nantinya)
  • Kelebihan operator
  • Lingkup blok nyata, tidak ada mengangkat, tidak ada IIFE s
  • VM asli
  • Semantik kesetaraan waras
  • Tidak ada kegilaan konversi implisit yang aneh
  • Diikat secara leksa ke this mana-mana
  • Mixin
  • Anotasi
  • Sistem impor
  • Operator subskrip yang ditentukan pengguna
  • Generik, dengan reifikasi
  • Cermin
  • Kelas koleksi yang lebih baik
  • API DOM yang lebih bersih

Juga, ia menulis di http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd :

Saya di tim Dart Google, jadi saya secara alami melihatnya dari sudut / bias. Inilah beberapa hal acak yang menarik perhatian saya, sebagian besar membandingkannya dengan Dart. Saya hanya menghabiskan beberapa menit membaca sekilas, jadi jangan menganggap semua ini terlalu serius ...

Tidak ada obat generik

Saya kira beberapa jenis lebih baik daripada tidak sama sekali, tetapi sangat sulit untuk kehilangan itu. TypeScript memang memiliki tipe array bawaan dan tipe objek mencakup beberapa case use type "map". Tetapi tidak bisa mendefinisikan tipe generik Anda sendiri adalah hambatan. Dokumen mengatakan ketika ditambahkan, obat generik akan bekerja menggunakan tipe erasure, yang saya harapkan mengingat gaya "kompilasi ke JS ringan", tetapi itu juga bisa menyebalkan. Sangat menyenangkan bisa melakukan hal-hal dengan argumen tipe Anda saat runtime.

Semua jenis dapat dibatalkan

Dart juga sama. Membuatku sedih dalam kedua kasus itu.

Sintaks anotasi jenisnya bagus

Hampir setiap bahasa dengan anotasi jenis opsional (ML, Scala, F #, Kotlin, dll.) Disertai dengan "postfix setelah a:. Dart mencoba menggunakan anotasi tipe-C yang menyebabkan beberapa kasus sudut yang tidak tepat. Saya suka apa yang dimiliki TypeScript di sini, terutama sintaks untuk tipe fungsi:

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

Antarmuka diketik secara struktural, kelas diketik secara nominal

Masuk akal mengingat itu JavaScript, tetapi tampaknya cukup rapi. Mampu mengimplementasikan antarmuka secara implisit bagus. Tapi TypeScript tampaknya tidak membiarkan Anda pergi dengan cara lain: diberikan kelas, Anda tidak dapat membuat tipe baru yang kompatibel dengannya tanpa secara konkret memperluasnya karena hal-hal merek. Di Dart, berkat antarmuka implisit, Anda bisa.

Jenis umum terbaik bisa gagal

Itu berarti ini adalah kesalahan tipe:

[1, true]

Anda dapat membebani antarmuka dengan tanda tangan parameter

Ini sangat keren karena memberi Anda cara memiliki aliran inferensi tipe yang lebih tepat melalui pemanggilan fungsi yang melakukan beberapa pergantian tipe dinamis. Sebagai contoh:

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

Dengan ini, ketika kompilator melihat panggilan berlipat ganda, ia dapat dengan benar memberi Anda tipe pengembalian yang tepat berdasarkan pada tipe argumen yang disimpulkan. Apa yang saya tidak yakin adalah bagaimana sebenarnya mengimplementasikan kelas yang mengimplementasikan antarmuka itu dan membuat pemeriksa tipe senang. Anda tidak dapat benar-benar membebani metode konkret, dan upaya lima menit saya untuk membuatnya bahagia dengan pengecekan tipe dinamis sepertinya tidak berhasil.

Ada sintaks khusus untuk tipe array

Masuk akal karena tidak ada obat generik. Ini juga bagus dan singkat, yang bagus, tapi saya pribadi lebih suka obat generik untuk keperluan umum daripada koleksi kasus khusus satu kali.

Tidak ada downcasting tersirat

Salah satu fitur sistem tipe Dart yang tidak biasa adalah bahwa kompatibilitas penugasan adalah dua arah: Anda dapat tertunduk tanpa peringatan. Selain dari kasus khusus penugasan ke / dari apa pun (dinamis dalam bahasa lain), TypeScript tidak mengizinkan itu. Anda harus mengetikkan menegaskan. Secara pribadi, saya suka pendekatan TypeScript di sini.

Fungsi panah dan leksikal ini

Ini hanya ibu dan pai apel. Saya suka itu. (Dart memiliki ini juga, dan ini selalu terikat secara leksikal.)

Secara keseluruhan, tampilannya cukup apik. Jika Anda ingin JS semantik yang sama (baik dan buruk) tetapi juga ingin beberapa jenis, TypeScript tampaknya layak. Ini seperti Closure Compiler tetapi dengan sintaks yang lebih baik.

Jika Anda menginginkan sesuatu yang lebih agresif dari sintaks dan semantik JS, sepertinya TypeScript bukan itu.

Seth Ladd
sumber
17
Apa itu pohon yang bergetar?
citykid
4
Untuk informasi lebih lanjut tentang pengocokan pohon: blog.sethladd.com/2013/01/…
Seth Ladd
19
"Alat Dart mendukung pengocokan pohon, suatu teknik untuk" menghilangkan "kode yang tidak digunakan, sehingga mengecilkan ukuran aplikasi yang digunakan. Saya dapat mengimpor perpustakaan kaya yang penuh dengan kebaikan yang berguna ke dalam aplikasi saya, tetapi hanya fungsi yang benar-benar saya gunakan yang akan dimasukkan. dalam output yang saya hasilkan. " thx
citykid
3
Saat dalam kondisi pratinjau, Typecript dalam kondisi sempurna untuk digunakan dalam proyek profesional yang dikirimkan besok. Bahasa dan Alat berfungsi tanpa masalah serius, atau bahkan hampir tidak ada masalah sama sekali.
citykid
4
Seperti yang dicatat oleh @JustAnotherUserYouMayKnowOrNot, TypeScript menambahkan obat generik di 0,9 blogs.msdn.com/b/typescript/archive/2013/06/18/…
Jon Mabe
60

Sementara pertanyaannya adalah "Apakah tujuan bahasa sama?", Pertanyaan sebenarnya adalah: "Bagaimana kita bisa membuat pemrograman web lebih baik dari tempat kita sekarang?" .

Kedua proyek mencoba melakukan pertimbangan ini

  • bahasa pemrograman (TypeScript membuat langkah kecil tapi sangat bersih, Dart membuat langkah yang lebih revolusioner yang masih bergerak)

  • interoperabilitas dengan kode js yang ada (0 transisi dalam TypeScript yang mengkompilasi ke js, rumit di Dart, karena 2 VM berbicara satu sama lain)

  • praktik rekayasa perangkat lunak (khusus Dart, komponen web, dan bayangan)

Selama 3 hari terakhir saya menyelam jauh ke dalam Dart dan kemudian ke TypeScript. Basis kode CoffeeScript saya pergi ke 2000-an baris kode, terlalu banyak untuk ditangani dengan CoffeeScript indah tapi terlalu lembut. Masalah yang saya hadapi adalah bahwa CoffeeScript tidak memiliki fitur yang dirancang bahasa untuk pemrograman skala menengah hingga besar: antarmuka, modul, jenis keamanan. Tapi ada satu masalah yang jauh lebih serius dengan kopi dan js: Keanehan "pointer" ini mempengaruhi kewarasan saya dan CoffeeScript tidak membantu apa pun di sini.

Jadi di sini hasil saya setelah 3 hari evaluasi dan penggunaan:

Anak panah

Pergi melalui tutorial, membaca 1 buku, membaca buku ke-2 dan mencoba demo. Saya pikir, Dart itu adalah masa depan . Lalu saya mencoba memigrasi aplikasi saya ke Dart. Itulah saat antusiasme saya turun dari 100 menjadi 10. Inilah sebabnya:

  1. The Dart Editor adalah satu-satunya cara untuk program Dart. Sementara plugin untuk Sublime Text ada, mereka tidak menyediakan fitur seperti intellisense, penyelesaian kode (koreksi saya jika saya salah). Namun demikian, Dart Editor dalam kualitas pra alpha. Meskipun itu mendukung hal-hal ajaib supercool seperti memperbarui halaman web ketika Anda mengedit file CSS (! Sangat keren) itu hang atau crash beberapa kali dalam satu menit. Jadi Anda mengetik 5 huruf dan 2 kali Anda harus menunggu 2 detik atau 15 detik antara mengetik. Dan saya punya proyek dengan beberapa baris kode, jadi tidak ingin menunggu apa yang terjadi ketika 1000s baris masuk. Pindah file dari satu folder ke yang lain di dalam Dart Editor, crash. Debuggingdengan Dart Editor pada pandangan pertama lebih baik daripada semua alat debugging js yang saya tahu (chrome adalah pilihan saya), tetapi masih ada terlalu banyak hal yang hilang: Tidak ada jendela langsung (ini membuat js debugging jauh lebih baik saat ini), tidak ada jam tangan.

  2. Kemungkinan Politik dan Pelarian : Ada yang mengatakan bahwa Apple, MS dan Firefox tidak akan pernah menyediakan Dart VMs. Yah, saya tidak begitu yakin, tetapi setidaknya untuk Apple ini muncul saat ini sangat pasti. Untuk yang lain lebih mungkin daripada sebaliknya. Jadi tidak masalah, kami dapat mengonversi Dart ke JavaScript. Cara kerja integrasi ini benar-benar hebat, Dart mempertahankan js stub yang membuat kode js terhubung ke Dart Editor, jadi print()pernyataan masih muncul di Dart Editor, keren. Tapi inilah, tetapi: jejak kode yang dikonversi tersebut tinggi. 150kB atau lebih (sebelum minifikasi). Saya tidak menggali terlalu banyak ke ukuran yang tepat, jadi jangan memaku saya pada ini.

  3. Kematangan Bahasa . Selain masalah yang terlalu serius dengan Dart Editor muncul di wajah saya 3 kali per menit, saya juga merasa tidak dapat diterima bahwa setiap sumber tentang kode Dart yang Anda temukan menggunakan Dart yang berbeda. Bahasa berubah setiap hari. Anda menemukan pos dari 5 minggu yang lalu? Itu sudah usang. Anda mencoba sampel dari tutorial Google? Setidaknya 1 sampel tidak dikompilasi sejak API berubah. Bahkan hal-hal biasa, seperti menempelkan acara ke elemen DOM berada dalam langkah yang baik .

  4. Integrasi dengan perpustakaan js yang ada agak sedikit terlibat. 2 VM perlu berkomunikasi di sini, ini rumit.

Sebagai kesimpulan, Anda tidak dapat secara serius menggunakan Dart pada hari ini, dan menyelam ke dalamnya tidak terlalu menyenangkan karena 1 dan 3. Kedua poin akan mengecewakan seiring waktu. Tentang poin 2, Google menerbitkan tolok ukur kinerja beberapa hari yang lalu yang menunjukkan bahwa js yang dikompilasi lebih baik daripada js yang ditulis tangan. Salamku, pekerjaan bagus. Waktu memuat mungkin masih ketinggalan karena masalah jejak seperti yang dikatakan. Namun, jika kode jejak digunakan oleh banyak banyak situs, mungkin tersedia cache dan voila, menghilang juga.

Jadi: Saya menganggap Dart proyek yang hebat, menggunakannya saat ini membawa sebagian besar risiko yang tidak terduga dan akan dibutuhkan tahun ini untuk mencapai tingkat stabil yang baik.

TypeScript

Mengevaluasi TypeScript sangat mudah, membutuhkan 1 atau 2 jam dan Anda tahu segalanya. Membaca dokumen spesifikasi bahasa dan buku pendek (TypeScript terungkap) mengungkapkan, saya tahu segalanya dan mulai pemrograman. Saya kemudian terkejut menemukan bahwa penambahan TypeScript ke JavaScript hanya memenuhi setiap kebutuhan serius yang saya miliki untuk meningkatkan pemrograman klien saya . Di sini yang utama:

  1. Antarmuka . Enkapsulasi dan antarmuka memungkinkan saya untuk menyusun kode dengan mudah. Sempurna!

  2. Negara kelas. . TypeScript memungkinkan untuk mengekspresikan keadaan yang instance kelas membawa secara eksplisit, atau lebih baik itu menegakkannya. Ini adalah langkah besar yang lebih baik dibandingkan dengan js atau kopi.

  3. thissebut kegilaan dikurangi . Di dalam fungsi panah, TypeScript membuat thispointer seperti warga yang berperilaku normal.

  4. Editor, Intellisense . TypeScript hadir dengan intellisense sempurna 100% teratas yang bereaksi dalam rentang mikro atau milidetik seperti yang digunakan dari Visual Studio saat pemrograman C #. Header TypeScript untuk semua perpustakaan js penting juga ada . Bagus, bagus, bagus.

  5. Pengalaman dan Risiko . Menggunakan TypeScript membawa risiko nol, bahasa didefinisikan dengan jelas, sangat stabil, itu hanya js dengan gula, tidak ada yang tidak terduga.

Sebenarnya, peningkatan ini memberi saya semua yang saya butuhkan. Satu-satunya hal yang ingin saya lihat di masa depan adalah koleksi generik. Tapi itu kacang.

Lalu bagaimana dengan kinerja? Meskipun saya menganggap diri saya sebagai orang aneh kinerja, saya tidak percaya bahwa ada proyek yang akan membuat pilihan teknologi di sini berdasarkan kinerja. Keduanya di liga js.

Jika Anda tertarik pada pemrograman web di masa depan, keduanya merupakan upaya yang hebat, TypeScript jauh lebih pragmatis dan dapat digunakan sekarang, Dart adalah proyek lab yang sangat menarik yang akan dapat digunakan setelah editor dan pengingkar dewasa tersedia dan ruang lingkup proyek dapat dilakukan dengan itu akan tergantung pada politik.

Bagaimanapun 3 hari eval sebagian besar menyenangkan dan saya belajar banyak, jika Anda menemukan waktu, diperlukan 1 hari untuk Dart dan 2 jam untuk TypeScript untuk membuat pendapat Anda sendiri. Cobalah.

Perbarui Oktober 2014

Sudah lama dan ex post muncul asumsi bahwa Typecript adalah rute stabil yang aman untuk pergi adalah benar. Saya baru saja menemukan pernyataan (sangat) menonjol tentang naskah, Dart dan Penutupan:

Saya telah tertarik pada tantangan pemrograman Web dalam skala besar selama beberapa waktu. Saya percaya bahwa Google Closure saat ini masih merupakan pilihan terbaik untuk pengembangan JavaScript / Web skala besar, tetapi pada akhirnya akan digantikan oleh sesuatu yang kurang bertele-tele. Meskipun Dart menunjukkan janji yang cukup besar, saya masih kecewa dengan ukuran JavaScript yang dihasilkannya. Dengan perbandingan, jika TypeScript dapat langsung diterjemahkan ke JavaScript yang dapat dikompilasi menggunakan mode lanjutan dari Closure Compiler, maka kita dapat memiliki semua manfaat JavaScript yang dioptimalkan dari Penutupan tanpa verbosity. Terlebih lagi, karena TypeScript adalah superset dari JavaScript, saya percaya bahwa ekstensi sintaksisnya memiliki peluang untuk membuatnya menjadi standar ECMAScript pada beberapa titik,

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

Michael Bolin adalah pahlawan google front end yang lama (ex) fb, juga terlibat dalam penutupan google (dapatkan bukunya tentang Penutupan).

Google Traceur

Appraoch Google untuk menjalankan ECMA Script 6 hari ini adalah proyek Traceurnya: https://github.com/google/traceur-compiler

Dibandingkan dengan Typescript, dukungan tooling mungkin jauh di belakang hingga saat ini. Namun pada sisi baiknya, jauh lebih cepat dalam mengadopsi peningkatan bahasa masa depan yang terlalu keren seperti iterator atau pemahaman.

Facebook Flow, Google AtScript

menyediakan fitur serupa dengan TypeScript.

"Orang mungkin bertanya-tanya ada apa dengan solusi pengecekan tipe JavaScript yang berbeda ini dan apa yang harus dilakukan tentang hal itu. Sebuah kabar baik adalah bahwa Microsoft, Facebook dan Google berkolaborasi dalam hal ini, menurut Jonathan Turner dari Microsoft:

Tim TypeScript bekerja dengan tim Flow dan AtScript untuk membantu memastikan bahwa sumber daya yang telah dibuat oleh komunitas pengetikan JavaScript dapat digunakan di seluruh alat ini. Ada banyak proyek yang dapat dipelajari dari satu sama lain, dan kami berharap dapat bekerja bersama untuk maju dan menciptakan alat terbaik yang kami bisa untuk komunitas JavaScript. Dalam jangka panjang, kami juga akan berupaya untuk melipat fitur terbaik dari alat-alat ini ke dalam ECMAScript, standar di balik JavaScript. "

artikel infoq tentang aliran fb

citykid
sumber
Saya akan menunggu sampai Google mulai menggunakan Dart untuk sebagian besar proyek sendiri (jika ada) - mulai memakan makanan anjing dengan kata lain. Dart juga terdengar seperti Silverlight, hanya tanpa bagian XAML, hanya satu bahasa, tetapi lebih baik diintegrasikan dengan JS / HTML.
Den
1
Ya, Dart adalah sesuatu di lab yang dapat kita tonton dan tunggu di masa depan, sementara Typescript siap untuk pengembangan profesional sekarang. Jadi membandingkan TypeScript dengan Dart membandingkan apel dengan bibit jeruk.
citykid
7
Ini adalah jawaban yang sangat mendalam. Terima kasih telah menulisnya.
Darshan Sawardekar
2
tidak tahu bagaimana naskah "memperbaiki" thiskonteks, karena Anda masih harus mengikat fungsi panggilan balik yang dideklarasikan di dalam metode dengan thiskonteks metode untuk mengakses atribut kelas. Bagaimana itu "memperbaiki" segalanya?
nurettin
1
titik yang valid. sementara binding kadang-kadang masih diperlukan, ini adalah fungsi panah di dalam alias , jadi masalah ini setidaknya dikurangi.
citykid
17

Mengutip Scott Hanselman:

Orang-orang telah membandingkan TypeScript dengan Dart. Itu membandingkan apel dengan karburator. TypeScript dibuat berdasarkan JavaScript sehingga tidak ada masalah interop JS. Dart adalah mesin virtual asli yang ditulis dari awal. Dart interops dengan JavaScript ... tapi ini bukan JS. Itu bahkan tidak menggunakan tipe nomor JavaScript misalnya.

Dari Mengapa TypeScript menjadi jawaban untuk apa pun?

M. Dudley
sumber
8
Sejujurnya aku agak bingung. TypeScript juga bukan JS, kan? var x = {}; x.foo = 5; //Doesn't work in typescriptdan var e = window.event ? window.event : e; //Doesn't work in typescriptContoh di atas akan gagal membuat compiler TypeScript. Apakah saya melewatkan sesuatu? Saya tidak bisa begitu saja "memasukkan" JavaScript saya dan menggunakan tipe ketika saya menginginkannya. Saya harus belajar beberapa sintaks baru dan struktur semuanya dengan tipe.
aikeru
@aikeru Hmmm, Anda benar. Tampaknya untuk menghilangkan beberapa kebesaran JS. Saya akan menggunakan alat baru ini, tetapi sekarang saya sedang berpikir dua kali.
Chev
3
Tidak setuju. Ini seperti membandingkan apel dengan pir atau karburator dengan injeksi bahan bakar. Ada banyak hal tentang keduanya yang secara alami membuat banyak orang berpikir tentang mereka secara bersamaan.
hippietrail
Sebagai catatan, ini bekerja var x = {}; x['foo'] = 5;dan ini tidak juga var y:any = {}; y.foo = 5;, tapi aku sedikit terkejut menemukan kau benar tentang hal ini - jenis dirasakan {}adalah {}bukan any. Bisa jadi masalah tipe inferensi. Saya memposting masalah di sini - kita akan melihat bagaimana mereka merespons.
mindplay.dk
3

Harus berpadu diskusi ini dengan temuan saya sendiri akhir-akhir ini.

1: TypeScript

MS telah mengambil pendekatan yang bagus dalam kenyataan bahwa Anda dapat dengan mudah masuk dan keluar dari TS dan JS. Kami terutama menggunakan AngularJS untuk pengembangan kami dan telah menemukan sementara tidak ada banyak dokumentasi untuk mengkonversi Angular ke TypeScript. Merupakan tambahan yang bagus untuk menggabungkan TypeScript ke dalam alur kerja Dev kami.

2: Dart

Dart adalah sedikit langkah ironis bagi Google. Mungkin mereka tidak ingat activeX dan semua mimpi buruk di sekitar mencoba untuk mendapatkan aplikasi yang bekerja dalam apa pun kecuali IE 5 atau IE 6 yang ditakuti hari itu. Butuh MS bertahun-tahun untuk pulih dari masa itu.

Dart sebagai bahasa "konseptual" tampaknya mencoba untuk menggabungkan beberapa fitur OOP yang bagus. Penjelasan dll adalah pemikiran yang bagus untuk Javascript.

Masalahnya, sulit membayangkan bandwidth yang cukup untuk membuat editor baru, bahasa baru, vm baru di browser, plugin untuk IDE lain, kompiler untuk mengkonversi ke javascript (tanpa ukuran beberapa meg), mengkonversi atau membuat perpustakaan panah baru untuk ganti ribuan perpustakaan js saat ini, minta seseorang memutuskan polimer atau arahan, konversikan situs dartlang untuk menggunakan panah, ini adalah apa yang bisa saya pikirkan dari atas kepala saya.

Konsep mencoba menggunakan Dart dalam hal apa pun kecuali aplikasi sepele saat ini menakutkan.

Di atas semua ES6 ini tidak jauh. ES6 menghadirkan banyak fitur yang coba diperbaiki Dart yang ada di ES5. Apa yang akan menjadi proposisi nilai begitu ES6 mencapai jalanan? Setidaknya pada saat ini satu-satunya perubahan yang harus Anda lakukan dalam TypeScript setelah ES6 keluar adalah mungkin memilih kompilasi yang berbeda untuk ditargetkan.

Hanya untuk menjelaskan bahwa saya adalah orang yang pro MS. MS membuat beberapa produk yang layak dan telah membuat langkah besar untuk memperbaiki kesalahan masa lalu dengan komunitas OSS. Saya masih jarang menggunakan apa pun selain TypeScript dari MS.

kode
sumber