Apakah "tidak diketik" juga berarti "diketik secara dinamis" di dunia CS akademik?

166

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! :-))

Peter Cooper
sumber
5
Penyalahgunaan tata nama orang lain tidak harus membentuk kebiasaan Anda - cukup gunakan frasa yang tepat. Anda harus menyadari masalah membaca.
Raphael
2
Saya selalu menganggapnya sebagai, variabel tidak diketik dalam variabel apa pun dapat menampung semua jenis data. Jenis apa yang ada dalam variabel dapat berubah secara dinamis .
Izkata
1
Juga (lagi-lagi mengatakan lebih banyak tentang bahasa alami daripada bahasa komputer) "untyped" = "single-typed" (satu jenis untuk semua nilai).
philipxy

Jawaban:

148

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 :

Sistem tipe adalah metode sintaksis yang dapat ditelusuri untuk membuktikan tidak adanya perilaku program tertentu dengan mengklasifikasikan frasa sesuai dengan jenis nilai yang mereka hitung.

Dia juga berkomentar:

Kata "statis" kadang-kadang ditambahkan secara eksplisit - kita berbicara tentang "bahasa pemrograman yang diketik secara statis," misalnya - untuk membedakan jenis analisis waktu kompilasi yang kami pertimbangkan di sini dari pengetikan dinamis atau laten yang ditemukan dalam bahasa seperti Skema (Sussman dan Steele, 1975; Kelsey, Clinger, dan Rees, 1998; Dybvig, 1996), di mana tag tipe run-time digunakan untuk membedakan berbagai jenis struktur di heap. Istilah seperti "diketik secara dinamis" bisa dibilang misnomer dan mungkin harus diganti dengan "diperiksa secara dinamis," tetapi penggunaannya standar.

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. :)

Andreas Rossberg
sumber
5
Hal ini sangat membantu dan bahkan mungkin menjadi jawaban favorit saya dalam hal memberikan beberapa sejarah untuk itu.
Peter Cooper
2
@PeterCooper btw Anda mungkin tertarik untuk mengetahui bahwa satu cabang utama dari semantik formal didasarkan (ha a pun) pada kalkulus lambda yang diketik; mis. Montague Semantics. Tetapi sebagai sistem deklaratif, non-generatif, saya pribadi selalu memilah-milah pengetikan dalam sistem seperti Montague Semantics dari pengetikan dalam bahasa pemrograman.
Tahu teori
+1. "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Steve
1
Ini tidak sepenuhnya benar tentang riwayat "jenis". Mereka bahkan lebih tua dari karya Gereja tentang lambda-calculus. Russell menggunakan tipe-tipe untuk menghindari paradoks dalam konstruksi teori himpunan.
Sam Tobin-Hochstadt
1
@ SamTobin-Hochstadt, ya, benar. Saya hanya berbicara tentang bagian dari sejarah yang secara langsung berkaitan dengan dasar-dasar PL. Saya akan mengklarifikasi.
Andreas Rossberg
68

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.

Norman Ramsey
sumber
12
Saya pikir ada masalah yang lebih luas di CS (termasuk akademisi) bahwa nama digunakan tanpa definisi yang ketat. Ini sangat kontras dengan matematika dan ilmu (kebanyakan?). Sejumlah besar perselisihan (misalnya tentang OOP) tampaknya berasal dari kurangnya definisi yang tepat. Sangat menyebalkan.
Konrad Rudolph
2
@KonradRudolph: Saya bertanya-tanya apakah, alih-alih perselisihan yang timbul dari kurangnya definisi yang tepat, kurangnya definisi yang tepat mungkin muncul sebagian dari perselisihan. Beberapa istilah memperoleh valensi emosional (baik itu positif atau negatif), dan para pendukung bahasa tertentu kemudian mendefinisikan istilah-istilah itu dengan cara yang termasuk atau mengecualikan bahasa mereka (dan mengecualikan atau memasukkan bahasa "musuh" favorit mereka). Sebagai contoh matematika - jika masih ada orang yang mendukung teori himpunan naif atas teori himpunan aksiomatik, Anda dapat yakin bahwa mereka akan menyebut pandangan mereka sendiri "teori himpunan aksiomatik" dan mendefinisikan "naif"
ruakh
4
@Norman, saya terkejut Anda menyebutnya penyalahgunaan - seperti yang Anda tahu, gagasan tentang jenis mendahului apa yang disebut bahasa yang diketik secara dinamis selama beberapa dekade, dan apa yang disebut "jenis" terakhir tidak ada hubungannya dengan yang sebelumnya. Jadi saya pikir adil untuk mengatakan bahwa penyalahgunaannya adalah sebaliknya.
Andreas Rossberg
5
@Norman: Ketika datang ke bahasa pemrograman, dan terutama mengetik sistem, jika Anda merasa informasi di Wikipedia berkualitas buruk, jangan tinggalkan itu sendirian dan memperbaikinya. (hanya trolling)
Gyom
3
@Gyom saya menyerah meningkatkan Wikipedia pada hari saya menyadari bahwa proses Wikipedian memberi imbalan perubahan , bukan keahlian . Waktu saya lebih baik dihabiskan untuk memperbaiki SO :-)
Norman Ramsey
43

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:

Bahasa tanpa sistem tipe statis biasanya disebut bahasa yang tidak diketik (atau bahasa yang diketik secara dinamis ). Bahasa-bahasa tersebut termasuk Skema dan dialek-dialek Lisp, Smalltalk, dan sebagian besar bahasa scripting lainnya seperti Perl, Python, dan Ruby. Perhatikan, bagaimanapun, bahwa bahasa yang tidak diketik tidak selalu memungkinkan program merusak data — ini hanya berarti bahwa semua pemeriksaan keamanan dilakukan pada waktu pelaksanaan. [...]

[ 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:

[...] Ini adalah mekanisme penyembunyian informasi utama banyak bahasa yang tidak diketik. Misalnya Skema PLT [4] menggunakan generatif structs, [...]

- Jacob Matthews dan Amal Ahmed, 2008 [ tautan ]

[...], kami menyajikan analisis waktu pengikatan untuk bahasa fungsional yang tidak diketik [...]. [...] Ini telah diimplementasikan dan digunakan dalam evaluator parsial untuk dialek bebas efek samping Skema. Analisisnya cukup umum, namun, valid untuk bahasa fungsional yang diketik tidak ketat seperti Haskell. [...]

- 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:

Saya kemudian menyadari bahwa sebenarnya tidak ada sirkularitas, karena bahasa yang diketik secara dinamis bukanlah bahasa yang tidak diketik - hanya saja jenisnya biasanya tidak langsung langsung terlihat dari teks program.

- seseorang (saya tidak tahu siapa), 1998 [ tautan ]

tetapi jelas sebagian besar orang yang menolak identifikasi ini tidak akan merasa perlu untuk mengatakannya secara eksplisit.

ruakh
sumber
2
Wow. Mengejutkan. Terimakasih atas infonya.
afrischke
Jenis kutipan yang saya cari, terima kasih! Agak membuatku takut bahwa buku ini memiliki rata-rata 2 bintang di Amazon meskipun begitu banyak kutipan yang disambut, tetapi ini adalah awal yang baik.
Peter Cooper
@PeterCooper: Saya telah mengedit jawaban saya untuk menambahkan lebih banyak kutipan. Mereka menghindari masalah peringkat Amazon dengan berasal dari makalah yang diterbitkan: untuk semua yang saya tahu, mereka mungkin masih sampah, tapi setidaknya kita tidak perlu khawatir tentang Amazon mengatakannya kepada kita. :-P
ruakh
Membingungkan "tidak diketik" dengan "diketik secara dinamis" tidak logis. Pengembang tidak boleh tidak logis.
rotman
10

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 xbisa 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 menerapkan xargumen dan browser harus memeriksa saat runtime yang xmerupakan fungsi.

Adam Mihalcin
sumber
AFAIK Masalah yang sama berlaku untuk ekspresi Lambda. Meskipun Anda mungkin dapat melewati fungsi untuk "posisi saya saat ini" ke dalam fungsi yang menghitung "jarak saya dari target" Anda juga bisa melewati fungsi "posisi saya sekarang" yang sama ke dalam fungsi yang menghitung "engah ditambah dengan vicks lebih baik untuk hidungmu ". Hanya karena Anda tidak dapat berarti itu valid - seperti halnya dengan sistem dinamis apa pun.
Steve
5
@Steve Sampah dalam sampah adalah kasus untuk bahasa pemrograman apa pun, dan tidak terkait dengan gagasan jenis. Bahkan dalam bahasa yang sangat diketik seperti OCaml atau SML saya dapat melewati Kutub Utara ke fungsi yang menghitung "jarak saya dari target" (dan tidak, posisi saya saat ini bukan Kutub Utara).
Adam Mihalcin
Hanya ingin menambahkan, untuk orang-orang di luar akademia: hal-hal seperti perakitan juga akan dianggap sebagai tanpa huruf.
CoffeeTableEspresso
6

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
5
Saya pikir perbedaan utama bukan antara nilai dan variabel , tetapi antara nilai dan ekspresi : Dalam bahasa yang diketik secara statis, ekspresi memiliki tipe, sedangkan dalam bahasa yang diketik secara dinamis, hanya nilai yang melakukannya. (Nama variabel adalah satu jenis ekspresi, tentu saja.)
ruakh
4

Pertanyaan ini semua tentang Semantik

Jika saya memberi Anda data ini: 12apa 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)menghasilkan 109yang 12ditambah nilai ascii dari a).

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 uints - Anda dapat melakukan dan melewatkan apa pun yang Anda inginkan - dan nilai-nilai hanya akan ditafsirkan sebagai uints. Dalam pengertian itu C "tidak diketik" (jika Anda memperlakukannya sedemikian rupa).

Namun - dan sampai pada poin Brendan - jika saya katakan bahwa "Umur saya 12" - maka 12ada 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 ICreatureWithArmsatau 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.

Steve
sumber
4
-1. Pertanyaannya menanyakan apakah kata tertentu digunakan, dalam lingkaran tertentu, dengan makna tertentu, dan respons Anda adalah untuk menjelaskan bahwa itu adalah pertanyaan apakah kata tersebut memiliki makna itu? Sungguh, saya pikir Anda telah melakukan pekerjaan yang mengagumkan menjelaskan segala sesuatu yang OP tampaknya sudah tahu, tanpa menambahkan sesuatu yang baru sama sekali. . .
ruakh
Sepertinya ada beberapa pertanyaan yang diperlukan untuk membangun definisi, mungkin? Yaitu penegakan tipe (statis atau dinamis) dan keberadaan jenis yang ditentukan. Jadi JavaScript memiliki tipe tetapi dapat dianggap "tidak diketik" karena kurangnya memeriksa validitas jenis sebelum melakukan operasi?
Peter Cooper
@ruakh - Saya bisa mengerti perspektif Anda. Namun, OP bertanya: is there something deeper to this that I am missingdan, 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.
Steve
@PeterCooper - Lihat hasil edit saya dan beri tahu saya jika itu menambah sesuatu untuk Anda (karena Anda mengatakan JavaScript has typesdalam balasan Anda).
Steve
2
'Jelas, apakah Javascript memiliki pemahaman tentang "tipe" atau tidak sama sekali tidak relevan.' Tidak benar. Seperti yang saya mengisyaratkan dalam jawaban saya, apa pun konteksnya, Anda tidak dapat memperlakukan 12 sebagai fungsi. Karena JavaScript memang memiliki tipe fungsi (atau, tergantung pada sudut pandang Anda, beberapa tipe fungsi), ini merupakan perbedaan penting.
Adam Mihalcin
4

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

Dave Mason
sumber
Terpilih. Senang mengetahui "semua bahasa yang diketik secara dinamis adalah tipe-aman". "Tetapi hal yang sama tidak berlaku untuk bahasa yang diketik secara statis", apakah maksud Anda bahwa semua atau sebagian besar bahasa yang diketik secara statis adalah tipe-tidak aman?
Tim
Terpilih. (1) Senang mengetahui "semua bahasa yang diketik secara dinamis adalah tipe-aman", tetapi Javascript diketik secara dinamis dan diketik dengan lemah, lihat stackoverflow.com/questions/964910/… . (2) "Tetapi hal yang sama tidak berlaku untuk bahasa yang diketik secara statis", apakah maksud Anda bahwa semua atau sebagian besar bahasa yang diketik secara statis adalah tipe-tidak aman?
Tim
Sangat sedikit bahasa yang aman secara tipe statis, jika Anda menyertakan kemungkinan kegagalan pemeran, subskrip out-of-bounds, atau pengecualian null-pointer sebagai tipe (dan kebanyakan orang memasukkan setidaknya kegagalan cor sebagai kesalahan ketik). Karat, misalnya, lebih aman jenis statis daripada Java karena Anda tidak dapat memiliki pointer nol. Java aman secara dinamis karena Anda mendapatkan pengecualian untuk operasi ilegal dan semuanya ditentukan (kecuali untuk metode asli). Demikian pula Karat (kecuali kode "tidak aman" yang ditentukan).
Dave Mason
Namun, C ++, C bahkan tidak aman secara dinamis karena ada bagian bahasa yang "tidak ditentukan", dan jika Anda melakukan salah satu dari operasi "tidak ditentukan", secara harfiah apa pun adalah respons hukum dari bahasa tersebut (nilai variabel yang tidak terkait dapat ubah, virus bisa menginfeksi program Anda, program bisa menulis di seluruh disk Anda dan kemudian crash, program itu bahkan bisa melakukan apa yang Anda harapkan :-).
Dave Mason
@DaveMason: Tidak terdefinisi. Ada perbedaan besar antara "tidak ditentukan" dan "tidak terdefinisi" dalam C. Perilaku tidak terdefinisi pada dasarnya adalah hal-hal ilegal yang dapat melakukan apa yang telah Anda gambarkan --- sementara pada dasarnya tidak ditentukan berarti "ditentukan implementasi" di mana implementasi tidak harus mendokumentasikannya. "(ada beberapa nuansa di sana-sini, jadi ini adalah penyederhanaan). Memanggil perilaku yang tidak ditentukan dengan demikian sangat legal (pada kenyataannya, seseorang melakukannya setiap kali seseorang menulis, katakanlah, panggilan fungsi).
Tim Čas
2

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

afrischke
sumber
1
Assembler memang memiliki beberapa gagasan tipe yang sangat lemah. Setidaknya di x86, semuanya bilangan bulat, tetapi beberapa bilangan bulat berbeda ukurannya dari yang lain. Itu bahkan sebelum masuk ke MMX, x87, dan ekstensi lainnya ke spesifikasi x86 asli.
Adam Mihalcin
Saya harus tidak setuju. Dalam Javascript saya dapat memiliki objek yang telah saya bangun untuk menjadi "Monyet" dan objek yang saya bangun 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 itu 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.
Steve
@Adam Mihalcin Benar. [Makro] bahasa rakitan tentu saja dapat memiliki beberapa gagasan tipe hingga berbagai tingkatan juga. (Lihat "Typed Assembly Language" misalnya.) Saya masih berpikir maksud saya.
afrischke
3
@Steve Saya tidak yakin apakah saya bisa mengikuti Anda. OP bertanya apakah dalam lingkaran CS tidak ada perbedaan yang dibuat antara "diketik secara dinamis" dan "tidak diketik". Ini tidak ada hubungannya dengan apakah Anda percaya bahwa praktis tidak ada perbedaan antara bagaimana Javascript vs rakitan memperlakukan bit dalam memori. Menurut apa yang saya baca (dan saya harus mencari ini secara khusus karena saya bukan programmer Javascript): Standar ECMAScript / Javascript mendefinisikan 6 tipe data (Boolean, String, Undefined, Number, Null, dan Object) dan pada titik mana pun pada waktunya nilainya dari satu jenis konkret ...
afrischke
1
... Sekarang ini adalah konsep (kebanyakan) bahasa rakitan tidak memiliki (semua ada bit dan byte), jadi imho ini menandai perbedaan yang jelas antara Javascript dan rakitan.
afrischke
1

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.

Dan Yoder
sumber