โมดูล C ++ - เหตุใดจึงถูกลบออกจาก C ++ 0x พวกเขาจะกลับมาในภายหลังหรือไม่?


110

ฉันเพิ่งค้นพบร่าง C ++ 0x เก่าเกี่ยวกับโมดูลใน C ++ 0x

แนวคิดคือการออกจากระบบ. h / .cpp ปัจจุบันโดยการเขียนเฉพาะไฟล์. cpp ซึ่งจะสร้างไฟล์โมดูลระหว่างการคอมไพล์ซึ่งจะถูกใช้โดยไฟล์. cpp อื่น ๆ

นี่ดูเหมือนเป็นคุณสมบัติที่ยอดเยี่ยมจริงๆ

แต่คำถามของฉันคือทำไมพวกเขาถึงลบมันออกจาก C ++ 0x เป็นเพราะปัญหาทางเทคนิคมากเกินไปหรือไม่? ไม่มีเวลา? และคุณคิดว่าพวกเขาจะพิจารณาทำงานกับ C ++ เวอร์ชันซ่อนเร้นหรือไม่?

คำตอบ:


70

จากสถานะของวิวัฒนาการ C ++ (โพสต์ซานฟรานซิสโก 2008)ข้อเสนอโมดูลถูกจัดประเภทเป็น "หัวเรื่องสำหรับ TR แยกต่างหาก:"

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

ข้อเสนอโมดูลยังไม่พร้อมและการรออาจทำให้การเสร็จสิ้นมาตรฐาน C ++ 0x ล่าช้า มันไม่ได้ถูกลบออกจริงๆมันไม่เคยรวมอยู่ในกระดาษใช้งาน


89

แบบร่างโมดูล C ++ (ข้อกำหนดทางเทคนิคหลัง C ++ 17)

WG21ฉบับร่างและการแก้ไขที่อัปเดตหลายรายการสำหรับข้อกำหนดของโมดูล C / C ++ ได้รับการเผยแพร่โดยWG21บน open-std.org ฉันจะเชื่อมโยงไปยังเอกสารล่าสุดที่นี่เท่านั้น:

  • Working Draft, Extensions to C ++ for Modules N4610 (October 2016)
  • การแก้ไขครั้งที่สี่เผยแพร่เป็นP0142R0 (มีนาคม 2559)
  • คำพูดสำหรับโมดูลที่เผยแพร่เป็นP0143R2 (มีนาคม 2559)
  • ทีมเสียงดังได้เผยแพร่การแก้ไขครั้งที่สองของการเปลี่ยนแปลง: P0273R1 (ตุลาคม 2016)

บล็อกโพสต์ต่อไปนี้ประกอบด้วยสรุปการประชุมมาตรฐานและโดยเฉพาะอย่างยิ่งสรุปสถานะปัจจุบันของแบบร่างโมดูล

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

ข้อกำหนดของโมดูลตามที่ Microsoft เสนอ

นี่คือภาพรวมโดยย่อของแนวคิดที่สำคัญที่สุดในข้อเสนอนี้ เนื่องจากเป็นแบบร่างสิ่งนี้อาจยังคงมีการเปลี่ยนแปลง มาตรฐานโมดูลใหม่จะประกอบด้วยสิ่งต่อไปนี้:

moduleคำหลักที่จะประกาศโมดูลหลายไฟล์สามารถประกาศนี้เพื่อสร้างโมดูลหนึ่ง ( แต่สำหรับแต่ละโมดูลเพียงหนึ่งรวบรวมหน่วยสามารถประกอบด้วยexport {}ส่วน):

module M;

importคำหลักเพื่อโมดูลนำเข้าแทนimportมันก็อาจจะมีการตัดสินใจที่จะใช้using moduleแทนดังนั้นคำหลักที่นำเข้าใหม่อาจจะหลีกเลี่ยง

import std.io;
import module.submodule;

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

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

การเปลี่ยนแปลงที่สำคัญของโมดูลคือมาโครและคำจำกัดความของตัวประมวลผลล่วงหน้าจะเป็นแบบโลคัลของโมดูลและจะไม่ถูกส่งออก ดังนั้นมาโครจึงไม่มีผลกระทบใด ๆ กับโมดูลที่นำเข้า:

#define FILE "my/file"
import std.io;   //will not be impacted by the above definition

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

สำหรับข้อมูลรายละเอียดเพิ่มเติมฉันขอแนะนำให้อ่านฉบับร่าง

โมดูลเสียงดัง

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

ในปัจจุบันไม่มีไวยากรณ์ C หรือ C ++ สำหรับการประกาศการนำเข้า Clang จะติดตามข้อเสนอโมดูลในคณะกรรมการ C ++ ดูส่วนรวมเป็นการนำเข้าเพื่อดูวิธีการนำเข้าโมดูลในปัจจุบัน

ส่วนหลักที่ Clang นำมาใช้ในปัจจุบันคือ "Module Map Language" ซึ่งอนุญาตให้เขียนแผนที่โมดูลสำหรับโค้ดที่มีอยู่ซึ่งยังคงใช้ไฟล์ส่วนหัว

การส่งออกมาโครจากโมดูล

ดังที่กล่าวไว้ข้างต้นยังไม่ชัดเจนว่าการส่งออกมาโครจะเป็นส่วนหนึ่งของModulesสุดท้ายหรือไม่ ในP0273R1มีการเสนอไวยากรณ์ต่อไปนี้สำหรับการส่งออกมาโคร:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

2
อัปเดตจาก 2018 Rapperswil มีข้อเสนอที่รวมเข้าด้วยกันจาก Gabriel dos Reis และ Richard Smith, p1103r0 botondballo.wordpress.com/2018/06/20/…
Dwayne Robinson

32

Clang เป็นคอมไพเลอร์ตัวแรกที่เริ่มทำงานกับโมดูลก่อนที่การกำหนดมาตรฐานจะเสร็จสมบูรณ์ เอกสารยังมีไม่มากนัก แต่สามารถดูโค้ดตัวอย่างได้ที่นี่:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

ความคิดเห็นบางส่วนจาก Douglas Gregor (ผู้พัฒนานำไปใช้):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

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

แก้ไข 1:
Douglas Gregor ได้เปิดตัวการนำเสนอเกี่ยวกับการใช้งานของเขา:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

แก้ไข 2:
การสนับสนุนโมดูลในเสียงดังได้รับการบันทึกไว้ที่นี่:
http://clang.llvm.org/docs/Modules.html

แก้ไข 3:
ขณะนี้โมดูลได้รับการสนับสนุนในคอมไพเลอร์ C ++ ของ Microsoft เช่นกัน: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1 aspx


-39
  1. เพราะเป็นการเปลี่ยนแปลงแนวความคิดที่ยิ่งใหญ่มาก
  2. ไม่มีความจำเป็นที่แท้จริงเนื่องจากการแยกแหล่งที่มาเป็น h / cpp จะได้ผล
  3. เนื่องจาก C ++ ไม่ได้กำหนดวิธีการสร้างไลบรารี "โมดูล" ที่แท้จริง มันปล่อยให้ผู้พัฒนาคอมไพเลอร์และตัวเชื่อมโยง
  4. บางครั้ง "โมดูล" ขึ้นอยู่กับแพลตฟอร์มเช่น DLL ค่อนข้างแตกต่างจากออบเจ็กต์ที่แชร์ ดังนั้นจึงไม่ใช่เรื่องเล็กน้อยที่จะผสานระหว่างแนวคิดเหล่านี้

78
มีความต้องการอย่างแน่นอน .h / .cpp เป็นวิธีแก้ปัญหาที่ไม่ดีและล้าสมัยอย่างน่าขัน ระบบโมดูลจะมีการเปลี่ยนแปลงครั้งใหญ่ แต่เป็นสิ่งที่คณะกรรมการมาตรฐานเห็นว่าสำคัญ
jalf

13
โมเดลการสร้างส่วนหัวคือโมดูลปัญหาที่มีไว้เพื่อแก้ปัญหาไม่ใช่วิธีแก้ปัญหา โมดูลยังไม่สามารถแทนที่ DLL / SO ได้
bames53

5
สิ่งนี้ผิด: 1.ข้อเสนอของโมดูลดูแลอย่างดีเพื่อให้แน่ใจว่าสามารถใช้งานร่วมกันได้กับระบบส่วนหัวที่มีอยู่แล้วดังนั้นจึงไม่มีอะไรหยุดชะงักเมื่อโมดูลจะถูกนำมาใช้ในอนาคต 2.ความจำเป็นในการลดความซับซ้อนของเวลาคอมไพล์ของโมดูลส่วนหัวจากความซับซ้อนO (M * N)เป็นO (M + N) ได้รับการบันทึกไว้เป็นอย่างดี 3.มาตรฐานโมดูลจะไม่กำหนดวิธีการรวบรวมและเชื่อมโยงโมดูล แต่จะเพิ่มความหมายที่ชัดเจนเพื่อแยกระหว่าง API ส่วนตัวและสาธารณะของโมดูล 4.รูปแบบไบนารีของ DLL หรือวัตถุที่ใช้ร่วมกันจะไม่ได้รับผลกระทบจากมาตรฐาน
lanoxx

3
"ไม่จำเป็นต้องใช้อย่างแท้จริงเนื่องจากการแยกแหล่งที่มาเพื่อ h / cpp จะได้ผล" ดังนั้นการเลื่อยโซ่ออกจากนิ้วที่ฉีดเข้าไป แต่ก็ไม่ได้หมายความว่ามันไม่ใช่ปัญหา! เพียงแค่ดูที่. NET หรือภาษาอื่น ๆ ที่ใหม่กว่าการต้องสั่งสิ่งต่างๆด้วยวิธีใดวิธีหนึ่งเพื่อให้สามารถมองเห็นได้จริงหรือสร้างได้อย่างถูกต้องเป็นภาระใหญ่ที่ต้องหายไป
paulm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.