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

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

6
เหตุใดจึงต้องใช้เซ็กเมนต์. bss
สิ่งที่ฉันรู้คือตัวแปรส่วนกลางและตัวแปรคงถูกเก็บไว้ใน.dataเซ็กเมนต์และข้อมูลที่ไม่ได้กำหนดค่าเริ่มต้นจะอยู่ใน.bssเซ็กเมนต์ สิ่งที่ฉันไม่เข้าใจคือเหตุใดเราจึงมีเซ็กเมนต์เฉพาะสำหรับตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้น หากตัวแปรที่ไม่ได้เริ่มต้นมีค่าที่กำหนดในขณะรันตัวแปรจะยังคงอยู่ใน.bssเซ็กเมนต์เท่านั้นหรือไม่ ในโปรแกรมต่อไปนี้ aอยู่ใน.dataกลุ่มและbอยู่ใน.bssกลุ่ม ถูกต้องหรือไม่ กรุณาแก้ไขฉันหากความเข้าใจของฉันไม่ถูกต้อง #include <stdio.h> #include <stdlib.h> int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9}; int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */ int main () { ; } นอกจากนี้ให้พิจารณาโปรแกรมต่อไปนี้ …

1
เรียนรู้เกี่ยวกับชื่อวิเศษของ VS debugger ได้ที่ไหน
หากคุณเคยใช้ตัวสะท้อนแสงคุณอาจสังเกตเห็นว่าคอมไพเลอร์ C # สร้างประเภทวิธีการฟิลด์และตัวแปรภายในซึ่งสมควรได้รับการแสดงผล 'พิเศษ' โดยดีบักเกอร์ ตัวอย่างเช่นตัวแปรโลคัลที่ขึ้นต้นด้วย 'CS $' จะไม่แสดงให้ผู้ใช้เห็น มีรูปแบบการตั้งชื่อพิเศษอื่น ๆ สำหรับประเภทการปิดของเมธอดที่ไม่ระบุชื่อฟิลด์สำรองของคุณสมบัติอัตโนมัติและอื่น ๆ คำถามของฉัน: จะเรียนรู้เกี่ยวกับหลักการตั้งชื่อเหล่านี้ได้ที่ไหน มีใครรู้เรื่องเอกสารบ้าง วัตถุประสงค์ของฉันคือทำให้ PostSharp 2.0 ใช้รูปแบบเดียวกัน

8
Qt: ไม่พบข้อผิดพลาด -lGL
ฉันเพิ่งติดตั้ง QtCreator ใหม่สร้างโครงการใหม่ ( แอปพลิเคชัน Qt ) ซึ่งได้รับสิ่งนี้หลังจากการรวบรวม: /usr/bin/ld: **cannot find -lGL** collect2: error: ld returned 1 exit status make: *** [untitled1] Error 1 18:07:41: The process "/usr/bin/make" exited with code 2. Error while building/deploying project untitled1 (kit: Desktop Qt 5.1.0 GCC 32bit) When executing step 'Make' ( โครงการว่างเปล่าฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ …

6
(A + B + C) ≠ (A + C + B) และการเรียงลำดับคอมไพเลอร์
การเพิ่มจำนวนเต็ม 32 บิตสองตัวอาจทำให้จำนวนเต็มล้น: uint64_t u64_z = u32_x + u32_y; การโอเวอร์โฟลว์นี้สามารถหลีกเลี่ยงได้หากหนึ่งในจำนวนเต็ม 32 บิตถูกแคสต์หรือเพิ่มเป็นจำนวนเต็ม 64 บิตก่อน uint64_t u64_z = u32_x + u64_a + u32_y; อย่างไรก็ตามหากคอมไพเลอร์ตัดสินใจที่จะจัดลำดับการเพิ่มใหม่: uint64_t u64_z = u32_x + u32_y + u64_a; การล้นจำนวนเต็มอาจยังคงเกิดขึ้น คอมไพเลอร์ได้รับอนุญาตให้ทำการเรียงลำดับใหม่หรือเราสามารถไว้วางใจให้คอมไพเลอร์สังเกตเห็นความไม่สอดคล้องกันของผลลัพธ์และรักษาลำดับนิพจน์ตามที่เป็นอยู่ได้หรือไม่?


13
เหตุใดจึงไม่สามารถสร้างคอมไพเลอร์ที่สามารถระบุได้ว่าฟังก์ชัน C ++ จะเปลี่ยนค่าของตัวแปรเฉพาะหรือไม่?
ฉันอ่านบรรทัดนี้ในหนังสือ: เป็นไปไม่ได้เลยที่จะสร้างคอมไพเลอร์ที่สามารถระบุได้ว่าฟังก์ชัน C ++ จะเปลี่ยนค่าของตัวแปรเฉพาะหรือไม่ ย่อหน้านี้กำลังพูดถึงสาเหตุที่คอมไพเลอร์เป็นแบบอนุรักษ์นิยมเมื่อตรวจสอบ const-ness เหตุใดจึงไม่สามารถสร้างคอมไพเลอร์ดังกล่าวได้ คอมไพลเลอร์สามารถตรวจสอบได้ตลอดเวลาว่ามีการกำหนดตัวแปรใหม่หรือไม่ฟังก์ชันที่ไม่ใช่ const จะถูกเรียกใช้หรือหากมีการส่งผ่านเป็นพารามิเตอร์ที่ไม่ใช่ const ...

3
ความหมายของข้อผิดพลาด Android Studio: พารามิเตอร์ที่ไม่มีคำอธิบายประกอบจะแทนที่พารามิเตอร์ @NonNull
ฉันกำลังทดลองใช้ Android Studio เมื่อสร้างโปรเจ็กต์ใหม่และเพิ่มonSaveInstanceStateเมธอดเริ่มต้นในคลาสสร้าง MyActivity เมื่อฉันพยายามคอมมิตโค้ดกับ Git ฉันได้รับข้อผิดพลาดแปลก ๆ ที่ฉันไม่เข้าใจ รหัสคือ: ข้อผิดพลาดที่ฉันได้รับคือ: ถ้าฉันพยายามเปลี่ยนลายเซ็นวิธีprotected void onSaveInstanceState(@NotNull Bundle outState)เป็น IDE ก็บอกฉันว่ามันไม่สามารถแก้ไขสัญลักษณ์NotNullได้ ฉันต้องทำอย่างไรเพื่อกำจัดคำเตือน

8
อะไรคือความแตกต่างระหว่างตัวแยกวิเคราะห์ LR, SLR และ LALR
อะไรคือความแตกต่างที่แท้จริงระหว่างตัวแยกวิเคราะห์ LR, SLR และ LALR ฉันรู้ว่า SLR และ LALR เป็นประเภทของตัวแยกวิเคราะห์ LR แต่อะไรคือความแตกต่างที่แท้จริงของตารางแยกวิเคราะห์ และจะแสดงได้อย่างไรว่าไวยากรณ์เป็น LR, SLR หรือ LALR? สำหรับไวยากรณ์ LL เราต้องแสดงให้เห็นว่าเซลล์ใด ๆ ของตารางการแยกวิเคราะห์ไม่ควรมีกฎการผลิตหลายข้อ กฎที่คล้ายกันสำหรับ LALR, SLR และ LR หรือไม่ ตัวอย่างเช่นเราจะแสดงให้เห็นว่าไวยากรณ์ได้อย่างไร S --> Aa | bAc | dc | bda A --> d LALR คือ (1) แต่ไม่ใช่ SLR (1)? แก้ไข (ybungalobill) : …

4
ระดับการเพิ่มประสิทธิภาพ GCC มีกี่ระดับ?
ระดับการเพิ่มประสิทธิภาพGCCมีกี่ระดับ? ฉันลอง gcc -O1, gcc -O2, gcc -O3 และ gcc -O4 ถ้าฉันใช้จำนวนมากมันจะไม่ได้ผล อย่างไรก็ตามฉันได้พยายามแล้ว gcc -O100 และรวบรวม ระดับการเพิ่มประสิทธิภาพมีกี่ระดับ?

3
จะสร้างไลบรารีแบบคงที่ด้วย g ++ ได้อย่างไร
ใครช่วยบอกวิธีสร้างไลบรารีแบบคงที่จากไฟล์. cpp และ. hpp ได้ไหม ฉันต้องสร้าง. o และ. a หรือไม่? ฉันต้องการทราบว่าฉันจะรวบรวมไลบรารีแบบคงที่และใช้ในรหัส. cpp อื่นได้อย่างไร ฉันมีheader.cpp, ผมอยากจะสร้างheader.hpp . header.aทดสอบส่วนหัว a ในtest.cpp. ฉันใช้ g ++ ในการรวบรวม

3
เหตุใดเงื่อนไข (null ||! tryParse) จึงทำให้เกิด "การใช้ตัวแปรภายในที่ไม่ได้กำหนด"
โค้ดต่อไปนี้ส่งผลให้ใช้ตัวแปรโลคัล "numberOfGroups" ที่ไม่ได้กำหนด : int numberOfGroups; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } อย่างไรก็ตามรหัสนี้ใช้งานได้ดี (แม้ว่าReSharperกล่าวว่า= 10ซ้ำซ้อน): int numberOfGroups = 10; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } ฉันขาดอะไรไปหรือคอมไพเลอร์ไม่ชอบของฉัน||? ฉันได้ จำกัด สิ่งนี้ให้แคบลงจนdynamicทำให้เกิดปัญหา ( optionsเป็นตัวแปรแบบไดนามิกในโค้ดด้านบนของฉัน) คำถามยังคงอยู่ทำไมฉันถึงทำสิ่งนี้ไม่ได้? รหัสนี้ไม่ได้รวบรวม: internal class Program { #region …

5
Eclipse: เปิดใช้งานการยืนยัน
ฉันใช้ Eclipse Galileo ฉันจะเปิดใช้งานการยืนยันใน Eclipse ได้อย่างไร ตามที่ไซต์อื่นแนะนำฉันได้ลองเพิ่มอาร์กิวเมนต์: -ea. ฉันได้ลองเปลี่ยนระดับการปฏิบัติตามข้อกำหนดของคอมไพเลอร์เป็น1.4. คำแนะนำเหล่านั้นไม่ได้ผล

11
Bootstrapping ยังคงต้องการการสนับสนุนจากภายนอก
ฉันเคยได้ยินเกี่ยวกับความคิดในการบูตภาษานั่นคือการเขียนคอมไพเลอร์ / ล่ามสำหรับภาษาในตัวเอง ฉันสงสัยว่ามันจะสำเร็จได้อย่างไรและมองไปรอบ ๆ และเห็นใครบางคนบอกว่ามันทำได้เพียงอย่างเดียว การเขียนคอมไพเลอร์เริ่มต้นในภาษาอื่น การเข้ารหัสคอมไพเลอร์เริ่มต้นด้วยมือในแอสเซมบลีซึ่งดูเหมือนจะเป็นกรณีพิเศษของตัวแรก สำหรับฉันแล้วสิ่งเหล่านี้ดูเหมือนจะไม่ใช่การบูตภาษาในแง่ที่ว่าทั้งคู่ต้องการการสนับสนุนจากภายนอก มีวิธีเขียนคอมไพเลอร์ในภาษาของตัวเองหรือไม่?

14
เหตุใดโค้ด Java นี้จึงคอมไพล์
ในขอบเขตของวิธีการหรือคลาสบรรทัดด้านล่างคอมไพล์ (พร้อมคำเตือน): int x = x = 1; ในขอบเขตระดับที่ตัวแปรได้รับค่าเริ่มต้นสิ่งต่อไปนี้ทำให้เกิดข้อผิดพลาด 'การอ้างอิงที่ไม่ได้กำหนด': int x = x + 1; x = x = 1ข้อผิดพลาด "การอ้างอิงที่ไม่ได้กำหนด" เป็นครั้งแรกไม่ใช่หรือ หรือบรรทัดที่สองint x = x + 1ควรรวบรวม? หรือมีบางอย่างที่ฉันขาดหายไป?

14
ปัญหาการคอมไพล์สร้างหรือเก็บถาวรด้วย Xcode 4 (และการอ้างอิง)
คำถามนี้มีการพัฒนาในช่วงหลายสัปดาห์ที่ผ่านมาเพื่อให้ครอบคลุมประเด็นทั่วไปมากขึ้นด้วย xcode4 (และการอัปเกรดโครงการในรูปแบบเก่ากว่า xcodes). อย่างไรก็ตามหลายปัญหาสามารถแก้ไขได้โดยทำตามคำแนะนำชุดเดียวกัน หากคุณมีปัญหาใด ๆ ต่อไปนี้ให้ลองใช้วิธีการในคำตอบที่ยอมรับ: Xcode 4 ไม่สามารถจัดเก็บแอปได้ Xcode 4 สร้างที่เก็บถาวรที่ใช้ไม่ได้ Xcode 4 ไม่ได้สร้าง. ipa Xcode 4 ไม่สามารถคอมไพล์ได้เนื่องจากข้อผิดพลาดของตัวประมวลผลล่วงหน้า Xcode 4 ไม่พบส่วนหัว รหัสของ Xcode 4 ไม่ทำงาน การพึ่งพาโครงการจะไม่รวบรวม การเพิ่มการพึ่งพาทำให้เกิดปัญหาข้างต้น คำถามเดิม หัวข้อ: "ไม่พบไฟล์ปัญหาคำศัพท์หรือตัวประมวลผลล่วงหน้า" ใน Xcode 4 ฉันมีโครงการใน Xcode 4 ที่จะสร้างได้ดีและทำงานบนอุปกรณ์และโปรแกรมจำลอง แต่เมื่อพยายามจัดเก็บข้อผิดพลาดเมื่อค้นหาไฟล์ส่วนหัวที่เกี่ยวข้องกับไลบรารีแบบคงที่: In file included from /Volumes/Development/Path/LBProject/LBProject/LBProject-Prefix.pch:15: In file included from …

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