มีทางเลือกอื่นสำหรับการวิเคราะห์เชิงสถิตหรือไม่?


18

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

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

สิ่งที่เกี่ยวข้องที่ฉันสงสัยเกี่ยวกับคือหากมีวิธีการที่ไม่ประกาศใด ๆ ที่จะทำการวิเคราะห์แบบคงที่ (ประเภทที่มีการประกาศส่วนใหญ่ )

คำตอบ:


24

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

  • การตรวจสอบแบบจำลองเป็นเทคนิคการวิเคราะห์และตรวจสอบความถูกต้องสำหรับระบบที่ทำงานพร้อมกันซึ่งช่วยให้คุณพิสูจน์ว่าโปรแกรมของคุณมีความประพฤติดีภายใต้การสอดแทรกเธรด

  • การวิเคราะห์กระแสข้อมูลรวบรวมข้อมูลเกี่ยวกับค่าที่เป็นไปได้ของตัวแปรซึ่งสามารถกำหนดได้ว่าการคำนวณบางอย่างซ้ำซ้อนหรือไม่เกิดข้อผิดพลาดบางอย่าง

  • การตีความเชิงนามธรรมเป็นแบบจำลองผลกระทบของโปรแกรมอย่างระมัดระวังโดยปกติแล้วในลักษณะที่การวิเคราะห์รับประกันว่าจะยุติ - ตัวตรวจสอบประเภทอาจนำไปใช้ในลักษณะที่คล้ายคลึงกับล่ามที่เป็นนามธรรม

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

  • การเขียนโปรแกรมตามสัญญาเป็นวิธีการในการระบุเงื่อนไขก่อนกำหนดผลข้างเคียงและค่าคงที่ Adaมีการสนับสนุนสัญญาและสามารถตรวจสอบบางสัญญาได้

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

อีกตัวอย่างหนึ่งของการวิเคราะห์แบบคงที่ที่ไม่ได้มีการประกาศพบในHack typechecker ซึ่งโครงสร้างการควบคุมการไหลปกติสามารถปรับแต่งชนิดของตัวแปร:

$x = get_value();
if ($x !== null) {
    $x->method();    // Typechecks because $x is known to be non-null.
} else {
    $x->method();    // Does not typecheck.
}

และการพูดของ "การกลั่น" ย้อนกลับไปในดินแดนของระบบประเภทประเภทการปรับแต่ง (ตามที่ใช้ในLiquidHaskell ) ประเภทคู่กับภาคแสดงที่รับประกันว่าจะเก็บไว้สำหรับอินสแตนซ์ของประเภท "กลั่น" และประเภทที่ขึ้นต่อกันจะนำสิ่งนี้ไปใช้อีกทำให้สามารถพึ่งพาประเภทของค่าได้ "Hello world" ของการพิมพ์ที่ขึ้นต่อกันมักจะเป็นฟังก์ชั่นการต่อข้อมูลอาเรย์:

(++) : (a : Type) -> (m n : Nat) -> Vec a m -> Vec a n -> Vec a (m + n)

ที่นี่++จะใช้ตัวถูกดำเนินการสองประเภทVec a mและVec a nเป็นเวกเตอร์ที่มีประเภทองค์ประกอบaและความยาวmและnตามลำดับซึ่งเป็นตัวเลขธรรมชาติ ( Nat) m + nมันกลับเวกเตอร์ที่มีประเภทธาตุชนิดเดียวกันมีความยาวเป็น และฟังก์ชั่นนี้พิสูจน์ข้อ จำกัด นี้อย่างเป็นนามธรรมโดยไม่ทราบค่าเฉพาะของmและnดังนั้นความยาวของเวกเตอร์อาจเป็นแบบไดนามิก


ระบบประเภทคืออะไร ฉันรู้ว่าฉันไม่รู้จริง ๆ คำจำกัดความเกี่ยวกับวิกิพีเดียเป็นวงกลม: en.wikipedia.org/wiki/Type_system
Max Heiber

1
@mheiber: ระบบประเภทคงเป็นเพียงการวิเคราะห์แบบคงที่ ascribes ประเภท (เช่นint, int -> int, forall a. a -> a) ถึงข้อตกลง (เช่น0, (+ 1), \x -> x) การวิเคราะห์อื่น ๆ สามารถกำหนดคุณสมบัติที่แตกต่างที่ไม่เกี่ยวข้องกับชนิดข้อมูลตัวอย่างเช่นผลข้างเคียง ( pure, io), การมองเห็น ( public, private) หรือสถานะ ( open, closed) ในทางปฏิบัติคุณสมบัติเหล่านี้จำนวนมากสามารถตรวจสอบได้ในการนำไปใช้เช่นเดียวกับการตรวจสอบ / การอนุมานดังนั้นความแตกต่างจึงไม่ถูกตัดออกอย่างสิ้นเชิง
Jon Purdy

4

@ JonPurdy คำตอบดีกว่า แต่ฉันต้องการเพิ่มตัวอย่างอีกสองสามข้อ:

ชัดเจน:

  • การตรวจสอบไวยากรณ์

  • linting

แบบไม่ชัดเจน:

  • Rust ช่วยให้โปรแกรมเมอร์ระบุว่า "การโยง" ไม่แน่นอนหรือไม่และบังคับใช้ข้อ จำกัด เหล่านี้

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

  • การเขียนโปรแกรมลอจิกนั้นเป็นการสร้างโปรแกรมโดยการให้คำยืนยัน

การพิมพ์กึ่งคงที่:

  • การไหลของ Facebook ช่วยให้สามารถผสมผสานระหว่างการพิมพ์แบบไดนามิกและแบบคงที่ แนวคิดคือแม้แต่รหัสแบบไดนามิกก็พิมพ์โดยนัย โฟลช่วยให้คุณเรียกใช้เซิร์ฟเวอร์ที่ตรวจจับรหัสของคุณขณะที่มันทำงานเพื่อตรวจหาข้อผิดพลาดประเภทที่เป็นไปได้แม้ว่าคุณจะไม่พิมพ์คำอธิบายประกอบหน้าที่ของคุณ

1

การวิเคราะห์ประเภทไม่ได้มีความหมายอะไรมาก

Agdaเป็นที่รู้จักกันว่ามีระบบประเภททัวริงที่สมบูรณ์แตกต่างกันมาก (และยากต่อการคำนวณ) มากกว่าภาษา ML (เช่นOcaml )


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