อ่าน 2 นาที
การวิเคราะห์นามแฝง
การวิเคราะห์นามแฝง (Alias analysis) เป็นเทคนิคใน ทฤษฎีคอมไพเลอร์ ใช้เพื่อตรวจสอบว่าตำแหน่งจัดเก็บข้อมูลสามารถเข้าถึงได้มากกว่าหนึ่งวิธีหรือไม่ ตัวชี้สองตัวจะเรียกว่า มีนามแฝง...
การวิเคราะห์นามแฝง
การวิเคราะห์นามแฝง (Alias analysis)เป็นเทคนิคในทฤษฎีคอมไพเลอร์ใช้เพื่อตรวจสอบว่าตำแหน่งจัดเก็บข้อมูลสามารถเข้าถึงได้มากกว่าหนึ่งวิธีหรือไม่ ตัวชี้สองตัวจะเรียกว่ามีนามแฝงหากพวกมันชี้ไปยังตำแหน่งเดียวกัน
เทคนิคการวิเคราะห์นามแฝงมักถูกจำแนกตามความไวต่อการไหลของข้อมูลและความไวต่อบริบท โดยอาจระบุข้อมูลว่าอาจเป็นนามแฝงหรือไม่ หรือต้องเป็นนามแฝง คำว่าการวิเคราะห์นามแฝงมักใช้สลับกับการวิเคราะห์จุดอ้างอิงซึ่งเป็นกรณีเฉพาะอย่างหนึ่ง
โปรแกรมวิเคราะห์นามแฝงมีจุดประสงค์เพื่อสร้างและคำนวณข้อมูลที่เป็นประโยชน์สำหรับการทำความเข้าใจนามแฝงในโปรแกรม
ภาพรวม
โดยทั่วไป การวิเคราะห์นามแฝงจะตรวจสอบว่าการอ้างอิงหน่วยความจำที่แยกจากกันนั้นชี้ไปยังพื้นที่หน่วยความจำเดียวกันหรือไม่ ซึ่งช่วยให้คอมไพเลอร์สามารถระบุได้ว่าตัวแปรใดในโปรแกรมจะได้รับผลกระทบจากคำสั่งนั้น ตัวอย่างเช่น พิจารณาส่วนของโค้ดต่อไปนี้ที่เข้าถึงสมาชิกของโครงสร้าง:
p.foo = 1 ; q.foo = 2 ; i = p.foo + 3 ;มีชื่อเรียกแทนที่เป็นไปได้สามกรณีดังนี้:
- ตัวแปร p และ q ไม่สามารถมีชื่อซ้ำกันได้ (กล่าวคือ ไม่สามารถชี้ไปยังตำแหน่งหน่วยความจำเดียวกันได้)
- ตัวแปร p และ q ต้องมีชื่อเรียกแทนกัน (กล่าวคือ ตัวแปรทั้งสองต้องชี้ไปยังตำแหน่งหน่วยความจำเดียวกันเสมอ)
- ไม่สามารถระบุได้อย่างแน่ชัดในขั้นตอนการคอมไพล์ว่า p และ q เป็นชื่อเรียกแทนกันหรือไม่
ถ้า p และ q ไม่สามารถเป็นนามแฝงกันได้ ก็i = p.foo + 3;สามารถเปลี่ยนเป็น ได้i = 4ถ้า p และ q ต้องเป็นนามแฝงกันได้ ก็i = p.foo + 3;สามารถเปลี่ยนเป็น ได้i = 5เพราะp.foo + 3= q.foo + 3ในทั้งสองกรณี เราสามารถทำการปรับแต่งประสิทธิภาพได้จากความรู้เรื่องนามแฝง (โดยสมมติว่าไม่มีเธรด อื่น ที่อัปเดตตำแหน่งเดียวกันแทรกแซงเธรดปัจจุบัน หรือแบบจำลองหน่วยความจำ ของภาษา อนุญาตให้การอัปเดตเหล่านั้นไม่ปรากฏให้เห็นทันทีในเธรดปัจจุบันหากไม่มีโครงสร้างการซิงโครไนซ์ ที่ชัดเจน ) ในทางกลับกัน ถ้าไม่ทราบว่า p และ q เป็นนามแฝงกันหรือไม่ จะไม่สามารถทำการปรับแต่งประสิทธิภาพได้ และต้องเรียกใช้โค้ดทั้งหมดเพื่อให้ได้ผลลัพธ์ การอ้างอิงหน่วยความจำสองรายการจะเรียกว่ามี ความสัมพันธ์ แบบอาจเป็นนามแฝงกันได้หากไม่ทราบว่าเป็นนามแฝงกันหรือไม่
ดำเนินการวิเคราะห์นามแฝง
ในการวิเคราะห์นามแฝง เราจะแบ่งหน่วยความจำของโปรแกรมออกเป็นกลุ่มนามแฝงกลุ่มนามแฝงคือเซตของตำแหน่งที่ไม่ซ้ำกันและไม่สามารถเรียกนามแฝงถึงกันได้ สำหรับการอธิบายในที่นี้ สมมติว่าการเพิ่มประสิทธิภาพที่ทำในที่นี้เกิดขึ้นบนการแสดงผลระดับกลางแบบ ต่ำ ของโปรแกรม กล่าวคือ โปรแกรมได้รับการคอมไพล์เป็นการดำเนินการแบบไบนารี การกระโดด การย้ายระหว่างรีจิสเตอร์ การย้ายจากรีจิสเตอร์ไปยังหน่วยความจำ การย้ายจากหน่วยความจำไปยังรีจิสเตอร์ การแยกสาขา และการเรียก/ส่งคืนฟังก์ชัน
การวิเคราะห์นามแฝงตามประเภท
หากภาษาที่กำลังคอมไพล์มีความปลอดภัยด้านประเภทตัวตรวจสอบประเภทของคอมไพเลอร์ถูกต้อง และภาษานั้นไม่มีความสามารถในการสร้างพอยเตอร์ที่อ้างอิงถึงตัวแปรโลคอล (เช่นML , HaskellหรือJava ) ก็สามารถทำการเพิ่มประสิทธิภาพที่มีประโยชน์บางอย่างได้[ 1 ]มีหลายกรณีที่เรารู้ว่าตำแหน่งหน่วยความจำสองตำแหน่งต้องอยู่ในคลาสนามแฝงที่แตกต่างกัน:
- ตัวแปรสองตัวที่มีชนิดข้อมูลต่างกันไม่สามารถอยู่ในคลาสนามแฝงเดียวกันได้ เนื่องจากเป็นคุณสมบัติของภาษาที่มีการกำหนดชนิดข้อมูลอย่างเข้มงวดและไม่มีการอ้างอิงหน่วยความจำโดยตรง (กล่าวคือ การอ้างอิงไปยังตำแหน่งหน่วยความจำไม่สามารถเปลี่ยนแปลงได้โดยตรง) ที่ตัวแปรสองตัวที่มีชนิดข้อมูลต่างกันไม่สามารถใช้ตำแหน่งหน่วยความจำเดียวกันได้พร้อมกัน
- การจัดสรรหน่วยความจำภายในเฟรมสแต็กปัจจุบัน จะต้องไม่อยู่ในคลาสนามแฝงเดียวกันกับการจัดสรรหน่วยความจำก่อนหน้าจากเฟรมสแต็กอื่น ทั้งนี้เนื่องจากการจัดสรรหน่วยความจำใหม่จะต้องแยกออกจากกันโดยสิ้นเชิงจากการจัดสรรหน่วยความจำอื่นๆ ทั้งหมด
- โดยทั่วไปแล้ว ฟิลด์แต่ละฟิลด์ของแต่ละประเภทข้อมูลจะมีคลาสชื่อเรียกแทน (alias class) ของตนเอง เนื่องจากระเบียบการกำหนดประเภทข้อมูลมักอนุญาตให้เฉพาะข้อมูลประเภทเดียวกันเท่านั้นที่สามารถใช้ชื่อเรียกแทนได้ เนื่องจากข้อมูลทั้งหมดของประเภทเดียวกันจะถูกจัดเก็บในรูปแบบที่เหมือนกันในหน่วยความจำ ดังนั้นฟิลด์จึงสามารถใช้ชื่อเรียกแทนได้เฉพาะกับตัวมันเองเท่านั้น
- ในทำนองเดียวกัน อาร์เรย์แต่ละประเภทจะมีคลาสนามแฝงเฉพาะของตนเอง
ในการวิเคราะห์ชื่อเรียกแทน (alias analysis) สำหรับโค้ด การโหลดและการจัดเก็บข้อมูลลงในหน่วยความจำทุกครั้งจะต้องติดป้ายกำกับด้วยคลาสของมัน จากนั้นเราจะมีคุณสมบัติที่มีประโยชน์ โดยกำหนดตำแหน่งหน่วยความจำและคลาสชื่อเรียกแทนไว้ว่า ถ้าคลาส ใดคลาส หนึ่งเป็นชื่อเรียก แทน ตำแหน่งหน่วยความจำนั้นอาจใช้ชื่อเรียกแทนได้ และถ้าคลาสใดคลาสหนึ่งเป็นชื่อเรียกแทน ตำแหน่งหน่วยความจำนั้นจะไม่ใช้ชื่อเรียกแทน
การวิเคราะห์นามแฝงตามกระแสข้อมูล
การวิเคราะห์ตามการไหลของโปรแกรม สามารถนำไปใช้กับโปรแกรมในภาษาที่มีการอ้างอิงหรือการแปลงชนิดข้อมูลได้ การวิเคราะห์ตามการไหลของโปรแกรมสามารถใช้แทนหรือเสริมการวิเคราะห์ตามชนิดข้อมูลได้ ในการวิเคราะห์ตามการไหลของโปรแกรม จะมีการสร้างคลาสชื่อเรียกแทนใหม่สำหรับแต่ละการจัดสรรหน่วยความจำ และสำหรับทุกตัวแปรส่วนกลางและตัวแปรภายในที่มีการใช้ที่อยู่ของตัวแปรนั้น การอ้างอิงอาจชี้ไปยังค่ามากกว่าหนึ่งค่าในช่วงเวลาหนึ่ง และอาจอยู่ในคลาสชื่อเรียกแทนมากกว่าหนึ่งคลาส ซึ่งหมายความว่าแต่ละตำแหน่งในหน่วยความจำจะมีชุดของคลาสชื่อเรียกแทนแทนที่จะมีเพียงคลาสชื่อเรียกแทนเดียว
ดูเพิ่มเติม
ลิงก์ภายนอก
- การจำแนกประเภทและการประยุกต์ใช้การวิเคราะห์นามแฝง - วิทยานิพนธ์ระดับปริญญาโทเพื่อเป็นบทนำสู่สาขานี้
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การวิเคราะห์นามแฝง
การวิเคราะห์นามแฝง (Alias analysis) เป็นเทคนิคใน ทฤษฎีคอมไพเลอร์ ใช้เพื่อตรวจสอบว่าตำแหน่งจัดเก็บข้อมูลสามารถเข้าถึงได้มากกว่าหนึ่งวิธีหรือไม่ ตัวชี้สองตัวจะเรียกว่า มีนามแฝง...
ภาพรวม
โดยทั่วไป การวิเคราะห์นามแฝงจะตรวจสอบว่าการอ้างอิงหน่วยความจำที่แยกจากกันนั้นชี้ไปยังพื้นที่หน่วยความจำเดียวกันหรือไม่ ซึ่งช่วยให้คอมไพเลอร์สามารถระบุได้ว่าตัวแปรใดในโปรแกรมจะได้รับผลกระทบจากคำสั่งนั้น ตัวอย่างเช่น...
ดำเนินการวิเคราะห์นามแฝง
ในการวิเคราะห์นามแฝง เราจะแบ่งหน่วยความจำของโปรแกรมออกเป็น กลุ่มนามแฝง กลุ่มนามแฝงคือเซตของตำแหน่งที่ไม่ซ้ำกันและไม่สามารถเรียกนามแฝงถึงกันได้ สำหรับการอธิบายในที่นี้ สมมติว่าการเพิ่มประสิทธิภาพที่ทำในที่นี้เกิดขึ้นบน การแสดงผลระดับกลางแบบ ต่ำ ของโปรแกรม...
การวิเคราะห์นามแฝงตามประเภท
หากภาษาที่กำลังคอมไพล์มี ความปลอดภัยด้านประเภท ตัวตรวจสอบประเภทของคอมไพเลอร์ถูกต้อง และภาษานั้นไม่มีความสามารถในการสร้างพอยเตอร์ที่อ้างอิงถึงตัวแปรโลคอล (เช่น ML , Haskell หรือ Java ) ก็สามารถทำการเพิ่มประสิทธิภาพที่มีประโยชน์บางอย่างได้ [ 1 ]...