SICP पढ़ें और स्कीम जानें, और अमूर्त डेटा प्रकारों का व्यावहारिक विचार । तब C में कोडिंग आसान है (चूंकि SICP, C का थोड़ा सा हिस्सा, और PHP, Ruby, आदि का एक सा ... आपकी सोच काफी चौड़ी हो जाएगी, और आप समझ जाएंगे कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग सबसे अच्छी शैली नहीं हो सकती है सभी मामले, लेकिन केवल कुछ प्रकार के कार्यक्रमों के लिए)। सी गतिशील मेमोरी आवंटन के बारे में सावधान रहें , जो शायद सबसे कठिन हिस्सा है। C99 या C11 प्रोग्रामिंग भाषा मानक और उसके सी मानक पुस्तकालय वास्तव में काफी गरीब है (यह टीसीपी या निर्देशिका के बारे में पता नहीं है!), और आप अक्सर कुछ बाहरी पुस्तकालयों की आवश्यकता होगी या इंटरफेस (जैसेPOSIX , libcurl HTTP क्लाइंट लाइब्रेरी के लिए, libonion HTTP सर्वर पुस्तकालय के लिए, GMPlib bignums के लिए, जैसे कुछ पुस्तकालय libunistring , आदि UTF-8 के लिए ...)।
आपकी "वस्तुएं" अक्सर सी से संबंधित कुछ में होती हैं struct
, और आप उन पर काम करने वाले कार्यों के सेट को परिभाषित करते हैं। छोटे या बहुत ही सरल कार्यों के लिए, उन्हें प्रासंगिक के साथ परिभाषित करने पर विचार करें struct
, जैसा static inline
कि कुछ हेडर फ़ाइल में कहीं और foo.h
होना चाहिए #include
।
ध्यान दें कि ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग केवल प्रोग्रामिंग प्रतिमान नहीं है । कुछ अवसरों में, अन्य प्रतिमान सार्थक होते हैं ( कार्यात्मक प्रोग्रामिंग आ ला ओकेमेल या हास्केल या यहां तक कि योजना या कॉमोन लिस्प, तर्क प्रोग्रामिंग आ ला प्रोलॉग , आदि ... आदि भी पढ़ें । घोषणा पत्र कृत्रिम बुद्धिमत्ता के बारे में जे.पत्रा का ब्लॉग )। स्कॉट की पुस्तक देखें: प्रोग्रामिंग भाषा व्यावहारिक
दरअसल, सी में एक प्रोग्रामर, या ओकेमेल में, आमतौर पर ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग स्टाइल में कोड नहीं करना चाहता है। अपने आप को वस्तुओं के बारे में सोचने के लिए मजबूर करने का कोई कारण नहीं है जब यह उपयोगी नहीं है।
आप कुछ struct
और उन पर काम करने वाले कार्यों को परिभाषित करेंगे (अक्सर संकेत के माध्यम से)। आपको कुछ टैग किए गए यूनियनों की आवश्यकता हो सकती है (अक्सर, struct
टैग सदस्य के साथ, अक्सर कुछ enum
, और कुछ union
अंदर), और आपको अपने कुछ के अंत में एक लचीली सरणी सदस्य रखने के लिए उपयोगी हो सकता है struct
।
C में कुछ मौजूदा मुफ्त सॉफ़्टवेयर के स्रोत कोड के अंदर देखें (
कुछ खोजने के लिए github और sourceforge देखें )। संभवतः, लिनक्स वितरण को स्थापित करना और उपयोग करना उपयोगी होगा: यह लगभग मुफ्त सॉफ्टवेयर से बना है, इसमें महान मुफ्त सॉफ्टवेयर सी कंपाइलर ( जीसीसी , क्लैंग / एलएलवीएम ) और विकास उपकरण हैं। यदि आप लिनक्स के लिए विकास करना चाहते हैं तो उन्नत लिनक्स प्रोग्रामिंग भी देखें ।
मत भूलना सभी चेतावनियों और डिबग जानकारी, जैसे के साथ संकलित करने के लिए gcc -Wall -Wextra -g
-notably विकास और डिबगिंग phases- दौरान और कुछ उपकरण, जैसे उपयोग करना सीखना valgrind शिकार करने के लिए मेमोरी लीक , gdb
डिबगर, आदि के लिए ध्यान रखना समझ में अच्छी तरह से क्या है अपरिभाषित व्यवहार और दृढ़ता से इसे से बचें (याद रखें कि एक कार्यक्रम कुछ यूबी हो सकता है और कभी-कभी "काम" लगता है)।
जब आपको वास्तव में ऑब्जेक्ट ओरिएंटेड कंस्ट्रक्शन (विशेष रूप से विरासत में ) की आवश्यकता होती है, तो आप संबंधित संरचनाओं और कार्यों के लिए पॉइंटर्स का उपयोग कर सकते हैं। आपके पास अपनी स्वयं की व्यवहार्य मशीनरी हो सकती है , प्रत्येक "ऑब्जेक्ट" में एक पॉइंटर के साथ एक struct
फ़ंक्शन फ़ंक्शन के साथ शुरू हो सकता है । आप एक पॉइंटर प्रकार को दूसरे पॉइंटर प्रकार (और इस तथ्य के साथ कि आप एक struct super_st
ही फ़ील्ड प्रकारों से शामिल कर सकते हैं, जैसे कि struct sub_st
विरासत का अनुकरण शुरू कर सकते हैं) की क्षमता का लाभ उठाते हैं । ध्यान दें कि सी काफी परिष्कृत वस्तु प्रणालियों को लागू करने के लिए पर्याप्त है-विशेष रूप से कुछ सम्मेलनों का पालन करके - जैसे कि GObject (GTK / Gnome से) प्रदर्शित करता है।
जब आपको वास्तव में क्लोजर की आवश्यकता होती है , तो आप अक्सर उन्हें कॉलबैक के साथ अनुकरण करेंगे , इस सम्मेलन के साथ कि कॉलबैक का उपयोग करने वाले प्रत्येक फ़ंक्शन को फ़ंक्शन पॉइंटर और कुछ क्लाइंट डेटा (फ़ंक्शन पॉइंटर द्वारा उपभोग किए जाने पर दोनों) पास किया जाता है। आपके पास (पारंपरिक रूप से) आपके स्वयं के क्लोजर जैसे भी हो सकते हैं ( struct
कुछ फ़ंक्शन पॉइंटर और बंद मान वाले)।
चूंकि सी एक बहुत ही निम्न स्तर की भाषा है, इसलिए विशेष रूप से स्मृति प्रबंधन के बारे में और विशेष रूप से कुछ नामकरण सम्मेलनों के बारे में अपने स्वयं के सम्मेलनों (अन्य सी कार्यक्रमों में अभ्यास से प्रेरित) को परिभाषित और दस्तावेज करना महत्वपूर्ण है । निर्देश सेट वास्तुकला के बारे में कुछ विचार करना उपयोगी है । यह मत भूलो कि एक सी कंपाइलर आपके कोड पर बहुत सारे अनुकूलन कर सकता है (यदि आप इसे पूछते हैं), तो हाथ से माइक्रो-ऑप्टिमाइज़ेशन करने के बारे में बहुत अधिक परवाह न करें, इसे अपने कंपाइलर पर छोड़ दें ( gcc -Wall -O2
जारी किए गए अनुकूलित संकलन के लिए) सॉफ्टवेयर)। यदि आप बेंचमार्किंग और कच्चे प्रदर्शन के बारे में परवाह करते हैं, तो आपको अनुकूलन को सक्षम करना चाहिए (एक बार आपके कार्यक्रम को डिबग किया गया है)।
मत भूलो कि कभी-कभी मेटाप्रोग्रामिंग उपयोगी है । काफी बार, C में लिखे गए बड़े सॉफ़्टवेयर में कुछ C कोड उत्पन्न करने के लिए कुछ स्क्रिप्ट या तदर्थ कार्यक्रम होते हैं (और आप कुछ गंदे C प्रीप्रोसेसर चालें भी खेल सकते हैं , जैसे X-macros )। कुछ उपयोगी C प्रोग्राम जनरेटर (जैसे yacc या gnu bison मौजूद है, जो parsers, gperf को सही हैश फंक्शन उत्पन्न करने के लिए उत्पन्न करता है ...)। कुछ सिस्टम (विशेष रूप से लिनक्स और पॉसिक्स) पर, आप generated-001.c
फ़ाइल में रनटाइम पर कुछ सी कोड भी उत्पन्न कर सकते हैं , इसे gcc -O -Wall -shared -fPIC generated-001.c -o generated-001.so
रनटाइम पर कुछ कमांड (जैसे ) चलाकर एक साझा ऑब्जेक्ट पर संकलित करें , गतिशील रूप से लोड करें जो dlopen का उपयोग करके साझा ऑब्जेक्ट को लोड करता है& dlsym का उपयोग करके नाम से फ़ंक्शन पॉइंटर प्राप्त करें । मैं MELT (एक लिस्प-जैसे डोमेन विशिष्ट भाषा में आपके लिए उपयोगी हो सकता हूं, क्योंकि यह GCC कंपाइलर के अनुकूलन को सक्षम करता है) में ऐसे ट्रिक्स कर रहा हूं ।
कचरा संग्रहण अवधारणाओं और तकनीकों से अवगत रहें ( संदर्भ गिनती अक्सर C में मेमोरी को प्रबंधित करने की एक तकनीक है, और यह IMHO कचरा संग्रह का एक खराब रूप है जो परिपत्र संदर्भों के साथ अच्छी तरह से व्यवहार नहीं करता है ; आपके पास इसके बारे में मदद करने के लिए कमजोर संकेत हो सकता है; लेकिन यह मुश्किल हो सकता है)। कुछ अवसरों पर, आप बोहम के रूढ़िवादी कचरा कलेक्टर का उपयोग करने पर विचार कर सकते हैं ।
qux = foo.bar(baz)
बन जाते हैंqux = Foo_bar(foo, baz)
।