คำถามติดแท็ก type-checking

การตรวจสอบว่าตัวแปรนิพจน์หรือค่ามีประเภทที่ประกาศไว้

8
คอมพิวเตอร์จะกำหนดประเภทข้อมูลของไบต์ได้อย่างไร
ตัวอย่างเช่นหากคอมพิวเตอร์10111100เก็บไว้ในหน่วยความจำไบต์เดียวคอมพิวเตอร์จะทราบได้อย่างไรว่าแปลความหมายนี้เป็นจำนวนเต็มอักขระ ASCII หรืออย่างอื่น ข้อมูลประเภทเก็บอยู่ในไบต์ที่อยู่ติดกันหรือไม่? (ฉันไม่คิดว่าจะเป็นเช่นนี้เพราะจะส่งผลให้มีการใช้พื้นที่สองเท่าสำหรับหนึ่งไบต์) ฉันสงสัยว่าบางทีคอมพิวเตอร์อาจไม่รู้ประเภทของข้อมูลว่ามีเพียงโปรแกรมที่ใช้เท่านั้นที่รู้ ฉันเดาว่าเป็นเพราะ RAM เป็นR AM และดังนั้นจึงไม่ได้อ่านตามลำดับว่าโปรแกรมเฉพาะบอก CPU เพื่อดึงข้อมูลจากที่อยู่เฉพาะและโปรแกรมกำหนดวิธีการปฏิบัติ ดูเหมือนว่าจะเหมาะกับการเขียนโปรแกรมสิ่งต่าง ๆ เช่นความจำเป็นในการพิมพ์ดีด ฉันกำลังติดตามใช่ไหม?

2
อัลกอริทึมการตรวจสอบประเภท
ฉันเริ่มต้นการวิจัยบรรณานุกรมส่วนบุคคลเกี่ยวกับอัลกอริทึมการตรวจสอบประเภทและต้องการคำแนะนำ อัลกอริทึมการตรวจสอบประเภทกลยุทธ์และเทคนิคทั่วไปที่ใช้มากที่สุดคืออะไร? ฉันสนใจอัลกอริทึมการตรวจสอบประเภทที่ซับซ้อนโดยเฉพาะอย่างยิ่งในภาษาที่พิมพ์แบบคงที่ที่รู้จักกันอย่างกว้างขวางเช่น C ++, Java 5+, Scala หรืออื่น ๆ IE, อัลกอริทึมการตรวจสอบประเภทที่ไม่ง่ายมากเนื่องจากการพิมพ์ภาษาพื้นฐานง่าย ๆ (เช่น Java 1.4 และต่ำกว่า) ฉันไม่สนใจภาษาที่เฉพาะเจาะจง X, Y หรือ Z ฉันสนใจในการตรวจสอบอัลกอริทึมโดยไม่คำนึงถึงภาษาที่พวกเขากำหนดเป้าหมาย หากคุณให้คำตอบเช่น "ภาษา L ที่คุณไม่เคยได้ยินเกี่ยวกับสิ่งที่พิมพ์อย่างยิ่งและการพิมพ์มีความซับซ้อนมีอัลกอริทึมการตรวจสอบประเภทที่ A, B และ C โดยการตรวจสอบ X และ Y โดยใช้อัลกอริทึม Z" หรือ " กลยุทธ์ X และ Y ที่ใช้สำหรับ Scala และตัวแปร Z ของ A ที่ใช้สำหรับ …

1
การอนุมานประเภทด้วยประเภทผลิตภัณฑ์
ฉันกำลังทำงานกับคอมไพเลอร์สำหรับภาษาที่ต่อกันและต้องการเพิ่มการสนับสนุนการอนุมานประเภท ฉันเข้าใจ Hindley - Milner แต่ฉันได้เรียนรู้ทฤษฎีประเภทเมื่อฉันไปดังนั้นฉันไม่แน่ใจว่าจะปรับตัวอย่างไร ระบบต่อไปนี้เป็นระบบเสียงที่ดี คำคือตัวอักษรองค์ประกอบของคำพูดคำพูดของคำหรือดั้งเดิม E : : = x||อีอี||[ e ]||...e::=x|ee|[e]|… e ::= x \:\big|\: e\:e \:\big|\: [e] \:\big|\: \dots เงื่อนไขทั้งหมดแสดงถึงฟังก์ชั่น สำหรับสองฟังก์ชั่นและ ,นั่นคือ juxtaposition แสดงถึงการจัดองค์ประกอบย้อนกลับ ตัวอักษรหมายถึงฟังก์ชั่น niladice 2อี1e1e_1อี2e2e_2อี1อี2= e2∘ e1e1e2=e2∘e1e_1\:e_2 = e_2 \circ e_1 คำอื่น ๆ นอกเหนือจากการแต่งมีกฎประเภทพื้นฐาน: x : ι[Lit]แกมมา⊢อีเมล์: σแกมมา⊢ [ E ] : ∀ …

2
ข้อผิดพลาดที่อาจเกิดขึ้นกับการมีเคอร์เนลน้อยที่สุดที่เรียกใช้รหัสที่ได้รับการจัดการคืออะไร?
สมมติว่าฉันต้องการสร้างระบบปฏิบัติการโดยใช้เคอร์เนลตัวล่างที่เล็กมากซึ่งทำหน้าที่เป็นตัวแปลรหัสที่ได้รับการจัดการ / รันไทม์และเคอร์เนลส่วนบนขนาดใหญ่ที่คอมไพล์กับภาษาเครื่องที่ไม่ใช่เจ้าของภาษา (Java bytecode, CIL เป็นต้น) ตัวอย่างของระบบปฏิบัติการที่คล้ายกันจะเป็นเอกเทศและคอสมอส ข้อผิดพลาดและความท้าทายในการพัฒนาที่มีอยู่คือการเขียนระบบปฏิบัติการด้วยโครงสร้างพื้นฐานแบบนี้ซึ่งแตกต่างจากโซลูชั่นดั้งเดิม

5
มีกรณีการใช้งานสำหรับประเภทด้านล่างเป็นประเภทพารามิเตอร์ฟังก์ชั่น?
หากฟังก์ชันมีชนิดส่งคืนเป็น⊥ ( ชนิดด้านล่าง ) นั่นหมายความว่าจะไม่ส่งคืน มันสามารถยกตัวอย่างเช่นออกหรือโยนทั้งสถานการณ์ธรรมดา สันนิษฐานว่าถ้าฟังก์ชั่นมีพารามิเตอร์ประเภท⊥มันจะไม่สามารถเรียก (ปลอดภัย) มีเหตุผลใดบ้างในการนิยามฟังก์ชั่นดังกล่าว?

1
ทำไมเราไม่ค้นคว้าเพิ่มเติมเกี่ยวกับการรับประกันเวลารวบรวม?
ฉันรักทุกสิ่งที่รวบรวมเวลาและฉันชอบความคิดที่ว่าเมื่อคุณรวบรวมโปรแกรมการรับประกันจำนวนมากเกี่ยวกับการดำเนินการของมัน โดยทั่วไปการพูดระบบประเภทคงที่ (Haskell, C ++, ... ) ดูเหมือนจะให้การรับประกันเวลาคอมไพล์ที่แข็งแกร่งกว่าระบบประเภทแบบไดนามิกใด ๆ จากสิ่งที่ฉันเข้าใจ Ada ดำเนินการตรวจสอบเวลาให้ดียิ่งขึ้นไปอีกและสามารถตรวจจับช่วงของข้อผิดพลาดที่มากกว่าก่อนดำเนินการ มันยังถือว่าปลอดภัยพอสมควร ณ เวลาใดเวลาหนึ่งมันถูกเลือกสำหรับฟิลด์ที่ละเอียดอ่อน (เมื่อข้อผิดพลาดในการเขียนโปรแกรมอาจทำให้เสียชีวิต) ตอนนี้ฉันสงสัยว่า: ถ้าการค้ำประกันแบบคงที่ที่ดีกว่านำไปสู่รหัสที่มีเอกสารและปลอดภัยกว่าแล้วทำไมเราไม่ค้นคว้าเพิ่มเติมในทิศทางนั้น ตัวอย่างของสิ่งที่ดูเหมือนว่าจะหายไปจะเป็นภาษาที่แทนที่จะกำหนดintประเภททั่วไปที่มีช่วงที่กำหนดโดยจำนวนบิตของสถาปัตยกรรมพื้นฐานหนึ่งอาจมีช่วง (ในตัวอย่างต่อไปนี้Int [a..b]อธิบายถึงชนิดจำนวนเต็มระหว่าง รวม a และ b): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int …

2
การลดผลิตภัณฑ์ใน HoTT ไปยังการเข้ารหัสของโบสถ์ / สกอตต์
ดังนั้นฉันกำลังจะไปถึงแม้ว่าหนังสือ HoTT กับบางคน ฉันอ้างว่าประเภทอุปนัยส่วนใหญ่ที่เราเห็นจะสามารถลดลงเป็นประเภทที่มีเพียงประเภทของฟังก์ชันและจักรวาลที่ขึ้นอยู่กับชนิดของ recuror เป็นแรงบันดาลใจสำหรับประเภทที่เทียบเท่า ฉันเริ่มวาดภาพว่าฉันคิดว่าสิ่งนี้จะได้ผลอย่างไรและหลังจากสะดุดฉันก็มาถึงสิ่งที่ฉันคิดว่าเป็นคำตอบ ( ⋅ , ⋅ ) ≡ λ : λ ข: B λ C : U λ กรัม: → B → C g ( a ) ( b ) ฉันn d⋅×⋅≡∏A,B,C:U(A→B→C)→C⋅×⋅≡∏A,B,C:U(A→B→C)→C\cdot \times \cdot \equiv \prod_{A, B, C : \mathcal{U}} (A \to B \to C) …

1
ตัวอย่างที่กระชับของต้นทุนชี้แจงของการอนุมานประเภท ML
ฉันทราบว่าค่าใช้จ่ายของการอนุมานประเภทในภาษาที่ใช้งานได้เช่น OCaml อาจสูงมาก การอ้างสิทธิ์คือมีลำดับของนิพจน์เช่นนั้นสำหรับแต่ละนิพจน์ความยาวของประเภทที่สอดคล้องกันนั้นจะเป็นเลขชี้กำลังบนความยาวของนิพจน์ ฉันกำหนดลำดับด้านล่าง คำถามของฉันคือ: คุณรู้จักลำดับที่มีนิพจน์ที่กระชับกว่าซึ่งประสบความสำเร็จในประเภทเดียวกันหรือไม่? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a …

1
เหตุใด Coq จึงรวมเอาการแสดงออกมาเป็นภาษาหลัก
Coq รวมถึงการแสดงออกให้เป็นภาษาหลักของมัน เราสามารถแปลการแสดงออกให้กับแอพพลิเคชั่นเช่นนี้: let x : t = v in b ~> (\(x:t). b) v ฉันเข้าใจว่ามันไม่ได้ผลเสมอไปเพราะค่าvจะไม่สามารถใช้ได้เมื่อพิมพ์แบบตรวจbสอบ อย่างไรก็ตามเรื่องนี้สามารถแก้ไขได้อย่างง่ายดายโดยปลอกพิเศษ typechecking (\(x:t). b) vของการใช้งานของฟอร์ม สิ่งนี้ช่วยให้เราสามารถลบการแสดงออกในราคาพิเศษในขณะพิมพ์ เหตุใด Coq จึงรวมถึงให้รวมการแสดงออก? พวกเขามีข้อได้เปรียบอื่น ๆ (นอกเหนือจากไม่จำเป็นต้องใช้กรณีพิเศษ)?

1
อะไรคือตัวอย่างที่ไม่ได้วางแผนไว้สำหรับการตรวจสอบประเภทคงที่ที่อนุรักษ์เกินไป?
ในแนวคิดในการเขียนโปรแกรมภาษาจอห์นมิทเชลเขียนว่าการตรวจสอบชนิดสแตติกจำเป็นต้องระมัดระวัง (เข้มงวดมากเกินไป) เนื่องจากปัญหาการหยุดทำงาน เขาให้เป็นตัวอย่าง: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) ใครสามารถให้คำตอบที่ไม่ได้วางแผนไว้ซึ่งจะเป็นข้อกังวลในทางปฏิบัติได้จริงหรือไม่? ฉันเข้าใจว่า Java อนุญาตการปลดเปลื้องที่ตรวจสอบแบบไดนามิกสำหรับกรณีเช่นนี้: if (foo instanceof Person) { Person p = (Person) foo; : } แต่ฉันพิจารณาถึงความจำเป็นของการขาดภาษา / คอมไพเลอร์ Java มากกว่าปัญหาข้ามภาษา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.