Argumen apa yang mendukung pengetikan yang lemah?

40

Ini muncul dalam sebuah diskusi dengan seorang teman, dan saya mendapati diri saya terdesak untuk memikirkan argumen yang bagus. Apa manfaat dari konferensi mengetik yang lemah?

Fishtoaster
sumber
17
Cooper and Torczon's Engineering a Compiler mendefinisikan pengetikan yang lemah karena menggunakan sistem tipe yang dirancang dengan buruk. Yang pasti tidak terdengar seperti itu akan menguntungkan siapa pun.
Corbin Maret
@Corbin March: Bagus sekali. Saya perlu menambahkan itu ke daftar saya.
Jörg W Mittag
5
Argumen terbaik dapat diberikan oleh eksekutif perusahaan: ini memungkinkan saya untuk mempekerjakan orang murah untuk membangun sistem saya
Vektor

Jawaban:

46

Masalah dengan diskusi semacam ini hanyalah bahwa istilah "pengetikan lemah" dan "pengetikan kuat" tidak ditentukan, tidak seperti misalnya istilah "pengetikan statis", "pengetikan dinamis", "pengetikan eksplisit", "pengetikan eksplisit", "pengetikan implisit", " mengetik bebek "," mengetik struktural "atau" mengetik nominal ". Heck, bahkan istilah "pengetikan manifes" dan "pengetikan laten", yang masih merupakan area penelitian dan diskusi terbuka mungkin lebih baik didefinisikan.

Jadi, sampai teman Anda memberikan definisi dari istilah "pengetikan lemah" yang cukup stabil untuk dijadikan dasar diskusi, bahkan tidak masuk akal untuk menjawab pertanyaan ini.

Sayangnya, terlepas dari jawaban Nick , tidak ada satu pun dari penjawab yang repot-repot memberikan definisi mereka, dan Anda dapat melihat kebingungan yang muncul di beberapa komentar. Sulit dikatakan, karena tidak ada yang benar-benar memberikan definisi mereka, tapi saya pikir saya menghitung setidaknya tiga yang berbeda, hanya di halaman ini.

Beberapa definisi yang lebih umum digunakan adalah (dan ya, saya tahu bahwa tidak ada satu pun dari mereka yang masuk akal, tetapi itulah definisi yang pernah saya lihat digunakan orang):

  • mengetik lemah = mengetik tidak aman / mengetik kuat = mengetik aman
  • pengetikan lemah = pengetikan dinamis / pengetikan kuat = pengetikan statis
  • pengetikan lemah = pengetikan bebek / pengetikan kuat = pengetikan nominal
  • pengetikan lemah = pengetikan struktural / pengetikan kuat = pengetikan nominal
  • pengetikan lemah = pengetikan implisit / pengetikan kuat = pengetikan eksplisit
  • pengetikan lemah = pengetikan laten / pengetikan kuat = pengetikan manifes
  • mengetik lemah = tidak mengetik / mengetik kuat = mengetik
  • pengetikan lemah = gips implisit / pengetikan kuat = hanya gips eksplisit
  • pengetikan lemah = gips implisit atau eksplisit / pengetikan kuat = tidak ada gips sama sekali
  • pengetikan lemah = konversi implisit / pengetikan kuat = hanya konversi eksplisit
  • pengetikan lemah = konversi implisit atau eksplisit / pengetikan kuat = tidak ada konversi sama sekali
  • pengetikan lemah = interpretasi / pengetikan kuat = kompilasi
  • pengetikan lemah = pengetikan lambat / kuat = cepat
  • pengetikan lemah = pengumpulan sampah / pengetikan kuat = manajemen memori manual
  • mengetik lemah = manajemen memori manual / mengetik kuat = pengumpulan sampah
  • … dan banyak lagi

Tiga definisi yang tampaknya paling banyak digunakan , adalah

  • lemah mengetik = bahasa pemrograman jelek jelek Anda / kuat mengetik = bahasa pemrograman super-mengagumkan saya
  • pengetikan lemah = setiap bahasa pemrograman lain / pengetikan kuat = satu-satunya bahasa pemrograman yang pernah saya pelajari (biasanya Java, C # atau C ++; anehnya, orang-orang yang belajar misalnya Haskell atau Skema sebagai bahasa pertama dan satu-satunya mereka tampaknya tidak berbagi pandangan dunia ini)
  • pengetikan lemah = setiap bahasa yang saya tidak mengerti / pengetikan kuat = Java (ganti dengan C # atau C ++ sesuka hati)

Kecuali semua orang setuju pada definisi apa yang "lemah mengetik" bahkan adalah , bahkan tidak masuk akal untuk berpikir tentang apa kelebihan mungkin. Keuntungan apa? Lebih buruk lagi, jika tidak ada definisi sama sekali , maka semua orang bisa menggeser definisi mereka agar sesuai dengan argumen mereka, dan setiap diskusi dijamin cukup banyak untuk berpindah menjadi flamewar.

Saya sendiri telah mengubah definisi saya sendiri beberapa kali selama bertahun-tahun dan sekarang telah mencapai titik di mana saya bahkan tidak menganggap istilah itu berguna lagi. Saya juga terbiasa berpikir bahwa pengetikan yang lemah (dalam berbagai definisi) memiliki tempat dalam skrip shell, tetapi setiap kali saya harus menyelesaikan masalah yang sama di Bash dan PowerShell, saya dengan menyakitkan diingatkan betapa salahnya saya.

Jörg W Mittag
sumber
5
Jawaban yang cukup sinis! Saya mengetahui dari mana Anda berasal tetapi saya merasa "cukup baik" untuk menebak bahwa siapa pun yang tidak memberikan definisi mengacu pada "pengetikan yang lemah dan / atau dinamis", itulah sebabnya saya memasukkan keduanya dalam jawaban saya. Saya tahu itu tidak sempurna, tetapi kebanyakan orang tampaknya mengabaikan ketika mendefinisikan sistem tipe.
Nicole
7
@Renesis: Saya akan menyebutnya "realisme" :-) Saya telah melihat cukup banyak diskusi tentang sistem tipe untuk menyadari bahwa separuh orang tidak menyadari bahwa mereka berbicara tentang hal-hal yang sama sekali berbeda dan yang lain tidak tahu apa yang mereka bicarakan tentang sama sekali . Beberapa bulan yang lalu, ada diskusi tentang daftar pengembangan inti dari sebuah bahasa yang tidak akan saya sebutkan, tentang menambahkan sistem tipe opsional untuk meningkatkan kinerja. Diskusi itu berlangsung selama seminggu, melibatkan lusinan orang dan ratusan surat. Tidak seorang pun menyadari bahwa sistem tipe opsional menurut definisi tidak dapat meningkatkan kinerja. …
Jörg W Mittag
8
+1 untuk cynism! Anda dapat menambahkan "pengetikan kuat = ketika IDE mengetahui jenis variabel saya (Intellisense dll.), Pengetikan lemah = ketika tidak)"
user281377
1
Nama-nama yang terdefinisi lebih baik untuk sistem pengetikan tidak memiliki penilaian implisit yang dimiliki oleh lemah dan kuat .
Eva
1
Cantik, menghibur, dan akurat. Semakin banyak saya belajar tentang sistem tipe, semakin saya menyadari berapa lama saya menderita di bawah ilusi bahwa satu bahasa berbeda dari yang lain dalam hal itu tidak sama sekali. Sungguh menakjubkan betapa banyak kebingungan yang disebabkan oleh konsep ini, dan saya benar-benar berpikir itu tidak perlu jika hanya kita menerima yang lemah / kuat bukanlah hal yang nyata, jadi mari kita bicara tentang sesuatu yang sebenarnya dan mungkin kita akan belajar sesuatu.
BrianH
25

Ingat ada dua konsep utama yang umumnya bingung:

Pengetikan dinamis

Bahasa pemrograman dikatakan diketik secara dinamis ketika sebagian besar pemeriksaan tipenya dilakukan pada saat run-time dibandingkan dengan saat kompilasi. Dalam pengetikan dinamis, nilai memiliki tipe tetapi variabel tidak; artinya, variabel dapat merujuk ke nilai jenis apa pun.

Keuntungan di sini sering diabaikan hanya untuk programmer "baru", tetapi juga bisa nyaman bagi setiap programmer:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

Lebih sedikit kode dalam hal apa pun di mana Anda harus memberikan atau menetapkan nilai baru:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Mengetik longgar atau lemah

Pengetikan yang lemah berarti bahwa suatu bahasa secara implisit mengkonversi (atau menggunakan) tipe-tipe saat digunakan.

Manfaat:

  • Berikan nilai tipe apa pun sebagai parameter ke suatu fungsi . Berguna untuk callback, API fleksibel, dan membuat implementasi penutupan yang lebih sederhana.
  • Evaluasi boolean implisit . Semua tipe dapat dievaluasi sebagai boolean. Ini juga memiliki manfaat samping seperti bagian dari ||dapat digunakan dalam penugasan tanpa konversi ke boolean:

    var a = param || defaultValue;
    
  • Sekali lagi, lebih sedikit kode:

    var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    

    Bahkan Java harus pergi sebagian, dengan panggilan implisit .toString()ketika menggabungkan objek dengan String; jika tidak, programmer Java akan mengutuknya sepanjang hari (pernyataan log akan di luar kendali).


Kedua definisi tersebut berasal dari http://en.wikipedia.org/wiki/Type_system . Dikatakan lebih baik daripada yang saya bisa.

Nicole
sumber
1
Pengetikan dinamis juga bermanfaat di mana banyak pembuatan kode akan diperlukan dalam bahasa yang diketik secara statis. Bandingkan jumlah pembuatan kode yang diperlukan untuk, katakanlah, Kerangka Entitas dalam pustaka C # hingga ORM dalam bahasa yang diketik secara dinamis (PHP, Python, dll). Meskipun beberapa orang mungkin berpendapat bahwa manfaat dalam hal IDE IntelliSense melebihi biaya semua pembuatan kode ...
Dean Harding
3
Komentar Anda "// no i = (Array) data) .length atau Array myArr = (Array) data;" sebenarnya tidak ada hubungannya dengan pengetikan dinamis, karena susunan data dapat dibuktikan saat kompilasi. Bahasa yang diketik secara statis dapat menyebarkan pengetahuan yang diperoleh dari instanceof.
Peter Taylor
@ Peter Taylor, saya kira itu benar dalam kasus-kasus sederhana, apakah Anda tahu ada yang melakukannya? Memang ada hubungannya dengan pengetikan dinamis dalam apakah suatu ifblok digunakan atau logika lain yang lebih kompleks (bahkan runtime atau dinamis), baris berikutnya akan legal dan aman dari kesalahan.
Nicole
@ Retesis, saya tidak, tidak. Tetapi keluarga bahasa ML diketik secara statis dan menggunakan inferensi tipe sehingga Anda sangat jarang harus secara eksplisit menyatakan jenis variabel.
Peter Taylor
1
@ Peter Taylor benar. Banyak manfaat pengetikan dinamis tersedia dalam bahasa dengan sistem pengetikan statis yang lebih baik, seperti Haskell, Scala atau bahkan C # dalam beberapa kasus. Saya akan mengatakan keuntungan utama dari pengetikan dinamis adalah berurusan dengan hal-hal yang secara inheren tanpa jenis, seperti HTML DOM. Mengapa menulis simpul ["attr"] alih-alih node.attr? Mereka selalu diselesaikan saat runtime.
Matt Olenik
7

Argumen utama untuk mengetik lemah adalah salah satu kinerja. (ini untuk menjawab pertanyaan OP seperti yang dinyatakan). Ada banyak diskusi bagus tentang dinamis vs statis, implisit vs eksplisit. dll.

C adalah bahasa yang diketik dengan lemah yang paling terkenal, dan tidak melakukan pengecekan run time atau kompilasi waktu pengecekan tipe variabel. Pada intinya Anda dapat melemparkan char *ke int *dan bahasa tidak akan peduli. Jadi mengapa Anda melakukan ini?

Pemrograman C cukup dekat dengan cara Anda akan melakukan hal-hal dengan perakitan, jadi ada kalanya Anda hanya peduli tentang alamat. Bukan hal yang tidak biasa untuk memberikan atau memberikan void *referensi karena alasan itu. Jika Anda tahu bagaimana memori diatur (lagi-lagi masalah C dan perakitan), Anda dapat melakukan beberapa perhitungan yang cukup keren berdasarkan alamat di void *untuk mendapatkan informasi yang Anda butuhkan. Sebagai contoh, ini dapat membuat Anda mengalami hubungan singkat proses yang harus Anda lalui di Jawa.

Sementara pengecekan jenis run-time tidak memiliki sedikit overhead yang luar biasa, ada kalanya itu hanya cukup untuk menyebabkan bagian kritis menjadi terlalu lambat. Saya berpikir sebagian besar tentang pemrograman tertanam dan sistem waktu nyata dalam kasus ini.

Yang mengatakan, dalam kebanyakan kasus memiliki sistem tipe kuat yang baik waktu kompilasi diperiksa atau diperiksa runtime membantu lebih sering daripada sakit.

Berin Loritsch
sumber
2
Saya tidak melihat mengapa bahasa yang diketik dengan kuat tidak dapat dikompilasi seefisien C. Tetapi kompiler harus jauh lebih kompleks.
9000
2
C ++ adalah contoh dari salah satu bahasa tersebut. Dalam C ++ semua pengecekan tipe dilakukan pada waktu kompilasi, dan tidak ada yang dilakukan pada saat run ... KECUALI Anda mengaktifkan RTTI.
Berin Loritsch
2
Tidak yakin saya setuju dengan argumen kinerja ini, tetapi ini adalah pandangan yang menarik.
Martin Ba
2

Mengetik yang lemah biasanya lebih mudah dipahami oleh pemula, misalnya dalam hal-hal seperti excel, javascript, dan vbscript. Anda juga memperdagangkan beberapa kecepatan pengembangan untuk potensi kesalahan.

Artikel bagus tentang hal ini: Pengetikan yang kuat vs Pengujian yang kuat

Homde
sumber
1
Saya tidak berpikir ada korespondensi yang kuat antara bahasa yang diketik dengan lemah dan bahasa ramah pemula. Ruby dan python sangat diketik dan umumnya dianggap ramah pemula. C diketik dengan lemah dan secara umum dianggap permusuhan pemula.
sepp2k
Tidak, bukan bahasa secara umum, saya hanya berbicara tentang pengetikan
Homde
2
Kombinasi dinamis dan sangat diketik adalah kombinasi ramah pemula. Meskipun saya telah melihat bahwa ketika orang beralih dari bahasa yang diketik secara statis ke bahasa yang diketik secara dinamis, mereka juga menjadi sangat bingung. Saya belum pernah melihat seseorang yang memulai dengan mengetik secara dinamis sejak sekolah akhirnya mengajar C atau Jawa pertama kali.
jsternberg
3
@Mchl: itu tidak ada hubungannya dengan pengetikan statis / dinamis atau kuat / lemah. Harus menyatakan jenis adalah tentang pengetikan eksplisit / implisit.
Jörg W Mittag
1
Mungkin juga;) Jadi saya pindah juga dari bahasa yang diketik secara eksplisit. Koreksi saya jika saya salah Pascal diketik secara statis, kuat, dan eksplisit, sedangkan PHP diketik secara dinamis, lemah, dan implisit, bukan?
Mchl