C ++ मॉड्यूल - उन्हें C ++ 0x से क्यों निकाला गया? क्या वे बाद में वापस आ जाएंगे?


110

मैंने अभी C ++ 0x में मॉड्यूल के बारे में इस पुराने C ++ 0x ड्राफ्ट की खोज की ।

वर्तमान में .h / .cpp सिस्टम से बाहर निकलने का विचार केवल .cpp फ़ाइलों को लिखने से था, जो संकलन के दौरान मॉड्यूल फ़ाइलों को उत्पन्न करेगा, जो तब अन्य .cpp फ़ाइलों द्वारा बदले में उपयोग किया जाएगा।

यह वास्तव में एक महान विशेषता की तरह लग रहा है।

लेकिन मेरा सवाल यह है: उन्होंने इसे C ++ 0x से क्यों निकाला? क्या यह बहुत अधिक तकनीकी कठिनाइयों के कारण था? समय की कमी? और क्या आपको लगता है कि वे C ++ के उल्टे संस्करण के लिए इस पर काम करने पर विचार करेंगे?

जवाबों:


70

C ++ एवोल्यूशन (पोस्ट सैन फ्रांसिस्को 2008) के राज्य से , मॉड्यूल प्रस्ताव को "एक अलग टीआर के लिए शीर्षक" के रूप में वर्गीकृत किया गया था।

प्रकाशित होने से पहले C ++ 0x के बाद एक और मानक के लिए प्रतीक्षा करने के लिए इन विषयों को बहुत महत्वपूर्ण माना जाता है, लेकिन अगले मानक के लिए समय पर अंतिम रूप दिया जाना भी प्रयोगात्मक है। इसलिए, इन सुविधाओं को जल्द से जल्द अवसर पर एक तकनीकी रिपोर्ट द्वारा वितरित किया जाएगा।

मॉड्यूल प्रस्ताव अभी तैयार नहीं था और इसके लिए प्रतीक्षा करने में C ++ 0x मानक को पूरा करने में देरी होगी। यह वास्तव में हटाया नहीं गया था, यह सिर्फ काम करने वाले कागज में शामिल नहीं था।


89

C ++ मॉड्यूल ड्राफ्ट (C ++ 17 के बाद तकनीकी विनिर्देश)

CG / C ++ मॉड्यूल विनिर्देश के लिए एक मसौदा और कई अपडेट किए गए संशोधन WG21 द्वारा खुले-std.org पर प्रकाशित किए गए हैं । मैं यहां केवल नवीनतम दस्तावेजों से लिंक करूंगा:

  • कार्य ड्राफ्ट, मॉड्यूल N4610 के लिए C ++ के लिए एक्सटेंशन (अक्टूबर 2016)।
  • चौथा संशोधन P0142R0 के रूप में प्रकाशित हुआ (मार्च 2016) के ।
  • P0143R2 के रूप में प्रकाशित मॉड्यूल के लिए रिकॉर्डिंग (मार्च 2016) के ।
  • क्लैंग टीम ने अपने परिवर्तनों का एक दूसरा संशोधन प्रकाशित किया है: P0273R1 (अक्टूबर 2016)।

निम्नलिखित ब्लॉग पोस्ट में मानकों की बैठकों का सारांश और विशेष रूप से मॉड्यूल ड्राफ्ट की वर्तमान स्थिति का सारांश है:

अपडेट करें: जैसा कि कोना ट्रिप रिपोर्ट में बताया गया है कि मैं ऊपर से जुड़ा था, वर्तमान में दो प्रतिस्पर्धात्मक प्रस्ताव हैं, एक Microsoft से और दूसरा क्लैंग से। Microsoft से प्रस्तावित समाधान मैक्रोज़ को निर्यात करने की अनुमति नहीं देता है, जबकि क्लैंग टीम से समाधान मैक्रोज़ के निर्यात का समर्थन करेगा। अब तक केवल 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

इसका महत्वपूर्ण ध्यान दें कि वर्तमान प्रीप्रोसेसर प्रणाली और मॉड्यूल दोनों सह-अस्तित्व में सक्षम होंगे और हेडर अभी भी उदाहरण के लिए मैक्रोज़ को शामिल करने के लिए उपयोग किया जा सकता है।

अधिक विस्तृत जानकारी के लिए मैं मसौदा पढ़ने का सुझाव देता हूं।

क्लेंग मॉड्यूल

क्लैंग एक मॉड्यूल कार्यान्वयन पर काम कर रहा है जो कि क्लैंग मॉड्यूल पेज पर पाया जा सकता है । हालांकि क्लैंग वर्तमान में मॉड्यूल के लिए एक ठोस सिंटैक्स को लागू नहीं करता है, अर्थात, क्लैंग द्वारा उपर्युक्त सिंटैक्स में से कोई भी लागू नहीं किया गया है। यह समझाने के लिए कि पृष्ठ में निम्नलिखित कथन है:

वर्तमान में, आयात घोषणाओं के लिए कोई C या C ++ सिंटैक्स नहीं है। Clang C ++ समिति में मॉड्यूल प्रस्ताव को ट्रैक करेगा। मॉड्यूल को आयात करने के तरीके के रूप में देखें कि आज आयात कैसे शामिल है।

वर्तमान में क्लैंग द्वारा लागू किया गया मुख्य भाग "मॉड्यूल मैप लैंग्वेज" है जो मौजूदा कोड के लिए मॉड्यूल मैप लिखने की अनुमति देता है जो अभी भी हेडर फ़ाइलों का उपयोग करता है।

मॉड्यूल से मैक्रो एक्सपोर्ट

जैसा कि ऊपर बताया गया है कि अभी भी यह स्पष्ट नहीं है कि मैक्रो निर्यात अंतिम मॉड्यूल टीएस का हिस्सा होगा या नहीं । में P0273R1 निम्न सिंटैक्स मैक्रो के निर्यात के लिए प्रस्तावित किया गया था:

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

2
2018 रैपरविल से अपडेट, गैब्रियल डॉस रीस और रिचर्ड स्मिथ से विलय प्रस्ताव है, p1103r0। botondballo.wordpress.com/2018/06/20/…
ड्वेन रॉबिन्सन

32

क्लैंग मानकीकरण पूरा होने से पहले ही मॉड्यूल पर काम करना शुरू करने वाला पहला कंपाइलर है। अभी तक बहुत सारे दस्तावेज नहीं हैं, लेकिन उदाहरण कोड यहां पाया जा सकता है:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

डगलस ग्रेगोर (उन्हें लागू करने वाले डेवलपर) की कुछ टिप्पणियां:
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

सिद्धांत रूप में, आप भविष्य में आने वाले सिंटैक्स में किसी भी संभावित परिवर्तन से खुद को ढालने के लिए start_module, end_module, import_module जैसे सहायक मैक्रो का एक गुच्छा परिभाषित कर सकते हैं।

संपादित 1:
डगलस ग्रेगर ने अपने कार्यान्वयन के बारे में एक प्रस्तुति जारी की है:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
क्लैंग में मॉड्यूल समर्थन को यहां प्रलेखित किया गया है:
http://clang.llvm.org/docs/Modin.net

EDIT 3:
मॉड्यूल अब Microsoft के C ++ कंपाइलर में भी समर्थित हैं: 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. "मॉड्यूल" कभी-कभी काफी प्लेटफ़ॉर्म पर निर्भर होते हैं, उदाहरण के लिए डीएलएल साझा वस्तुओं से काफी अलग। इसलिए इन अवधारणाओं के बीच विलय करना इतना तुच्छ नहीं है।

78
जरूर कोई जरूरत है। .h / .cpp एक हास्यास्पद बुरा और आउटमोड्ड वर्कअराउंड है। एक मॉड्यूल प्रणाली एक बड़ा बदलाव होगा, लेकिन यह एक है जो मानक समिति स्पष्ट रूप से महत्वपूर्ण मानती है।
jalf

13
हेडर बिल्ड मॉडल समस्या का समाधान करने के लिए होता है, न कि समाधान। इसके अलावा मॉड्यूल DLL / SOs के लिए एक प्रतिस्थापन नहीं हैं।
bames53

5
यह गलत है: 1. मॉड्यूल प्रस्ताव मौजूदा हेडर सिस्टम के साथ पश्चगामी संगतता सुनिश्चित करने के लिए अच्छी देखभाल करता है, इसलिए जब भविष्य में मॉड्यूल पेश किया जाएगा तो कुछ भी नहीं टूटेगा। 2. हेडर मॉड्यूल के एक O (M * N) जटिलता से O (M + N) के संकलन समय जटिलता को कम करने की आवश्यकता बहुत अच्छी तरह से प्रलेखित है। 3. मॉड्यूल मानक यह निर्धारित नहीं करेगा कि मॉड्यूल को कैसे संकलित और लिंक किया जा रहा है, लेकिन यह मॉड्यूल के निजी और सार्वजनिक एपीआई के बीच अलग करने के लिए एक स्पष्ट अर्थ जोड़ता है। 4. डीएलएल या साझा वस्तुओं का द्विआधारी प्रारूप मानक द्वारा अप्रभावित है।
लैनोक्स

3
"स्रोत की जुदाई के रूप में इसकी कोई वास्तविक आवश्यकता नहीं है एच / सीपीपी को अलग करने का काम करता है" तो श्रृंखला एक इंजेक्शन वाली उंगली को बंद करती है, लेकिन इसका मतलब यह नहीं है कि यह एक मुद्दा नहीं है! बस .NET या किसी अन्य नए लैंग को देखें, एक निश्चित तरीके से चीजों को ऑर्डर करने के लिए ताकि यह वास्तव में दिखाई दे सके या सही तरीके से बन सके एक बहुत बड़ा बोझ है जिसे दूर करने की आवश्यकता है।
पॉलम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.