Saya membaca dek slide yang menyatakan "JavaScript tidak bertipe." Ini bertentangan dengan apa yang saya pikir benar sehingga saya mulai menggali untuk mencoba dan belajar lebih banyak.
Setiap jawaban untuk JavaScript adalah bahasa yang tidak diketik? mengatakan bahwa JavaScript bukan tanpa huruf dan menawarkan contoh berbagai bentuk pengetikan statis, dinamis, kuat, dan lemah yang saya kenal dan senangi .. jadi itu bukan cara yang tepat.
Jadi saya bertanya kepada Brendan Eich, pencipta JavaScript, dan dia berkata:
tipe akademik menggunakan "untyped" berarti "tidak ada tipe statis". mereka cukup pintar untuk melihat bahwa nilai memiliki tipe (ya!). konteks penting.
Apakah orang-orang ilmu komputer yang berfokus secara akademis menggunakan "tidak diketik" sebagai sinonim dari "diketik secara dinamis" (dan apakah ini valid?) Atau ada sesuatu yang lebih dalam dari ini yang saya lewatkan? Saya setuju dengan Brendan bahwa konteks itu penting, tetapi kutipan penjelasan apa pun akan bagus karena buku-buku "go to" saya saat ini tidak mempermainkan topik ini.
Saya ingin memperbaikinya sehingga saya dapat meningkatkan pemahaman saya dan karena bahkan Wikipedia tidak merujuk pada penggunaan alternatif ini (toh saya bisa menemukannya). Saya tidak ingin mengacaukan menggunakan istilah atau mempertanyakan penggunaan istilah di masa depan jika saya salah :-)
(Saya juga telah melihat top Smalltalker mengatakan Smalltalk adalah "untyped" juga, jadi itu bukan satu kali yang membuat saya memulai pencarian ini! :-))
sumber
Jawaban:
Ya, ini adalah praktik standar dalam literatur akademik. Untuk memahaminya, perlu diketahui bahwa gagasan "tipe" ditemukan pada tahun 1930-an, dalam konteks kalkulus lambda (bahkan, bahkan lebih awal, dalam konteks teori himpunan). Sejak itu, seluruh cabang logika komputasi telah muncul yang dikenal sebagai "teori tipe". Pemrograman teori bahasa didasarkan pada dasar-dasar ini. Dan dalam semua konteks matematis ini, "tipe" memiliki makna tertentu yang sudah mapan.
Terminologi "pengetikan dinamis" ditemukan jauh kemudian - dan ini merupakan kontradiksi dalam hal penggunaan matematis umum dari kata "type".
Misalnya, berikut adalah definisi "sistem tipe" yang digunakan Benjamin Pierce dalam buku teks standarnya Jenis dan Bahasa Pemrograman :
Dia juga berkomentar:
Sebagian besar orang yang bekerja di lapangan tampaknya berbagi pandangan ini.
Perhatikan bahwa ini tidak berarti bahwa " tidak diketik" dan "diketik secara dinamis" adalah sinonim. Sebaliknya, bahwa yang terakhir adalah (secara teknis menyesatkan) nama untuk kasus tertentu yang pertama.
PS: Dan FWIW, kebetulan saya adalah peneliti akademis dalam sistem tipe, dan pelaksana JavaScript non-akademik, jadi saya harus hidup dengan skisma. :)
sumber
"[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Saya seorang ilmuwan komputer akademis yang berspesialisasi dalam bahasa pemrograman, dan ya, kata "tidak diketik" sering digunakan (salah) dengan cara ini. Akan lebih baik untuk memesan kata untuk digunakan dengan bahasa yang tidak membawa tag jenis dinamis, seperti Forth dan kode assembly, tetapi bahasa ini jarang digunakan dan bahkan lebih jarang dipelajari, dan itu jauh lebih mudah untuk mengatakan "tidak diketik" dari "diketik secara dinamis".
Bob Harper gemar mengatakan bahwa bahasa seperti Skema, Javascript, dan sebagainya harus dianggap bahasa yang diketik hanya dengan satu tipe: nilai. Saya bersandar pada pandangan ini, karena memungkinkan untuk membangun pandangan dunia yang konsisten menggunakan hanya satu jenis formalisme.
PS Dalam kalkulus lambda murni, satu-satunya "nilai" adalah istilah dalam bentuk normal, dan satu-satunya istilah tertutup dalam bentuk normal adalah fungsi. Tetapi sebagian besar ilmuwan yang menggunakan kalkulus lambda menambahkan tipe dasar dan konstanta, dan kemudian Anda memasukkan sistem tipe statis untuk lambda atau Anda segera kembali ke tag tipe dinamis.
PPS Untuk poster asli: ketika datang ke bahasa pemrograman, dan terutama jenis sistem, informasi di Wikipedia berkualitas buruk. Jangan percaya itu.
sumber
Saya telah mencarinya, dan menemukan bahwa jawaban untuk pertanyaan Anda sederhana, dan mengejutkan, "ya": tipe CS akademik, atau setidaknya beberapa dari mereka, gunakan "tidak diketik" untuk berarti "diketik secara dinamis". Misalnya, Bahasa Pemrograman: Prinsip dan Praktik , Edisi Ketiga (oleh Kenneth C. Louden dan Kenneth A. Lambert, diterbitkan 2012) mengatakan ini:
[ tautan ] (catatan: dicetak tebal dalam aslinya) dan terus menggunakan "tidak diketik" hanya dengan cara ini.
Saya menemukan ini mengejutkan (untuk banyak alasan yang sama yang diberikan afrischke dan Adam Mihalcin), tetapi di sanalah Anda. :-)
Diedit untuk ditambahkan: Anda dapat menemukan lebih banyak contoh dengan menghubungkan
"untyped languages"
ke Pencarian Buku Google. Sebagai contoh:- Jacob Matthews dan Amal Ahmed, 2008 [ tautan ]
- Charles Consel, 1990 [ tautan ]
Ngomong-ngomong, kesan saya, setelah melihat-lihat hasil pencarian ini, adalah bahwa jika seorang peneliti menulis bahasa fungsional yang "tidak diketik", ia sangat mungkin menganggapnya "tidak diketik" dalam arti yang sama dengan lambda yang tidak diketik. kalkulus yang disebutkan oleh Adam Mihalcin. Setidaknya, beberapa peneliti menyebutkan Skema dan kalkulus lambda dalam napas yang sama.
Apa yang pencarian tidak katakan, tentu saja, adalah apakah ada peneliti yang menolak identifikasi ini, dan tidak menganggap bahasa-bahasa ini sebagai "tidak diketik". Ya, saya memang menemukan ini:
- seseorang (saya tidak tahu siapa), 1998 [ tautan ]
tetapi jelas sebagian besar orang yang menolak identifikasi ini tidak akan merasa perlu untuk mengatakannya secara eksplisit.
sumber
Tidak diketik dan diketik secara dinamis sama sekali bukan sinonim. Bahasa yang paling sering disebut "tidak diketik" adalah Lambda Calculus, yang sebenarnya merupakan bahasa yang tidak terikat - semuanya adalah fungsi, jadi kita dapat secara statis membuktikan bahwa jenis segala sesuatu adalah fungsinya. Bahasa yang diketik secara dinamis memiliki beberapa jenis, tetapi tidak menambahkan cara bagi kompiler untuk memeriksanya secara statis, memaksa kompiler untuk memasukkan pemeriksaan runtime pada tipe variabel.
Kemudian, JavaScript adalah bahasa yang diketik secara dinamis: adalah mungkin untuk menulis program dalam JavaScript sedemikian rupa sehingga beberapa variabel
x
bisa berupa angka, atau fungsi, atau string, atau sesuatu yang lain (dan menentukan mana yang akan membutuhkan pemecahan Masalah Pemutusan atau beberapa masalah matematika yang sulit), sehingga Anda dapat menerapkanx
argumen dan browser harus memeriksa saat runtime yangx
merupakan fungsi.sumber
Kedua pernyataan itu benar, tergantung pada apakah Anda berbicara tentang nilai atau variabel. Variabel JavaScript tidak diketik, nilai-nilai JavaScript memiliki tipe, dan variabel dapat berkisar pada semua jenis nilai saat runtime (yaitu 'secara dinamis').
Dalam JavaScript dan banyak bahasa lainnya, nilai dan bukan variabel membawa tipe. Semua variabel dapat berkisar di atas semua jenis nilai dan dapat dianggap "diketik secara dinamis" atau "tidak diketik" - dari perspektif pengecekan tipe, variabel yang tidak memiliki / tipe yang tidak diketahui dan variabel yang dapat mengambil jenis apa pun secara logis dan praktis setara. . Ketika ahli teori ketik berbicara tentang bahasa dan tipe, mereka biasanya membicarakan hal ini - variabel yang membawa tipe - karena mereka tertarik untuk menulis jenis checker dan kompiler dan sebagainya, yang beroperasi pada teks program (yaitu variabel) dan bukan program yang berjalan di memori (nilai yaitu).
Sebaliknya dalam bahasa lain, seperti C, variabel membawa tipe tetapi nilainya tidak. Dalam bahasa seperti Java, variabel dan nilai keduanya membawa tipe. Di C ++, beberapa nilai (yang memiliki fungsi virtual) membawa tipe dan yang lainnya tidak. Dalam beberapa bahasa bahkan mungkin bagi nilai untuk mengubah jenis, meskipun ini biasanya dianggap desain yang buruk.
sumber
Pertanyaan ini semua tentang Semantik
Jika saya memberi Anda data ini:
12
apa jenisnya? Anda tidak memiliki cara untuk mengetahui dengan pasti. Bisa berupa bilangan bulat - bisa jadi pelampung - bisa berupa string. Dalam pengertian itu sangat banyak data "tidak diketik".Jika saya memberi Anda bahasa imajiner yang memungkinkan Anda menggunakan operator seperti "tambah", "kurangi", dan "gabungkan" pada data ini dan beberapa bagian data lain yang sewenang-wenang, "tipe" agak tidak relevan (dengan bahasa imajiner saya) (contoh : mungkin
add(12, a)
menghasilkan109
yang12
ditambah nilai ascii daria
).Mari kita bicara C sebentar. C cukup banyak memungkinkan Anda melakukan apa pun yang Anda inginkan dengan sepotong data yang sewenang-wenang. Jika Anda menggunakan fungsi yang mengambil dua
uint
s - Anda dapat melakukan dan melewatkan apa pun yang Anda inginkan - dan nilai-nilai hanya akan ditafsirkan sebagaiuint
s. Dalam pengertian itu C "tidak diketik" (jika Anda memperlakukannya sedemikian rupa).Namun - dan sampai pada poin Brendan - jika saya katakan bahwa "Umur saya
12
" - maka12
ada jenisnya - setidaknya kita tahu ini numerik. Dengan konteks semuanya memiliki tipe - terlepas dari bahasa.Inilah sebabnya saya katakan di awal - pertanyaan Anda adalah semantik. Apa arti dari "tidak diketik"? Saya pikir Brendan memukul paku di kepala ketika dia berkata "tidak ada tipe statis" - karena hanya itu yang bisa berarti. Manusia secara alami mengklasifikasikan sesuatu menjadi tipe. Kita secara intuitif tahu bahwa ada sesuatu yang secara fundamental berbeda antara mobil dan monyet - tanpa pernah diajarkan untuk membuat perbedaan itu.
Kembali ke contoh saya di awal - bahasa yang "tidak peduli dengan jenis" (per-se) dapat membuat Anda "menambahkan" "usia" dan "nama" tanpa menghasilkan kesalahan sintaksis ... tetapi itu tidak berarti ini adalah operasi yang logis.
Javascript memungkinkan Anda melakukan segala macam hal gila tanpa menganggapnya "kesalahan". Itu tidak berarti apa yang Anda lakukan adalah logis. Thats bagi pengembang untuk berolahraga.
Apakah sistem / bahasa yang tidak menerapkan keamanan jenis pada waktu kompilasi / bangun / interpretasi "tidak diketik" atau "diketik secara dinamis"?
Semantik.
EDIT
Saya ingin menambahkan sesuatu di sini karena beberapa orang tampaknya terjebak pada "yeah, tetapi Javascript memang memiliki beberapa" tipe "".
Dalam komentar saya tentang jawaban orang lain saya katakan:
Dalam Javascript saya dapat memiliki objek yang saya bangun untuk menjadi "Monyet" dan objek yang saya bangun untuk menjadi "Manusia" dan beberapa fungsi dapat dirancang untuk beroperasi hanya pada "Manusia", yang lain hanya pada "Monyet", dan yang lain hanya pada "Things With Arms". Apakah bahasa tersebut pernah diberitahu atau tidak ada kategori objek seperti "benda dengan senjata" sama tidak relevannya dengan perakitan ("tidak diketik") seperti halnya dengan Javascript ("dinamis"). Ini semua masalah integritas logis - dan satu-satunya kesalahan adalah menggunakan sesuatu yang tidak memiliki senjata dengan metode itu.
Jadi, jika Anda menganggap Javascript memiliki "gagasan tipe" secara internal - dan, karenanya "tipe dinamis" - dan berpikir ini entah bagaimana "sangat berbeda dari sistem yang tidak diketik" - Anda harus melihat dari contoh di atas bahwa "gagasan tentang" jenis "itu secara internal benar-benar tidak relevan.
Untuk melakukan operasi yang sama dengan C #, misalnya, saya PERLU antarmuka yang disebut
ICreatureWithArms
atau sesuatu yang serupa. Tidak demikian dalam Javascript - tidak demikian dalam C atau ASM.Jelas, apakah Javascript memiliki pemahaman tentang "tipe" atau tidak sama sekali tidak relevan.
sumber
is there something deeper to this that I am missing
dan, saya pikir, bahwa kegagalan untuk memahami bahwa ini adalah masalah semantik adalah hal yang lebih dalam - jadi saya melakukan yang terbaik untuk mengipasi apa pun yang saya bisa.JavaScript has types
dalam balasan Anda).Meskipun benar bahwa sebagian besar peneliti CS yang menulis tentang jenis pada dasarnya hanya menganggap bahasa dengan jenis yang dapat diturunkan secara sintaksis sebagai bahasa yang diketik, ada lebih banyak dari kita yang menggunakan bahasa yang diketik secara dinamis / laten yang mengambil kesulitan dalam penggunaan itu.
Saya menganggap ada 3 jenis [SIC] bahasa:
Untyped - hanya operator yang menentukan interpretasi nilai - dan umumnya bekerja pada apa saja. Contoh: Assembler, BCPL
Yang diketik secara statis - ekspresi / variabel memiliki tipe yang terkait dengannya, dan tipe itu menentukan interpretasi / validitas operator pada waktu kompilasi. Contoh: C, Java, C ++, ML, Haskell
Diketik secara dinamis - nilai memiliki tipe yang terkait dengannya, dan tipe itu menentukan interpretasi / validitas operator saat run-time. Contoh: LISP, Skema, Smalltalk, Ruby, Python, Javascript
Sepengetahuan saya, semua bahasa yang diketik secara dinamis adalah tipe-aman - yaitu hanya operator yang valid yang dapat beroperasi pada nilai-nilai. Tetapi hal yang sama tidak berlaku untuk bahasa yang diketik secara statis. Tergantung pada kekuatan sistem tipe yang digunakan, beberapa operator mungkin diperiksa hanya pada saat run-time, atau tidak sama sekali. Misalnya, sebagian besar bahasa yang diketik secara statis tidak menangani bilangan bulat bilangan bulat dengan benar (menambahkan 2 bilangan bulat positif dapat menghasilkan bilangan bulat negatif), dan referensi array yang tidak terikat sama sekali tidak dicentang sama sekali (C, C ++) atau hanya diperiksa pada run-time. Lebih lanjut, beberapa sistem tipe sangat lemah sehingga pemrograman yang berguna membutuhkan pintu darurat (yang digunakan dalam C dan keluarga) untuk mengubah tipe ekspresi waktu kompilasi.
Semua ini mengarah pada klaim yang absurd, seperti bahwa C ++ lebih aman daripada Python karena itu (diketik secara statis), sedangkan kebenarannya adalah bahwa Python secara intrinsik aman sementara Anda dapat menembak kaki Anda dengan C ++.
sumber
Saya bukan ilmuwan komputer, tetapi saya akan agak terkejut jika "tidak diketik" benar-benar digunakan sebagai sinonim untuk "diketik secara dinamis" di komunitas CS (setidaknya dalam publikasi ilmiah) karena kedua istilah tersebut menggambarkan konsep yang berbeda. Bahasa yang diketik secara dinamis memiliki gagasan tentang jenis dan itu memberlakukan batasan jenis saat runtime (misalnya, Anda tidak dapat membagi bilangan bulat dengan sebuah string dalam Lisp tanpa mendapatkan kesalahan) sementara bahasa yang tidak diketik tidak memiliki gagasan jenis di semua (mis. assembler). Bahkan artikel Wikipedia tentang bahasa pemrograman (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) membuat perbedaan ini.
Pembaruan: Mungkin kebingungan berasal dari kenyataan bahwa beberapa teks mengatakan sesuatu sampai-sampai "variabel tidak diketik" dalam Javascript (yang benar). Tetapi itu tidak secara otomatis berarti bahwa bahasa tersebut tidak diketik (yang akan salah).
sumber
Setuju dengan Brendan - konteks adalah segalanya.
Saya ambil:
Saya ingat sedang bingung, sekitar tahun 2004, karena ada argumen yang pecah tentang apakah Ruby tidak diketik atau diketik secara dinamis. Orang-orang C / C ++ sekolah lama (yang saya adalah salah satunya) berpikir tentang kompiler dan mengatakan Ruby tidak diketik.
Ingat, di C, tidak ada tipe runtime, hanya ada alamat dan jika kode yang mengeksekusi memutuskan untuk memperlakukan apa pun yang ada di alamat itu sebagai sesuatu yang bukan, whoops. Itu pasti tidak diketik dan sangat berbeda dari yang diketik secara dinamis.
Di dunia itu, "mengetik" adalah tentang kompiler. C ++ memiliki "pengetikan yang kuat" karena pemeriksaan kompiler lebih ketat. Java dan C lebih "diketik dengan lemah" (bahkan ada argumen tentang apakah Java diketik dengan kuat atau lemah). Bahasa dinamis, dalam kontinum itu, "tidak diketik" karena mereka tidak memiliki pemeriksaan tipe kompiler.
Hari ini, untuk mempraktekkan programmer, kita sudah terbiasa dengan bahasa yang dinamis, kita jelas berpikir untyped berarti tidak ada kompiler atau pemeriksa tipe interpreter, yang akan sangat sulit untuk di-debug. Tapi ada periode di sana di mana itu tidak jelas dan di dunia yang lebih teoretis dari CS bahkan mungkin tidak bermakna.
Dalam beberapa pengertian yang mendalam, tidak ada yang bisa tidak diketik (atau hampir tidak ada, toh) karena Anda harus memiliki niat dalam memanipulasi nilai untuk menulis algoritma yang bermakna. Ini adalah dunia CS teoretis, yang tidak membahas secara spesifik bagaimana kompiler atau juru bahasa diimplementasikan untuk bahasa tertentu. Jadi "tidak diketik" sama sekali (mungkin, saya tidak tahu) sama sekali tidak berarti dalam konteks itu.
sumber