คำถามติดแท็ก compiler

คอมไพเลอร์เป็นโปรแกรมคอมพิวเตอร์ที่แปลงซอร์สโค้ดที่เขียนในภาษาโปรแกรมหนึ่งเป็นภาษาคอมพิวเตอร์อื่น

1
ข้อเสียของรูปแบบกลางการทำงาน
ฉันกำลังเขียนเครื่องมือเพิ่มประสิทธิภาพสำหรับภาษาที่คล้ายกับ JavaScript และต้องเลือกการแสดงรหัสกลาง ตัวเลือกที่ชัดเจน / ทั่วไปในทุกวันนี้ก็คือStatic Single Assignment (SSA) อย่างไรก็ตามโมเดิร์นคอมไพเลอร์การดำเนินงานใน Cยังกล่าวถึงรูปแบบกลางทำงานซึ่งโดยทั่วไปหมายถึงจะบริสุทธิ์การทำงานสำหรับการแสดงกลาง (บริสุทธิ์ในแง่เดียวของตัวแปรท้องถิ่นข้อมูลกองยังคงไม่แน่นอนและไม่ CPS เพียงตรงไปตรงมาletบล็อกและโทรหาง) และ มีข้อดีบางประการในแง่ของการให้เหตุผลที่ง่ายกว่า สมมุติว่ามันไม่ใช่เกมง่ายๆหรือทุกคนจะใช้การเป็นตัวแทนอยู่แล้วดังนั้นคำถามของฉันคืออะไรรูปแบบการใช้งานกลางที่มีข้อเสียเปรียบเทียบกับ SSA อย่างไร

9
คำแนะนำอาชีพ: ปริญญาเอกในทฤษฎีภาษาโปรแกรม [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน6 ปีที่ผ่านมา ฉันสนใจทฤษฎีของภาษาโปรแกรมและจะสมัครปริญญาเอกในหัวข้อนี้ แต่ฉันต้องการทราบเพิ่มเติมเกี่ยวกับอาชีพหลังจบการศึกษาระดับบัณฑิตศึกษา นอกเหนือจากการเป็นอาจารย์ แต่ฉันสามารถรับอาชีพใดได้บ้าง

2
คอมไพเลอร์ใช้ประโยชน์จากมัลติเธรดเพื่อการรวบรวมที่เร็วขึ้นหรือไม่?
ถ้าฉันจำหลักสูตรคอมไพเลอร์ของฉันได้อย่างถูกต้องคอมไพเลอร์ทั่วไปมีโครงร่างที่เรียบง่ายดังต่อไปนี้: ตัววิเคราะห์คำจะสแกน (หรือเรียกใช้ฟังก์ชั่นการสแกนบางอย่าง) โค้ดต้นฉบับแบบตัวอักษรต่ออักขระ สตริงของอักขระอินพุตถูกตรวจสอบกับพจนานุกรมของ lexemes เพื่อความถูกต้อง หาก lexeme นั้นถูกต้องมันจะถูกจัดประเภทเป็นโทเค็นที่สอดคล้องกับมัน parser ตรวจสอบความถูกต้องของการรวมกันของโทเค็น; token โดยโทเค็น มันเป็นไปได้ในทางทฤษฎีหรือไม่ที่จะแบ่งซอร์สโค้ดออกเป็นควอเตอร์ คอมไพเลอร์มีตัวที่ใช้มัลติเธรดหรือไม่?

5
การต่อสู้ทำให้รู้สึกเมื่อใช้แบ็กเอนด์คอมไพเลอร์ใหม่หรือไม่?
ฉันมีภาษาที่มีอยู่ซึ่งฉันจำเป็นต้องย้ายพอร์ตไปยังแพลตฟอร์มใหม่ ฉันอาจลองทำสิ่งนี้โดยเปลี่ยนแบ็กเอนด์ของคอมไพเลอร์ที่มีอยู่ มันเป็นงานที่มีความสำคัญในการเขียนแบ็กเอนด์ใหม่ ฉันไม่เห็นวิธีที่จะทำลายสิ่งนี้ให้เป็นเรื่องที่สมเหตุสมผลโดยไม่ละเมิดหลักเกณฑ์การลงทุน ฉันไม่เห็นว่าแต่ละเรื่องสามารถเจรจาต่อรองได้ - พวกเขาทั้งหมดจำเป็นสำหรับคอมไพเลอร์ที่ใช้งานได้ เรื่องราวต่าง ๆ มีลำดับความสำคัญเท่ากันและไม่สำคัญว่าฉันจะส่งพวกเขาออกไปเป็นอย่างไร ฉันต้องทำทั้งหมด มีบางส่วนของซอฟต์แวร์ที่ฉันใช้อยู่ซึ่งมีลำดับความสำคัญต่ำกว่าซอฟต์แวร์อื่นและฉันเห็นว่าเราสามารถส่งมอบได้เพิ่มขึ้น แต่มีหลักสำคัญที่เป็นต้องมี ฉันวางแผนที่จะพยายามติดตามการต่อสู้ แต่ฉันเพิ่งผ่านการเคลื่อนไหวหรือไม่ มีแนวทางปฏิบัติที่แนะนำสำหรับโครงการประเภทนี้หรือไม่?

2
คอมไพเลอร์สามารถแปลงตรรกะแบบเรียกซ้ำเป็นตรรกะแบบไม่ซ้ำแบบเรียกซ้ำได้หรือไม่
ฉันได้เรียนรู้ F # และมันเริ่มมีอิทธิพลต่อความคิดของฉันเมื่อฉันเขียนโปรแกรม C # ด้วยเหตุนี้ฉันจึงใช้การเรียกซ้ำเมื่อฉันรู้สึกว่าผลลัพธ์นั้นช่วยให้อ่านได้ง่ายขึ้นและฉันก็ไม่สามารถจินตนาการได้ว่ามันคดเคี้ยวจนล้นสแต็ค สิ่งนี้ทำให้ฉันถามว่าคอมไพเลอร์สามารถแปลงฟังก์ชั่นแบบเรียกซ้ำเป็นแบบที่ไม่ใช่แบบเรียกซ้ำได้หรือไม่

1
มีพอดคาสต์ (ไม่บรรยาย) เกี่ยวกับการพัฒนาคอมไพเลอร์หรือไม่?
คำตอบของคำถามนี้เป็นความพยายามของชุมชน แก้ไขคำตอบที่มีอยู่เพื่อปรับปรุงโพสต์นี้ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ มีพอดคาสต์หลายตัวพร้อมการบรรยายจากมหาวิทยาลัย ฉันกำลังมองหาพอดแคสต์ "อื่น ๆ " ดังนั้นพอดคาสต์ที่ไม่มีการบรรยายเกี่ยวกับการพัฒนาคอมไพเลอร์มีอะไรบ้าง?
15 compiler 

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

13
เป็นความจริงหรือไม่ที่คอมไพเลอร์ C เวอร์ชันแรกใช้เวลาหลายสิบนาทีและต้องการฟล็อปปี้ดิสก์ในระหว่างขั้นตอนต่างๆ
แรงบันดาลใจจากคำถามนี้ ฉันได้ยินมาว่าคอมไพเลอร์รุ่นแรก ๆ ของ C สำหรับคอมพิวเตอร์ส่วนบุคคล (ฉันเดาว่ามันประมาณปี 1980) อาศัยอยู่ในฟลอปปีดิสก์สองหรือสามแผ่นและเพื่อรวบรวมโปรแกรมที่ต้องแทรกดิสก์ด้วย "First Pass" "การผ่านครั้งแรก" จากนั้นเปลี่ยนเป็นดิสก์ด้วย "การผ่านครั้งที่สอง" เรียกใช้จากนั้นทำเช่นเดียวกันสำหรับ "การผ่านครั้งที่สาม" แต่ละรอบวิ่งเป็นเวลาหลายสิบนาทีดังนั้นนักพัฒนาจึงเสียเวลามากในกรณีที่พิมพ์ผิด การเรียกร้องนั้นเป็นจริงมากแค่ไหน? ตัวเลขและรายละเอียดที่แท้จริงคืออะไร
15 history  compiler 

4
งานคอมไพเลอร์ - จำเป็นต้องมีการศึกษาเท่าไหร่ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามดังนั้นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว ฉันได้รับแรงบันดาลใจจากการก่อสร้างคอมไพเลอร์เป็นวิชาคำถามและคิดว่าฉันจะถามคำถามนี้ ฉันได้ยินจากคนไม่กี่คนที่พวกเขามี "ทีมคอมไพเลอร์" ที่ดี (อย่าถามที่ฉันได้ยินฉันจำไม่ได้) ดังนั้นทำให้ฉันสงสัยว่าทำไมคนถึงได้ทำงานในทีมเช่นนี้ ? ฉันรู้ว่ามีชั้นเรียนในหลักสูตรปริญญาตรีและเป็นเช่นนั้น แต่เป็นสิ่งที่การศึกษาระดับปริญญาโทจะต่ำสุด (เช่นปริญญาโทอย่างน้อย)? ฉันเริ่มต้นปริญญาโทสาขาวิทยาการคอมพิวเตอร์ในอีกสองเดือนและโรงเรียนที่ฉันกำลังจะมีสองชั้นเรียนคอมไพเลอร์ซึ่งจะเพียงพอที่จะได้งานพัฒนาคอมไพเลอร์หรือจะต้องใช้เวลามากขึ้นหรือไม่

12
มีคอมไพเลอร์ใดที่พยายามแก้ไขข้อผิดพลาดทางไวยากรณ์ด้วยตนเองหรือไม่? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันได้ยินมาพักหนึ่งแล้วว่าเคยเป็นคอมไพเลอร์ที่พยายามแก้ไขข้อผิดพลาดทางไวยากรณ์โดยการวิเคราะห์บริบทและสรุปสิ่งที่ตั้งใจไว้ คอมไพเลอร์ดังกล่าวมีอยู่จริงหรือไม่? เห็นได้ชัดว่ามันมีคุณค่าในทางปฏิบัติน้อย แต่จะน่าสนใจมากที่จะเล่นกับและเรียนรู้จาก
15 syntax  compiler 

10
คำเตือนของคอมไพเลอร์
คอมไพเลอร์หลายคนมีข้อความเตือนเพื่อเตือนโปรแกรมเมอร์เกี่ยวกับข้อผิดพลาดทางตรรกะและประสิทธิภาพที่อาจเกิดขึ้นเวลาส่วนใหญ่คุณแก้ไขได้อย่างรวดเร็ว แต่สิ่งที่เกี่ยวกับคำเตือนที่ไม่สามารถแก้ไขได้? คุณจัดการกับคำเตือนที่ไม่สามารถแก้ไขได้อย่างไร คุณเขียนส่วนของรหัสอีกครั้งหรือเขียนใหม่ในวิธี "ยาวไม่แฮ็ค" หรือปิดใช้งานคำเตือนทั้งหมดด้วยกันไหม สิ่งที่ควรปฏิบัติที่ดีที่สุด ถ้าคุณแก้ไขรหัสของคนอื่นและรหัสของเขามีคำเตือน? นี่เป็นตัวอย่างที่ดี: jQuery มีคำเตือน JavaScript จำนวนมากเมื่อตรวจพบเบราว์เซอร์ระดับ Mozilla เหตุใดผู้พัฒนา jQ จึงไม่แก้ไข หากคุณมีส่วนร่วมกับ jQuery คุณจะแก้ไขหรือไม่
15 compiler 

2
ข้อมูลทั่วไปถูกนำไปใช้ในคอมไพเลอร์สมัยใหม่อย่างไร
สิ่งที่ฉันหมายถึงนี่คือเราจะเปลี่ยนจากเทมเพลตบางส่วนT add(T a, T b) ...เป็นรหัสที่สร้างได้อย่างไร ฉันคิดถึงวิธีที่จะบรรลุผลสองสามอย่างนี้เราเก็บฟังก์ชันทั่วไปไว้ใน AST Function_Nodeแล้วทุกครั้งที่เราใช้เราเก็บไว้ในโหนดฟังก์ชั่นดั้งเดิมสำเนาของตัวเองด้วยประเภททั้งหมดที่ถูกTแทนที่ด้วยประเภทที่ กำลังใช้. ยกตัวอย่างเช่นadd<int>(5, 6)จะเก็บสำเนาของฟังก์ชั่นทั่วไปหาaddและทดแทนทุกประเภทT ในการคัดลอกintด้วย ดังนั้นมันจะมีลักษณะดังนี้: struct Function_Node { std::string name; // etc. Type return_type; std::vector<std::pair<Type, std::string>> arguments; std::vector<Function_Node> copies; }; จากนั้นคุณสามารถสร้างรหัสสำหรับสิ่งเหล่านี้และเมื่อคุณเยี่ยมชมFunction_Nodeรายการของสำเนาที่copies.size() > 0คุณเรียกใช้visitFunctionในสำเนาทั้งหมด visitFunction(Function_Node& node) { if (node.copies.size() > 0) { for (auto& node : nodes.copies) { visitFunction(node); } // it's …

8
ทำไม C ++ ถึงเขียนคอมไพเลอร์?
ฉันสงสัยว่าทำไม C ++ จึงเป็นตัวเลือกที่ดีในการเขียนคอมไพเลอร์ แน่นอนว่า C ก็ดีสำหรับจุดประสงค์นี้ด้วยเช่นกันเพราะคอมไพเลอร์ส่วนใหญ่เขียนใน C หรือ C ++ แต่ฉันสนใจ C ++ มากกว่าในเวลานี้ มีเหตุผลที่ดีไหม? ฉันกำลังหาสิ่งนั้นในอินเทอร์เน็ต แต่ฉันไม่สามารถหาเหตุผลที่ดีได้
14 c++  compiler 

1
ทำไม LLVM จึงมี IR เหมือนการประกอบมากกว่า IR เหมือนต้นไม้ หรือ: ทำไมโครงการตั้งเป้าหมาย LLVM IR แทนที่จะเป็น AST เสียงดังกราว?
ทำไมแอสเซมบลีแทน LLVM ของกลาง (LLVM IR) จึงเป็นเหมือนต้นไม้มากกว่าต้นไม้ อีกทางหนึ่งทำไมการติดตั้งภาษาจึงตั้งเป้าหมาย LLVM IR มากกว่า AST ของเสียงดังกราว ฉันไม่ได้พยายามถามคำถามสองคำถามที่แตกต่างกันในครั้งเดียวถ้ามันเป็นอย่างนั้น สำหรับฉันดูเหมือนว่าทั้งไคลเอนต์และนักเขียนโปรแกรมไลบรารีได้รับความเห็นพ้องต้องกันว่า API ของ LLVM ไม่มีอะไรมากไปกว่าการออกแบบซอฟต์แวร์ที่ดีและคำถามของฉันก็คือ "ทำไม" เหตุผลที่ฉันถามคือดูเหมือนว่า LLVM สามารถให้ฟังก์ชันการทำงานมากขึ้นเพื่อ frontends หาก IR เป็นเหมือน AST เพราะเครื่องมือ AST ที่ใช้ clang ของ clang สามารถใช้กับส่วนหน้าใดก็ได้ อีกทางหนึ่งภาษาที่กำหนดเป้าหมาย LLVM IR สามารถรับฟังก์ชั่นการใช้งานได้มากกว่าหากพวกเขาตั้งเป้าหมาย AST ของเสียงดังกราว เสียงดังกังวานมีคลาสและฟังก์ชั่นสำหรับการสร้างและทำงานกับ AST และเป็นโครงการส่วนหน้าเดียวที่เชื่อมโยงอย่างยิ่งกับโครงการ LLVM ดังนั้นทำไมฟังก์ชั่น AST ของเสียงดังกราวจึงดังต่อไปยัง LLVM ฉันรู้ว่า Rust …

3
คอมไพเลอร์รู้อย่างไรเกี่ยวกับคลาสอื่นและคุณสมบัติของมัน?
ฉันกำลังเขียนภาษาการเขียนโปรแกรมแรกของฉันที่เป็นวัตถุแบบตะวันออกและดีมากด้วยการสร้าง 'คลาส' เดี่ยว แต่ขอบอกว่าผมต้องการให้มีการเรียนการพูดและClassA ClassBให้ทั้งสองไม่มีอะไรเกี่ยวข้องกันแล้วทั้งหมดเป็นสิ่งที่ดี อย่างไรก็ตามการพูดClassAสร้างClassBคำถามนี้ - คำถามที่เกี่ยวข้อง 2 คำถาม: วิธีจะคอมไพเลอร์รู้เมื่อรวบรวมClassAว่าClassBแม้อยู่และถ้ามันไม่อย่างไรก็รู้ว่าคุณสมบัติของมัน? ความคิดของฉันในตอนนี้ก็คือ: แทนที่จะรวบรวมแต่ละคลาสในแต่ละครั้ง (เช่นการสแกน, วิเคราะห์คำและสร้างรหัส) แต่ละไฟล์ "(ไม่ใช่ไฟล์จริง ๆ , แต่," คลาส ") ฉันต้องสแกน + แยกแต่ละครั้งก่อน แล้วสร้างรหัสสำหรับทั้งหมดหรือไม่

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