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

แท็กคอมไพเลอร์ - ก่อสร้างควรนำไปใช้กับคำถามที่เกี่ยวข้องกับการเขียนโปรแกรมของคอมไพเลอร์หรือคำถามเกี่ยวกับรายละเอียดการทำงานภายในของคอมไพเลอร์ อย่าใช้สำหรับคำถามเกี่ยวกับ * ใช้ * คอมไพเลอร์เฉพาะหรือข้อผิดพลาดในการรวบรวม

6
ฉันสามารถบังคับใช้รูปแบบประเภทใดกับโค้ดเพื่อให้แปลเป็นภาษาโปรแกรมอื่นได้ง่ายขึ้น [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันกำลังวางแผนที่จะทำโครงการด้านข้างที่มีเป้าหมายในการแปลรหัสจากภาษาโปรแกรมหนึ่งไปยังอีกภาษาหนึ่ง ภาษาที่ฉันเริ่มต้นคือ PHP และ Python (Python เป็น PHP ควรจะเริ่มต้นได้ง่ายกว่า) แต่ฉันควรจะเพิ่มภาษาอื่น ๆ ได้อย่างง่ายดาย (สัมพัทธ์) แผนคือ: สิ่งนี้มุ่งสู่การพัฒนาเว็บ รหัสเดิมและรหัสเป้าหมายจะอยู่บนเฟรมเวิร์ก (ซึ่งฉันจะต้องเขียนด้วย) กรอบงานเหล่านี้จะใช้รูปแบบการออกแบบ MVC และปฏิบัติตามข้อกำหนดการเข้ารหัสที่เข้มงวด สิ่งนี้น่าจะทำให้การแปลง่ายขึ้น ฉันกำลังดู IOC และการฉีดแบบพึ่งพาเนื่องจากอาจทำให้กระบวนการแปลง่ายขึ้นและมีข้อผิดพลาดน้อยลง ฉันจะใช้โมดูลแยกวิเคราะห์ของ Python ซึ่งช่วยให้ฉันสามารถเล่นกับ Abstract Syntax Tree ได้ เห็นได้ชัดว่าสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับจาก PHP คือtoken_get_all ()ซึ่งเป็นการเริ่มต้น จากนั้นฉันสามารถสร้าง AST ตารางสัญลักษณ์และโฟลว์ควบคุม จากนั้นฉันเชื่อว่าฉันสามารถเริ่มการส่งออกโค้ดได้ ผมไม่จำเป็นต้องมีการแปลที่สมบูรณ์แบบ ฉันยังคงต้องตรวจสอบโค้ดที่สร้างขึ้นและแก้ไขปัญหา …

5
การใช้การอนุมานประเภท
ฉันเห็นการอภิปรายที่น่าสนใจเกี่ยวกับการพิมพ์แบบคงที่และแบบไดนามิก โดยทั่วไปฉันชอบการพิมพ์แบบคงที่เนื่องจากการตรวจสอบประเภทการคอมไพล์โค้ดเอกสารที่ดีกว่าเป็นต้นอย่างไรก็ตามฉันยอมรับว่ามันทำให้โค้ดรกถ้าทำแบบที่ Java ทำ ดังนั้นฉันกำลังจะเริ่มสร้างภาษาสไตล์การทำงานของตัวเองและการอนุมานประเภทเป็นหนึ่งในสิ่งที่ฉันต้องการนำไปใช้ ฉันเข้าใจว่ามันเป็นเรื่องใหญ่และฉันไม่ได้พยายามสร้างสิ่งที่ยังไม่เคยทำมาก่อนเพียงแค่การอนุมานขั้นพื้นฐาน ... มีคำแนะนำเกี่ยวกับสิ่งที่ต้องอ่านที่จะช่วยฉันในเรื่องนี้หรือไม่? โดยเฉพาะอย่างยิ่งสิ่งที่เป็นประโยชน์ / ปฏิบัติมากกว่าเมื่อเทียบกับทฤษฎีหมวดหมู่เชิงทฤษฎี / ตำราทฤษฎีประเภทอื่น ๆ หากมีข้อความอภิปรายเกี่ยวกับการนำไปใช้งานพร้อมโครงสร้างข้อมูล / อัลกอริทึมนั่นก็น่าจะดี


11
การสร้างไฟล์คลาส Java ถูกกำหนดหรือไม่?
เมื่อใช้JDK เดียวกัน (เช่นjavacปฏิบัติการเดียวกัน) ไฟล์คลาสที่สร้างขึ้นจะเหมือนกันเสมอหรือไม่? อาจมีความแตกต่างขึ้นอยู่กับระบบปฏิบัติการหรือฮาร์ดแวร์หรือไม่? ยกเว้นรุ่น JDK อาจมีปัจจัยอื่นที่ทำให้เกิดความแตกต่างหรือไม่? มีตัวเลือกคอมไพเลอร์เพื่อหลีกเลี่ยงความแตกต่างหรือไม่? ความแตกต่างอาจเป็นไปได้ในทางทฤษฎีเท่านั้นหรือ Oracle javacสร้างไฟล์คลาสที่แตกต่างกันสำหรับตัวเลือกอินพุตและคอมไพเลอร์เดียวกันหรือไม่ อัปเดต 1ฉันสนใจในการสร้างเช่นเอาต์พุตของคอมไพเลอร์ไม่ใช่ว่าไฟล์คลาสสามารถเรียกใช้บนแพลตฟอร์มต่างๆได้หรือไม่ อัปเดต 2โดย 'Same JDK' ฉันยังหมายถึงjavacปฏิบัติการเดียวกัน อัปเดต 3ความแตกต่างระหว่างความแตกต่างทางทฤษฎีและความแตกต่างในทางปฏิบัติในคอมไพเลอร์ของ Oracle [แก้ไขเพิ่มคำถามถอดความ] "อะไรคือสถานการณ์ที่เรียกใช้งาน javac เดียวกันเมื่อรันบนแพลตฟอร์มอื่นจะสร้าง bytecode ที่แตกต่างกัน"

8
วิธีการสร้างภาษาโปรแกรม JVM?
ฉันได้สร้างคอมไพเลอร์ในภาษา C (โดยใช้ Lex & Bison) สำหรับภาษาการเขียนโปรแกรมแบบไดนามิกที่รองรับลูปการประกาศฟังก์ชันภายในฟังก์ชันการเรียกซ้ำ ฯลฯ ฉันยังสร้างเครื่องเสมือนที่รันโค้ดกลางที่สร้างโดยคอมไพเลอร์ ฉันกำลังคิดเกี่ยวกับการรวบรวมเป็น Java bytecode แทนที่จะเป็นรหัสกลางของฉันเอง ผมเห็นว่าคำถามเกี่ยวกับการสร้างภาษา JVM ได้รับแล้วถามแต่ผมไม่หาคำตอบให้ข้อมูลมาก นี่คือคำถามของฉัน: ฉันเดาว่าจะสร้างภาษาสำหรับ JVM สิ่งที่ต้องทำคือการอ่านหนังสือข้อกำหนดของ JVMคุณสามารถแนะนำหนังสืออะไรได้อีกบ้าง (ยกเว้น Dragon Book แน่นอน) ส่วนใหญ่ฉันกังวลเกี่ยวกับหนังสือหรือแบบฝึกหัดเกี่ยวกับวิธีสร้างภาษา JVM ไม่ใช่คอมไพเลอร์โดยทั่วไป มีไลบรารี Java มากมายสำหรับอ่านเขียนและเปลี่ยน.classไฟล์เช่นjclasslib , bcel , gnu bytecodeฯลฯ คุณจะแนะนำตัวไหน นอกจากนี้คุณทราบถึงไลบรารี C ที่ทำงานเดียวกันหรือไม่? ฉันกำลังคิดที่จะดูภาษาอื่นที่กำหนดเป้าหมายไปที่ JVM เช่น Clojure, Jython หรือ JRuby แต่ภาษาทั้งหมดเหล่านี้มีระดับสูงและซับซ้อนมาก (เพื่อสร้างคอมไพเลอร์สำหรับพวกเขา) ฉันกำลังมองหาภาษาการเขียนโปรแกรมที่ง่ายกว่า …

4
การรวบรวมเทียบกับการถ่ายโอนข้อมูล
ในขณะที่ค้นหาความแตกต่างฉันพบคำจำกัดความเหล่านี้: การคอมไพล์เป็นคำทั่วไปสำหรับการเขียนซอร์สโค้ดในภาษาหนึ่งและแปลงเป็นอีกภาษาหนึ่ง Transpilingเป็นคำเฉพาะสำหรับการเขียนซอร์สโค้ดในภาษาหนึ่งและเปลี่ยนเป็นภาษาอื่นที่มีระดับนามธรรมใกล้เคียงกัน ฉันเข้าใจว่า Abstraction คืออะไร แต่ "ระดับนามธรรมที่คล้ายคลึงกัน" ในคำจำกัดความข้างต้นหมายความว่าอย่างไร และเราจะหาระดับของนามธรรมในภาษาได้อย่างไร?

6
โปรแกรมแยกวิเคราะห์ GCC และ Clang เขียนด้วยลายมือจริงหรือ
ดูเหมือนว่า GCC และ LLVM-Clang กำลังใช้ตัวแยกวิเคราะห์การสืบเชื้อสายแบบเรียกซ้ำที่เขียนด้วยลายมือและไม่ได้สร้างด้วยเครื่องโดยใช้ Bison-Flex การแยกวิเคราะห์จากล่างขึ้นบน ขอคนที่นี่ช่วยยืนยันว่าเป็นกรณีนี้ได้ไหม และถ้าเป็นเช่นนั้นเหตุใดเฟรมเวิร์กคอมไพเลอร์หลักจึงใช้ตัวแยกวิเคราะห์ที่เขียนด้วยลายมือ อัปเดต : บล็อกที่น่าสนใจในหัวข้อนี้ที่นี่

6
คอมไพเลอร์สร้างโค้ดที่ดีกว่าสำหรับ do-while loops เมื่อเทียบกับลูปประเภทอื่น ๆ หรือไม่?
มีความคิดเห็นในไลบรารีการบีบอัด zlib (ซึ่งใช้ในโปรเจ็กต์ Chromium และอื่น ๆ อีกมากมาย) ซึ่งหมายความว่า do-while loop ใน C สร้างโค้ด "ดีกว่า" ในคอมไพเลอร์ส่วนใหญ่ นี่คือข้อมูลโค้ดที่ปรากฏ do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers …

7
เคอร์เนลลินุกซ์สามารถคอมไพล์ตัวเองได้อย่างไร?
ฉันไม่ค่อยเข้าใจกระบวนการคอมไพล์ของเคอร์เนล Linux เมื่อฉันติดตั้งระบบ Linux บนเครื่องของฉัน นี่คือบางสิ่งที่ทำให้ฉันสับสน: เคอร์เนลถูกเขียนด้วย C อย่างไรก็ตามเคอร์เนลถูกคอมไพล์โดยไม่ติดตั้งคอมไพเลอร์ได้อย่างไร? หากคอมไพเลอร์ C ถูกติดตั้งบนเครื่องของฉันก่อนที่จะคอมไพล์เคอร์เนลคอมไพเลอร์จะรวบรวมเองได้อย่างไรโดยไม่ต้องติดตั้งคอมไพเลอร์ ฉันสับสนมากสองสามวันขอบคุณสำหรับการตอบกลับ

7
เหตุใดการเขียนคอมไพเลอร์ในภาษาที่ใช้งานได้จึงง่ายกว่า [ปิด]
ปิด . คำถามนี้เป็นคำถามความคิดเห็นตาม ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบได้ด้วยข้อเท็จจริงและการอ้างอิงโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ปรับปรุงคำถามนี้ ฉันคิดถึงคำถามนี้มานานมาก แต่ก็ไม่พบคำตอบใน Google และคำถามที่คล้ายกันใน Stackoverflow หากมีการซ้ำกันขออภัยด้วย หลายคนดูเหมือนจะพูดว่าการเขียนคอมไพเลอร์และเครื่องมือภาษาอื่น ๆ ในภาษาที่ใช้งานได้เช่น OCaml และ Haskell นั้นมีประสิทธิภาพมากกว่าและง่ายกว่ามากจากนั้นจึงเขียนเป็นภาษาที่จำเป็น นี่คือเรื่องจริง? และถ้าเป็นเช่นนั้น - เหตุใดจึงมีประสิทธิภาพและง่ายในการเขียนเป็นภาษาที่ใช้งานได้แทนที่จะเป็นภาษาที่จำเป็นเช่น C? นอกจากนี้ - ไม่ใช่เครื่องมือภาษาในภาษาที่ใช้งานได้ช้ากว่าในภาษาระดับต่ำเช่น C หรือไม่?

2
GCC: March ต่างจาก mtune อย่างไร?
ฉันพยายามขัดหน้า GCC man สำหรับสิ่งนี้ แต่ก็ยังไม่ได้รับจริงๆ อะไรคือความแตกต่างระหว่าง-marchและ-mtune? เมื่อใดที่ใช้เพียงแค่-marchเทียบกับทั้งสองอย่าง เป็นไปได้ไหมที่จะเพียง-mtune?

3
คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่?
คอมไพเลอร์ gcc C เขียนด้วยตัว C เองหรือไม่? หรือเขียนไว้ใน Assembly? ถ้าคอมไพเลอร์เขียนด้วย C แล้วคอมไพเลอร์ที่ใช้ในการรวบรวมโค้ดคอมไพเลอร์คืออะไร?

13
อะไรคือความแตกต่างระหว่างโทเค็นและคำศัพท์?
ในการสร้างคอมไพเลอร์โดย Aho Ullman และ Sethi กำหนดให้สตริงอินพุตของอักขระของโปรแกรมต้นทางถูกแบ่งออกเป็นลำดับของอักขระที่มีความหมายเชิงตรรกะและเป็นที่รู้จักกันในชื่อโทเค็นและ lexemes เป็นลำดับที่ประกอบเป็นโทเค็นดังนั้นสิ่งที่ ความแตกต่างพื้นฐานคืออะไร?

8
ทำไม GDB จึงกระโดดข้ามบรรทัดอย่างไม่คาดคิดและพิมพ์ตัวแปรเป็น“ <value optimized out>”
ใครช่วยอธิบายพฤติกรรมของ gdb นี้ได้บ้าง? 900 memset(&amp;new_ckpt_info,'\0',sizeof(CKPT_INFO)); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_** HDR),i_offset); (gdb) **903 prev_offset = cp_node-&gt;offset;** (gdb) **905 m_CPND_CKPTINFO_READ(ckpt_info,(char *)cb-&gt;shm_addr.ckpt_addr+sizeof(CKPT_ HDR),i_offset);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** (gdb) **910 bitmap_value = cpnd_client_bitmap_set(client_hdl%32);** (gdb) **908 bitmap_offset = client_hdl/32;** …

2
ผลรวมประเภท - ทำไมใน Haskell จึงเป็น `show (Int | Double)` ต่างจาก `(show Int) | (แสดงสองครั้ง) `
ทำไมสิ่งเหล่านี้จึงไม่เทียบเท่ากัน show $ if someCondition then someInt else some double และ if someCondition then show someInt else show someDouble ฉันเข้าใจว่าถ้าคุณแยกif ... elseส่วนในตัวอย่างแรกให้กับนิพจน์ด้วยตัวเองคุณจะไม่สามารถแสดงประเภทของมันด้วยประเภทผลรวมนิรนามชนิดของInt | Doubleสิ่งที่คุณสามารถทำได้อย่างง่ายดายใน TypeScript (กล่าวถึง TypeScript เพราะมันเป็น langauge ผมใช้บ่อยและประเภทสนับสนุนซำ) และจะต้องหันไปใช้ข้อมูลนั้นขึ้นอยู่กับว่ามันจะเรียกEithershow ตัวอย่างที่ฉันให้ที่นี่มีความสำคัญ แต่สำหรับฉันมันสมเหตุสมผลมากกว่าที่จะคิดว่า "โอเคเรากำลังจะแสดงบางสิ่งบางอย่างและสิ่งนั้นขึ้นอยู่กับsomeCondition" มากกว่า "โอเคถ้ามีเงื่อนไขจริงแล้วแสดงบางอย่าง สำหรับการทำซ้ำรหัสน้อย (ที่นี่แสดงซ้ำสองครั้ง แต่มันอาจจะเป็นฟังก์ชั่นการใช้งานที่ยาวนานและแทนที่จะif ... elseมี&gt; 2 สาขาที่ต้องพิจารณา) ในใจของฉันมันควรจะง่ายสำหรับคอมไพเลอร์เพื่อตรวจสอบว่าแต่ละประเภทที่ทำให้ผลรวมประเภท (ที่นี่Int | Double) สามารถใช้เป็นพารามิเตอร์ในการshowทำงานและตัดสินใจว่าประเภทถูกต้องหรือไม่ ยิ่งไปกว่านั้นshowฟังก์ชั่นนั้นจะส่งคืนstringชนิดพารามิเตอร์เสมอดังนั้นคอมไพเลอร์ไม่จำเป็นต้องดำเนินการกับ "สาขา" …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.