ภาษาขยายตัวอย่างไร [ปิด]


208

ฉันกำลังเรียนรู้ C ++ และฉันเพิ่งเริ่มเรียนรู้เกี่ยวกับความสามารถของQtในการเขียนโปรแกรม GUI ฉันถามตัวเองคำถามต่อไปนี้:

C ++ ซึ่งก่อนหน้านี้ไม่มีไวยากรณ์ที่สามารถขอให้ระบบปฏิบัติการหน้าต่างหรือวิธีการสื่อสารผ่านเครือข่าย (กับ API ที่ฉันไม่เข้าใจอย่างสมบูรณ์ฉันยอมรับ) ก็ได้รับความสามารถดังกล่าวผ่านห้องสมุดที่เขียนด้วยภาษา C ++ เอง? ดูเหมือนว่าฉันจะเป็นวงกลมมาก คุณสามารถใช้คำแนะนำ C ++ ในห้องสมุดเหล่านั้นได้อย่างไร?

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


27
std :: cout ยังวาดอะไรบนหน้าจอได้อย่างไร? หรือว่าจะนั่งบนคอมไพเลอร์ที่เข้าใจฮาร์ดแวร์ของคุณ?
doctorlove

14
เป็นคำถามที่ดีมาก ท้ายที่สุดก็ยากที่จะตอบจนกว่าคุณจะศึกษาฮาร์ดแวร์
user541686

17
Qt ไม่ได้เป็นการขยายตัวของภาษา (ที่จะต้องมีคอมไพเลอร์ Qt-aware) มันเป็นเพียงห้องสมุดที่เพิ่มเข้าคลังแสงของคุณ ในที่สุดที่ระดับต่ำสุดไลบรารีทั้งหมดจะสื่อสารกับระบบปฏิบัติการผ่านการเรียกใช้ระบบซึ่งไม่ขึ้นกับภาษา แต่ขึ้นอยู่กับระบบปฏิบัติการและสถาปัตยกรรม CPU เป็นอย่างมาก
DevSolar

8
afaik, C ++ มีชุดประกอบแบบอินไลน์ซึ่งสามารถทำอะไรได้มาก
ชื่อที่แสดง

9
@DevSolar: จริง ๆ แล้ว Qt จะขยายภาษาด้วยกลไกช่องสัญญาณของตัวเองการสะท้อนและคุณสมบัติแบบไดนามิกอื่น ๆ อีกมากมาย และสิ่งเหล่านั้นต้องการคอมไพเลอร์ (คอมไพเลอร์ meta-object) เพื่อคอมไพล์ลงไปที่โค้ด C ++
Siyuan Ren

คำตอบ:


194

คอมพิวเตอร์มีลักษณะคล้ายหัวหอมมีหลายเลเยอร์มากมายตั้งแต่แกนด้านในของฮาร์ดแวร์บริสุทธิ์ไปจนถึงแอพพลิเคชั่นชั้นนอกสุด แต่ละเลเยอร์จะแสดงบางส่วนของตัวเองไปยังเลเยอร์ด้านนอกถัดไปเพื่อให้เลเยอร์ภายนอกอาจใช้ฟังก์ชั่นเลเยอร์ชั้นในบางส่วน

ในกรณีของ Windows ระบบปฏิบัติการจะเปิดเผย WIN32 API ที่เรียกว่าแอปพลิเคชันที่ทำงานบน Windows ไลบรารี Qt ใช้ API นั้นเพื่อให้แอปพลิเคชันที่ใช้ Qt เป็น API ของตัวเอง คุณใช้ Qt, Qt ใช้ WIN32, WIN32 ใช้ระดับต่ำกว่าของระบบปฏิบัติการ Windows และอื่น ๆ จนกว่าจะมีสัญญาณไฟฟ้าในฮาร์ดแวร์


56
หมายเหตุ: Qtที่นี่จะให้สิ่งที่เป็นนามธรรมของเลเยอร์ด้านล่างเพราะใน Linux Qtจะเรียกใช้ Linux API ไม่ใช่ WIN32 API
Matthieu M.

5
ฉันอาจจะอธิบายเพิ่มเติมเกี่ยวกับตัวอย่างของ Qt เล็กน้อยว่ามันจะปรากฏขึ้นเหมือนกับว่ามันสามารถขยายขีดความสามารถ c ++ ได้อย่างง่ายดาย เมื่อความจริงคือพวกเขาใช้ความพยายามอย่างมากในการสร้าง API ทั่วไปเพื่อ (debatably) "คอร์หัวหอม" ที่แตกต่างกันมากมาย พวกเขาเป็นคนที่ให้การพกพาด้านบนของแบ็กเอนด์ที่ไม่ใช่แบบพกพาที่ไม่ได้มาตรฐาน
luk32

81
คอมพิวเตอร์เหมือนหัวหอม: การตัดผ่านทำให้คุณร้องไห้ แต่มันก็ค่อนข้างอร่อยหลังจากนั้น
alecov

3
@ChristopherPfohl ใช่ต้องใช้มันเพราะฉันไม่สามารถเข้าใจได้ว่าคอมพิวเตอร์จะเป็นเหมือนกล่องช็อคโกแลตได้อย่างไร :)
โปรแกรมเมอร์บางคนเพื่อน

1
@Celeritas ครูอาจจะกล่าวหรืออาจจะเป็นuser32.dll gdi32.dll
user253751

59

คุณพูดถูกว่าโดยทั่วไปห้องสมุดไม่สามารถทำสิ่งใด ๆ ที่เป็นไปไม่ได้

แต่ไม่จำเป็นต้องเขียนไลบรารีใน C ++ เพื่อให้สามารถใช้งานได้โดยโปรแกรม C ++ แม้ว่าพวกเขาจะเขียนใน C ++ พวกเขาอาจใช้ห้องสมุดอื่น ๆ ที่ไม่ได้เขียนใน C ++ ดังนั้นความจริงที่ว่า C ++ ไม่ได้ให้วิธีการทำก็ไม่ได้ป้องกันไม่ให้มันจากการถูกเพิ่มใด ๆ ดังนั้นตราบใดที่มีบางวิธีที่จะทำนอก c ++

ในระดับที่ค่อนข้างต่ำบางฟังก์ชั่นที่เรียกโดย C ++ (หรือโดย C) จะถูกเขียนในชุดประกอบและชุดประกอบมีคำแนะนำที่จำเป็นในการทำสิ่งที่เป็นไปไม่ได้ (หรือไม่ง่าย) ใน C ++ ตัวอย่างเช่นการโทร ฟังก์ชั่นระบบ ณ จุดนั้นการเรียกของระบบนั้นสามารถทำสิ่งใดก็ตามที่คอมพิวเตอร์ของคุณสามารถทำได้เพียงเพราะไม่มีอะไรจะหยุด


คุณหมายถึงห้องสมุดเหล่านั้นที่เขียนในภาษาอื่นได้รับการคอมไพล์แล้วด้วยคอมไพเลอร์อื่น ๆ หรือไม่? แล้วจะต้องมีไฟล์อินเตอร์เฟสที่เชื่อมโยงแต่ละการเรียกใช้ฟังก์ชันที่จัดเตรียมให้กับ C ++ โดยไลบรารีไปยังไลบรารีเวอร์ชันที่คอมไพล์แล้วหรือไม่? ดังนั้นการอนุญาตให้คอมไพเลอร์ C ++ รู้ว่าจะแปลการเรียกเหล่านั้นเป็นอย่างไร
Med Larbi Sentissi

2
@MedLarbiSentissi 1) ไม่จำเป็นต้องคอมไพเลอร์อื่น ๆ เป็นไปได้ (และมักเป็นกรณี) ว่าคอมไพเลอร์เดียวมีความสามารถในการรวบรวมหลายภาษารวมถึงแอสเซมบลีและยังสามารถคอมไพล์ C ++ กับแอสเซมบลีอิน 2) ทั้งนี้ขึ้นอยู่กับระบบและคอมไพเลอร์ที่เฉพาะเจาะจงทำให้ฟังก์ชั่นเหล่านั้นเรียกใช้จาก C ++ ได้โดยใช้ไฟล์อินเตอร์เฟสบางส่วน แต่ไฟล์อินเตอร์เฟสนั้นอาจเป็นส่วนหัว C (หรือ C ++) ที่สามารถใช้งานได้โดยตรงจาก C ++

1
@MedLarbiSentissi: ห้องสมุด windows หลายแห่งถูกรวบรวมเป็นไฟล์ dll ที่มีอินเตอร์เฟซของตัวเองเช่นเดียวกับรหัส คุณสามารถมองเข้าไปใน dll และดูรายการฟังก์ชั่นที่ใช้งานได้ พวกเขามักจะมาพร้อมกับไฟล์ส่วนหัว C เมื่อคุณสร้าง exe ของคุณมันจะมีรายการของ dll ที่ต้องการให้ทำงาน เมื่อระบบปฏิบัติการพยายามโหลด exe ของคุณระบบจะโหลด dll เหล่านั้นโดยอัตโนมัติก่อนเริ่มดำเนินการ
Mooing Duck

8
คำตอบนี้ดูเหมือนจะแนะนำว่า "เวทย์มนตร์" นั้นอยู่ในภาษาอื่นอย่างสมบูรณ์ แต่จริงๆแล้วส่วนใหญ่ของรหัสที่ถือว่าเป็นระบบปฏิบัติการที่ทันสมัยที่สุดคือ C (มีเพียงส่วนที่เกี่ยวกับฮาร์ดแวร์หรือประสิทธิภาพที่สำคัญซึ่งเขียนไว้ในชุดประกอบ) - และเป็นไปได้แน่นอนที่จะใช้ C ++ แทน ประเด็นคือไม่มี "เวทย์มนตร์" ภาษาที่สร้างขึ้นเพื่อสร้างนามธรรมที่ทรงพลังและเมื่อคุณสามารถโต้ตอบกับฮาร์ดแวร์ได้ความเป็นไปได้นั้นเกือบจะไร้ขีด จำกัด
Matteo Italia

1
@hvd ฉันคิดว่าความขัดแย้งทั้งหมดในการสนทนานี้คือคุณ (และคนอื่น ๆ ) ให้นิยาม C เป็นคุณลักษณะที่ระบุไว้ ในความเป็นจริงคอมไพเลอร์เพิ่มมากกว่าสิ่งที่ระบุทำให้คำถามที่ว่า C คืออะไรที่ไม่ตอบคำถาม สำหรับฉันสิ่งที่พิเศษเกี่ยวกับภาษา (สิ่งที่มันเป็น) คือเมตาวิธีในการแสดงการไหลของโปรแกรมและความเป็นไปได้ในการจัดโครงสร้าง องค์ประกอบที่มีโครงสร้างไม่สำคัญสำหรับมันเพราะมันเป็นเพียงแค่รหัส ASM ที่ดีกว่าที่สามารถเพิ่มโดยคอมไพเลอร์ตามที่พวกเขาต้องการ
LionC

43

C และ C ++ มีคุณสมบัติ 2 อย่างที่อนุญาตให้เพิ่มความสามารถทั้งหมดที่ OP กำลังพูดถึง

  1. C และ C ++ สามารถเข้าถึงหน่วยความจำ
  2. C และ C ++ สามารถเรียกรหัสแอสเซมบลีสำหรับคำแนะนำที่ไม่ได้อยู่ในภาษา C หรือ C ++

ในเคอร์เนลหรือในแพลตฟอร์มโหมดที่ไม่มีการป้องกันขั้นพื้นฐานอุปกรณ์ต่อพ่วงเช่นพอร์ตอนุกรมหรือดิสก์ไดรฟ์จะถูกแมปลงในแผนที่หน่วยความจำในลักษณะเดียวกับ RAM หน่วยความจำคือชุดของสวิตช์และพลิกสวิตช์ของอุปกรณ์ต่อพ่วง (เช่นพอร์ตอนุกรมหรือดิสก์ไดรเวอร์) ทำให้อุปกรณ์ต่อพ่วงของคุณทำสิ่งที่มีประโยชน์

ในระบบปฏิบัติการโหมดป้องกันเมื่อใครต้องการเข้าถึงเคอร์เนลจาก userspace (พูดเมื่อเขียนไปยังระบบไฟล์หรือวาดพิกเซลบนหน้าจอ) หนึ่งต้องทำการโทรระบบ C ไม่มีคำสั่งให้ทำการเรียกระบบ แต่ C สามารถเรียกรหัสแอสเซมเบลอร์ซึ่งสามารถเรียกการเรียกระบบที่ถูกต้องได้นี่คือสิ่งที่ช่วยให้รหัส C ของบุคคลสามารถพูดคุยกับเคอร์เนล

เพื่อให้การเขียนโปรแกรมเป็นแพลตฟอร์มที่ง่ายขึ้นการเรียกของระบบจะถูกรวมเข้ากับฟังก์ชันที่ซับซ้อนมากขึ้นซึ่งอาจทำหน้าที่บางอย่างที่มีประโยชน์ภายในโปรแกรมของตัวเอง หนึ่งมีอิสระที่จะเรียกระบบโทรโดยตรง (ใช้แอสเซมเบลอร์) แต่มันอาจจะง่ายกว่าที่จะใช้ประโยชน์จากฟังก์ชั่นห่อหุ้มที่หนึ่งในแพลตฟอร์ม

มีอีกระดับของ API ที่มีประโยชน์มากกว่าการเรียกระบบ ยกตัวอย่างเช่น malloc สิ่งนี้ไม่เพียง แต่จะเรียกระบบให้รับหน่วยความจำขนาดใหญ่ แต่จะจัดการหน่วยความจำนี้ด้วยการทำหนังสือทั้งหมดเกี่ยวกับสิ่งที่เกิดขึ้น

Win32 APIs ห่อฟังก์ชันการทำงานด้านกราฟิกไว้ด้วยชุดวิดเจ็ตแพลตฟอร์มทั่วไป Qt ใช้เวลานี้เพิ่มอีกเล็กน้อยโดยการห่อ Win32 (หรือ X Windows) API ด้วยวิธีการข้ามแพลตฟอร์ม

โดยพื้นฐานแล้วแม้ว่าคอมไพเลอร์ C จะเปลี่ยนรหัส C เป็นรหัสเครื่องและเนื่องจากคอมพิวเตอร์ได้รับการออกแบบให้ใช้รหัสเครื่องคุณควรคาดหวังให้ C สามารถใช้สิงโตร่วมกันได้หรือสิ่งที่คอมพิวเตอร์สามารถทำได้ สิ่งที่ห้องสมุดกระดาษห่อทำคือการยกของหนักเพื่อให้คุณไม่ต้องทำ


ข้อแม้เกี่ยวกับ # 2: C และ C ++ สามารถเรียกฟังก์ชันที่เป็นไปได้เท่านั้นซึ่งเป็นไปตาม "ระเบียบการเรียก" ที่คอมไพเลอร์เข้าใจและคาดหวัง (รหัสแอสเซมบลีสามารถใช้การประชุมที่ชอบหรือไม่มีเลย - ดังนั้นโค้ดอาจไม่สามารถเรียกได้โดยตรง) โชคดีที่คอมไพเลอร์ที่เคารพตัวเองทุกตัวมีวิธีในตัวที่จะใช้การประชุมทั่วไปของแพลตฟอร์ม (ตัวอย่างคอมไพเลอร์ Windows C ช่วยให้คุณมี / ใช้ฟังก์ชั่นที่ใช้การประชุม "cdecl", "stdcall" หรือ "fastcall") แต่รหัสแอสเซมบลีต้องใช้ระเบียบที่คอมไพเลอร์รู้หรือ C และ C ++ สามารถ ' ไม่เรียกมันโดยตรง
cHao

2
อีกทั้ง: I / O ที่แมปหน่วยความจำนั้นเป็นเรื่องปกติ พีซีเช่นที่อยู่พอร์ตอนุกรมดิสก์ไดร์ฟ ฯลฯ โดยทั่วไปใช้ "I / O ports" ของ x86 ซึ่งเป็นกลไกที่แตกต่างกันโดยสิ้นเชิง (บัฟเฟอร์วิดีโอมักจะเป็นหน่วยความจำแมป แต่โหมดวิดีโอ ฯลฯ มักจะถูกควบคุมผ่านพอร์ต I / O)
cHao

@cHao: แน่นอนว่าวิธีการแบบคลาสสิกที่ใช้ INP และ OUTP นั้นได้รับการพัฒนาให้สอดคล้องกับ DMA; การสร้าง PCI ดูเหมือนจะทำอะไรได้มากกว่าด้วยการลงทะเบียนฟังก์ชั่นพิเศษของหน่วยความจำตอนนี้มีวิธีการแมปอุปกรณ์โดยอัตโนมัติไปยังภูมิภาคที่ไม่ทับซ้อนกันและค้นพบพวกเขาจากไดรเวอร์และน้อยกว่าด้วยพอร์ต I / O
Ben Voigt

อุปกรณ์ต่อพ่วงที่ทันสมัยจะใช้ DMA สำหรับการถ่ายโอนข้อมูลจำนวนมาก แต่คุณยังคงตั้งโปรแกรมคอนโทรลเลอร์ DMA พร้อมหน่วยความจำที่สามารถระบุตำแหน่งได้
doron

@doron: อืมมมคุณตั้งโปรแกรมคอนโทรลเลอร์ DMA ผ่านพื้นที่ที่อยู่ I / O (ไม่ใช่พื้นที่หน่วยความจำ) บนพีซีอย่างน้อยถ้าคุณมีสติ ซีพียู x86 สมัยใหม่ต้องการเรียงลำดับการเข้าถึงหน่วยความจำใหม่เพื่อปรับปรุงประสิทธิภาพ ด้วย MMIO ที่อาจทำให้เกิดความเสียหาย ... ดังนั้นคุณต้องระมัดระวังในการทำให้ที่อยู่เหล่านั้นไม่ถูกต้องและทำการใส่คำสั่งต่อไปนี้ไว้ในที่ที่เหมาะสม OTOH ตัว x86 รับรองว่าการอ่านและเขียนไปยังพื้นที่ I / O นั้นเสร็จสิ้นตามลำดับของโปรแกรม ซึ่งเป็นสาเหตุที่สิ่งสำคัญส่วนใหญ่ยังคงทำผ่านพื้นที่ I / O (ซึ่งโดยทั่วไปจะไม่สามารถเข้าถึงได้ผ่านตัวชี้) และอาจจะเป็น
cHao

23

ภาษา (เช่นC ++ 11 ) เป็นข้อมูลจำเพาะบนกระดาษมักเขียนเป็นภาษาอังกฤษ ดูภายในC ++ 11 ฉบับร่างล่าสุด (หรือซื้อข้อมูลจำเพาะสุดท้ายราคาแพงจากผู้จำหน่าย ISO ของคุณ)

โดยทั่วไปคุณใช้คอมพิวเตอร์ที่มีการใช้ภาษาบางอย่าง(โดยทั่วไปคุณสามารถใช้งานโปรแกรม C ++ ได้โดยไม่ต้องใช้คอมพิวเตอร์ใด ๆ เช่นใช้ทาสมนุษย์หลายคนตีความมันซึ่งจะผิดจรรยาบรรณและไม่มีประสิทธิภาพ)

การใช้งาน C ++ โดยทั่วไปของคุณทำงานได้เหนือระบบปฏิบัติการบางระบบและสื่อสารกับมัน (ใช้รหัสเฉพาะในการติดตั้งใช้งานบ่อยในห้องสมุดระบบบางระบบ) โดยทั่วไปการสื่อสารที่จะทำผ่านระบบโทรศัพท์ ดูตัวอย่างลงในsyscalls (2)สำหรับรายชื่อของระบบสายที่มีอยู่บนลินุกซ์

จากมุมมองของแอปพลิเคชัน syscall เป็นคำสั่งเครื่องพื้นฐานเช่นSYSENTERบน x86-64 พร้อมการประชุม ( ABI )

ลินุกซ์บนเดสก์ทอปของฉันห้องสมุด Qt อยู่เหนือX11ห้องสมุดลูกค้าการสื่อสารกับเซิร์ฟเวอร์ X11 Xorgผ่านโปรโตคอล X ของ Windows

บน Linux ให้ใช้lddไฟล์ปฏิบัติการของคุณเพื่อดูรายการการพึ่งพา (ยาว) บนไลบรารี ใช้pmapในกระบวนการทำงานของคุณเพื่อดูว่ารายการใดที่ "โหลด" ตอนรันไทม์ BTW บน Linux แอปพลิเคชันของคุณอาจใช้ซอฟต์แวร์ฟรีเท่านั้นคุณสามารถศึกษาซอร์สโค้ดของมัน (จาก Qt, ถึง Xlib, libc, ... เคอร์เนล) เพื่อทำความเข้าใจกับสิ่งที่เกิดขึ้น


2
สำหรับการอ้างอิงANSI ขายสเปค C ++ 11 ในราคาที่ต่ำกว่าเล็กน้อยเพียง US $ 60 (ซึ่งเคยเป็นครึ่งหนึ่ง แต่เป็นอัตราเงินเฟ้อ: P) มันระบุว่าเป็น INCITS / ISO / IEC 14882 แต่อย่างน้อยก็เป็น ISO มาตรฐานพื้นฐานอย่างเดียวที่เสนอ ไม่แน่ใจเกี่ยวกับ errata / TRs
cHao

19

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

การเรียกใช้ระบบเป็นวิธีระดับต่ำในการใช้พลังของระบบปฏิบัติการ แต่อาจซับซ้อนและยุ่งยากในการใช้ดังนั้นมักจะถูก "ห่อ" ใน API เพื่อให้คุณไม่ต้องจัดการกับพวกเขาโดยตรง แต่ภายใต้อะไรก็ตามที่คุณทำที่เกี่ยวข้องกับ O / S ทรัพยากรที่เกี่ยวข้องจะใช้การเรียกของระบบรวมถึงการพิมพ์เครือข่ายและซ็อกเก็ต ฯลฯ

ในกรณีของ windows, Microsoft Windows มี GUI ที่เขียนลงในเคอร์เนลจริง ๆ , ดังนั้นจึงมีการเรียกระบบสำหรับการทำ windows, การวาดภาพกราฟิก, ฯลฯ ในระบบปฏิบัติการอื่น, GUI อาจไม่ได้เป็นส่วนหนึ่งของเคอร์เนล, ในกรณีนี้ เท่าที่ฉันรู้ว่าจะไม่มีการเรียกระบบใด ๆ สำหรับสิ่งที่เกี่ยวข้องกับ GUI และคุณสามารถทำงานได้ในระดับที่ต่ำกว่าด้วยกราฟิกระดับต่ำและการโทรที่เกี่ยวข้องกับอินพุต


3
สิ่งสำคัญที่ขาดหายไปก็คือระบบการเรียกใช้นั้นไม่ได้ใช้เวทมนตร์ พวกเขาจะให้บริการโดยเคอร์เนลซึ่งโดยทั่วไปจะเขียนใน C (++) ยิ่งกว่านั้น syscalls ก็ไม่จำเป็นด้วยซ้ำ ในระบบปฏิบัติการพื้นฐานที่ไม่มีการป้องกันหน่วยความจำหน้าต่างสามารถวาดได้โดยใส่พิกเซลลงในฮาร์ดแวร์เฟรมเฟรมโดยตรง
el.pescado

15

คำถามที่ดี. นักพัฒนา C หรือ C ++ ใหม่ทุกคนมีสิ่งนี้อยู่ในใจ ฉันถือว่าเครื่อง x86 มาตรฐานสำหรับส่วนที่เหลือของโพสต์นี้ หากคุณใช้คอมไพเลอร์ Microsoft C ++ ให้เปิด notepad ของคุณแล้วพิมพ์สิ่งนี้ (ตั้งชื่อไฟล์ Test.c)

int main(int argc, char **argv)
{
   return 0
}

และตอนนี้รวบรวมไฟล์นี้ (ใช้พรอมต์คำสั่งสำหรับนักพัฒนา) cl Test.c /FaTest.asm

ตอนนี้เปิด Test.asm ในแผ่นจดบันทึกของคุณ สิ่งที่คุณเห็นคือรหัสแปล - C / C ++ แปลเป็นแอสเซมเบลอร์ คุณได้คำใบ้หรือไม่?

_main   PROC
    push    ebp
    mov ebp, esp
    xor eax, eax
    pop ebp
    ret 0
_main   ENDP

โปรแกรม C / C ++ ได้รับการออกแบบให้ทำงานบนโลหะ ซึ่งหมายความว่าพวกเขาสามารถเข้าถึงฮาร์ดแวร์ระดับต่ำกว่าซึ่งทำให้ง่ายต่อการใช้ประโยชน์จากความสามารถของฮาร์ดแวร์ บอกว่าฉันจะเขียน C library getch () บนเครื่อง x86

ฉันจะพิมพ์บางอย่างด้วยวิธีนี้:

_getch proc 
   xor AH, AH
   int 16h
   ;AL contains the keycode (AX is already there - so just return)
ret

ฉันเรียกใช้มันด้วยแอสเซมเบลอร์และสร้าง. OBJ - ตั้งชื่อมันว่า getch.obj

จากนั้นฉันเขียนโปรแกรม C (ฉันไม่ได้รวมอะไรเลย)

extern char getch();

void main(int, char **)
{
  getch();
}

ตอนนี้ตั้งชื่อไฟล์นี้ - GetChTest.c รวบรวมไฟล์นี้โดยผ่าน getch.obj ไป (หรือคอมไพล์ทีละไฟล์กับ. obj และลิงค์ GetChTest.Obj และ getch.Obj ร่วมกันเพื่อสร้าง GetChTest.exe)

เรียกใช้ GetChTest.exe แล้วคุณจะพบว่ามันรอคีย์บอร์ดอินพุต

การเขียนโปรแกรม C / C ++ ไม่ได้เกี่ยวกับภาษา ในการเป็นโปรแกรมเมอร์ C / C ++ ที่ดีคุณต้องมีความเข้าใจอย่างถ่องแท้เกี่ยวกับชนิดของเครื่องที่รัน คุณจะต้องรู้วิธีจัดการหน่วยความจำวิธีการลงทะเบียนโครงสร้าง ฯลฯ คุณอาจไม่ต้องการข้อมูลเหล่านี้ทั้งหมดสำหรับการเขียนโปรแกรมปกติ - แต่พวกเขาจะช่วยคุณอย่างมาก นอกเหนือจากความรู้พื้นฐานเกี่ยวกับฮาร์ดแวร์มันจะช่วยให้คุณเข้าใจได้อย่างชัดเจนว่าคอมไพเลอร์ทำงานอย่างไร (แปลว่ามันแปลอย่างไร) ซึ่งช่วยให้คุณสามารถปรับแต่งโค้ดของคุณได้ตามความจำเป็น มันเป็นแพ็คเกจที่น่าสนใจ!

ทั้งสองภาษารองรับคำสำคัญ __asm ​​ซึ่งหมายความว่าคุณสามารถผสมรหัสภาษาแอสเซมบลีของคุณด้วย การเรียนรู้ C และ C ++ จะทำให้คุณเป็นโปรแกรมเมอร์โดยรวมที่ดีขึ้น

ไม่จำเป็นต้องเชื่อมโยงกับ Assembler เสมอ ฉันพูดถึงมันเพราะฉันคิดว่ามันจะช่วยให้คุณเข้าใจดีขึ้น ส่วนใหญ่การเรียกใช้ไลบรารีส่วนใหญ่ใช้ประโยชน์จากการเรียกของระบบ / API ที่จัดทำโดยระบบปฏิบัติการ (ระบบปฏิบัติการจะทำสิ่งที่เกี่ยวกับฮาร์ดแวร์)


10

C ++ ... ทันใดนั้นความสามารถดังกล่าวผ่านทางไลบรารีที่เขียนด้วย C ++ เองได้อย่างไร?

ไม่มีอะไรน่าอัศจรรย์เกี่ยวกับการใช้ห้องสมุดอื่น ๆ ไลบรารี่เป็นฟังก์ชั่นใหญ่ ๆ ที่คุณสามารถโทรหาได้

พิจารณาตัวเองเขียนฟังก์ชั่นเช่นนี้

void addExclamation(std::string &str)
{
    str.push_back('!');
}

addExclamation(myVeryOwnString);ตอนนี้ถ้าคุณรวมถึงไฟล์ที่คุณสามารถเขียน ตอนนี้คุณอาจถามว่า "C ++ ได้รับความสามารถในการเพิ่มเครื่องหมายอัศเจรีย์ในสตริงได้อย่างไร" คำตอบนั้นง่าย: คุณเขียนฟังก์ชั่นที่จะทำแล้วคุณเรียกมันว่า

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

คำถามอื่น ๆ ตอบวิธีการวาดหน้าต่างจริง แต่คุณฟังสับสนเกี่ยวกับวิธีการทำงานของห้องสมุดดังนั้นฉันต้องการที่จะตอบคำถามส่วนใหญ่ของคำถามของคุณ


8

กุญแจสำคัญคือความเป็นไปได้ของระบบปฏิบัติการที่จะเปิดเผย API และคำอธิบายโดยละเอียดเกี่ยวกับวิธีการใช้ API นี้

ระบบปฏิบัติการเสนอชุดของ API ที่มีการเรียกการประชุม แบบแผนการโทรกำลังกำหนดวิธีที่พารามิเตอร์กำหนดให้กับ API และวิธีส่งคืนผลลัพธ์และวิธีดำเนินการเรียกจริง

ระบบปฏิบัติการและคอมไพเลอร์ที่สร้างรหัสสำหรับพวกเขาเล่นด้วยกันได้ดีดังนั้นคุณมักจะไม่ต้องคิดถึงมันแค่ใช้มัน


7

ไม่จำเป็นต้องใช้ไวยากรณ์พิเศษสำหรับการสร้างหน้าต่าง สิ่งที่จำเป็นต้องมีก็คือระบบปฏิบัติการมี API เพื่อสร้างหน้าต่าง API ดังกล่าวประกอบด้วยการเรียกใช้ฟังก์ชันอย่างง่ายซึ่ง C ++ จะให้ไวยากรณ์

นอกจากนี้ C และ C ++ เรียกว่าภาษาการเขียนโปรแกรมระบบและสามารถเข้าถึงตัวชี้โดยพลการ (ซึ่งอาจถูกแมปไปยังอุปกรณ์บางอย่างโดยฮาร์ดแวร์) นอกจากนี้มันยังค่อนข้างง่ายในการเรียกฟังก์ชั่นที่กำหนดไว้ในการชุมนุมซึ่งช่วยให้การดำเนินงานเต็มรูปแบบที่โปรเซสเซอร์ให้ ดังนั้นจึงเป็นไปได้ที่จะเขียน OS เองโดยใช้ C หรือ C ++ และแอสเซมบลีจำนวนเล็กน้อย

มันควรจะกล่าวถึงว่า Qt เป็นตัวอย่างที่ไม่ดีเนื่องจากมันใช้เมตาคอมไพเลอร์ที่เรียกว่าเพื่อขยายไวยากรณ์ของ C ++ อย่างไรก็ตามนี่ไม่เกี่ยวข้องกับความสามารถในการโทรเข้าสู่ API ที่จัดทำโดยระบบปฏิบัติการเพื่อวาดหรือสร้างหน้าต่าง


7

ก่อนอื่นฉันคิดว่ามีความเข้าใจผิดเล็กน้อย

C ++ ซึ่งก่อนหน้านี้ไม่มีไวยากรณ์ที่สามารถขอระบบปฏิบัติการสำหรับหน้าต่างหรือวิธีการสื่อสารผ่านเครือข่ายได้อย่างไร

ไม่มีไวยากรณ์สำหรับการดำเนินการกับระบบปฏิบัติการ มันเป็นคำถามของความหมาย

ทันใดนั้นความสามารถดังกล่าวผ่านห้องสมุดที่เขียนด้วย C ++ เอง

ดีระบบปฏิบัติการส่วนใหญ่เขียนในซีคุณสามารถใช้ไลบรารีที่ใช้ร่วมกัน (ดังนั้น dll) เพื่อเรียกรหัสภายนอก นอกจากนี้รหัสระบบปฏิบัติการสามารถลงทะเบียนการปฏิบัติของระบบบนsyscalls *หรือขัดจังหวะซึ่งคุณสามารถเรียกใช้การชุมนุม ไลบรารีที่ใช้ร่วมกันนั้นมักจะทำให้ระบบเรียกหาคุณดังนั้นคุณจึงไม่ต้องใช้อินไลน์แอสเซมบลี

นี่คือบทแนะนำที่ดีเกี่ยวกับสิ่งนั้น: http://www.win.tue.nl/~aeb/linux/lk/lk-4.html
สำหรับ Linux แต่หลักการก็เหมือนกัน

ระบบปฏิบัติการทำงานบนการ์ดกราฟิกการ์ดเครือข่าย ฯลฯ อย่างไร? มันกว้างมาก แต่ส่วนใหญ่คุณต้องเข้าถึงอินเตอร์รัปต์พอร์ตหรือเขียนข้อมูลบางส่วนไปยังพื้นที่หน่วยความจำพิเศษ เนื่องจากการดำเนินการนั้นได้รับการปกป้องคุณจึงต้องเรียกมันผ่านระบบปฏิบัติการต่อไป


7

ในความพยายามที่จะให้มุมมองที่แตกต่างกันเล็กน้อยสำหรับคำตอบอื่น ๆ ฉันจะตอบแบบนี้

(ข้อจำกัดความรับผิดชอบ: ฉันทำให้สิ่งต่าง ๆ เรียบง่ายขึ้นเล็กน้อยสถานการณ์ที่ฉันให้ไว้ล้วนเป็นสมมุติฐานอย่างแท้จริงและถูกเขียนขึ้นเพื่อแสดงให้เห็นถึงแนวความคิดแทนที่จะเป็นความจริง 100% ต่อชีวิต)

ลองนึกถึงสิ่งต่าง ๆ จากมุมมองอื่น ๆ จินตนาการว่าคุณเพิ่งเขียนระบบปฏิบัติการง่าย ๆ ที่มีความสามารถในการทำเกลียวขั้นพื้นฐานหน้าต่างและการจัดการหน่วยความจำ คุณต้องการใช้ไลบรารี C ++ เพื่อให้ผู้ใช้โปรแกรมใน C ++ และทำสิ่งต่าง ๆ เช่นทำ windows วาดลง windows ฯลฯ คำถามคือวิธีการทำเช่นนี้

ประการแรกเนื่องจาก C ++ คอมไพล์กับรหัสเครื่องคุณต้องกำหนดวิธีการใช้รหัสเครื่องเพื่อเชื่อมต่อกับ C ++ นี่คือที่มาของฟังก์ชั่นฟังก์ชั่นยอมรับข้อโต้แย้งและให้ค่าตอบแทนดังนั้นพวกเขาจึงมีวิธีมาตรฐานในการถ่ายโอนข้อมูลระหว่างส่วนต่าง ๆ ของรหัส พวกเขาทำเช่นนี้โดยการสร้างบางสิ่งบางอย่างที่รู้จักกันในการประชุมโทร

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

ดังนั้นหลายเดือนต่อมาและคุณมีฟังก์ชั่นระบบปฏิบัติการทั้งหมดของคุณแยกออก ผู้ใช้ของคุณสามารถเรียกใช้ฟังก์ชั่นเพื่อสร้างหน้าต่างและวาดลงบนพวกเขาพวกเขาสามารถสร้างหัวข้อและทุกสิ่งที่ยอดเยี่ยม นี่คือปัญหาแม้ว่าฟังก์ชั่นระบบปฏิบัติการของคุณจะแตกต่างจากฟังก์ชั่นของ Linux หรือฟังก์ชั่นของ Windows ดังนั้นคุณตัดสินใจว่าคุณจะต้องให้อินเตอร์เฟซมาตรฐานแก่ผู้ใช้เพื่อให้พวกเขาสามารถเขียนโค้ดแบบพกพาได้ นี่คือที่มาของ QT

ตามที่คุณเกือบจะรู้แน่นอน QT มีคลาสและฟังก์ชันที่มีประโยชน์มากมายสำหรับการทำสิ่งต่าง ๆ ที่ระบบปฏิบัติการทำ แต่ในลักษณะที่เป็นอิสระจากระบบปฏิบัติการพื้นฐาน วิธีการทำงานนี้คือ QT จัดเตรียมคลาสและฟังก์ชันที่เหมือนกันในลักษณะที่ปรากฏแก่ผู้ใช้ แต่รหัสที่อยู่เบื้องหลังฟังก์ชั่นนั้นแตกต่างกันสำหรับแต่ละระบบปฏิบัติการ ตัวอย่างเช่น QApplication :: closeAllWindows () ของ QT จะเรียกฟังก์ชั่นการปิดหน้าต่างเฉพาะของแต่ละระบบปฏิบัติการตามรุ่นที่ใช้ ใน Windows มันมักจะเรียก CloseWindow (hwnd) ในขณะที่บนระบบปฏิบัติการที่ใช้ X Window System มันอาจจะเรียก XDestroyWindow (จอแสดงผลหน้าต่าง)

เห็นได้ชัดว่าระบบปฏิบัติการมีหลายเลเยอร์ซึ่งทั้งหมดจะต้องมีการโต้ตอบผ่านส่วนต่อประสานของหลายพันธุ์ มีหลายแง่มุมที่ฉันยังไม่ได้แตะต้องเลย แต่การอธิบายทั้งหมดจะใช้เวลานานมาก หากคุณมีความสนใจต่อไปในการทำงานภายในของระบบปฏิบัติการผมขอแนะนำให้ตรวจสอบจากวิกิพีเดีย OS dev

โปรดจำไว้ว่าเหตุผลที่ระบบปฏิบัติการหลายแห่งเลือกที่จะเปิดเผยส่วนต่อประสานกับ C / C ++ ก็คือพวกเขารวบรวมรหัสเครื่อง แต่พวกเขาอนุญาตให้คำแนะนำในการประกอบประกอบเข้าด้วยกันกับรหัสของตัวเองและให้อิสระแก่โปรแกรมเมอร์อย่างมาก

มีอีกมากเกิดขึ้นที่นี่ ฉันต้องการอธิบายเพิ่มเติมว่าไลบรารี่เช่นไฟล์. so และ. dll ไม่จำเป็นต้องเขียนด้วยภาษา C / C ++ และสามารถเขียนเป็นภาษาแอสเซมบลีหรือภาษาอื่น ๆ ได้ แต่ฉันรู้สึกว่าถ้าฉันเพิ่มเข้าไปอีก เขียนบทความทั้งหมดและเท่าที่ฉันชอบทำฉันไม่มีเว็บไซต์โฮสต์ไว้


6

เมื่อคุณพยายามวาดบางสิ่งบางอย่างบนหน้าจอรหัสของคุณจะเรียกรหัสบางส่วนของรหัสที่เรียกรหัสอื่น ๆ (ฯลฯ ) จนกระทั่งในที่สุดก็มี "การเรียกระบบ" ซึ่งเป็นคำสั่งพิเศษที่ CPU สามารถดำเนินการได้ คำแนะนำเหล่านี้สามารถเขียนได้ในชุดประกอบหรือสามารถเขียนใน C ++ หากคอมไพเลอร์รองรับ "อินทริน" (ซึ่งเป็นฟังก์ชั่นที่คอมไพเลอร์จัดการกับ "พิเศษ" โดยการแปลงเป็นรหัสพิเศษที่ CPU สามารถเข้าใจได้) งานของพวกเขาคือบอกระบบปฏิบัติการให้ทำอะไรสักอย่าง

เมื่อมีการเรียกระบบเกิดขึ้นฟังก์ชันจะเรียกว่าเรียกใช้ฟังก์ชันอื่น (ฯลฯ ) จนกระทั่งในที่สุดไดร์เวอร์จอแสดงผลจะบอกให้วาดบางสิ่งบางอย่างบนหน้าจอ ณ จุดนั้นไดรเวอร์จอแสดงผลจะดูที่ภูมิภาคหนึ่ง ๆ ในหน่วยความจำกายภาพซึ่งจริงๆแล้วไม่ใช่หน่วยความจำ แต่เป็นช่วงที่อยู่ที่สามารถเขียนได้ราวกับว่ามันเป็นหน่วยความจำ อย่างไรก็ตามการเขียนไปยังช่วงที่อยู่นั้นทำให้ฮาร์ดแวร์กราฟิกขัดขวางการเขียนหน่วยความจำและวาดบางสิ่งบางอย่างบนหน้าจอ
การเขียนไปยังหน่วยความจำของภูมิภาคนี้เป็นสิ่งที่สามารถเขียนโค้ดใน C ++ ได้เนื่องจากในด้านซอฟต์แวร์มันเป็นเพียงการเข้าถึงหน่วยความจำปกติ เป็นเพียงฮาร์ดแวร์ที่จัดการแตกต่างกัน
นั่นเป็นคำอธิบายพื้นฐานจริงๆว่ามันทำงานอย่างไร


4
Afaik systemcall ไม่ใช่คำสั่ง cpu จริงๆและไม่มีส่วนเกี่ยวข้องกับอินทริน มันมีฟังก์ชั่นเพิ่มเติมของเคอร์เนลระบบปฏิบัติการซึ่งสื่อสารกับอุปกรณ์
MatthiasB

3
@ Matiasias B: คุณผิดเพราะsyscall(และลูกพี่ลูกน้องsysenter) เป็นคำสั่ง CPU แน่นอน
user541686

2
นี่เป็นเพียงคำใบ้ในการปรับปรุงคำตอบของคุณเนื่องจากมันไม่ชัดเจนสำหรับตัวเอง อย่ามองว่าเป็นการโจมตีส่วนตัวหรืออะไรก็ตาม
MatthiasB

1
@ MatiasB: ฉันไม่ได้ใช้มันเป็นการส่วนตัว ฉันกำลังบอกว่าฉันรู้แล้วว่าคำตอบนั้นไม่ถูกต้อง 100% จริง ๆ แต่ฉันคิดว่ามันง่ายพอที่จะตอบ OP - ดังนั้นถ้าคุณรู้วิธีเขียนคำตอบที่ดีกว่าจริงๆแล้วโปรดเขียนด้วยตัวคุณเอง ตอบหรือใช้เวลาในการแก้ไขของฉัน ฉันไม่มีอะไรเพิ่มที่ฉันคิดว่าคุ้มค่าดังนั้นถ้าคุณต้องการเห็นสิ่งที่ดีกว่าในหน้านี้คุณจะต้องพยายามด้วยตัวเอง
user541686

3
การเรียกของระบบเสร็จสิ้นโดยใช้ซอฟต์แวร์อินเตอร์รัปต์ คำแนะนำเช่นsysenterนั้นเป็นเส้นทางการโทรที่ดีที่สุดเนื่องจากการสลับบริบทที่ใช้โดยตัวจัดการขัดจังหวะไม่เร็วเท่าที่ทุกคนต้องการ แต่โดยพื้นฐานแล้วมันยังคงเป็นซอฟต์แวร์ที่สร้างการขัดจังหวะในขณะที่จัดการโดย vectoring เป็นตัวจัดการที่ติดตั้งโดยเคอร์เนลระบบปฏิบัติการ ส่วนหนึ่งของกระบวนการสลับบริบทที่ดำเนินการโดยsysenterการเปลี่ยนบิตโหมดในตัวประมวลผลเพื่อตั้งค่าริง 0 - การเข้าถึงคำสั่งที่ลงทะเบียนและหน่วยความจำและพื้นที่ I / O ทั้งหมด
Ben Voigt

4

โปรแกรม C ++ ของคุณกำลังใช้ไลบรารี Qt (เขียนด้วยรหัส C ++ ด้วย) ไลบรารี Qt จะใช้ฟังก์ชัน Windows CreateWindowEx (ซึ่งมีรหัสใน C ภายใน kernel32.dll) หรือภายใต้ลีนุกซ์อาจใช้Xlib (หรือรหัสใน C), แต่มันอาจส่งไบต์ดิบที่โพรโทคอล X หมายถึง " โปรดสร้างหน้าต่างให้ฉันด้วย "

ที่เกี่ยวข้องกับคำถามcatch-22ของคุณคือบันทึกในอดีตที่ว่า "คอมไพเลอร์ C ++ ตัวแรกเขียนด้วย C ++" ถึงแม้ว่าจริงๆแล้วมันจะเป็นคอมไพเลอร์ C ที่มีความคิด C ++ ไม่มากพอที่จะสามารถคอมไพล์เวอร์ชั่นแรกได้ .

ในทำนองเดียวกัน GCC คอมไพเลอร์ใช้ส่วนขยาย GCC: มันเป็นครั้งแรกที่รวบรวมไปยังรุ่นแล้วใช้ในการคอมไพล์ตัวเอง (คำแนะนำในการสร้าง GCC)


2

ฉันเห็นคำถามนี้จริง ๆ แล้วเป็นคำถามคอมไพเลอร์

ดูด้วยวิธีนี้คุณเขียนโค้ดใน Assembly (คุณสามารถทำได้ในภาษาใด ๆ ) ซึ่งแปลภาษาที่เพิ่งเขียนใหม่ของคุณที่คุณต้องการเรียก Z ++ เป็น Assembly เพื่อความเรียบง่ายให้เรียกมันว่า compiler (มันเป็นคอมไพเลอร์) .

ตอนนี้คุณให้คอมไพเลอร์นี้ฟังก์ชั่นพื้นฐานบางอย่างเพื่อให้คุณสามารถเขียน int, string, arrays และอื่น ๆ ที่จริงแล้วคุณให้ความสามารถมากพอเพื่อให้คุณสามารถเขียนคอมไพเลอร์เองใน Z ++ และตอนนี้คุณมีคอมไพเลอร์สำหรับ Z ++ เขียนเป็น Z ++ ค่อนข้างเรียบร้อย

อะไรที่เจ๋งกว่าคือตอนนี้คุณสามารถเพิ่มความสามารถให้กับคอมไพเลอร์นั้นโดยใช้ความสามารถที่มีอยู่แล้วจึงขยายภาษา Z ++ ด้วยคุณสมบัติใหม่โดยใช้คุณสมบัติก่อนหน้า

ตัวอย่างเช่นถ้าคุณเขียนโค้ดมากพอที่จะวาดพิกเซลในสีใดก็ได้คุณสามารถขยายได้โดยใช้ Z ++ เพื่อวาดสิ่งที่คุณต้องการ


0

ฮาร์ดแวร์คือสิ่งที่ทำให้สิ่งนี้เกิดขึ้นได้ คุณสามารถนึกถึงหน่วยความจำกราฟิกเป็นอาร์เรย์ขนาดใหญ่ (ประกอบด้วยทุกพิกเซลบนหน้าจอ) ในการวาดลงบนหน้าจอคุณสามารถเขียนถึงหน่วยความจำนี้โดยใช้ C ++ หรือภาษาใด ๆ ที่อนุญาตให้เข้าถึงหน่วยความจำนั้นโดยตรง หน่วยความจำนั้นเพิ่งจะสามารถเข้าถึงได้โดยหรืออยู่ในการ์ดกราฟิก

ในระบบที่ทันสมัยการเข้าถึงหน่วยความจำกราฟิกโดยตรงจะต้องมีการเขียนโปรแกรมควบคุมเนื่องจากข้อ จำกัด ต่าง ๆ เพื่อให้คุณใช้วิธีการทางอ้อม ไลบรารีที่สร้างหน้าต่าง (จริง ๆ แล้วเป็นภาพเหมือนภาพอื่น ๆ ) แล้วเขียนภาพนั้นลงในหน่วยความจำกราฟิกที่ GPU แสดงบนหน้าจอ ไม่มีสิ่งใดที่จะเพิ่มในภาษายกเว้นความสามารถในการเขียนไปยังตำแหน่งหน่วยความจำเฉพาะซึ่งเป็นตัวชี้สำหรับ


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