"ไม่พิมพ์" หมายถึง "พิมพ์แบบไดนามิก" ในโลกวิชาการ CS หรือไม่


166

ฉันกำลังอ่านสำรับภาพนิ่งที่ระบุว่า "ไม่ได้พิมพ์ JavaScript" สิ่งนี้ขัดแย้งกับสิ่งที่ฉันคิดว่าเป็นจริงดังนั้นฉันจึงเริ่มขุดเพื่อลองและเรียนรู้เพิ่มเติม

ทุกคำตอบของJavaScript เป็นภาษาที่ไม่ได้พิมพ์หรือไม่ บอกว่า JavaScript ไม่ได้ถูกพิมพ์และนำเสนอตัวอย่างของรูปแบบต่างๆของการพิมพ์คงที่แบบไดนามิกที่แข็งแกร่งและอ่อนแอที่ฉันคุ้นเคยและมีความสุขกับ .. ดังนั้นจึงไม่ใช่วิธีที่จะไป

ดังนั้นฉันจึงถามเบรนแดนเอชผู้สร้าง JavaScript และเขาพูดว่า:

ประเภทวิชาการใช้ "untyped" เพื่อหมายถึง "ไม่มีประเภทคงที่" พวกเขาฉลาดพอที่จะเห็นว่าค่ามีประเภท (duh!) บริบทของเรื่อง

กลุ่มวิทยาการคอมพิวเตอร์ที่มุ่งเน้นด้านวิชาการใช้ "untyped" เป็นคำพ้องความหมายของ "การพิมพ์แบบไดนามิก" (และนี่ถูกต้องหรือไม่?) หรือมีบางสิ่งที่ลึกซึ้งกว่านี้ที่ฉันหายไป? ฉันเห็นด้วยกับเบรนแดนว่าบริบทมีความสำคัญ แต่การอ้างอิงใด ๆ ของคำอธิบายจะดีมากเพราะหนังสือ "ไปที่" ปัจจุบันของฉันไม่ได้เล่นบอลในหัวข้อนี้

ฉันต้องการทำสิ่งนี้ลงเพื่อให้ฉันสามารถปรับปรุงความเข้าใจของฉันและเพราะแม้แต่ Wikipedia ก็ไม่ได้อ้างถึงการใช้ทางเลือกนี้ (ที่ฉันสามารถหาได้) ฉันไม่ต้องการยุ่งกับการใช้คำหรือถามถึงการใช้คำในอนาคตถ้าฉันผิด :-)

(ฉันเคยเห็น Smalltalker อันดับต้น ๆ บอกว่า Smalltalk ก็คือ "ไม่พิมพ์" เช่นกันดังนั้นมันจึงไม่ใช่ครั้งเดียวซึ่งเป็นสิ่งที่ทำให้ฉันออกจากภารกิจนี้! :-))


5
การใช้คำศัพท์ในทางที่ผิดของผู้อื่นไม่จำเป็นต้องกำหนดนิสัยของคุณ - เพียงแค่ใช้วลีที่ถูกต้อง (เพิ่มเติม) คุณต้องตระหนักถึงปัญหาในการอ่านอย่างชัดเจน
Raphael

2
ฉันมักจะใช้มันเป็นตัวแปรที่ไม่มีการพิมพ์ในที่ตัวแปรใด ๆ สามารถเก็บข้อมูลประเภทใด ๆ ประเภทของสิ่งที่อยู่ในตัวแปรสามารถเปลี่ยนแบบไดนามิก
Izkata


1
นอกจากนี้ (พูดอีกครั้งเกี่ยวกับภาษาธรรมชาติมากกว่าภาษาคอมพิวเตอร์) "untyped" = "พิมพ์ครั้งเดียว" (หนึ่งประเภทสำหรับค่าทั้งหมด)
philipxy

คำตอบ:


148

ใช่นี่คือมาตรฐานการปฏิบัติในวรรณคดีเชิงวิชาการ เพื่อทำความเข้าใจมันช่วยให้ทราบว่าความคิดของ "ประเภท" ถูกประดิษฐ์ขึ้นในปี 1930 ในบริบทของแลมบ์ดาแคลคูลัส (อันที่จริงแม้ก่อนหน้านี้ในบริบทของทฤษฎีเซต) ตั้งแต่นั้นมาทั้งสาขาของตรรกะการคำนวณได้เกิดขึ้นที่เรียกว่า "ทฤษฎีประเภท" ทฤษฎีภาษาโปรแกรมขึ้นอยู่กับพื้นฐานเหล่านี้ และในบริบททางคณิตศาสตร์เหล่านี้ "ประเภท" มีความหมายที่เฉพาะเจาะจงและเป็นที่ยอมรับ

คำศัพท์ "การพิมพ์แบบไดนามิก" ถูกคิดค้นขึ้นในภายหลัง - และมันเป็นข้อขัดแย้งในแง่ของการใช้ทางคณิตศาสตร์ทั่วไปของคำว่า "ประเภท"

ตัวอย่างเช่นต่อไปนี้เป็นคำจำกัดความของ "ระบบการพิมพ์" ที่เบนจามินเพียร์ซใช้ในหนังสือเรียนประเภทและภาษาโปรแกรม :

ระบบประเภทเป็นวิธีการทางวากยสัมพันธ์ syntax เพื่อพิสูจน์ว่าไม่มีพฤติกรรมของโปรแกรมบางอย่างโดยการจำแนกวลีตามประเภทของค่าที่คำนวณ

เขายังกล่าวว่า:

บางครั้งคำว่า "คงที่" ถูกเพิ่มเข้ามาอย่างชัดเจน - เราพูดถึง "ภาษาการเขียนโปรแกรมแบบสแตติก" เพื่อแยกความแตกต่างของการวิเคราะห์เวลารวบรวมเรากำลังพิจารณาที่นี่จากการพิมพ์แบบไดนามิกหรือแฝงที่พบในภาษาเช่น Scheme (Sussman and Steele, 1975; Kelsey, Clinger และ Rees, 1998; Dybvig, 1996) ซึ่งมีการใช้แท็กประเภทเวลาทำงานเพื่อแยกแยะความแตกต่างของโครงสร้างในฮีป คำเช่น "พิมพ์แบบไดนามิก" เป็นชื่อที่ไม่เหมาะสมและควรถูกแทนที่ด้วย "ตรวจสอบแบบไดนามิก" แต่การใช้งานเป็นมาตรฐาน

คนส่วนใหญ่ที่ทำงานในสาขานี้ดูเหมือนจะแบ่งปันมุมมองนี้

โปรดทราบว่านี่ไม่ได้หมายความว่า "untyped" และ "พิมพ์แบบไดนามิก" เป็นคำพ้องความหมาย ค่อนข้างว่าหลังเป็นชื่อ (ทำให้เข้าใจผิดทางเทคนิค) สำหรับกรณีเฉพาะของอดีต

PS: และ FWIW ฉันเป็นทั้งนักวิจัยเชิงวิชาการในระบบการพิมพ์และผู้ที่ไม่ได้ใช้งาน JavaScript ดังนั้นฉันต้องอยู่กับความแตกแยก :)


5
มันมีประโยชน์มากและอาจเป็นคำตอบที่ฉันชอบในแง่ของการให้ประวัติบางอย่างกับมัน
Peter Cooper

2
@PeterCooper btw คุณอาจจะสนใจที่จะรู้ว่าหนึ่งสาขาที่สำคัญของความหมายอย่างเป็นทางการคือ predicated (ฮาปุน) ในการพิมพ์แลมบ์ดาแคลคูลัส; เช่นความหมายของ Montague แต่ในฐานะที่เป็นระบบที่ไม่มีการประกาศฉันได้แบ่งการพิมพ์ในระบบเช่น Montague Semantics โดยไม่ต้องพิมพ์ภาษาโปรแกรม
knowtheory

+1 "[dynamically typed] is a (technically misleading) name for a particular case of [untyped]"
Steve

1
สิ่งนี้ไม่ถูกต้องนักเกี่ยวกับประวัติของ "ประเภท" พวกเขายังแก่กว่างานของคริสตจักรในแลมบ์ดาแคลคูลัส รัสเซลใช้ประเภทเพื่อหลีกเลี่ยงความขัดแย้งในการสร้างทฤษฎีเซต
Sam Tobin-Hochstadt

1
@ SamTobin-Hochstadt ใช่แล้ว ฉันแค่พูดถึงส่วนหนึ่งของประวัติศาสตร์ที่เกี่ยวข้องกับรากฐานของ PLs โดยตรง ฉันจะชี้แจง
Andreas Rossberg

68

ฉันเป็นนักวิทยาศาสตร์คอมพิวเตอร์เชิงวิชาการที่มีความเชี่ยวชาญด้านการเขียนโปรแกรมภาษาและใช่คำว่า "untyped" มักใช้ (ผิด) ในลักษณะนี้ มันจะเป็นการดีถ้าคุณจองคำที่ใช้กับภาษาที่ไม่มีแท็กประเภทไดนามิกเช่น Forth และรหัสแอสเซมบลี แต่ภาษาเหล่านี้ไม่ค่อยได้ใช้และยังไม่ค่อยได้เรียนและมันง่ายกว่าที่จะพูดว่า "untyped" กว่า "พิมพ์แบบไดนามิก"

Bob Harper ชอบที่จะพูดว่าภาษาอย่าง Scheme, Javascript และอื่น ๆ ควรได้รับการพิจารณาว่าเป็นภาษาที่พิมพ์ด้วยค่าประเภทเดียว ฉันเอนตัวไปยังมุมมองนี้เพราะมันเป็นไปได้ที่จะสร้างมุมมองโลกที่สอดคล้องกันโดยใช้วิธีการประเภทเดียว

ป.ล. ในแคลคูลัสแลมบ์ดาบริสุทธิ์มีเพียง "ค่านิยม" เท่านั้นคือคำศัพท์ในรูปแบบปกติและคำศัพท์ปิดเฉพาะในรูปแบบปกติคือฟังก์ชัน แต่นักวิทยาศาสตร์ส่วนใหญ่ที่ใช้แคลคูลัสแลมบ์ดาเพิ่มประเภทฐานและค่าคงที่แล้วคุณก็รวมระบบประเภทคงที่สำหรับแลมบ์ดาหรือคุณกลับไปที่แท็กประเภทไดนามิก

PPS สำหรับโปสเตอร์ต้นฉบับ: เมื่อพูดถึงภาษาการเขียนโปรแกรมและโดยเฉพาะอย่างยิ่งระบบประเภทข้อมูลใน Wikipedia นั้นมีคุณภาพไม่ดี อย่าไว้ใจมัน


12
ฉันคิดว่ามีปัญหาในวงกว้างใน CS (รวมถึงสถาบันการศึกษา) ที่ใช้ชื่อโดยไม่มีคำจำกัดความที่เข้มงวด สิ่งนี้ตรงกันข้ามกับคณิตศาสตร์และวิทยาศาสตร์ (ส่วนใหญ่) ข้อพิพาทจำนวนมาก (เช่นเกี่ยวกับ OOP) ดูเหมือนจะเกิดจากการขาดคำจำกัดความที่เหมาะสม น่ารำคาญมาก
Konrad Rudolph

2
@ KonradRudolph: ฉันสงสัยว่ามากกว่าข้อพิพาทที่เกิดขึ้นจากการขาดคำจำกัดความที่เหมาะสมการขาดคำจำกัดความที่เหมาะสมอาจเกิดขึ้นในส่วนหนึ่งจากข้อพิพาท คำบางคำได้รับความรู้สึกทางอารมณ์ (ไม่ว่าจะเป็นบวกหรือลบ) และผู้สนับสนุนของภาษาที่เฉพาะเจาะจงจากนั้นกำหนดคำเหล่านั้นในรูปแบบที่รวมหรือแยกภาษาของพวกเขา (และแยกหรือรวมภาษา "ศัตรู" ที่พวกเขาโปรดปราน) สำหรับตัวอย่างคณิตศาสตร์ - หากยังมีคนที่สนับสนุนทฤษฎีเซตไร้เดียงสาเหนือทฤษฎีเซตจริงซึ่งคุณสามารถมั่นใจได้ว่าพวกเขาจะเรียกมุมมองของตนเองว่า "ทฤษฎีเซตซึ่งเป็นจริง" และกำหนด "ไร้เดียงสา
ruakh

4
@Norman ฉันประหลาดใจที่คุณเรียกมันว่าการใช้ผิดประเภท - ตามที่คุณทราบความคิดของประเภทที่มีมาก่อนที่เรียกว่าภาษาที่พิมพ์แบบไดนามิกในทศวรรษที่ผ่านมาและสิ่งที่เรียกว่า "พิมพ์" หลังมีอะไรจะทำอย่างไรกับอดีต ดังนั้นฉันคิดว่ามันยุติธรรมที่จะบอกว่าการใช้ผิดวิธีเป็นอีกทางหนึ่ง
Andreas Rossberg

5
@Norman: เมื่อพูดถึงภาษาการเขียนโปรแกรมและโดยเฉพาะอย่างยิ่งระบบพิมพ์หากคุณรู้สึกว่าข้อมูลใน Wikipedia มีคุณภาพไม่ดีอย่าปล่อยให้มันอยู่คนเดียวและปรับปรุงมัน (แค่หลอก)
Gyom

3
@Gyom ผมขึ้นปรับปรุงวิกิพีเดียวันที่ฉันตระหนักว่ากระบวนการวิกิพีเดียรางวัลการเปลี่ยนแปลงไม่เชี่ยวชาญ เวลาของฉันใช้เวลาในการปรับปรุง SO :-) ดีขึ้น
นอร์แมนแรมซีย์

43

ฉันได้ตรวจสอบแล้วและพบว่าคำตอบสำหรับคำถามของคุณนั้นเรียบง่ายและน่าประหลาดใจที่ "ใช่": ประเภทนักวิชาการ CS หรืออย่างน้อยก็บางคนใช้ "untyped" เพื่อหมายถึง "พิมพ์แบบไดนามิก" ตัวอย่างเช่นภาษาการเขียนโปรแกรม: หลักการและวิธีปฏิบัติรุ่นที่สาม (โดย Kenneth C. Louden และ Kenneth A. Lambert เผยแพร่เมื่อปี 2012) กล่าวว่า:

ภาษาที่ไม่มีระบบชนิดสแตติกมักเรียกว่าภาษาที่ไม่พิมพ์ (หรือภาษาที่พิมพ์แบบไดนามิก ) ภาษาดังกล่าวรวมถึง Scheme และภาษาถิ่นอื่น ๆ ของ Lisp, Smalltalk และภาษาสคริปต์ส่วนใหญ่เช่น Perl, Python และ Ruby อย่างไรก็ตามโปรดทราบว่าภาษาที่ไม่ได้พิมพ์ไม่จำเป็นต้องอนุญาตให้โปรแกรมทำการข้อมูลที่เสียหายนั่นหมายถึงการตรวจสอบความปลอดภัยทั้งหมดจะดำเนินการในเวลาดำเนินการ [ ... ]

[ ลิงค์ ] (หมายเหตุ: การพับเป็นต้นฉบับ) และจะใช้ "untyped" ด้วยวิธีนี้

ฉันพบสิ่งที่น่าประหลาดใจนี้ (ด้วยเหตุผลเดียวกับที่ afrischke และ Adam Mihalcin มอบให้) แต่คุณอยู่ที่นั่น :-)


แก้ไขเพื่อเพิ่ม:คุณสามารถค้นหาตัวอย่างเพิ่มเติมได้โดยเสียบ"untyped languages"เข้ากับ Google Book Search ตัวอย่างเช่น:

[…] นี่คือกลไกการซ่อนข้อมูลหลักเป็นภาษาที่ไม่มีการพิมพ์จำนวนมาก เช่น PLT Scheme [4] ใช้ generative structs, […]

- Jacob Matthews และ Amal Ahmed, 2008 [ ลิงค์ ]

[…], เรานำเสนอการวิเคราะห์เวลาผูกพันสำหรับภาษาฟังก์ชันที่ไม่พิมพ์ […] […] มันถูกนำไปใช้และถูกนำไปใช้ในผู้ประเมินผลบางส่วนสำหรับภาษาถิ่นของ Scheme อย่างไรก็ตามการวิเคราะห์นั้นเป็นเรื่องทั่วไปเพียงพอที่จะถูกต้องสำหรับภาษาที่ใช้งานไม่ได้เช่น Haskell [ ... ]

- Charles Consel, 1990 [ ลิงค์ ]

โดยวิธีการที่ความประทับใจของฉันหลังจากดูผลการค้นหาเหล่านี้คือว่าถ้านักวิจัยเขียนภาษาทำงาน "untyped" เขามีแนวโน้มที่จะถือว่าเป็น "untyped" ในลักษณะเดียวกับแลมบ์ดาที่ไม่มีการพิมพ์ แคลคูลัสที่ Adam Mihalcin กล่าวถึง อย่างน้อยนักวิจัยหลายคนพูดถึง Scheme และแคลคูลัสแลมบ์ดาในลมหายใจเดียวกัน

สิ่งที่การค้นหาไม่ได้พูดคือมีนักวิจัยที่ปฏิเสธบัตรประจำตัวนี้หรือไม่และไม่ถือว่าภาษาเหล่านี้เป็น "untyped" ฉันพบสิ่งนี้:

ฉันรู้แล้วว่าไม่มีการเวียนวนเพราะภาษาที่พิมพ์แบบไดนามิกไม่ใช่ภาษาที่ไม่พิมพ์ - เป็นเพียงประเภทที่มักจะไม่ชัดเจนทันทีจากข้อความของโปรแกรม

- ใครบางคน (ฉันไม่สามารถบอกได้ว่าใคร), 1998 [ ลิงค์ ]

แต่เห็นได้ชัดว่าคนส่วนใหญ่ที่ปฏิเสธตัวตนนี้จะไม่รู้สึกว่าจำเป็นต้องพูดอย่างชัดเจน


2
ว้าว. ตกตะลึง ขอบคุณสำหรับข้อมูล.
afrischke

การเรียงลำดับของการอ้างอิงที่ฉันกำลังมองหาขอบคุณ! คินด้าทำให้ฉันกลัวว่าหนังสือเล่มนี้มีค่าเฉลี่ย 2 ดาวในอเมซอน แต่ก็มีการอ้างอิงที่น่ายินดีมากกว่านี้ แต่นี่เป็นการเริ่มต้นที่ยอดเยี่ยม
Peter Cooper

@PeterCooper: ฉันได้แก้ไขคำตอบของฉันเพื่อเพิ่มการอ้างอิงเพิ่มเติม พวกเขาหลีกเลี่ยงปัญหาการให้คะแนนของอเมซอนโดยมาจากเอกสารที่ตีพิมพ์: สำหรับสิ่งที่ฉันรู้พวกเขาอาจยังคงเป็นถังขยะ แต่อย่างน้อยเราก็ไม่ต้องกังวลกับอเมซอนที่บอกเรา :-P
ruakh

สับสน "ไม่พิมพ์" กับ "พิมพ์แบบไดนามิก" เป็นไร้เหตุผล นักพัฒนาไม่ควรมีเหตุผล
rotman

10

การพิมพ์และพิมพ์แบบไดนามิกนั้นไม่ใช่คำพ้องความหมาย ภาษาที่มักถูกเรียกว่า "untyped" คือแลมบ์ดาแคลคูลัสซึ่งจริงๆแล้วเป็นภาษาที่ไม่มีการพิมพ์ - ทุกอย่างเป็นฟังก์ชั่นดังนั้นเราจึงสามารถพิสูจน์ได้ว่าประเภทของทุกสิ่งเป็นฟังก์ชั่น ภาษาที่พิมพ์แบบไดนามิกมีหลายประเภท แต่ไม่ได้เพิ่มวิธีสำหรับคอมไพเลอร์เพื่อตรวจสอบพวกเขาแบบคงที่บังคับให้คอมไพเลอร์เพื่อแทรกการตรวจสอบรันไทม์กับประเภทตัวแปร

จากนั้น JavaScript เป็นภาษาที่พิมพ์แบบไดนามิก: มันเป็นไปได้ที่จะเขียนโปรแกรมใน JavaScript เพื่อให้ตัวแปรบางอย่างxอาจเป็นตัวเลขหรือฟังก์ชั่นหรือสตริงหรืออย่างอื่น (และการพิจารณาว่าใครจะต้องแก้ปัญหา Halting หรือบางอย่าง ปัญหาทางคณิตศาสตร์อย่างหนัก) ดังนั้นคุณสามารถนำxไปใช้กับการโต้แย้งและเบราว์เซอร์จะต้องตรวจสอบที่รันไทม์ที่xเป็นฟังก์ชั่น


AFAIK ปัญหาเดียวกันนี้ใช้กับนิพจน์แลมบ์ดา ในขณะที่คุณสามารถส่งผ่านฟังก์ชั่นสำหรับ "ตำแหน่งปัจจุบันของฉัน" ไปยังฟังก์ชันที่คำนวณ "ระยะทางจากเป้าหมาย" ของคุณคุณสามารถส่งผ่านฟังก์ชัน "ตำแหน่งปัจจุบันของฉัน" ไปยังฟังก์ชันที่คำนวณ "เดียวกันได้ สำหรับจมูกของคุณ " เพียงเพราะคุณไม่สามารถบอกได้ว่ามันใช้ได้ - เช่นเดียวกับระบบไดนามิกใด ๆ
Steve

5
@Steve Garbage in ขยะออกเป็นกรณีสำหรับภาษาการเขียนโปรแกรมใด ๆ และไม่เกี่ยวข้องกับความคิดของประเภท แม้ในภาษาที่พิมพ์ออกมาอย่างรุนแรงเช่น OCaml หรือ SML ฉันสามารถส่งขั้วโลกเหนือไปยังฟังก์ชันที่คำนวณ "ระยะทางจากเป้าหมายของฉัน" (และไม่ได้ตำแหน่งปัจจุบันของฉันไม่ใช่ขั้วโลกเหนือ)
Adam Mihalcin

แค่อยากจะเพิ่มสำหรับคนที่อยู่นอกสถาบันการศึกษา: สิ่งต่าง ๆ เช่นการชุมนุมจะนับเป็น untyped
CoffeeTableEspresso

6

ข้อความทั้งสองถูกต้องขึ้นอยู่กับว่าคุณกำลังพูดถึงค่าหรือตัวแปร ตัวแปร JavaScript ถูกยกเลิกการพิมพ์ค่า JavaScript มีประเภทและตัวแปรสามารถอยู่เหนือประเภทของค่าใด ๆ ที่รันไทม์ (เช่น 'แบบไดนามิก')

ใน JavaScript และภาษาอื่น ๆ อีกมากมายค่าและไม่ใช่ตัวแปรมีชนิด ตัวแปรทั้งหมดสามารถครอบคลุมค่าทุกประเภทและอาจถูกพิจารณาว่าเป็น "พิมพ์แบบไดนามิก" หรือ "ไม่พิมพ์" - จากมุมมองของการตรวจสอบชนิดของตัวแปรที่ไม่มีประเภท / ไม่รู้จักและตัวแปรที่สามารถใช้ชนิดใด ๆ . เมื่อนักทฤษฎีประเภทพูดคุยเกี่ยวกับภาษาและประเภทพวกเขามักจะพูดถึงเรื่องนี้ - ตัวแปรที่มีประเภท - เพราะพวกเขามีความสนใจในการเขียนตัวตรวจสอบชนิดและคอมไพเลอร์และอื่น ๆ ซึ่งทำงานกับข้อความของโปรแกรม (เช่นตัวแปร) (เช่นค่า)

ในทางตรงกันข้ามภาษาอื่น ๆ เช่น C ตัวแปรจะมีชนิด แต่ค่าไม่ได้ ในภาษาเช่น Java ตัวแปรและค่าทั้งสองชนิดพกพา ใน C ++ บางค่า (ผู้ที่มีฟังก์ชั่นเสมือน) และชนิดอื่น ๆ ไม่ได้ ในบางภาษาอาจเป็นไปได้ที่ค่าเปลี่ยนประเภทถึงแม้ว่านี่จะถือว่าเป็นการออกแบบที่ไม่ดี


5
ฉันคิดว่าความแตกต่างที่สำคัญไม่ได้อยู่ระหว่างค่าและตัวแปรแต่ระหว่างค่าและการแสดงออก : ในภาษาที่พิมพ์แบบคงที่นิพจน์มีประเภทในขณะที่ในภาษาที่พิมพ์แบบไดนามิกค่าเพียงทำ (ชื่อตัวแปรเป็นหนึ่งในประเภทของการแสดงออกแน่นอน)
ruakh

4

คำถามนี้เกี่ยวกับความหมาย

ถ้าฉันให้ข้อมูลนี้กับคุณ: 12มันคือประเภทอะไร? คุณไม่มีทางรู้แน่ ๆ อาจเป็นจำนวนเต็ม - อาจเป็นแบบลอยตัว - อาจเป็นสตริง ในแง่นั้นมันเป็นข้อมูลที่ "ไม่ได้พิมพ์" อย่างมาก

ถ้าฉันให้ภาษาจินตภาพแก่คุณซึ่งให้คุณใช้โอเปอเรเตอร์เช่น "เพิ่ม", "ลบ" และ "ต่อ" กับข้อมูลนี้และข้อมูลอื่นโดยพลการบางอย่าง "ประเภท" ค่อนข้างไม่เกี่ยวข้อง (กับภาษาจินตภาพของฉัน) (ตัวอย่าง : อาจadd(12, a)ให้ผลบวก109ซึ่งเป็น12ค่า ascii ของa)

มาคุย C กันสักครู่ C ช่วยให้คุณทำสิ่งที่คุณต้องการด้วยข้อมูลส่วนใดก็ได้ หากคุณกำลังใช้ฟังก์ชั่นที่ใช้เวลาสองuints - คุณสามารถโยนและผ่านสิ่งที่คุณต้องการ - และค่าก็จะถูกตีความว่าเป็นuints ในแง่นี้ C คือ "untyped" (หากคุณปฏิบัติต่อมันในลักษณะดังกล่าว)

อย่างไรก็ตาม - และไปถึงจุดที่เบรนแดน - ถ้าฉันบอกคุณว่า "อายุของฉันคือ12" - แล้วก็12มีประเภท - อย่างน้อยเราก็รู้ว่ามันเป็นตัวเลข ด้วยบริบททุกอย่างมีประเภท - โดยไม่คำนึงถึงภาษา

นี่คือเหตุผลที่ฉันพูดตอนเริ่มต้น - คำถามของคุณเป็นหนึ่งในความหมาย ความหมายของ "untyped" คืออะไร? ฉันคิดว่าเบรนแดนกระทบเล็บที่หัวเมื่อเขาพูดว่า "ไม่มีรูปแบบคงที่" - เพราะนั่นคือทั้งหมดที่อาจหมายถึง มนุษย์จำแนกสิ่งต่าง ๆ ตามประเภท เรารู้โดยสัญชาตญาณว่ามีบางสิ่งบางอย่างที่แตกต่างกันโดยพื้นฐานระหว่างรถยนต์กับลิง - โดยไม่ได้รับการสอนให้สร้างความแตกต่างเหล่านั้น

กลับไปที่ตัวอย่างของฉันในตอนแรก - ภาษาที่ "ไม่สนใจประเภท" (ต่อ se) อาจให้คุณ "เพิ่ม" อายุ "และ" ชื่อ "โดยไม่มีข้อผิดพลาดทางไวยากรณ์ ... แต่ ไม่ได้หมายความว่าเป็นการทำงานที่มีเหตุผล

Javascript อาจอนุญาตให้คุณทำสิ่งที่บ้าทุกประเภทโดยไม่คำนึงถึง "ข้อผิดพลาด" ไม่ได้หมายความว่าสิ่งที่คุณกำลังทำนั้นฟังดูมีเหตุผล ขอบคุณสำหรับนักพัฒนาในการทำงาน

เป็นระบบ / ภาษาที่ไม่บังคับใช้ความปลอดภัยของประเภทในเวลารวบรวม / สร้าง / ตีความ "untyped" หรือ "พิมพ์แบบไดนามิก"?

อรรถศาสตร์

แก้ไข

ฉันต้องการเพิ่มบางสิ่งบางอย่างที่นี่เพราะบางคนดูเหมือนจะติดกับ "ใช่ แต่ Javascript มี" ประเภท "บางส่วน

ในความคิดเห็นของฉันเกี่ยวกับคำตอบของคนอื่นฉันพูดว่า:

ใน Javascript ฉันสามารถมีวัตถุที่ฉันสร้างขึ้นเพื่อเป็น "Monkeys" และวัตถุที่ฉันสร้างขึ้นเพื่อเป็น "มนุษย์" และฟังก์ชั่นบางอย่างอาจได้รับการออกแบบมาเพื่อทำงานกับ "มนุษย์" เท่านั้นส่วนอื่น ๆ ใน "Monkeys" เท่านั้นและ แต่คนอื่น ๆ เพียง "สิ่งที่มีอาวุธ" ไม่ว่าภาษาจะมีการบอกหรือไม่ก็ตามมีหมวดหมู่ของวัตถุว่า "สิ่งที่มีอาวุธ" นั้นไม่เกี่ยวข้องกับการประกอบ ("ไม่พิมพ์") เหมือนกับ Javascript ("ไดนามิก") มันเป็นเรื่องของความซื่อสัตย์ตรรกะ - และข้อผิดพลาดเพียงอย่างเดียวจะใช้สิ่งที่ไม่มีอาวุธด้วยวิธีการนั้น

ดังนั้นหากคุณคิดว่า Javascript มี "ความคิดประเภท" ภายใน - และด้วยเหตุนี้ "ไดนามิกประเภท" - และคิดว่านี่เป็น "แตกต่างอย่างชัดเจนจากระบบที่ไม่มีการพิมพ์" - คุณควรเห็นจากตัวอย่างด้านบนว่า ประเภท "มันมีภายในไม่เกี่ยวข้องจริงๆ

เพื่อทำการดำเนินการเดียวกันกับ C # เช่นฉันต้องการอินเทอร์เฟซที่เรียกว่าICreatureWithArmsหรือสิ่งที่คล้ายกัน ไม่เช่นนั้นใน Javascript - ไม่ใช่ใน C หรือ ASM

เห็นได้ชัดว่า Javascript มีความเข้าใจเกี่ยวกับ "ประเภท" ใด ๆ หรือไม่นั้นไม่เกี่ยวข้องเลย


4
-1 คำถามจะถามว่ามีการใช้คำบางคำในวงกลมที่มีความหมายบางอย่างหรือไม่และการตอบสนองของคุณคือการอธิบายว่าเป็นคำถามว่าคำนั้นมีความหมายนั้นหรือไม่? จริง ๆ ฉันคิดว่าคุณทำงานที่น่าชื่นชมอธิบายทุกอย่างที่ OP ดูเหมือนว่าจะรู้แล้วโดยไม่ต้องเพิ่มอะไรใหม่เลย . .
ruakh

ดูเหมือนว่ามีคำถามหลายข้อที่จำเป็นในการสร้างคำจำกัดความบางที? ประเภทของการบังคับใช้ประเภท (แบบคงที่หรือแบบไดนามิก) และการปรากฏตัวของประเภทที่กำหนดไว้ ดังนั้น JavaScript จึงมีประเภท แต่สามารถพิจารณาว่า "ไม่พิมพ์" เนื่องจากไม่มีการตรวจสอบความถูกต้องของประเภทก่อนดำเนินการหรือไม่
Peter Cooper

@ruakh - ฉันเข้าใจมุมมองของคุณ อย่างไรก็ตาม OP ถาม: is there something deeper to this that I am missingและฉันคิดว่าล้มเหลวที่จะเข้าใจว่ามันเป็นปัญหาความหมายคือสิ่งที่ลึก - ดังนั้นฉันจึงพยายามอย่างดีที่สุดที่จะชิปในสิ่งที่ชิ้นอาหารอันโอชะที่ฉันสามารถทำได้
Steve

@PeterCooper - ดูการแก้ไขของฉันและบอกฉันว่าจะเพิ่มอะไรให้คุณหรือไม่ (นับตั้งแต่ที่คุณพูดJavaScript has typesในการตอบของคุณ)
Steve

2
'เห็นได้ชัดว่า Javascript มีความเข้าใจเกี่ยวกับ "ประเภท" ใด ๆ หรือไม่นั้นไม่เกี่ยวข้อง' ไม่จริง. ตามที่ฉันได้บอกใบ้ไว้ในคำตอบของฉันไม่ว่าบริบทจะเป็นอย่างไรคุณไม่สามารถทำหน้าที่เป็น 12 ได้ เนื่องจาก JavaScript มีประเภทฟังก์ชั่น (หรือขึ้นอยู่กับมุมมองของคุณฟังก์ชั่นหลายประเภท) นี่คือความแตกต่างที่สำคัญ
Adam Mihalcin

4

ในขณะที่มันเป็นความจริงที่นักวิจัย CS ส่วนใหญ่ที่เขียนเกี่ยวกับประเภทพิจารณาเฉพาะภาษาที่มีประเภท syntactically - derivations เป็นภาษาพิมพ์มีจำนวนมากของเราใช้ภาษาแบบไดนามิก / แฝงที่แฝงที่ใช้ความโกรธ

ฉันพิจารณาว่ามี 3 ประเภท [SIC] ของภาษา:

Untyped - มีเพียงผู้ประกอบการเท่านั้นที่กำหนดการตีความค่า - และโดยทั่วไปแล้วจะทำงานกับอะไร ตัวอย่าง: Assembler, BCPL

พิมพ์แบบคงที่ - การแสดงออก / ตัวแปรมีประเภทที่เกี่ยวข้องกับพวกเขาและประเภทที่กำหนดการตีความ / ความถูกต้องของผู้ประกอบการที่รวบรวมเวลา ตัวอย่าง: C, Java, C ++, ML, Haskell

พิมพ์แบบไดนามิก - ค่ามีประเภทที่เกี่ยวข้องกับพวกเขาและประเภทนั้นกำหนดการตีความ / ความถูกต้องของผู้ประกอบการในเวลาทำงาน ตัวอย่าง: LISP, Scheme, Smalltalk, Ruby, Python, Javascript

สำหรับความรู้ของฉันภาษาที่พิมพ์แบบไดนามิกทั้งหมดจะปลอดภัยต่อผู้ใช้ - เช่นผู้ให้บริการที่ถูกต้องเท่านั้นที่สามารถทำงานกับค่า แต่สิ่งนี้ไม่เป็นความจริงสำหรับภาษาที่พิมพ์แบบคงที่ ขึ้นอยู่กับพลังของระบบประเภทที่ใช้ตัวดำเนินการบางอย่างอาจถูกตรวจสอบในเวลาทำงานเท่านั้นหรือไม่ได้เลย ตัวอย่างเช่นภาษาที่พิมพ์แบบสแตติกส่วนใหญ่จะไม่จัดการกับจำนวนเต็มล้นอย่างเหมาะสม (การเพิ่มจำนวนเต็มบวก 2 ตัวสามารถสร้างจำนวนเต็มลบได้) และการอ้างอิงอาร์เรย์ที่ไม่อยู่ในขอบเขตไม่ได้ถูกตรวจสอบเลย (C, C ++) หรือ เวลาทำงาน นอกจากนี้ระบบประเภทบางประเภทยังอ่อนแอจนการเขียนโปรแกรมที่มีประโยชน์ต้องใช้ช่องทางหลบหนี (ปลดเปลื้องใน C และตระกูล) เพื่อเปลี่ยนประเภทของเวลาคอมไพล์ของนิพจน์

ทั้งหมดนี้นำไปสู่การอ้างสิทธิ์ที่ไร้สาระเช่น C ++ นั้นปลอดภัยกว่า Python เพราะ (พิมพ์แบบสแตติก) ในขณะที่ความจริงก็คือ Python ปลอดภัยอย่างแท้จริงในขณะที่คุณสามารถยิงขาของคุณด้วย C ++


upvoted ดีใจที่ได้ทราบว่า "ทุกภาษาที่พิมพ์แบบไดนามิกนั้นปลอดภัยต่อการใช้งาน" "แต่สิ่งเดียวกันนั้นไม่เป็นความจริงสำหรับภาษาที่พิมพ์แบบคงที่" คุณหมายถึงว่าภาษาที่พิมพ์แบบคงที่ทั้งหมดหรือส่วนใหญ่เป็นประเภทที่ไม่ปลอดภัยหรือไม่
ทิม

upvoted (1) ดีใจที่ได้รู้ว่า "ภาษาแบบไดนามิกพิมพ์ทุกชนิดปลอดภัย" แต่ Javascript เป็นพิมพ์แบบไดนามิกและการพิมพ์ที่อ่อนแอเห็นstackoverflow.com/questions/964910/... (2) "แต่สิ่งนี้ไม่เป็นความจริงสำหรับภาษาที่พิมพ์แบบคงที่" คุณหมายถึงว่าภาษาที่พิมพ์แบบคงที่ทั้งหมดหรือส่วนใหญ่เป็นแบบไม่ปลอดภัยหรือไม่
ทิม

มีภาษาเพียงไม่กี่ประเภทที่มีความปลอดภัยแบบสแตติกหากคุณรวมถึงความเป็นไปได้ของความล้มเหลวในการส่งข้อยกเว้นการห้อยออกนอกขอบเขตหรือตัวชี้โมฆะตัวชี้เป็นประเภท (และคนส่วนใหญ่มีความล้มเหลวในการส่ง ยกตัวอย่างเช่นสนิมมีความปลอดภัยต่อการพิมพ์มากกว่าจาวาเพราะคุณไม่สามารถมีตัวชี้โมฆะ Java เป็นประเภทที่ปลอดภัยแบบไดนามิกที่คุณได้รับข้อยกเว้นสำหรับการดำเนินการที่ผิดกฎหมายและมีการระบุทุกอย่าง (ยกเว้นวิธีการเนทิฟ) ในทำนองเดียวกันสนิม (ยกเว้นรหัส "ไม่ปลอดภัย" ซึ่งกำหนดเป็นอย่างอื่น)
Dave Mason

อย่างไรก็ตาม C ++, C ไม่ปลอดภัยแม้กระทั่งแบบไดนามิกเพราะมีส่วนที่ "ไม่ได้ระบุ" ของภาษาและถ้าคุณทำหนึ่งในการดำเนินการ "ไม่ระบุ" สิ่งใดก็ตามที่แท้จริงคือการตอบสนองทางกฎหมายจากภาษา (ค่าของตัวแปรที่ไม่เกี่ยวข้อง การเปลี่ยนแปลงไวรัสอาจติดโปรแกรมของคุณโปรแกรมสามารถเขียนลงดิสก์ของคุณแล้วเกิดความผิดพลาดโปรแกรมสามารถทำสิ่งที่คุณคาดหวัง :-)
Dave Mason

@DaveMason: ไม่ได้กำหนด มีความแตกต่างอย่างมากระหว่าง "ไม่ระบุ" และ "ไม่ได้กำหนด" ใน C. พฤติกรรมที่ไม่ได้กำหนดนั้นเป็นสิ่งผิดกฎหมายที่สามารถทำสิ่งที่คุณอธิบายได้ - ในขณะที่ไม่ได้ระบุหลักหมายถึง "การใช้งานที่กำหนดไว้ "(มีความแตกต่างตรงนี้และตรงนี้, นี่คือการทำให้เข้าใจง่าย) การกล่าวอ้างพฤติกรรมที่ไม่ระบุจึงเป็นสิ่งที่ถูกต้องตามกฎหมายอย่างสมบูรณ์
ทิม Junas

2

ฉันไม่ใช่นักวิทยาศาสตร์คอมพิวเตอร์ แต่ฉันค่อนข้างแปลกใจถ้าใช้ "untyped" ถูกใช้เป็นคำพ้องสำหรับ "พิมพ์แบบไดนามิก" ในชุมชน CS (อย่างน้อยในสิ่งพิมพ์ทางวิทยาศาสตร์) เนื่องจากคำสองคำนี้อธิบายแนวคิดที่แตกต่างกัน ภาษาที่พิมพ์แบบไดนามิกมีความคิดประเภทและบังคับใช้ข้อ จำกัด ประเภทที่รันไทม์ (คุณไม่สามารถยกตัวอย่างเช่นหารจำนวนเต็มด้วยสตริงใน Lisp โดยไม่ได้รับข้อผิดพลาด) ในขณะที่ภาษาที่ไม่มีการพิมพ์ไม่มีความคิดประเภทใด ๆ ทั้งหมด (เช่นแอสเซมเบลอร์) แม้แต่บทความ Wikipedia เกี่ยวกับภาษาการเขียนโปรแกรม (http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) ทำให้ความแตกต่างนี้เกิดขึ้น

อัปเดต: บางทีความสับสนอาจมาจากความจริงที่ว่าบางตำราพูดอะไรบางอย่างในระดับที่ "ตัวแปรไม่ได้พิมพ์" ใน Javascript (ซึ่งเป็นจริง) แต่นั่นไม่ได้หมายความว่าจะไม่มีการพิมพ์ภาษา (ซึ่งจะเป็นเท็จ) โดยอัตโนมัติ


1
แอสเซมเบลอร์มีแนวคิดที่อ่อนแอมาก อย่างน้อยใน x86 ทุกอย่างเป็นจำนวนเต็ม แต่จำนวนเต็มบางตัวมีขนาดแตกต่างจากที่อื่น นั่นคือก่อนที่จะเข้าสู่ MMX, x87 และส่วนขยายอื่น ๆ กับข้อมูลจำเพาะ x86 ดั้งเดิม
Adam Mihalcin

ฉันไม่เห็นด้วย ใน Javascript ฉันสามารถมีวัตถุที่ฉันสร้างขึ้นเพื่อเป็น "Monkeys" และวัตถุที่ฉันสร้างขึ้นเพื่อเป็น "มนุษย์" และฟังก์ชั่นบางอย่างอาจได้รับการออกแบบมาเพื่อทำงานกับ "มนุษย์" เท่านั้นส่วนอื่น ๆ ใน "Monkeys" เท่านั้นและ แต่คนอื่น ๆ ใน "สิ่งต่าง ๆ ด้วยอาวุธ" เท่านั้น ไม่ว่าภาษาจะมีการบอกหรือไม่ก็ตามมีหมวดหมู่ของวัตถุว่า "สิ่งที่มีอาวุธ" นั้นไม่เกี่ยวข้องกับการประกอบ ("ไม่พิมพ์") เหมือนกับ Javascript ("ไดนามิก") มันเป็นเรื่องของความซื่อสัตย์ตรรกะ - และข้อผิดพลาดเพียงอย่างเดียวคือการใช้สิ่งที่ไม่มีอาวุธด้วยวิธีการนั้น
Steve

@ Adam Mihalcin True แน่นอนว่าภาษาแอสเซมบลี [มาโคร] สามารถมีประเภทของความรู้สึกที่หลากหลายได้เช่นกัน (ลองดูตัวอย่าง "ภาษาแอสเซมบลีที่พิมพ์") ฉันยังคิดว่าประเด็นของฉันยังคงอยู่
afrischke

3
@ Steve ฉันไม่แน่ใจว่าฉันสามารถติดตามคุณได้ OP ถามว่าในแวดวง CS จะไม่มีการแยกความแตกต่างระหว่าง "พิมพ์แบบไดนามิก" และ "ไม่พิมพ์" สิ่งนี้ไม่เกี่ยวกับว่าคุณเชื่อว่าไม่มีความแตกต่างระหว่างจาวาสคริปต์กับแอสเซมบลีต่อบิตในหน่วยความจำ ตามสิ่งที่ฉันได้อ่าน (และฉันต้องค้นหาสิ่งนี้โดยเฉพาะเนื่องจากฉันไม่ใช่โปรแกรมเมอร์ Javascript): มาตรฐาน ECMAScript / Javascript กำหนดประเภทข้อมูล 6 ประเภท (บูลีน, สตริง, ไม่ได้กำหนด, หมายเลข, เป็นโมฆะและวัตถุ) และ ณ จุดใด ๆ ในเวลาค่าเป็นประเภทคอนกรีตหนึ่ง ...
afrischke

1
... ตอนนี้นี่เป็นแนวคิดเกี่ยวกับภาษาแอสเซมบลี (ส่วนใหญ่) ไม่มี (ทั้งหมดมีบิตและไบต์) ดังนั้นสิ่งนี้จึงเป็นเครื่องหมายความแตกต่างที่ชัดเจนระหว่าง Javascript และแอสเซมบลี
afrischke

1

เห็นด้วยกับเบรนแดน - บริบทคือทุกสิ่ง

สิ่งที่ฉันใช้:

ฉันจำได้ว่าสับสนประมาณปี 2004 เพราะมีข้อโต้แย้งมากมายเกี่ยวกับว่าทับทิมถูกพิมพ์หรือพิมพ์แบบไดนามิกหรือไม่ คนในโรงเรียน C / C ++ เก่า (ซึ่งฉันเป็นหนึ่ง) กำลังคิดถึงคอมไพเลอร์และบอกว่าทับทิมไม่ได้พิมพ์

โปรดจำไว้ว่าใน C ไม่มีประเภทรันไทม์มีเพียงที่อยู่และหากรหัสที่กำลังดำเนินการตัดสินใจที่จะปฏิบัติต่อสิ่งใดก็ตามที่ที่อยู่นั้นเป็นสิ่งที่ไม่ใช่อยู่ นั่นคือพิมพ์แน่นอนและแตกต่างจากพิมพ์แบบไดนามิก

ในโลกใบนี้การพิมพ์คือทั้งหมดที่เกี่ยวกับคอมไพเลอร์ C ++ มี "การพิมพ์ที่รัดกุม" เนื่องจากการตรวจสอบคอมไพเลอร์เข้มงวดมากขึ้น Java และ C มี "การพิมพ์ที่อ่อนแอ" มากกว่า ภาษาแบบไดนามิกนั้น "ไม่ได้พิมพ์" เนื่องจากไม่มีการตรวจสอบประเภทคอมไพเลอร์

วันนี้สำหรับการฝึกโปรแกรมเมอร์เราคุ้นเคยกับภาษาไดนามิกเราเห็นได้ชัดว่าไม่มีการพิมพ์หมายถึงไม่มีการตรวจสอบคอมไพเลอร์หรือล่ามแปลซึ่งจะยากที่จะแก้ปัญหาอย่างบ้าคลั่ง แต่มีช่วงเวลาหนึ่งที่ไม่ชัดเจนและในโลกแห่งทฤษฎีของ CS อาจไม่ได้มีความหมาย

ในแง่ลึกบางอย่างไม่มีสิ่งใดที่สามารถพิมพ์ออกมา (หรือเกือบจะไม่มีอะไรเลย) เพราะคุณต้องมีความตั้งใจในการจัดการค่าเพื่อเขียนอัลกอริทึมที่มีความหมาย นี่คือโลกของ CS เชิงทฤษฎีซึ่งไม่ได้เกี่ยวข้องกับลักษณะเฉพาะของวิธีการใช้งานคอมไพเลอร์หรือล่ามสำหรับภาษาที่กำหนด ดังนั้น "ไม่พิมพ์" คือ (อาจไม่รู้ฉัน) โดยไม่มีความหมายทั้งหมดในบริบทนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.