it-swarm-id.com

Argumen apa yang mendukung pengetikan yang lemah?

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

41
Fishtoaster

Masalah dengan diskusi semacam ini hanyalah bahwa istilah "pengetikan lemah" dan "pengetikan kuat" tidak terdefinisi, 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 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 dari para penjawab yang repot-repot memberikan definisi mereka juga, dan Anda dapat melihat kebingungan yang dihasilkan di beberapa komentar. Sulit dikatakan, karena tidak ada yang benar-benar memberikan definisi mereka, tetapi saya pikir saya menghitung setidaknya tiga yang berbeda, hanya di halaman ini.

Beberapa definisi yang lebih umum digunakan adalah (dan ya, saya tahu bahwa hampir tidak ada satupun yang masuk akal, tetapi itulah definisi yang saya miliki orang yang dilihat benar-benar menggunakan):

  • 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
  • lemah mengetik = gips implisit/kuat mengetik = 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 setiap orang setuju dengan definisi apa "lemah mengetik" genap adalah , bahkan tidak masuk akal untuk berpikir tentang apa keuntungannya. 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.

46
Jörg W Mittag

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; yaitu, 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 ketika digunakan.

Manfaat:

  • Kirimkan nilai jenis apa pun sebagai parameter ke fungsi . Berguna untuk panggilan balik, 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 setengah jalan, dengan panggilan implisit ke .toString() saat menggabungkan objek dengan String; jika tidak Java = programmer akan mengutuk 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.

25
Nicole

Argumen utama ntuk 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. Intinya Anda bisa memberikan char * ke sebuah int * dan bahasa tidak akan peduli. Jadi mengapa Anda melakukan ini?

Pemrograman C cukup dekat dengan cara Anda akan melakukan sesuatu dengan Assembly, jadi ada kalanya Anda hanya peduli dengan alamat. Bukan hal yang aneh untuk melemparkan atau memberikan void * referensi karena alasan itu. Jika Anda tahu bagaimana memori diatur (lagi-lagi masalah C dan Majelis), Anda dapat melakukan beberapa perhitungan keren berdasarkan alamat di void * untuk mendapatkan informasi yang Anda butuhkan. Ini dapat membuat Anda mengalami hubungan singkat proses yang harus Anda lalui di Java misalnya.

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 menyakitkan.

7
Berin Loritsch

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 subjek: Pengetikan kuat vs pengujian kuat

2
Homde