อ่าน 3 นาที
การแสดงผลระดับกลาง
การ แสดงผลระดับกลาง ( IR ) คือ โครงสร้างข้อมูล หรือรหัสที่ใช้ภายในโดย คอมไพเลอร์ หรือ เครื่องเสมือน เพื่อแสดง รหัสต้นฉบับ IR ถูกออกแบบมาเพื่อให้เอื้อต่อการประมวลผลเพิ่มเติม เช่น...
การแสดงผลระดับกลาง
| การดำเนินการตามโปรแกรม |
|---|
| แนวคิดทั่วไป |
| ประเภทของโค้ด |
| กลยุทธ์การรวบรวม |
| ระยะเวลาการรันที่น่าสนใจ |
|
| คอมไพเลอร์และชุดเครื่องมือที่โดดเด่น |
การแสดงผลระดับกลาง ( IR ) คือโครงสร้างข้อมูลหรือรหัสที่ใช้ภายในโดยคอมไพเลอร์หรือเครื่องเสมือนเพื่อแสดงรหัสต้นฉบับ IR ถูกออกแบบมาเพื่อให้เอื้อต่อการประมวลผลเพิ่มเติม เช่นการเพิ่มประสิทธิภาพและการแปล [ 1 ] IRที่ "ดี" ต้องมีความถูกต้องแม่นยำ – สามารถแสดงรหัสต้นฉบับได้โดยไม่สูญเสียข้อมูล[ 2 ] – และเป็นอิสระจากภาษาต้นฉบับหรือภาษาเป้าหมายใดๆ[ 1 ] IR อาจมีได้หลายรูปแบบ: โครงสร้างข้อมูล ในหน่วยความจำ หรือรหัสแบบทูเปิลหรือสแต็ก พิเศษ ที่โปรแกรมสามารถอ่านได้[ 3 ]ในกรณีหลังนี้ เรียกอีกอย่างว่าภาษา ระดับกลาง
ตัวอย่างที่เห็นได้ชัดคือคอมไพเลอร์สมัยใหม่ส่วนใหญ่ เช่นตัวแปลภาษา CPythonจะแปลงข้อความเชิงเส้นที่มนุษย์อ่านได้ซึ่งแสดงถึงโปรแกรม ให้เป็นโครงสร้างกราฟ ระดับกลาง ที่ช่วยให้สามารถวิเคราะห์การไหลและจัดเรียงใหม่ก่อนการประมวลผล การใช้การแสดงผลระดับกลางเช่นนี้ทำให้ระบบคอมไพเลอร์ เช่นGNU Compiler CollectionและLLVMสามารถใช้งานได้กับภาษาต้นฉบับที่แตกต่างกันมากมาย เพื่อสร้างโค้ด สำหรับ สถาปัตยกรรม เป้าหมาย ที่ หลากหลาย
ภาษาระดับกลาง
ภาษาตัวกลางคือภาษาของเครื่องจักรนามธรรมที่ออกแบบมาเพื่อช่วยในการวิเคราะห์โปรแกรมคอมพิวเตอร์คำนี้มาจากวิธีการใช้ในคอมไพเลอร์ซึ่งรหัสต้นฉบับของโปรแกรมจะถูกแปลงเป็นรูปแบบที่เหมาะสมกว่าสำหรับการปรับปรุงรหัสก่อนที่จะนำไปใช้สร้าง รหัส วัตถุหรือ รหัส เครื่อง สำหรับเครื่องเป้าหมาย การออกแบบภาษาตัวกลางโดยทั่วไปจะแตกต่างจาก ภาษาเครื่องที่ใช้งานได้จริงในสามประการพื้นฐาน:
- คำสั่งแต่ละคำสั่งแสดงถึงการดำเนินการพื้นฐานเพียงอย่างเดียว ตัวอย่างเช่นโหมดการกำหนดแอดเดรสแบบ "shift-add" ซึ่งพบได้ทั่วไปในไมโครโปรเซสเซอร์นั้นไม่มีอยู่ในคำสั่งนี้
- ข้อมูล เกี่ยวกับการควบคุมการไหลของโปรแกรมอาจไม่รวมอยู่ในชุดคำสั่ง
- จำนวนรีจิสเตอร์ของโปรเซสเซอร์ที่มีอยู่อาจมีจำนวนมาก หรืออาจไม่มีขีดจำกัด
รูปแบบที่นิยมใช้สำหรับภาษาขั้นกลางคือรหัสสามที่อยู่
คำนี้ยังใช้เพื่ออ้างถึงภาษาที่ใช้เป็นตัวกลางโดยภาษาโปรแกรมระดับสูง บางภาษา ซึ่งไม่ได้สร้างโค้ดวัตถุหรือโค้ดเครื่องเอง แต่สร้างเฉพาะภาษาตัวกลางเท่านั้น ภาษาตัวกลางนี้จะถูกส่งไปยังคอมไพเลอร์สำหรับภาษานั้นๆ ซึ่งจะสร้างโค้ดวัตถุหรือโค้ดเครื่องที่เสร็จสมบูรณ์ออกมา โดยปกติแล้วจะทำเช่นนี้เพื่อลดความยุ่งยากในกระบวนการปรับแต่งหรือเพื่อเพิ่มความสามารถในการพกพาโดยใช้ภาษาตัวกลางที่มีคอมไพเลอร์สำหรับโปรเซสเซอร์และระบบปฏิบัติการ หลายระบบ เช่น ภาษา Cภาษาที่ใช้สำหรับกรณีนี้มีความซับซ้อนอยู่ระหว่างภาษาโปรแกรมระดับสูงและ ภาษาโปรแกรม ระดับต่ำเช่นภาษาแอสเซมบลี
ภาษา
แม้ว่า C จะไม่ได้ถูกออกแบบมาให้เป็นภาษาตัวกลางอย่างชัดเจน แต่ธรรมชาติของC ในฐานะที่เป็นนามธรรมของภาษา แอสเซมบลีและความแพร่หลายในฐานะภาษาระบบมาตรฐาน ในระบบ ปฏิบัติการ แบบ Unixและระบบปฏิบัติการอื่นๆ ทำให้มันกลายเป็นภาษาตัวกลางที่ได้รับความนิยม ตัวอย่างเช่นEiffel , Sather , Esterel , ภาษา Lisp บางสำเนียง ( Lush , Gambit ), Slang ซึ่งเป็นส่วนย่อยของ Smalltalk ใน Squeak, Nim , Cython , SystemTap , Vala , V และอื่นๆ ต่างก็ใช้ C เป็นภาษาตัวกลาง นอกจากนี้ยังมีการออกแบบ C เวอร์ชันต่างๆ เพื่อให้มีคุณสมบัติของ C ในฐานะภาษาแอสเซมบลี แบบพกพาได้ เช่นC--และC Intermediate Language
ภาษาใดๆ ที่กำหนดเป้าหมายไปยังเครื่องเสมือนหรือเครื่อง p-codeสามารถถือว่าเป็นภาษาตัวกลางได้:
- ไบต์โค้ด Java
- ภาษา Common Intermediate Language ( CIL ) ของ Microsoft เป็นภาษาระดับกลางที่ออกแบบมาเพื่อให้คอมไพเลอร์ทั้งหมดสำหรับ.NET Frameworkใช้ร่วมกัน ก่อนที่จะทำการคอมไพล์แบบคงที่หรือแบบไดนามิกเป็นโค้ดเครื่องจักร
- ในขณะที่ภาษาตัวกลางส่วนใหญ่ถูกออกแบบมาเพื่อรองรับภาษาที่มีการกำหนดประเภทข้อมูลแบบคงที่ แต่ภาษาตัวกลาง Parrotถูกออกแบบมาเพื่อรองรับภาษาที่มีการกำหนดประเภทข้อมูลแบบไดนามิก ซึ่งในเบื้องต้นคือ Perl และ Python
- TIMIเป็นมาตรฐานที่ใช้โดยคอมไพเลอร์บนแพลตฟอร์มIBM i
- รหัส OสำหรับBCPL
- โค้ดMATLAB ที่คอมไพล์ไว้ล่วงหน้า
- รหัสพีของ Microsoft
- รหัส p ของปาสคาล
ชุดคอมไพเลอร์ GNU (GCC) ใช้ภาษาตัวกลางหลายภาษาภายในเพื่อลดความซับซ้อนในการพกพาและการคอมไพล์ข้ามแพลตฟอร์มภาษาเหล่านี้ได้แก่
- ภาษาการถ่ายโอนทะเบียน (RTL) ในอดีต
- ภาษาต้นไม้ทั่วไป
- GIMPLE ที่ใช้ SSAเป็นพื้นฐาน (ระดับต่ำกว่า GENERIC; เป็นอินพุตสำหรับตัวเพิ่มประสิทธิภาพส่วน ใหญ่ ; มีสัญกรณ์ "ไบต์โค้ด" ที่กระชับ)
GCC สนับสนุนการสร้าง IR เหล่านี้ ซึ่งเป็นเป้าหมายสุดท้าย:
- ชั้นกลางของ HSA
- LLVM Intermediate Representation (แปลงมาจาก GIMPLE ใน llvm-gcc ซึ่งปัจจุบันเลิกใช้งานแล้ว โดยใช้ตัวเพิ่มประสิทธิภาพและตัวสร้างโค้ดของ LLVM)
เฟรมเวิร์กคอมไพเลอร์ LLVMนั้นมีพื้นฐานมาจาก ภาษาตัวกลาง LLVM IRซึ่งการแสดงผลแบบอนุกรมไบนารีที่กระชับนั้นเรียกอีกอย่างว่า "bitcode" และได้รับการพัฒนาเป็นผลิตภัณฑ์โดย Apple [ 4 ] [ 5 ]เช่นเดียวกับ GIMPLE Bytecode, LLVM Bitcode มีประโยชน์ในการเพิ่มประสิทธิภาพในระหว่างการเชื่อมโยง เช่นเดียวกับ GCC, LLVM ยังกำหนดเป้าหมาย IR บางตัวที่มุ่งเน้นการแจกจ่ายโดยตรง รวมถึงPNaCl IR และSPIR ของ Google การพัฒนาเพิ่มเติมภายใน LLVM คือการใช้Multi-Level Intermediate Representation ( MLIR ) ซึ่งมีศักยภาพในการสร้างโค้ดสำหรับเป้าหมายที่แตกต่างกัน และเพื่อรวมเอาผลลัพธ์ของคอมไพเลอร์ต่างๆ เข้าด้วยกัน[ 6 ]
ภาษาตัวกลาง ILOC [ 7 ]ใช้ในชั้นเรียนเกี่ยวกับการออกแบบคอมไพเลอร์เป็นภาษาเป้าหมายที่เรียบง่าย[ 8 ]
อื่น
เครื่องมือ วิเคราะห์แบบคงที่มักใช้การแสดงผลระดับกลาง ตัวอย่างเช่นRadare2เป็นกล่องเครื่องมือสำหรับการวิเคราะห์ไฟล์ไบนารีและการวิศวกรรมย้อนกลับ โดยใช้ภาษาระดับกลาง ESIL [ 9 ]และ REIL [ 10 ]เพื่อวิเคราะห์ไฟล์ไบนารี
ดูเพิ่มเติม
- แผนผังไวยากรณ์นามธรรม – การแสดงโครงสร้างไวยากรณ์นามธรรมของซอร์สโค้ดในรูปแบบแผนผังต้นไม้
- หนาม
- ไบต์โค้ด – ชุดคำสั่งที่ออกแบบมาเพื่อให้โปรแกรมแปลภาษาประมวลผล
- การเขียนกราฟใหม่ – การสร้างกราฟใหม่จากกราฟที่มีอยู่เดิม
- การแปลด้วยเครื่องจักรข้ามภาษา – ประเภทหนึ่งของการแปลด้วยเครื่องจักร
- ภาษาหลัก – ภาษาตัวกลางระหว่างภาษาต่างๆ
- คอมไพเลอร์แบบซอร์สโค้ดต่อซอร์สโค้ด – ตัวแปลรหัสต้นฉบับของคอมพิวเตอร์
- ตารางสัญลักษณ์ – โครงสร้างข้อมูลที่ใช้โดยโปรแกรมแปลภาษา เช่น คอมไพเลอร์หรืออินเตอร์พรีเตอร์
- การเขียนพจน์ใหม่ – การแทนที่พจน์ย่อยในสูตรด้วยพจน์อื่น
- อันคอล
ลิงก์ภายนอก
- กลุ่ม Stanford SUIF
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การแสดงผลระดับกลาง
การ แสดงผลระดับกลาง ( IR ) คือ โครงสร้างข้อมูล หรือรหัสที่ใช้ภายในโดย คอมไพเลอร์ หรือ เครื่องเสมือน เพื่อแสดง รหัสต้นฉบับ IR ถูกออกแบบมาเพื่อให้เอื้อต่อการประมวลผลเพิ่มเติม เช่น...
ภาษาระดับกลาง
ภาษา ตัวกลาง คือภาษาของ เครื่องจักรนามธรรม ที่ออกแบบมาเพื่อช่วยในการวิเคราะห์ โปรแกรมคอมพิวเตอร์ คำนี้มาจากวิธีการใช้ใน คอมไพเลอร์ ซึ่งรหัสต้นฉบับของโปรแกรมจะถูกแปลงเป็นรูปแบบที่เหมาะสมกว่าสำหรับการปรับปรุงรหัสก่อนที่จะนำไปใช้สร้าง รหัส วัตถุ หรือ รหัส...
ภาษา
แม้ว่า C จะไม่ได้ถูกออกแบบมาให้เป็นภาษาตัวกลางอย่างชัดเจน แต่ธรรมชาติของ C ในฐานะที่เป็นนามธรรมของภาษา แอสเซมบลี และ ความแพร่หลายในฐานะ ภาษาระบบ มาตรฐาน ใน ระบบ ปฏิบัติการ แบบ Unix และระบบปฏิบัติการอื่นๆ ทำให้มันกลายเป็นภาษาตัวกลางที่ได้รับความนิยม...
อื่น
เครื่องมือ วิเคราะห์แบบคงที่ มักใช้การแสดงผลระดับกลาง ตัวอย่างเช่น Radare2 เป็นกล่องเครื่องมือสำหรับการวิเคราะห์ไฟล์ไบนารีและการวิศวกรรมย้อนกลับ โดยใช้ภาษาระดับกลาง ESIL [ 9 ] และ REIL [ 10 ] เพื่อวิเคราะห์ไฟล์ไบนารี