SICP'yi okuyun ve Şema ve soyut veri türleri hakkında pratik fikir edinin . O zaman C'ye kodlama kolaydır (SICP, biraz C ve biraz PHP, Ruby, vb.) Çünkü düşünceleriniz yeterince genişleyecektir ve nesne yönelimli programlamanın en iyi stil olmayabileceğini anlarsınız. tüm davalar, ancak sadece bazı programlar için). Muhtemelen en zor kısım olan C dinamik bellek ayırma konusunda dikkatli olun . C99 veya C11 programlama dili standart ve C standart kütüphanesi (o! TCP veya dizinleri bilmediği) ve aslında oldukça zayıf sık sık bazı dış kütüphaneleri gerekecektir veya arabirimleri (örnPOSIX , libcurl HTTP istemci kütüphanesi için, libonion HTTP sunucusu kütüphane için, GMPlib bignums için, gibi bazı kütüphane libunistring ) ... vb UTF-8 için.
"Nesnelerin" çoğu kez C ile ilişkilidir struct
ve üzerinde çalışan fonksiyonlar kümesini tanımlarsınız. Kısa ya da çok basit işlevler için, bunları başka yerde -d'de kullanılacak bazı başlık dosyalarında olduğu struct
gibi , ilgili olarak tanımlamayı düşünün .static inline
foo.h
#include
Nesne yönelimli programlamanın tek programlama paradigması olmadığına dikkat edin . Bazı durumlarda ise, diğer paradigmalar değerli (olan fonksiyonel programlama la ocaml veya Haskell hatta Programı veya commmon Lisp, à mantık programlama vs vs la Prolog à ... ayrıca Oku J.Pitrat blog bildirim yapay zeka konusunda). Scott'ın kitabına bakınız: Programlama Dili Pragmatik
Aslında, C veya Ocaml'daki bir programcı genellikle nesne yönelimli programlama tarzında kodlama yapmak istemez. İşe yaramazsa nesneleri düşünmeye zorlamak için hiçbir neden yoktur.
Bazılarını struct
ve üzerinde çalışan fonksiyonları tanımlayacaksınız (genellikle işaretçilerden). Bazı etiketli sendikalara gereksinim duyabilirsiniz (genellikle, bir struct
etiket üyeli, çoğu bazıları enum
ve bazıları union
içeride) ve bazılarınızın sonunda esnek bir dizi üyesine sahip olmakta yararlı olabilirsiniz struct
.
Bazı mevcut kaynak koduna içine bak özgür yazılım içinde C (bkz github & sourceforge
bazı bulmak için). Muhtemelen, bir Linux dağıtımını kurmak ve kullanmak faydalı olacaktır: hemen hemen sadece özgür yazılımdan yapılmış, harika özgür yazılım C derleyicileri ( GCC , Clang / LLVM ) ve geliştirme araçlarına sahip. Ayrıca Linux için geliştirmek istiyorsanız İleri Linux Programcılığına bakınız .
Örneğin tüm uyarı ve hata ayıklama bilgi ile derlemeye unutmayın gcc -Wall -Wextra -g
-notably geliştirme ve hata ayıklama bölecek sırasında ve bazı araçlar, örneğin kullanmayı öğrenmek valgrind avı için hafıza sızıntıları , gdb
özen vb ayıklayıcıya, bir de ne olduğunu anlamak tanımsız Davranış ve şiddetle kaçının (bir programın bazı UB'lere sahip olabileceğini ve bazen "çalışıyor" göründüğünü unutmayın).
Nesneye yönelik yapılara (özellikle kalıtımsal ) gerçekten ihtiyaç duyduğunuzda , ilgili yapılar ve işlevler için işaretçileri kullanabilirsiniz. Kendi kararsız makinenize sahip olabilirsiniz , her bir "nesne" ye sahip bir işaretçi ile başlayan bir işaretçilere sahip olabilirsiniz struct
. Bir işaretçi tipini başka bir işaretçi tipine çevirme kabiliyetinden (ve kalıtım taklit etmeye struct super_st
başlayanlarla aynı alan tiplerini içeren bir içerikten kullanabilme gerçeğinden struct sub_st
) faydalanırsınız. GObject'in (GTK / Gnome'dan) gösterdiği gibi, özellikle bazı kuralları izleyerek oldukça karmaşık nesne sistemlerini uygulamak için C'nin yeterli olduğuna dikkat edin .
Eğer gerçekten gerektiğinde kapanışları , sen edeceğiz genellikle onları taklit geri aramaları ile, kongre (o çağıran işlev işaretçisi tarafından tüketilen) bir geri arama kullanarak her işlevi bir işlev işaretçisi ve bazı müşteri verilerini hem geçirilir söyledi. Ayrıca (geleneksel olarak) kendi kapanış-benzeri- struct
lerinize (bazı fonksiyon göstergeleri ve kapalı değerler içeren) sahip olabilirsiniz.
C çok düşük seviyeli bir dil olduğundan, kendi sözleşmelerinizi (diğer C programlarındaki uygulamalardan ilham alarak), özellikle bellek yönetimi ve muhtemelen bazı adlandırma kurallarıyla ilgili tanımlamak ve belgelemek önemlidir . Komut kümesi mimarisi hakkında biraz fikir sahibi olmak faydalıdır . Bir C derleyicisinin kodunuzda birçok optimizasyon yapabileceğini unutmayın (isterseniz), bu nedenle el ile mikro optimizasyonlar yapmaya çok fazla önem vermeyin, bunu derleyicinize bırakın ( gcc -Wall -O2
sürümün optimize edilmiş bir şekilde derlenmesi için) yazılım). Kıyaslama ve ham performansla ilgileniyorsanız, optimizasyonları etkinleştirmelisiniz (programınız hata ayıklandıktan sonra).
Unutmayın ki bazen metaprogramming faydalı olabilir . Oldukça sık, C ile yazılmış büyük yazılım, başka yerlerde kullanılan bazı C kodlarını oluşturmak için bazı komut dosyaları veya geçici programlar içerir (ayrıca bazı kirli C ön işlem püf noktalarını da oynayabilirsiniz , örneğin X makroları ). Bazı yararlı C program jeneratörleri bulunmaktadır (örneğin , ayrıştırıcı üretmek için yacc veya gnu bizonu , mükemmel hash fonksiyonları üretmek için gperf , vb ...). Bazı sistemlerde (özellikle Linux ve POSIX) generated-001.c
dosya zamanında çalışma sırasında bazı C kodları bile oluşturabilir, çalışma zamanında bir komut (gibi gcc -O -Wall -shared -fPIC generated-001.c -o generated-001.so
) çalıştırarak onu paylaşılan bir nesneye derleyebilir , dlopen kullanarak bu paylaşılan nesneyi dinamik olarak yükleyebilirsiniz.& dlsym kullanarak bir ismin fonksiyon göstergesini alın . MELT'de ( GCC derleyicisinin özelleştirilmesini sağladığından sizin için yararlı olabilecek Lisp benzeri bir alana özgü dil) bu tür numaralar yapıyorum .
Çöp toplama konseptleri ve tekniklerinin farkında olun ( referans sayma , genellikle C'deki belleği yönetmek için kullanılan bir tekniktir ve IMHO, dairesel referanslarla iyi ilgilenmeyen zayıf bir çöp toplama biçimidir ; bu konuda yardımcı olabilecek zayıf işaretçilere sahip olabilirsiniz. ama zor olabilir). Bazı durumlarda, Boehm'in muhafazakar çöp toplayıcısını kullanmayı düşünebilirsiniz .
qux = foo.bar(baz)
olurqux = Foo_bar(foo, baz)
.