2010-05-06 4 views
6

उसकी FAQ में, Bjarne Stroustrup का कहना है:भाषा निर्माण उपकरण के रूप में सी प्रीप्रोसेसर की लंबाई/सीमाएं क्या हैं? मैं इनके बारे में और कहां से जान सकता हूं?

[Cfront, पहले सी ++ संकलक] का निर्माण करने के लिए, मैं पहली बार सी इस्तेमाल किया एक "वर्ग के साथ सी" लिखने के लिए करने वाली सी पूर्वप्रक्रमक। "सी कक्षाओं के साथ" एक सी बोलीभाषा थी जो सी ++ के तत्काल पूर्वजों बन गया ... मैंने फिर "कक्षाओं के साथ सी" में सीफ़्रंट का पहला संस्करण लिखा।

जब मैं इस पढ़ें, यह सी पूर्वप्रक्रमक में मेरी रुचि भी खफा। मैंने अपनी अभिव्यक्तियों को सामान्य अभिव्यक्तियों को सरल बनाने के लिए उपयुक्त के रूप में देखा होगा, लेकिन इस स्तर पर सिंटैक्स और अर्थशास्त्र में महत्वपूर्ण रूप से जोड़ने की क्षमता के बारे में सोचा नहीं था, जिसे मैं कक्षाओं में सी लाने की कल्पना करता हूं।

  1. वहाँ सी के बंद एक भाषा bootstrapping के लिए इस दृष्टिकोण के अन्य उदाहरण हैं:

    तो अब मैं अपने मन में कुछ सवाल हैं?

  2. क्या स्ट्रॉस्ट्रुप का मूल कार्य कहीं भी उपलब्ध है?

  3. मैं इस तकनीक का उपयोग करने के विनिर्देशों के बारे में और कहां से जान सकता हूं?

  4. उस दृष्टिकोण की लंबाई/सीमाएं क्या हैं? क्या कोई कह सकता है, प्रीप्रोसेसर मैक्रोज़ का एक सेट बनाएं जो किसी को कुछ लिस्प/योजना जैसे कुछ लिखने दें?

+1

सी में वस्तु उन्मुख कोड लिखने के बारे में http://stackoverflow.com/questions/351733/ निम्नलिखित प्रश्न पर एक नज़र डालें कैन-यू-राइट-ऑब्जेक्ट-ओरिएंटेड-कोड-इन-सी .... क्योंकि कुछ सीओओ कार्यान्वयन प्रीप्रोसेसर आईआईआरसी का भारी उपयोग करते हैं। –

+1

कक्षाओं के साथ सी एक संकलक लक्ष्य कोड था, जो एक [सामान्य आदत] है (http://programmers.stackexchange.com/a/257873/40065)। सी प्रीप्रोसेसर का उल्लेख भ्रमित है। –

उत्तर

4

एक 'भाषा' आप सी पूर्वप्रक्रमक का उपयोग कर बना सकते हैं की कुरूपता की तरह का एक उदाहरण के लिए, इस हेडर फाइल पर एक नजर है स्टीव बोर्न द्वारा लिखित यूनिक्स खोल और इसका उद्देश्य सी को भाषा की तरह एक अल्गोल में बदलना है। यहाँ जब इसे प्रयोग की तरह क्या कोड का एक टुकड़ा लग रहा है की एक उदाहरण है:

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/args.c

विचित्र की तरह लग रहा है कि लेकिन यह अभी भी सी है यह एक अलग भाषा की तरह लग सकता है, लेकिन क्योंकि यह में कार्यान्वित किया जाता प्रीप्रोसेसर, इसके लिए कोई वाक्य रचनात्मक समर्थन नहीं है उदाहरण के लिए

WHILE foo 
DO 
    SWITCH 
    .... 
    ENDSW 
OD 

सब बहुत ठीक है और अच्छी तरह से संकलित, लेकिन ऐसा नहीं करता है

WHILE foo 
DO 
    SWITCH 
    .... 
    OD 
ENDSW 
+0

उन दोनों लिंक मृत दिखते हैं। –

+1

हां, आप सही हैं। मैं देखूंगा कि क्या मुझे कुछ अपडेट किए गए लिंक मिल सकते हैं – JeremyP

12

ध्यान दें कि Stroustrup नहीं कहना था कि उन्हें सी प्रीप्रोसेसर (सीपीपी) का इस्तेमाल किया क्लासेस -वह नहीं था के साथ सी तैयार करना है। उन्होंने सी और सीफ्रंट का उपयोग करके अपना खुद का प्रीप्रोसेसर लिखा था, एक सच्चा संकलक बिल्कुल प्रीप्रोसेसर नहीं था। सी प्रीप्रोसेसर वास्तव में भाषा विकास के लिए गहराई से अनुपयुक्त है, क्योंकि इसमें कोई पार्सिंग क्षमता नहीं है।

+2

कुछ पार्सिंग क्षमताओं। मैक्रो पैरामीटर सूचियों को थोड़ी सी प्रसंस्करण की आवश्यकता होती है जो पार्सिंग के स्तर तक बढ़ जाती है। 'खाद्य ((एक्स, वाई, जेड), ए, बी," मैं, खुद, और मैं "को संभालने के लिए) 'इसे कोष्ठक गहराई करना है। – nategoose

+0

@nategoose बेशक यह सी प्रीप्रोसेसर मैक्रोज़ को पार्स कर सकता है - यही वह है जो इसे करने के लिए डिज़ाइन किया गया था! लेकिन कक्षाओं के साथ सी जैसे चीजों को लिखने के लिए, इसे क्लास कोड के साथ सी को पार्स करने में सक्षम होना चाहिए, और यह ऐसा नहीं कर सकता है। –

+0

मुझे यकीन है कि सीपीपी ट्यूरिंग-पूर्ण है। ऐसा लगता है कि ऐसा आसान पार्सिंग संभव हो सकता है, अगर संभवतः आसान नहीं है। –

4

सी प्रीप्रोसेसर वह नहीं है जिसे आप ढूंढ रहे हैं। यह सीफ्रंट जैसे वाक्यविन्यास और अर्थशास्त्र को जोड़ नहीं सकता है।

सीफ्रंट एक वास्तविक कंपाइलर था जिसने कक्षाओं के साथ सी का अनुवाद किया, बाद में सी ++, सी से। यह केवल एक प्रीप्रोसेसर था जिसमें यह सी कंपाइलर से पहले भाग गया था। मैंने फोरट्रान 77 कोड से सी कोड का अनुवाद करने के लिए एक बार एफ 2 सी नामक एक प्रोग्राम का इस्तेमाल किया। यह एक ही सिद्धांत पर काम किया।

नई लिंक्स जैसी सामान्य मैक्रो शक्ति के साथ सामान्य लिस्पो जैसी भाषाएं हैं, जैसे नए वाक्यविन्यास और अर्थशास्त्र, और फर्थ जैसे भाषाएं जहां सिस्टम परिवर्तनों को समायोजित करने के लिए पर्याप्त लचीला है, लेकिन यह अधिकांश भाषाओं के लिए काम नहीं करेगा।

1

ऐसा लगता है कि "कक्षाओं के साथ सी" -to-c प्रीप्रोसेसर मानक सी प्रीप्रोसेसर जैसा ही है, क्योंकि वह विशेष रूप से इस प्रीप्रोसेसर को लिखने के बारे में बोलता है।

सी प्रीप्रोसेसर बहुत सीमित है। इसका उपयोग आम अभिव्यक्तियों के लिए शॉर्टेंड बनाने के लिए किया जा सकता है, लेकिन यह इसके बारे में है। जब आप इसके साथ नई भाषा संरचनाओं को परिभाषित करने का प्रयास करते हैं, तो यह तेजी से अधिक बोझिल और भंगुर हो जाता है।

2

मुझे लगता है कि उद्देश्य-सी उसी तरह से शुरू हुआ। यह एक प्रीप्रोसेसर था जिसने कुछ सी कोड बनाया जो तब सी संकलक को पास किया गया था। लेकिन यह #define FOO के अर्थ में सी प्रीप्रोसेसर नहीं था, यह मानक सी प्रीप्रोसेसर के पहले या बाद में एक अतिरिक्त कदम के रूप में चलाया गया था। प्रीप्रोसेसर चरणों की किसी भी संख्या का परिणाम सी संकलक को भेजा जा सकता है।

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h

यह मूल के स्रोत कोड से है:

3

दूसरों के द्वारा उल्लेख किया है, सी ++ सी प्रीप्रोसेसर (सीपीपी) का उपयोग नहीं कर बनाया गया था।

उसने कहा, आप पागल सीपीपी और रिकर्सन के साथ चीजें कर सकते हैं; मैं सुंदर यकीन है कि यह ट्यूरिंग पूर्ण है। बदसूरत चाल प्राप्त करने के लिए बदसूरत चाल का उपयोग करने के लिए मैं जिन पुस्तकालयों को जोड़ने के लिए लिंक कर रहा हूं। यद्यपि आप शीर्ष पर लालित्य का निर्माण कर सकते हैं, कई लोग इसे Turing Tarpit पर विचार कर सकते हैं।

gentler इस सामग्री के लिए परिचय, Cloak आज़माएं।

गहराई में जाने के लिए,

  • Boost को देखो - "पार मंच" है, लेकिन इसके लिए भद्दा; लोकप्रिय सी ++ पुस्तकालय
  • Chaos का हिस्सा - बूस्ट-पीपी पुरुष द्वारा अनुवर्ती है, लेकिन केवल C99 अनुरूप उपकरण, Ergo अधिक सुरुचिपूर्ण का समर्थन करता है
  • Order - से मैं क्या बता सकते हैं, एक लिस्प जैसी भाषा, अराजकता से प्रेरित , शुद्ध सीपीपी

ईजी पर बनाया गया ऑर्डर या कैओस के साथ, आप शुद्ध सीपीपी में एक रिकर्सिव फाइबोनैकी अनुक्रम जनरेटर लिख सकते हैं।

+0

कैओस सी 8 9-अनुरूप प्रीप्रोसेसरों का भी समर्थन करता है। –

0

मेरा सुझाव है कि आप GCC Macros documentation से शुरू करें जो सी प्रीप्रोसेसर के जीसीसी कार्यान्वयन के बारे में काफी रोचक जानकारी प्रदान करता है।

उनके उत्तर में क्ले ब्रिज सी प्रीप्रोसेसर का उपयोग करने के कुछ उदाहरण प्रदान करता है। ऑर्डर भाषा के बारे में एक उदाहरण कई उदाहरणों के साथ दिलचस्प है। ऑर्डर के लेखक ने एक मुद्दा उठाया है जिसमें वह भाग गया है, सी प्रीप्रोसेसर कार्यान्वयन अधिक हाल के मानकों को पूरी तरह कार्यान्वित नहीं कर सकता है।

सामान्य रूप से सी प्रीप्रोसेसर का उपयोग करने के लिए स्टीव बोर्न ने यूनिक्स के लिए बोर्न शैल लिखते समय क्या किया था, यह एक गतिविधि है जिसे मैं कई जल बोर्डिंग सत्रों के बाद प्रस्तुति के लिए उचित आधार पर विचार करता हूं।

सी प्रीप्रोसेसर के बारे में याद रखने की मुख्य बात यह है कि यह टेक्स्ट टोकन में हेरफेर कर रहा है। तो सी प्रीप्रोसेसर सिंटैक्स के साथ थोड़ा सा टिंचरिंग की अनुमति देगा। उदाहरण के लिए, निम्न मैक्रो, जो बिना किसी त्रुटि के विजुअल स्टूडियो 2005 के साथ संकलित करता है, अनजान टेक्स्ट मैनिपुलेशन संभव दिखाता है।

#define TESTOP(a,x,y,op,z) a (x) op (y); z 

void f(void) 
{ 
    int i = 0, j = 5; 

    TESTOP(,i,j,+=,); 
    TESTOP(,i,(j + 2),+=,); 
    TESTOP({,i,(j + 2),+=,}); 
} 

हालांकि आप समझते हैं और सी प्रीप्रोसेसर की सीमाओं में से कुछ को हल करने के लिए जब सीमाओं धक्का करने की आवश्यकता है। विचार करने के लिए कुछ मुद्दों के लिए GCC topic Macro Pitfalls देखें।

और आप सी प्रीप्रोसेसर को एक सामान्य मैक्रो और टेक्स्ट प्रीप्रोसेसर के रूप में उपयोग कर सकते हैं जो सी कंपाइलर के अलावा कुछ टूल को लक्षित करता है। उदाहरण के लिए पुराने imake utility for build automation ने एक व्यापक मैक्रो सुविधा प्रदान करने के लिए सी प्रीप्रोसेसर का उपयोग किया।

जहां मैंने देखा है कि सी प्रीप्रोसेसर सबसे प्रभावी ढंग से जटिल कोड और घोषणाओं को सरल बनाने में उपयोग किया गया था।

एक मामला जो मैंने देखा है वह एक राज्य मशीन भाषा प्रदान करने के लिए सी प्रीप्रोसेसर का उपयोग कर रहा था जिसका उपयोग राज्य संरचना का वर्णन करने के लिए डेटा संरचनाओं और डेटा को बनाने के लिए किया गया था। परिणामस्वरूप डेटा संरचनाओं को तब राज्य मशीन फ़ंक्शन के लिए तर्क के रूप में उपयोग किया जाता था। इसने एक प्री फ़ंक्शन द्वारा किए गए राज्य मशीन प्रसंस्करण के साथ सी प्रीप्रोसेसर परिभाषित भाषा में कई अलग-अलग राज्य मशीन प्रक्रियाओं को लिखा है।

माइक्रोसॉफ्ट, माइक्रोसॉफ्ट फाउंडेशन क्लासेस (एमएफसी) में, सी प्रीप्रोसेसर का इस्तेमाल एमएफसी के कुछ संदेश विवरण छिपाने के लिए किया था। एक बार जब आप इसे इस्तेमाल करते हैं तो कुछ ऐसा पढ़ना उचित रूप से आसान है। चूंकि विजुअल स्टूडियो आईडीई में मैक्रोज़ का उपयोग करके कोड उत्पन्न करने और संशोधित करने के लिए टूल थे, यह प्रोग्रामर के लिए बहुत सीधे आगे था।

BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument) 
    //{{AFX_MSG_MAP(CFrameworkWndDoc) 
    ON_WM_CHAR() 
    ON_WM_TIMER() 
    ON_MESSAGE(WU_EVS_DFLT_LOAD, OnDefaultWinLoad) 
    ON_MESSAGE(WU_EVS_POPUP_WINDOW, OnPopupWindowByName) 
    ON_MESSAGE(WU_EVS_POPDOWN_WINDOW, OnPopdownWindowByName) 
    ON_MESSAGE(WM_APP_CONNENGINE_MSG_RCVD, OnConnEngineMsgRcvd) 
    ON_MESSAGE(WM_APP_XMLMSG_MSG_RCVD, OnXmlMsgRcvd) 
    ON_MESSAGE(WM_APP_BIOMETRIC_MSG_RCVD, OnBiometricMsgRcvd) 
    ON_MESSAGE(WM_APP_SHUTDOWN_MSG, OnShutdownMsgRcvd) 
    ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd) 
    ON_MESSAGE(WM_APP_SHOW_HIDE_GROUP, OnShowHideGroupMsgRcvd) 
    //}}AFX_MSG_MAP 
END_MESSAGE_MAP() 

विशेष रूप से आप जब देखो क्या मैक्रो की तरह इस्तेमाल किया देखो:

#define BEGIN_MESSAGE_MAP(theClass, baseClass) \ 
     PTM_WARNING_DISABLE \ 
     const AFX_MSGMAP* theClass::GetMessageMap() const \ 
      { return GetThisMessageMap(); } \ 
     const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \ 
     { \ 
      typedef theClass ThisClass;      \ 
      typedef baseClass TheBaseClass;     \ 
      static const AFX_MSGMAP_ENTRY _messageEntries[] = \ 
      { 

    #define END_MESSAGE_MAP() \ 
      {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \ 
     }; \ 
      static const AFX_MSGMAP messageMap = \ 
      { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; \ 
      return &messageMap; \ 
     }         \ 
     PTM_WARNING_RESTORE 

// for Windows messages 
#define ON_MESSAGE(message, memberFxn) \ 
    { message, 0, 0, 0, AfxSig_lwl, \ 
     (AFX_PMSG)(AFX_PMSGW) \ 
     (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \ 
     (memberFxn)) }, 

#define ON_WM_TIMER() \ 
    { WM_TIMER, 0, 0, 0, AfxSig_vw, \ 
     (AFX_PMSG)(AFX_PMSGW) \ 
     (static_cast< void (AFX_MSG_CALL CWnd::*)(UINT_PTR) > (&ThisClass :: OnTimer)) }, 
संबंधित मुद्दे

 संबंधित मुद्दे