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

คำถามเกี่ยวกับโปรแกรมที่อ่านโค้ดในภาษาหนึ่ง (ภาษาต้นฉบับ) และแปลเป็นโปรแกรมที่เทียบเท่าในภาษาอื่น (ภาษาเป้าหมาย)

1
การแยกประเภทการปรับแต่ง
ที่ทำงานฉันได้รับมอบหมายให้อนุมานข้อมูลบางประเภทเกี่ยวกับภาษาแบบไดนามิก ฉันเขียนลำดับของข้อความไปยังletนิพจน์ที่ซ้อนกันเช่น: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } เนื่องจากฉันเริ่มต้นจากข้อมูลประเภททั่วไปและพยายามอนุมานประเภทที่เฉพาะเจาะจงมากขึ้นตัวเลือกที่เป็นธรรมชาติคือประเภทการปรับแต่ง ตัวอย่างเช่นตัวดำเนินการตามเงื่อนไขส่งคืนการรวมของประเภทของสาขาที่เป็นจริงและเท็จ …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

3
ตัวแยกวิเคราะห์แบบสืบเชื้อสายซ้ำพร้อมการย้อนรอยสำหรับไวยากรณ์
คนที่สามารถสอนให้ฉันทำไม parser โคตร recursive กับ backtracking ที่พยายามที่โปรดักชั่นและ (ตามลำดับ) ไม่รู้จักภาษาเกิดขึ้นจากไวยากรณ์AAS→ a SaS→aSaS \rightarrow aSaS→S→aaS \rightarrow aaS→ a Sa | S→aSa | aaS \rightarrow aSa\ |\ aa มันจะปรากฏคำเฉพาะแยกจากภาษา\}{ a2n | n≥1} {a2n | n≥1}\{a^{2^n}\ |\ n \ge 1 \} ฉันสร้างตัวแยกวิเคราะห์ดังกล่าวโดยใช้ตัวแยกวิเคราะห์ ABNF นี้กับกฎการผลิตS = "a" S "a" / "aa"และตัวแยกวิเคราะห์ไม่รู้จักคำaaaaaaเช่น ฉันคาดหวังว่ามันจะใช้การผลิตจนกระทั่งการต่อเชื่อมของโหนดเทอร์มินัลของการแยกจากซ้ายเริ่มต้นด้วย 7 ของจากนั้นขึ้นไปที่การแยกเลือกการผลิตแทนจนกระทั่งต้นไม้ดูเหมือน นี้:S→ …

3
เริ่มต้นใช้งานการวิเคราะห์โปรแกรม
ฉันกำลังมองหาแหล่งข้อมูลเกี่ยวกับการเริ่มต้นกับการวิเคราะห์โปรแกรม หนังสือเล่มเดียวที่ฉันพบในหัวข้อคือหนังสือNielson & Nielson นอกเหนือจากนั้นดูเหมือนว่าจะมีหนังสือ "คอมไพเลอร์" เท่านั้นที่ "การวิเคราะห์โปรแกรม" จะเป็นบทหรืออะไรก็ตามที่อยู่ในบรรทัดเหล่านั้น คนอื่นรู้จักทรัพยากรอื่น ๆ บ้างไหม?

2
จำนวนขั้นต่ำทางทฤษฎีของการลงทะเบียนสำหรับคอมพิวเตอร์ที่ทันสมัย?
ฉันลงเรียนหลักสูตรคอมไพเลอร์ในการศึกษาระดับปริญญาตรีของฉันซึ่งเราเขียนคอมไพเลอร์ที่คอมไพล์โปรแกรมต้นฉบับในภาษาจาวาของเล่นเหมือนภาษาแอสเซมบลีของเล่น (ซึ่งเรามีล่าม) ในโครงการเราได้ตั้งสมมติฐานบางอย่างเกี่ยวกับเครื่องเป้าหมายที่เกี่ยวข้องอย่างใกล้ชิดกับโปรแกรมดั้งเดิมที่ใช้งานจริง สแต็กรันไทม์ติดตามโดยการลงทะเบียนสแต็คพอยน์เตอร์ ("SP") เฉพาะ ฮีปสำหรับการจัดสรรอ็อบเจ็กต์แบบไดนามิกที่ติดตามโดยตัวชี้ฮีพเฉพาะ ("HP") ลงทะเบียน การลงทะเบียนตัวนับโปรแกรมเฉพาะ ("PC") เครื่องเป้าหมายมี 16 รีจิสเตอร์ การดำเนินการกับข้อมูล (ตรงข้ามกับเช่นการข้าม) เป็นการดำเนินการลงทะเบียนเพื่อลงทะเบียน เมื่อเราไปถึงหน่วยการใช้การจัดสรรการลงทะเบียนเพื่อทำให้เกิดประโยชน์สูงสุดมันทำให้ฉันประหลาดใจ: จำนวนการลงทะเบียนขั้นต่ำทางทฤษฎีสำหรับเครื่องดังกล่าวคืออะไร? คุณสามารถเห็นได้จากสมมติฐานของเราที่เราใช้การลงทะเบียนห้ารายการ (SP, HP, PC, และอีกสองสำหรับใช้เป็นที่เก็บข้อมูลสำหรับการทำงานแบบไบนารี) ในคอมไพเลอร์ของเรา ในขณะที่การเพิ่มประสิทธิภาพเช่นการจัดสรรการลงทะเบียนสามารถใช้ประโยชน์จากการลงทะเบียนมากขึ้นแต่มีวิธีที่จะได้รับน้อยลงในขณะที่ยังคงโครงสร้างเช่นสแต็คและกอง? ฉันคิดว่ามีการลงทะเบียนที่อยู่ (การลงทะเบียนเพื่อดำเนินการลงทะเบียน) เราต้องการอย่างน้อยสองทะเบียน แต่เราต้องการมากกว่าสอง?

1
รับสตริงและ CFG อักขระใดบ้างที่สามารถติดตามสตริง (ในรูปแบบประโยคของ CFG)
ให้เป็นชุดของขั้วและชุดของสัญลักษณ์ที่ไม่ใช่ขั้วของบางบริบทฟรีไวยากรณ์GΣΣ\SigmaNยังไม่มีข้อความNGGG บอกว่าฉันมีสายเช่นโดยที่และเป็นรูปแบบที่ sentential ของGa∈(Σ∪N)+a∈(Σ∪N)+a \in (\Sigma \cup N)^+xay∈S(G)xay∈S(G)x a y \in \mathcal{S}(G)x,y∈(Σ∪N)∗x,y∈(Σ∪N)∗x,y\in (\Sigma \cup N)^*S(G)S(G)\mathcal{S}(G)GGG ได้รับ , ฉันต้องการที่จะตรวจสอบชุดC = { B | W ขZ ∈ S ( G ) , ข∈ Σ ∪ N }GGGC={b∣wabz∈S(G),b∈Σ∪N}C={b∣wabz∈S(G),b∈Σ∪N}C = \{ b \mid wabz \in \mathcal{S}(G), b \in \Sigma \cup N \} เพื่อชี้แจงในกรณีนี้คือสตริงของเทอร์มินัลและที่ไม่ใช่เทอร์มินัลและbมีความยาวหนึ่งw,x,y,z,a,bw,x,y,z,a,bw, x, …

2
รวบรวมภาษาการเขียนโปรแกรมด้วยตัวเอง
ฉันเป็นนักเรียนวิทยาศาสตร์คอมพิวเตอร์ ฉันต้องการสร้างภาษาการเขียนโปรแกรมของตัวเอง (ภาษาพื้นฐานพร้อมคำแนะนำเล็กน้อย) ฉันรู้วิธีการวิเคราะห์วากยสัมพันธ์ฉันทำมันแล้วใน Perl ในบทความฉันอ่านบางอย่างเกี่ยวกับคอมไพเลอร์คอมไพเลอร์เสร็จแล้วในตัวเอง เช่นคอมไพเลอร์ C เขียนใน C. เป็นไปได้อย่างไร? ฉันสามารถสร้างภาษาของตัวเอง แต่ฉันไม่รู้ว่าฉันจะใช้มันได้อย่างไร ความคิดใด ๆ เป็นคำถามที่ดีจริงๆและฉันสามารถเขียนบล็อกโครงการได้

1
อะไรคือตัวอย่างที่ไม่ได้วางแผนไว้สำหรับการตรวจสอบประเภทคงที่ที่อนุรักษ์เกินไป?
ในแนวคิดในการเขียนโปรแกรมภาษาจอห์นมิทเชลเขียนว่าการตรวจสอบชนิดสแตติกจำเป็นต้องระมัดระวัง (เข้มงวดมากเกินไป) เนื่องจากปัญหาการหยุดทำงาน เขาให้เป็นตัวอย่าง: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) ใครสามารถให้คำตอบที่ไม่ได้วางแผนไว้ซึ่งจะเป็นข้อกังวลในทางปฏิบัติได้จริงหรือไม่? ฉันเข้าใจว่า Java อนุญาตการปลดเปลื้องที่ตรวจสอบแบบไดนามิกสำหรับกรณีเช่นนี้: if (foo instanceof Person) { Person p = (Person) foo; : } แต่ฉันพิจารณาถึงความจำเป็นของการขาดภาษา / คอมไพเลอร์ Java มากกว่าปัญหาข้ามภาษา

3
ความเท่าเทียมกันของการวิเคราะห์การไหลของข้อมูลการตีความเชิงนามธรรมและการอนุมานประเภท?
@ Babou ของคำตอบของคำถามที่ผ่านมาทำให้ผมนึกถึงว่าครั้งหนึ่งผมคิดว่าผมอ่านกระดาษเกี่ยวกับความเท่าเทียมกัน (ในแง่ทั้งข้อเท็จจริงที่ว่าจะสามารถสรุปหรือได้รับการพิสูจน์และความซับซ้อนเวลาของการทำงานขั้นตอนวิธีการอนุมาน) ของการวิเคราะห์ข้อมูลการไหล , การตีความที่เป็นนามธรรมและอนุมานชนิด ในบางกรณีย่อย (เช่นระหว่างการวิเคราะห์การไหลของข้อมูลระหว่างบริบทและการตีความนามธรรม) ความเท่าเทียมกันนั้นค่อนข้างชัดเจนสำหรับฉัน แต่คำถามดูเหมือนจะละเอียดกว่าสำหรับการเปรียบเทียบอื่น ๆ ตัวอย่างเช่นฉันไม่สามารถทราบได้ว่าการอนุมานประเภท Hindley-Milner สามารถใช้ในการพิสูจน์คุณสมบัติบางอย่างที่สามารถพิสูจน์ได้ด้วยการวิเคราะห์การไหลของข้อมูลที่มีความอ่อนไหวต่อการไหล อะไรคือการอ้างอิงน้ำเชื้อที่พูดถึงการเทียบเท่า (หรือความแตกต่าง) ระหว่างการวิเคราะห์การไหลของข้อมูลการตีความที่เป็นนามธรรมและการอนุมานประเภท?

3
Cross T ของไดอะแกรม T
ฉันกำลังศึกษา Bootstrapping จาก Red Dragon Book Compilers และพบว่าแผนภาพ T สำหรับ cross compiler ค่อนข้างสับสน ฉันไม่เข้าใจความหมายของ "Run compiler1 ถึง compiler2" ทุกคนสามารถให้คำอธิบายที่ดีกว่าการเปรียบเทียบหรือตัวอย่างที่เกี่ยวข้องกับคอมไพเลอร์โลกแห่งความจริงได้หรือไม่? สัญกรณ์บางอย่างก่อน โดย ฉันหมายความว่าคอมไพเลอร์สำหรับภาษา เขียนในภาษาที่ผลิตส่งออกภาษา / รหัสเครื่องNนี่คือหลุมฝังศพหรือ T-แผนภาพLSN=LSN=LSN= LLLSSSNNN รวบรวมคอมไพเลอร์ สมมติว่าเรามีคอมไพเลอร์ข้ามภาษาใหม่ L ในภาษาที่ใช้งาน S การสร้างรหัสสำหรับเครื่อง N LSN=LSN=LSN= สมมติว่าเรายังมีคอมไพเลอร์ S ที่มีอยู่กำลังทำงานอยู่บนเครื่องที่ใช้รหัส M สำหรับเครื่อง M: SMM=SMM=SMM= เรียกใช้ LSN ผ่าน SMM เพื่อสร้าง LMN คอมไพเลอร์ก่อสร้าง LMN=LSN+SMMLMN=LSN+SMMLMN …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.