C programlama dili hala kullanılıyor mu?


96

Ben bir C # programcısıyım ve gelişimimin çoğu birkaç Windows uygulamasıyla birlikte web siteleri için. C kadarıyla, uzun zamandır kullanmadım, gerek olmadığından. Arkadaşlarımdan biri işlerini test etmek için C öğrenmesi gerektiğini, C # öğrenmesine yardımcı olduğunu söylediğinde bana sürpriz oldu.

Birinin ancak C'de yapılan bir geliştirme olması durumunda test için C öğreneceğini düşündüm. Bildiğim kadarıyla, COM ve donanım tasarımı ile ilgili tüm gelişmeler C ++ 'da da yapıldı. Bu nedenle, C ++ kullanmanız gerektiğinde C öğrenmenin bir anlamı yoktur. Ayrıca tarihi öneme de inanmıyorum, peki neden C öğrenirken zaman ve para harcıyorsunuz?

C hala herhangi bir yeni yazılım geliştirmede veya başka bir şeyde kullanılıyor mu?


46
Hiç PIC'ler için bir C ++ derleyicisi gördünüz mü?
SK-mantık

195
Birinin öğrenmeyi zaman ve para harcıyor ile eşitleyeceği için üzülen tek kişi ben miyim?
Jetti,

37
" Bildiğim kadarıyla, COM ve donanım tasarımı ile ilgili tüm gelişmeler C ++ ' da da yapıldı " - Bana göre aslında herhangi bir donanım arayüzü tasarımı yapmıyorsunuz.
Ed S.

32
İnsanlar hepimizin sevdiği lüks üst düzey dillerin sık sık C de uygulandığını unutuyor
David Cowden

13
@ThomasEding Ölü dil? C'yi ölü bir dil olarak görürseniz, kesinlikle programlama dilleri konusunda çok sınırlı bir bilgiye sahipsiniz.
JesperE

Yanıtlar:


214

C görece olduğu avantaja sahiptir küçük dil yapar, kolay bir C derleyicisi uygulamak için (C ++ derleyicisi yazmak için bir canavar ise) ve yapar daha kolay dil öğrenmek . Ayrıca TIOBE indeksine bakın, C'nin C ++ 'dan biraz ileride olduğuna göre.

(IMO) azalan gerekçelendirme sırasındaki C, halen

  • Gömülü sayfalar
    C derleyicisini küçük bir platforma taşımak C ++ derleyicisini yerleştirmekten daha kolaydır. Ayrıca, C savunucuları C ++ 'ın "sırtlarının çok gerisinde kaldığını" iddia ediyorlar. Ancak, IMO bu FUD.

  • Sistem programlama
    Yine, bu genellikle "derleyicinin ne yaptığını bilmenin" kolay olduğunu iddia eder. Bununla birlikte, birçok gömülü program örneğin şablonlardan ve diğer C ++ temel özelliklerinden yararlanabilir.

  • Açık kaynaklı yazılım
    Bu, çoğunlukla bir tutum problemidir: OSS, C ++ 'ı her zaman C ++' dan daha çok tercih etmiştir (oysa sektörün büyük bölümlerinde bunun tam tersidir). Torvalds'ın mantıksız nefreti, bunun Linux'taki en önemli nedeni olabilir .


16
Tutumdan daha fazla tarih. "Çekirdek" açık kaynaklı paketler olarak düşünebileceğinizlerin çoğu, C ++ şu anda olduğu kadar yaygın bir şekilde bulunmadığı ve kaynaklar hala kıt olduğu zaman geliştirildi.
Blrfl

65
TIOBE endeksi bir şakadır. Arama motoru isabetleri anlamsız.
DeadMG

29
@Sedate: Bu şablonlar genellikle kod şişmesine neden olur, eski C ++ derleyicilerinden gelen bir efsanedir. Modern derleyiciler aynı şablon örneklerini katlayacaktır. OTOH, şablonlar, çalışma zamanı yerine derleme zamanında kod yürüten ve daha az kod üretilmesine neden olan şablon meta programlamasına izin verir . Ayrıca, daha güvenli programlar için (daha az döküm), gömülü alanda genellikle çok önemli olan bir şey yaparlar. EC ++, C ++ uzmanları tarafından (diğer şeylerin yanı sıra) şablonların atılmasının aptallığı yüzünden ölümüne dayandı.
sbi

18
@James: Etkili soyutlamalar, genel programlama ve tür güvenliği gibi şeyleri mi kastediyorsunuz? Evet, bunu kim isterdi.
Xeo,

11
@JesperE Olduğu gibi, bunu yazdığımdan beri işleri değiştirdim ve şimdi gömülü aygıtlar için programlama yapıyorum. C ++ kullanıyoruz ve STL ve şablon meta-programlamasının zayıf donanım ve zor gerçek zamanlı kısıtlamaların yanı sıra güvenilirlik gereksinimleriniz olduğunda ne yapabileceği dikkat çekiyor. (Enerji santralleri yapıyoruz.) Evet, belirli bir kod parçası için a std::vectorveya a kullanmanız gerekip gerekmediğini bilmek zorundasınız std::map- ancak kendiniz uygulamak zorunda değilsiniz, ancak iyi test edilmiş, yüksek performanslı ve yüksek soyutlamalar sunan güvenilir kütüphane uygulamaları.
sbi

119

Kaynakların az olduğu gömülü donanım programlamasında çok kullanılır.

Linux çekirdeği C ile yazılmıştır, çünkü Linus Torvalds'a göre, C ++ korkunç bir dildir .


14
Windows çekirdeğinin büyük bir kısmının da C olduğunu düşünüyorum. Ve birçok eski sistem.
Kodlayıcı

14
Tamamlanması için Linus, çekirdekte C ++ 'ı denedi. Bu bir artıdan çok bir sorundu. Her neyse, çekirdek gelişimi gerçekten spesifik bir konudur, bu C ++ 'ın genel olarak kötü olduğu anlamına gelmez.
deadalnix

75
Diğerlerine göre , Linus'un tartışması korkunç.
sbi

36
Linus'un argümanları geçerli olabilir veya olmayabilir, ancak Linux çekirdeği hala düz C ile yazılmıştır :-)
Joonas Pulakka

15
Linus bir gitmiş.
ubiyubix

94

Gördüğüm tüm modern diller C ile etkileşime girebilir:

  • C ++
  • Java
  • C #
  • piton
  • Haskell
  • Amaç C

C ile etkileşime girme ihtiyacı şunlardan kaynaklanmaktadır:

  • C basit bir ABI'ye sahip
  • C uzun süredir yanında olmak

Bu, bu diller C ile iletişim kurabildiği için şunları yapabilir:

  • kütüphanelerinden yararlan
  • birbirleriyle C aracılığıyla iletişim kurar (örneğin, Clang, C ++ dilinde yazılmıştır ancak C arayüzüne bağlı Python Bağlamaları sunmaktadır).

Ve hepsinin çalışma süreleri için C'ye güveneceğine bahse girerim (tam meclis olmadıkça? Şüpheli).

C, programlama dillerinin Lingua Franca'sıdır ve belirli bir mimariye bağlı olmayan (montaj gibi) en basitlerinden (ABI-bilge) biri, ondan kurtulmak için büyük bir değişiklik yapacaktır.


45

Bence bu, "Arkadaşlarım ve ben Reggae'yi dinliyorum. Gerçekten hala Rap dinleyen var mı?"

Dışarıdaki her dilin kullanımı var. Farklı dillerin kesinlikle kendi nişleri vardır. Ama C hakkında soruyorum! Günlük olarak C # 'dan daha az insanın kullanıldığına eminim (kimsenin C # kullanmadığı bir dükkanda çalışmak tamamen önyargılıdır).

Hızlı google, dillerin göreceli popülerliğine bakıyor.
Bunların hiçbirinin yetkili olmadığından eminim ancak trendleri görmek için kullanabiliriz:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

Etiketlerdeki SO oranına bile bakıldığında:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 diğer etiketler
  • C: 38790

Öyleyse C, SO'daki en popüler 18 konudur (ve burada birçok başka dil vardır).

Not: Yukarıdaki TIOBE endeksinin on yıldan uzun bir süredir sürekli olarak güncellendi (ve 3 yıl öncesine dayanan bazı verileri var), her dilde çalışan mühendisleri ölçmek gerekiyor (bunun ne kadar doğru olduğu hakkında hiçbir fikrim yok). Java / Visual Basic dışındaki ilk 10 dilden, dükkanımdaki kişilerin bildiklerini yansıtıyor (oranlarımız çok daha küçük bir örneklem boyutuna sahip olduğumuzdan biraz farklı olsa da).


1
Bu cevap beni şaşırtıyor ... sen C # ile devam ediyorsun ve sonra SO soru etiketlerini göster, ama bunların hiçbirinin C kullanımıyla hiçbir ilgisi yok. Popülerlik (özellikle langopop'ta, popülerliği belirlemek için arama motoru sorgularını kullandıkları yerlerde) bir dilin modern gün kullanımını gerçekten göstermez, bir dilin modern gün aramalarını gösterir. Araştırmalar için, C'nin daha düşük seviyeli sınıflar için Üniversitelerde sıkça kullanıldığını, böylece sorgu sayısını ve SO gönderilerini artırabileceğini göz önünde bulundurmalısınız.
Jetti,

3
@Jetti: Bu yüzden açıkça şunu söylüyorum: I am sure none of this is authoritative but we can use it to see trendsFakat ikinci ifadenize katılmıyorum; C artık yüksek öğrenim kurumlarında öğretilen ana dil değil (eğer o zaman yeni mezunlar grubu olsaydı işe yaramaz olmazdı). İnsanlar bugünlerde net Java / C # öğreniyorlar. Ayrıca Tiobe raporu, sorgularla değil işler hakkındadır.
Martin York

Geriye dönüp baktığımda, bence kötü bir kelime seçimi var. Düşük sayı sınıflarını (başlangıç ​​sınıfları) kastetmiyorum, sistem sınıflarını (bilgisayar mimarisi) C'nin kullanıldığı yerde kastettim.
Jetti,

4
SO etiketi sayısı, genel olarak dil popülerliğini tanımlamaz, yalnızca SO kullanıcıları arasında dil popülerliğini gösterir .
Ed S.

4
@ Ed S. Açıkçası. Ancak soru popülerlikle ilgili değil. C'nin bir dil olarak varlığı ile ilgili. SO etiketi sayısı bize bunun kesinlikle ölü bir dil olmadığını gösteriyor. C'nin diğer sitelerde ilk 2'de yer alması onu ilk / ikinci en çok kullanılan dil yapmaz. Ancak ilk 10'daki varlığı, ölmediğinin önemli bir göstergesidir. Elbette bunların hiçbiri, C'nin hala aktif olarak kullanılmakta olduğunu gösteren güçlü göstergeler değildir.
Martin York

23

Kaynakları düşük olduğunuzda ve nesne yönelimli yeteneklere ihtiyacınız olmadığında C kullanmanız gerekebilir.

Günümüzde kullanımda olan birçok yazılım, donanım sürücülerinden bahsetmek yerine, hala C dilinde yazılmıştır.

Tiobe indeksine göre , C hala en çok kullanılan dil.


Tcrosley'nin önerdiği gibi, bu soruya bir göz atmak isteyebilirsiniz .


Ayrıca gibi C ve C ++ arasındaki farklar hakkında bazı ilgili makalelerin kontrol etmelidir Bu wiki veya bu örneğin.


4
ahem !! Bu harika bir nokta. "OOP yeteneklerinin aslında dil için ek yük getirdiğini" hiç düşünmedim. Bu geçerli noktayı açıkça belirttiğiniz için teşekkür ederiz. Şimdi, C'nin diğerlerinin önünde nerede olduğunu anlayabiliyorum
Pankaj Upadhyay

7
@Pankaj C ++ genellikle ek yüke fazla çalışma zamanı eklemez, dilin karmaşıklığının büyük bir kısmı “kullanmadığınız şey için ödeme yapmama” ilkesidir - istisnalar kullanmazsanız istisnalar kullanmazsınız Yavaşlayın veya kodunuza boyut ekleyin. Derleyici daha büyük ve daha karmaşık olsa da
Martin Beckett 15

2
gömülü alanda yeniden C, ayrıca bu soruya ve cevaplara bakın: programmers.stackexchange.com/questions/84514/…
tcrosley

6
Asla OOP yeteneklerine ihtiyaç duymazsınız, basitçe bazı senaryolarda işe yarar.
Ed S.

2
@Jose Faeti: Patronum hemfikirdi çünkü patronum deneyimli, rasyonel bir adam. Programlama dinini satın almıyor.
Ed S.

20

Kendinizi, C'nin işe yaramaz olduğu ve bu nedenle göz ardı edilebileceği konusunda ikna etmeye çalışıyorsunuz gibi geliyor. Sorunuzu yıkalım:

“Birisinin yalnızca C'de gelişme olması durumunda test için C öğreneceğini düşündüm.”

Hayır, C öğrenmenin birçok nedeni vardır. Bilsem bile, yine de bu gibi battaniye ifadeleri kullanmaktan kaçınacağımı bilmeseydim, özellikle de dairesel mantıkla birlikte. Açıkçası, düzgün bir şekilde test edebilmek / düzeltmek için kodun yazıldığı dili bilmek gerekiyor, ancak bu dil bilgisinin hala verilen bir dil olarak kullanıldığını ve sadece C için değil, herhangi bir dil için geçerli olduğunu varsayar.

"Bildiğim kadarıyla, COM ve donanım tasarımı ile ilgili tüm geliştirme de C ++ 'da yapılır."

Bu yanlış.

“Bu nedenle, C öğrenme C ++ kullanmanız gerekiyorsa anlam ifade etmiyor. Ayrıca tarihi önemine de inanmıyorum, neden C öğrenmede zaman ve para harcıyorsunuz?”

Bu, hepsinin en tartışmalı mantığı. Öncelikle, tarihi önem, inanmanız gereken bir şeydir , çünkü eğer C'nin bir C ++ alt kümesi olduğunu bilseydiniz ve bu nedenle, C'yi bilmek daha iyi bir C ++ programcısı olmanıza yardımcı olabilir. Elbette, C, bundan sonra gelen dillerin çoğunda da etkiliydi, böylece faydalar burada bitmiyordu. Ek olarak, C çok önemli olduğu için sadece tarihsel öneme sahip olduğu düşünülmez. Halen yaygın olarak kullanılmaktadır ve bu nedenle böyle bir ikincil konuma devredilemez. Her programcının kullanması gereken ve tam bir bilgiye sahip olması gereken bir dil olmadığını ve bunun doğru olacağını savunabilirsiniz, ancak lütfen önce kendi gerçek değerlerini incelemeden bir şeye inanmadığınızı söyleyerek argümanınızı oluşturmayın.


7
C C ++ bir alt kümesidir , ne anlama geldiğini mi ?? . C, bir C ++ alt kümesi değildir; Infact onlar oldukça farklı. Evet, C ++, C'nin bir geliştirilmesidir veya bazen sınıflar ve OOP ile birlikte C olarak adlandırılır, ancak C'nin bir altküme olduğunu söyler, haklı değildir
Pankaj Upadhyay

7
C ++, çoğunlukla C'nin eski bir sürümünün üst kümesidir ve C, o zamandan bu yana biraz farklı bir yöne gitti. Dillerin bazı yönleri büyük ölçüde paralel yönlere gitmiştir, ancak diğerleri (ve C ++ 'in dışında başka birçok şey vardır).
Donal Fellows

Bu gerçeğe açıklık getirmek için oy kullanmaya katılıyorum, tüm geçerli C programları geçerli C ++ programları değil, yani C ++ C'nin bir süperseti değil. Ancak, C'nin karar verilmesi noktasında C'nin nasıl bir süperset olduğu. Donal Fellows'un bahsettiği gibi bir süperset. Artık doğru olmadığında, artık olduğunu söylemek mantıklı değil.
Joshua Hedges

16

Gömülü sistemlere ek olarak, çoğu yeni dilde C ile arabirim oluşturmanın bir yolu vardır. Bu dillerin hepsinde kullanımı kolaydır. C ++, bazı dillerle de (ancak Python (yalnızca CPython gibi)) arayüz arayabilse de, C ++ bazı özelliklerinden dolayı daha fazla dille arayüz yapamaz (özellikle isim yönetimi, ancak şablonlar soruna yardımcı olmaz). C ABI, ara yüzleşmenin en kolay yollarından biridir (C ++ yazıp arabirim için harici "C" kullanabileceğinizi biliyorum. Umurumda değil).

Ayrıca, C ve C ++ 'nın sistem programlaması için gerçekten en iyi diller olması ve C derleme sürelerinin çok daha hızlı olması avantajına sahiptir . C ++ derleme süreleri, kullandığım herhangi bir dilin en kötüsü.

Şimdi orada popüler sistem dili olmak isteyen başka diller varken ( özellikle D hakkında bilgim var ), yazılımın büyük bir kısmı C / C ++ dilinde yazılmıştır. D gibi diller, birinin doğrudan kullanmak yerine C kütüphanesinin etrafında bir sarıcı oluşturmasını gerektirir (tıpkı C ++ 'dan olduğu gibi).


D, C kodunu doğrudan, tıpkı C ++ gibi çağırabilir. İşlev prototipinde ihtiyacınız varsa (yine, tıpkı C ++ gibi). Sadece extern(C)D ile yazıyorsunuz, C ++ ile yazıyorsunuzextern "C"
Peter Alexander

@Peter Alexander D'deki harici (C) durumdan haberdarım. Sarmalayıcı dosyası derken bahsettiğim şey buydu. C başlığını doğrudan dahil edemezsiniz (C ++ 'da yapabileceğiniz gibi, C başlığının "C" dışında kullandığı ve #ifdef __cplusplus bloklarına sahip olduğunu varsayalım). O zaman sadece harici (C) kullanımı arasında başka uyuşmazlıklar var (özellikle dizgilerin nasıl işlendiği. Benim bilgime göre, D'de boş bir sonlandırıcı yok. Bu yüzden diziyi C'ye geçirirken özel olarak değiştirmelisiniz).
jsternberg

11

kontrol langpop.com , Freshmeat ve Google Code özellikle grafikleri. C'nin hala ileride olduğunu gösteriyor.

C, metale (yani gömülü sisteme) yakın olmanız gereken sistemlerde ve performansta aç uygulamalarda hala popülerdir.


4
Bu URL'yi AÇMAYIN ! Web sitesi artık mevcut değil ve URL sinir bozucu spam sitelere yönlendiriliyor.
Nikolay Suvandzhiev

11

Neredeyse her gün iPad / iPhone için geliştirme yapıyorum. Birçok kitaplık C dilinde yazılmıştır ve bir Objective-C eşdeğerine sahip değildir. Yani evet, hala ve piyasadaki en yeni cihazlardan biri tarafından kullanılıyor.

C ile birçok gömülü sistemi programlayabilirsiniz, küçük ve kullanışlıdır ve muhtemelen gelecek yıllar boyunca olacak (diğer bir deyişle zamanınızı boşa harcıyorsunuz ya da para harcamak değilsiniz).


2
“Objective-C henüz genç” aslında 1980'lerin ortalarından, C ++ kadar eski. Yine de kullanan çoğu insan 2007'ye kadar rastlamamıştı.

Doğru söylemek istediğim, temel olarak iOS için Objective-C’de eşdeğeri olmayan birçok C kütüphanesi olduğu. Gerçekten, dilin kendisi de hiç genç değil (Wiki ile kontrol edilir). Bunu gösterdiğin için teşekkürler.
Valentin Radu

7

Genellikle gömülü sistem için C hala yaygın olarak kullanılmaktadır.

Bu soru başka bir örnek verir.

TIOBE endeksi dili sınıflandırmak için çalışır, popülerlik / kullanım , devamlı olarak ilk yerlerde C koyar.


2. Sıra (Java'dan sonra).
Martin York

7
C ++ ve Java'nın her ikisi de son 10 yılda popülaritesinde aşağı yönlü bir eğilim sergilerken, C az ya da çok statik kalıyor.
Paul R

7

Taşınabilirlik.

C kodunu çalıştıracağını düşündüğünüz her sistemin bir listesini yapın ve ardından istediğiniz diğer diller için benzer bir liste yapın.

Benimle aynı cevabı bulduysan, sonuç evet olur.


5

Bence C en güçlü dildir Aşağıdaki nedenlerden dolayı!

1) İlk C 'de, Bu bir sistem dilidir (bu, minimum çalışma zamanı veya hiç çalışma süresi olmadan düşük seviyeli programlama yapmak için kullanılabileceği anlamına gelir).

2) Elde edilen uygulamanın hızı. Dil kaynağı göreceli olarak küçük ve çok verimli olduğundan C kaynak kodu daha yüksek seviyeli dillerden çok daha fazla optimize edilebilir. Assembly dilinde programlama yapmadan, assembly dilinde programlama yapmak mümkün. ve montajı ve C'yi birlikte bile kullanabilirsiniz!

3) C, Firmware programlama (donanım) 'daki uygulamasıdır. Bu, montaj ile kullanma / çalışma ve doğrudan kontrolörler, işlemciler ve diğer cihazlarla iletişim kurma kabiliyetinden kaynaklanmaktadır.

4) C, halihazırda bilinen diğer birçok dil için bir yapı taşıdır. C'nin geçmişine bakın ve bunun bir süredir var olduğunu göreceksiniz (programlama dilleri yine de giderken). Python'a, örneğin tamamen Nesneye Yönelik Yüksek Düzeyli bir programlama dili göz atın. C ile yazılmıştır (belki de C ++ ile). Bu, başlığın altında neler olup bittiğini bilmek istemeniz durumunda size söyler; C'yi ve nasıl çalıştığını anlamak çok önemlidir.

Bir uygulama dili, örneğin bir kelime işlemci veya oyun yazmak gibi üst düzey programlama için kullanılır. Uygulama dillerine örnek olarak Java, C #. Bunun nedeni, odak toplama verimliliği olduğu için çöp toplama, otomatik yazma, çalışma zamanı doğrulama vb.

Düşük seviye programlama için bir sistem dili kullanılır. örneğin Bir mikro denetleyici, bir sürücü ve işletim sistemi çekirdeği. Örnekler montaj, C içerir. Kodun doğrudan donanım üzerinde çalışması için çok az çalışma zamanı gerektirir veya hiç çalışma zamanı gerektirmezler ve odak programcının donanım üzerinde doğrudan kontrolü olmasını sağlar.

Genel olarak, bir uygulama dili olarak düşüyor, ancak hala bir sistem dili olarak güçlü kalıyor.


1

Ah evet, kullanılıyor. Ağ paket işleme alanında çalışıyorum. Ağ paketlerini işlediğimiz iki farklı şirkette bulundum. Bu nedenle, Ethernet veya IP seviyesinde çalışıyoruz, TCP'nin üstünde değil.

İlginç bir şekilde, her iki şirkette de C ++ 'a seçildi. Şirketlerden birinde, iki üründen biri Linux çekirdeğinin üzerine, diğer ürün ise Linux kullanıcı alanında yapıldı. Açıkçası C'yi Linux çekirdeği olarak kullanan çekirdek ürün C'de programlanmış ancak kullanıcı alanı ürünü için de C'yi seçmişlerdir. Her iki ürün de yaklaşık 2000 yılından başlayarak geliştirildi (2000'den biraz önce çekirdek ürünü ve 2000'den biraz sonra da kullanıcı ürünü).

Ondan sonra gittiğim şirkette, ürün C ++ değil C üzerinde üretildi. Aslında, 1990'ların ortasından itibaren bir projenin devamıdır, ancak performans iyileştirme talepleri nedeniyle, esasen her şeyin yeniden yazılacağına karar verilmiştir. Bu yeniden yazma nedeniyle C ++ seçme seçeneğimiz vardı, ancak yapmadı.

Ağ paket işleme alanında, performans çok önemlidir. Bu yüzden, mevcut karma tablolardan daha yüksek performansa sahip kendi karma tabloyu uygulamak istiyorum. Karma tablo yazarı değil, hangi karma fonksiyonun kullanılacağını seçen kişi benim. Belki de performans istiyorum ve MurMurHash3'e gidin . Belki güvenlik istiyorum ve SipHash'a gidiyorum . Bellek ayırıcıları açıkça özeldir. Aslında, kullandığımız tüm önemli veri yapıları mümkün olan en yüksek performans için özel olarak uygulanmıştır.

C ++ kullanımını engelleyecek hiçbir şey olmamakla birlikte, genellikle kötü bir fikirdir. Paket başına atılan tek istisna, paket işlem hızını kabul edilemez seviyelere düşürür! Dolayısıyla C ++ 'nın istisnalarını kullanamıyoruz. Yol çok yavaş. Veri yapılarını yapılar olarak uygulayarak ve sonra bu yapılar üzerinde çalışan işlevleri uygulayarak, zaten nesne yönelimli C kodu kullanıyoruz. C ++ sanal işlevlere sahip olacak, ancak daha sonra her yerde kullanılırsa sanal işlev çağrıları performansı keser. Bu nedenle, sanal işlev çağrıları gerekiyorsa, açık ve işlev göstergeye sahip olmak daha iyidir.

C ++ arkanızda birçok şey yapacak: bellek ayırma, vb. Öte yandan, genellikle C'de olmayanlar. Belleği tahsis eden bir fonksiyon yazabilirsiniz, ancak genellikle tahsisin gerçekleştiği fonksiyonun arayüzünden anlaşılır.

C ile programlama yaparken yapabileceğiniz mikro optimizasyonların bir örneği olarak, Linux çekirdeğindeki container_of makrosuna bir göz atın. Tabii, container_of 'i C ++ kodunda kullanabilirsiniz, fakat bunu kim yaptı? Yani, çoğu C programında tamamen kabul edilebilir, ancak tipik C ++ programcıları hemen bağlantı düğümlerini ayrı bloklar olarak tahsis eden bağlantılı bir liste gibi başka bir şey teklif ederler. Bunu istemiyoruz çünkü tahsis edilen her hafıza bloğu performans açısından kötü.

Belki de C ++ 'da bize fayda sağlayacak tek şey, C ++' ın şablon metaprogramlamasına izin vermesidir, yani hala bir işlev parametresi varken bazen sanal işlev çağrılarını önleyebilirsiniz ve derleyicinin işlevleri satır içi yapmasına izin verir. Ancak şablon metaprogramlaması karmaşıktır ve C'deki tüm gereklilikleri yerine getirmeyi başardık, bu nedenle bu özelliğin C ++ 'daki faydası o kadar kritik değildir.

Şirketlerden birinde, aslında özelliklerin bir kısmının uygulandığı özel bir derlenmiş dilimiz vardı. Sanırım derleyicinin hedef dili hangisiydi? Kurul? Hayır, hem 32 bit hem de 64 bit mimarileri desteklemek zorunda kaldık. C ++? Elbette jest yapıyorsun. Açıkçası, bu GCC'nin hesaplanan goto ile C idi . Böylece, özel dil C'ye (ya da aslında hesaplanan goto'yu destekleyen C'nin gcc varyantına) derlendi ve C derleyicisi derleme üretti.


0

C'yi hala günlük olarak kullanıyorum ve bunun başlıca nedenlerinden biri, diğer dillerle etkileşimden ve çeşitli dillerde her türlü derleyici tarafından oluşturulan eklentiler tarafından kullanılmak üzere tasarlanmış bir SDK.

Yapıcılar ve yıkıcılar ve değişkenler içeren sınıfları kullanan, aşırı işlev yükleyen, istisnalar atan vb. Farklı derleyiciler kullanılarak yazılan bir C ++ eklentisi olsa bile, Lua, C #, Python, C vb. ve kendi ayarlarımız.

Python'dan, örneğin C #'dan çağrılabilecek bir Python SDK'sı yazamıyorum.

Buradaki C, bu dillerin herhangi birinden çağrılabilecek bir API oluşturmama izin veren tek dil. Bu, C arayüzlerini uygulamak için sık sık C ++ kullandığımı söyledi (bazen ben sadece C olarak uyguluyorum).

Bunun yanı sıra, bazen düşük seviyeli veri yapıları ve bellek ayırıcılar gibi şeyler için çalışmak için en kolay dili C bulurum. C ++ 'ta kazandığınız tüm ekstra tip emniyetler, hizalanmış bit ve baytları bir araya getirmek için tasarlanmış bir bellek ayırıcı yazıyorsanız, size yardımcı olmaz. Ve C ++ 'ın zengin tip sistemine ve istisnai durumlara karşı, kendi veri yapılarınızı döndürmek kolay değildir - yalnızca bir veri yapısını std::vectoristisna güvenli hale getirmek ve kaçınmak istemiyormuş gibi önemsiz görmek için ne kadar çaba harcadığına bakın Konteynere eklemediğiniz elementler üzerindeki ktors ve dtors (C ++ standart kütüphanesinin tamamını uygulayan biri olarak konuşuyorum). Sadece yetiştirilebilir bir dizinin iyi uygulanması çok zor olduğunda, üretim kalitesinde bir BVH uygulamak için gereken işi hayal edin.

Var olan veri yapılarını kullanmak veya mevcut olanları kullanarak daha üst düzeyde olanları uygulamak istediğimde C ++ 'ı tercih ediyorum , ancak bunun için kullanılmayan bir motorun çekirdeğinde düşük seviyeli bir veri yapısı uygulayacaksam Mevcut veri yapıları, C kesinlikle yapıcı, yıkıcı ve atılan istisnalar hakkında endişelenmeden sadece memcpyburada ve memmoveoradaki şeyleri, mallocbitişik bir bloğu ve orada olan şeyleri sağlayan uber basit tip sistemiyle yapmayı çok daha kolaylaştırıyor realloc.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.