คอมพิวเตอร์, การเขียนโปรแกรม
โฆษก - คือ ... ประเภทของคอมไพเลอร์ แปลงและโปรแกรมการออกอากาศ
โปรแกรมเช่นเดียวกับคนที่จะแปลจากภาษาหนึ่งไปยังอีกที่ต้องการล่ามหรือนักแปล
แนวคิดพื้นฐาน
โปรแกรมที่เป็นตัวแทนทางภาษาของการคำนวณ: ฉัน→ P → P (i) ล่ามเป็นโปรแกรมที่จะถูกส่งไปยังโปรแกรมการป้อนข้อมูลที่ P และบางส่วนอินพุตเอ็กซ์ จะดำเนินการที่ P x: ผม (P, x) = P (x) ความจริงที่ว่ามีเพียงหนึ่งนักแปลที่มีความสามารถในการดำเนินการโปรแกรมเป็นไปได้ทั้งหมด (ซึ่งสามารถแสดงในระบบอย่างเป็นทางการ) เป็นลึกซึ้งมากอย่างมีนัยสำคัญและทัวริงค้นพบ
หน่วยประมวลผลเป็นล่ามของโปรแกรมในภาษาเครื่อง โดยทั่วไปมีราคาแพงเกินไปที่จะเขียนล่ามภาษาระดับสูงเพื่อให้พวกเขาแปลเป็นรูปแบบที่ง่ายต่อการตีความ
บางชนิดของนักแปลมีชื่อแปลกมาก:
- แอสเซมแปลโปรแกรมภาษาประกอบเป็นภาษาเครื่อง
- คอมไพเลอร์แปลภาษาระดับสูงให้เป็นภาษาที่ต่ำกว่า
โฆษก - เป็นโปรแกรมที่จะเป็นข้อมูลเข้าโปรแกรมในบางภาษา S และผลิตโปรแกรม T ในลักษณะที่พวกเขาทั้งสองมีความหมายเดียวกันที่: P → X → Q. นั่นคือ∀x P (x) = Q (x)
หากออกอากาศโปรแกรมทั้งหมดเป็นสิ่งที่ interpretable จะเรียกว่าการสะสมก่อนที่จะดำเนินการหรือทอทรวบรวม ทอทคอมไพเลอร์สามารถนำมาใช้ในชุดหลังซึ่งมักจะเป็นผู้ประกอบการตัวอย่างเช่น:
แหล่งที่มาคอมไพเลอร์รหัส→ (ผู้แปล) →→รหัสการชุมนุมประกอบ (compiler) →→ซีพียูรหัสเครื่อง (ล่าม)
การดำเนินงานหรือแบบไดนามิกสะสมเกิดขึ้นหากโปรแกรมมีการออกอากาศเมื่อดำเนินการโดยส่วนหนึ่งรวบรวมไว้ก่อนหน้าอื่น ๆ JIT-คอมไพเลอร์จำได้ว่าสิ่งที่พวกเขาได้ทำมาแล้วเพื่อที่จะไม่ทำซ้ำรหัสที่มาอีกครั้งและอีกครั้ง พวกเขายังสามารถผลิตสะสมและปรับ recompilation ขึ้นอยู่กับพฤติกรรมของสภาพแวดล้อมการทำงานของโปรแกรมที่
หลายภาษาอนุญาตให้มีการรันโค้ดที่รวบรวมเวลาและรวบรวมรหัสใหม่ที่รันไทม์
ขั้นตอนการแปล
ออกอากาศประกอบด้วยขั้นตอนของการวิเคราะห์และสังเคราะห์นี้:
แหล่งที่มารหัสวิเคราะห์→→→แนวคิดกำเนิดตัวแทน (สังเคราะห์) →รหัสเป้าหมาย
เพราะนี่คือเหตุผลเหล่านี้:
- วิธีการอื่นใดที่ไม่เหมาะสม คำแปลก็ไม่ทำงาน
- วิธีการแก้ปัญหาทางวิศวกรรมที่ดี: ถ้าคุณต้องการที่จะเขียนนักแปลของ M และ N ภาษาแหล่งที่มาของการกำหนดเป้าหมายจำเป็นต้องเขียนโปรแกรมเพียงง่ายๆ M + N (polukompilyatorov) มากกว่า M × N ซับซ้อน (รวมของนักแปล)
แต่ในทางปฏิบัติมีมุมมองความคิดของไม่ค่อยแสดงออกเพียงพอและมีประสิทธิภาพเพียงพอที่จะครอบคลุมทุกแหล่งที่มาและเป้าหมายเท่าที่จะนึกออกภาษา ขณะที่บางคนก็สามารถที่จะเข้ามาใกล้จะถึงนี้
คอมไพเลอร์จริงผ่านหลายขั้นตอน เมื่อมีการสร้างคอมไพเลอร์ของคุณเองไม่จำเป็นต้องทำซ้ำทั้งหมดทำงานอย่างหนักว่าคนที่ได้ทำเพื่อสร้างการแสดงและเครื่องกำเนิดไฟฟ้า คุณสามารถแปลภาษาของคุณโดยตรงใน JavaScript หรือ C และใช้ประโยชน์จากที่มีอยู่ JavaScript เครื่องยนต์และเรียบเรียง C ที่จะทำส่วนที่เหลือ นอกจากนี้คุณยังสามารถใช้ที่มีอยู่กลางเป็นตัวแทนและ เสมือนเครื่อง
บันทึกการแปล
โฆษก - เป็นโปรแกรมหรือฮาร์ดแวร์ที่เกี่ยวข้องกับสามภาษา: แหล่งที่มาของปลายทางและฐาน พวกเขาสามารถเขียนได้ใน T-shape, วางซ้ายเดิมขวาและฐานเป้าหมายด้านล่าง
มีสามประเภทของคอมไพเลอร์คือ:
- โฆษก - เป็น samokompilyator ถ้ามันสอดคล้องกับพื้นฐานภาษาต้นฉบับ
- คอมไพเลอร์ภาษาที่กำหนดเป้าหมายเป็นพื้นฐานที่เรียกว่า samorezidentnym
- โฆษก - ข้ามคอมไพเลอร์ถ้าเขามีการกำหนดเป้าหมายและภาษาต่างๆขั้นพื้นฐาน
นี่คือเหตุผลที่สำคัญหรือไม่
แม้ว่าคุณจะไม่ทำให้คอมไพเลอร์จริงความรู้ที่ดีของเทคโนโลยีของการสร้างเพราะแนวคิดใช้เพื่อการนี้ถูกนำมาใช้กันอย่างแพร่หลายเช่น:
- จัดรูปแบบข้อความ;
- คำสั่งภาษา ฐานข้อมูล;
- สถาปัตยกรรมคอมพิวเตอร์ขั้นสูง
- ปัญหาการเพิ่มประสิทธิภาพทั่วไป;
- GUIs;
- ภาษาสคริปต์;
- ควบคุม;
- เครื่องเสมือน;
- เครื่องแปลภาษา
นอกจากนี้หากคุณต้องการที่จะเขียน preprocessors, Linkers, รถตัก, แก้จุดบกพร่องและโปรคุณต้องไปผ่านขั้นตอนเช่นเดียวกับเมื่อเขียนคอมไพเลอร์
นอกจากนี้คุณยังสามารถเรียนรู้วิธีการเขียนโปรแกรมที่ดีขึ้นนับตั้งแต่การสร้างของนักแปลภาษาหมายถึงความเข้าใจที่ดีขึ้นของความซับซ้อนและความคลุมเครือของมัน การศึกษาหลักการทั่วไปของการออกอากาศยังช่วยให้คุณกลายเป็นภาษาออกแบบที่ดี ดังนั้นมันไม่สำคัญว่าสูงชันภาษาหากไม่สามารถดำเนินการได้อย่างมีประสิทธิภาพ?
เทคโนโลยีที่ครอบคลุม
เทคโนโลยีคอมไพเลอร์ครอบคลุมพื้นที่ที่แตกต่างของวิทยาการคอมพิวเตอร์:
- ทฤษฎีอย่างเป็นทางการของภาษา: ไวยากรณ์แยกคำนวณ;
- สถาปัตยกรรมคอมพิวเตอร์:. การเรียนการสอนชุด RISC หรือ CISC, ไปป์ไลน์การประมวลผลหลักรอบนาฬิกา ฯลฯ
- แนวคิดของการเขียนโปรแกรมภาษาเช่นการดำเนินการควบคุมลำดับการดำเนินการตามเงื่อนไขย้ำเรียกซ้ำสลายการทำงานต้นแบบประสานเมตาเขียนโปรแกรมขอบเขตคงประเภทย่อยแม่แบบประเภทเอาท์พุต้นแบบคำอธิบายประกอบไหล monads กล่องจดหมายให้ดำเนินการต่อ สัญลักษณ์แสดงออกปกติหน่วยความจำในการทำธุรกรรม, มรดก, polymorphism การตั้งค่าโหมดและอื่น ๆ ฯลฯ ..;
- ภาษานามธรรมและเครื่องเสมือน;
- ขั้นตอนวิธีและ โครงสร้างข้อมูล: การแสดงออกปกติขั้นตอนวิธีการแยกวิเคราะห์อัลกอริทึมกราฟิก, การเขียนโปรแกรมแบบไดนามิก การฝึกอบรม
- การเขียนโปรแกรมภาษา: ไวยากรณ์ความหมาย (แบบคงที่และแบบไดนามิก) กระบวนทัศน์การสนับสนุน (โครงสร้าง OOP ทำงานตรรกะกองขนาน meta-การเขียนโปรแกรม);
- ซอฟแวร์การสร้าง (คอมไพเลอร์มักจะมีขนาดใหญ่และซับซ้อน): แปล, แคช componentize, API-อินเตอร์เฟซกลับมาใช้การประสาน
การออกแบบคอมไพเลอร์
บางส่วนของปัญหาที่พบในการพัฒนาของนักแปลจริง:
- มีปัญหากับภาษาต้นฉบับ มันเป็นเรื่องง่ายที่จะรวบรวมมันได้หรือไม่ มี preprocessor? วิธีนี้เป็นประเภทหรือไม่ มีห้องสมุด?
- การจัดกลุ่มผ่านคอมไพเลอร์: เดียวหรือหลายวิธี?
- การศึกษาระดับปริญญาของการเพิ่มประสิทธิภาพที่ต้องการ โปรแกรมการออกอากาศได้อย่างรวดเร็วและไม่สะอาดด้วยการเพิ่มประสิทธิภาพน้อยหรือไม่มีเลยสามารถเป็นปกติ คอมไพเลอร์เพิ่มประสิทธิภาพเกินจะชะลอตัว แต่รหัสที่ดีกว่าที่รันไทม์อาจจะคุ้มค่า
- การศึกษาระดับปริญญาที่จำเป็นของการตรวจสอบข้อผิดพลาด สามารถแปลได้หยุดเพียงแค่ที่ผิดพลาดครั้งแรก? เมื่อมันควรจะหยุด? ไม่ว่าจะไว้วางใจแก้ไขข้อผิดพลาดคอมไพเลอร์?
- ความพร้อมใช้งานของเครื่องมือ ถ้าภาษาต้นฉบับไม่ได้มีขนาดเล็กมาก, สแกนเนอร์และเครื่องกำเนิดไฟฟ้าจะต้องวิเคราะห์ นอกจากนี้ยังมีเครื่องกำเนิดไฟฟ้า, เครื่องกำเนิดไฟฟ้ารหัส แต่พวกเขาจะไม่ธรรมดา
- ประเภทรหัสเป้าหมายที่จะสร้าง ได้รับการคัดเลือกจากรหัสเครื่องบริสุทธิ์ที่เสริมหรือเสมือน หรือเพียงแค่เขียนส่วนรายการที่สร้างการแสดงกลางที่นิยมเช่น LLVM, RTL หรือ JVM หรือทำให้การแปลของเดิมในรหัสที่มาใน C หรือ JavaScript
- รูปแบบของรหัสเป้าหมาย คุณสามารถเลือก ภาษาที่ประกอบ รหัสเครื่องพกพาภาพหน่วยความจำรหัสเครื่อง
- การกำหนดเป้าหมายใหม่ เมื่อชุดของเครื่องกำเนิดไฟฟ้าเป็นสิ่งที่ดีที่จะมีส่วนเข้าร่วมกัน ด้วยเหตุนี้จึงเป็นที่ดีที่สุดที่จะมีหนึ่งเครื่องกำเนิดไฟฟ้าสำหรับการป้อนข้อมูลของหลายส่วน
คอมไพเลอร์สถาปัตยกรรมส่วนประกอบ
เหล่านี้เป็นส่วนประกอบที่สำคัญในการทำงานของคอมไพเลอร์ที่สร้างรหัสพื้นเมือง (ถ้ามีโปรแกรมออกเป็นโปรแกรมใน C หรือเครื่องเสมือนที่คุณไม่จำเป็นต้องหลายขั้นตอนเพื่อให้บริการ):
- โปรแกรมการป้อนข้อมูล (เครื่องหมายไหล) จะถูกป้อนเข้าเครื่องสแกนเนอร์ (วิเคราะห์ศัพท์) ซึ่งแปลงเป็นกระแสของราชสกุล
- Parser (parser) สร้างต้นไม้ต้นหนึ่งไวยากรณ์นามธรรม
- การวิเคราะห์ความหมายสลายข้อมูลความหมายและการตรวจสอบโหนดสำหรับข้อผิดพลาด เป็นผลให้การสร้างความหมายกราฟ - ต้นไม้ไวยากรณ์นามธรรมที่มีคุณสมบัติเพิ่มเติมและการเชื่อมโยงที่จัดตั้งขึ้น
- รหัสเครื่องกำเนิดไฟฟ้าระดับกลางสร้างกราฟการไหล (tuples ถูกแบ่งออกเป็นบล็อกหลัก)
- เครื่องอิสระเพิ่มประสิทธิภาพรหัสดำเนินการทั้งในระดับท้องถิ่น (ภายในหน่วยฐาน) และระดับโลก (เพื่อบล็อคทั้งหมด) การเพิ่มประสิทธิภาพโดยทั่วไปที่เหลือภายในกิจวัตร ลดรหัสซ้ำซ้อนและลดความยุ่งยากในการคำนวณ ผลที่ได้คือกราฟการไหลของการปรับเปลี่ยน
- เครื่องกำเนิดไฟฟ้าผูกรหัสเป้าหมายพื้นฐานเป็นรหัสควบคุมการส่งเป็นเส้นตรงสร้างลงทะเบียนเสมือนวัตถุไฟล์ประกอบ (อาจจะไม่ได้ผล)
- เครื่องขึ้นอยู่กับการเพิ่มประสิทธิภาพลิงเกอร์จัดสรรหน่วยความจำระหว่างการลงทะเบียนและทำให้การวางแผนทีม จะดำเนินการแปลงโปรแกรมในภาษาการชุมนุมที่ชุมนุมนี้กับการใช้งานที่ดีของ pipelining
นอกจากนี้การใช้งานของผู้จัดการการตรวจสอบข้อผิดพลาดของระบบย่อยและตารางสัญลักษณ์
วิเคราะห์คำศัพท์ (สแกน)
สแกนเนอร์แปลงอักขระแหล่งกระแสเข้าไปในกระแสของสัญญาณการลบช่องว่างความคิดเห็นและแมโครขยาย
สแกนเนอร์มักจะพบปัญหาเช่นหรือไม่ที่จะคำนึงถึงกรณีที่อัตรากำไรขั้นต้นแบ่งบรรทัดและความคิดเห็นที่ฝังตัว
ข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการสแกนที่เรียกว่าคำศัพท์และรวมถึง:
- ตัวอักษรที่ไม่ได้อยู่ในตัวอักษร;
- ส่วนที่เกินจากจำนวนตัวอักษรในคำหรือเส้น;
- ไม่ได้เป็นสัญญาณปิดหรือสตริงตัวอักษร;
- จุดสิ้นสุดของแฟ้มในความคิดเห็น
แยก (แยก)
ตัวแยกวิเคราะห์แปลงลำดับราชสกุลเป็นต้นไม้ไวยากรณ์นามธรรม โหนดในต้นไม้แต่ละครั้งจะถูกเก็บไว้เป็นวัตถุที่มีเขตข้อมูลชื่อหลายแห่งซึ่งเป็นตัวโหนต้นไม้ ในขั้นตอนนี้จะไม่มีวงจร เมื่อคุณสร้างแยกวิเคราะห์เป็นสิ่งจำเป็นที่จะใส่ใจกับระดับของความซับซ้อนของไวยากรณ์ (LL หรือ LR) และพบว่ามีผู้ใดแก้ความกำกวมกฎ บางภาษาจะต้องมีการวิเคราะห์ความหมาย
พบข้อผิดพลาดในขั้นตอนนี้จะเรียกว่าไวยากรณ์ ตัวอย่างเช่น:
- k = 5 * (7 - Y;
- J = / 5;
- 56 = x * 4
การวิเคราะห์ความหมาย
ในระหว่าง การวิเคราะห์ความหมาย ในการตรวจสอบ permissibility ของกฎและชิ้นส่วนร่วมของต้นไม้แยกที่ (ให้ชื่ออ้างอิงแทรกการดำเนินงานสำหรับการแปลงชนิดนัยและอื่นง.) สำหรับการขึ้นรูปแบบของกราฟความหมาย
เห็นได้ชัดว่าชุดของภัณฑ์ของกฎในภาษาที่แตกต่างกันที่แตกต่างกัน หากคุณรวบรวมภาษา Java เหมือนคอมไพเลอร์อาจพบ:
- ประกาศตัวแปรหลายภายในขอบเขตของตน
- อ้างอิงถึงตัวแปรก่อนการประกาศ;
- อ้างอิงถึงชื่อของผู้ที่ไม่ได้ประกาศนั้น
- การละเมิดสิทธิในสิทธิบัตร;
- จำนวนมากเกินไปหรือไม่เพียงพอของการขัดแย้งในวิธีการเรียก;
- ประเภทไม่ตรงกัน
รุ่น
รหัสรุ่นระดับกลางผลิตกราฟการไหลประกอบด้วย tuples แบ่งออกเป็นพื้นฐาน
รุ่นรหัสผลิตรหัสเครื่องจริง ในคอมไพเลอร์แบบดั้งเดิมสำหรับ RISC เครื่องในขั้นตอนแรกคุณสร้างประกอบกับจำนวนอนันต์ของการลงทะเบียนเสมือน สำหรับ CISC เครื่องอาจจะไม่เกิดขึ้น
Similar articles
Trending Now