เป็นไปไม่ได้ที่ออโตมาต้าที่มีขอบเขตเชิงเส้นจะตรวจสอบว่าโปรแกรม C ++ หรือไม่และเป็นไปไม่ได้ที่ LBA จะตรวจสอบว่าโปรแกรม SML นั้นพิมพ์ได้ดีหรือไม่ C ++ มีระบบชนิดทัวริงสมบูรณ์เนื่องจากคุณสามารถโค้ดโปรแกรมโดยพลการเป็นเทมเพลต metaprograms
SML น่าสนใจกว่านี้ มันมีประเภทการตรวจสอบที่ตัดสินใจได้ แต่ปัญหาคือสมบูรณ์ EXPTIME ดังนั้นจึงไม่น่าเป็นไปได้ที่ LBA สามารถตรวจสอบได้เว้นแต่จะมีการล่มสลายของลำดับชั้นที่ซับซ้อนอย่างน่าประหลาดใจ เหตุผลสำหรับสิ่งนี้คือ SML ต้องการการอนุมานประเภทและมีครอบครัวของโปรแกรมขนาดของประเภทที่เติบโตเร็วกว่าขนาดของโปรแกรม เป็นตัวอย่างพิจารณาโปรแกรมต่อไปนี้:
fun delta x = (x, x) (* this has type 'a -> ('a * 'a), so its return value
has a type double the size of its argument *)
fun f1 x = delta (delta x) (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)
fun f3 x = f2 (f2 x) (* This function has a HUGE type *)
สำหรับระบบประเภทที่เรียบง่ายเช่น C หรือ Pascal ฉันเชื่อว่าเป็นไปได้ที่ LBA จะตรวจสอบ
ในวันแรก ๆ ของการวิจัยภาษาโปรแกรมบางครั้งผู้คนใช้van Wingaarden grammars (หรือที่เรียกว่าgrammarsสองระดับ) เพื่อระบุระบบชนิดสำหรับภาษาโปรแกรม ฉันเชื่อว่า Algol 68 ถูกระบุด้วยวิธีนี้ อย่างไรก็ตามฉันได้รับการบอกว่าเทคนิคนี้ถูกทอดทิ้งด้วยเหตุผลเชิงปฏิบัติเป็นหลักมันกลายเป็นเรื่องยากสำหรับคนที่จะเขียนไวยากรณ์ที่ระบุสิ่งที่พวกเขาคิดว่าพวกเขากำลังระบุ! (โดยทั่วไปคนไวยากรณ์ที่เขียนสร้างภาษาขนาดใหญ่กว่าที่พวกเขาตั้งใจ)
ทุกวันนี้ผู้คนใช้กฎการอนุมานเชิงแผนผังเพื่อระบุระบบชนิดซึ่งโดยพื้นฐานแล้ววิธีการระบุเพรดิเคตเป็นจุดคงที่ที่น้อยที่สุดของคอลเล็กชั่นของฮอร์นเบ็ดเตล็ด ความพึงพอใจสำหรับทฤษฎีฮอร์นอันดับหนึ่งนั้นไม่สามารถตัดสินใจได้โดยทั่วไปดังนั้นหากคุณต้องการที่จะจับนักทฤษฎีทุกประเภททำสิ่งที่คุณเลือกจะมีความแข็งแกร่งมากกว่าที่สะดวกจริง ๆ
ฉันรู้ว่ามีการทำงานบางอย่างในการใช้ไวยากรณ์ของคุณลักษณะเพื่อใช้งานระบบพิมพ์ พวกเขาอ้างว่ามีประโยชน์ทางวิศวกรรมซอฟต์แวร์สำหรับตัวเลือกนี้: กล่าวคือแกรมม่าแอ็ตทริบิวต์ควบคุมการไหลของข้อมูลอย่างเคร่งครัดและฉันบอกว่านี่ทำให้โปรแกรมเข้าใจง่ายขึ้น