Bugün bir yazılım projesi için C'yi kullanır mısınız? [kapalı]


18

Evet ise, nerede ve neden kullanardınız?

Cevabınız hayırsa, lütfen C'nin neden kabul edilemeyeceğine dair bir açıklama yapın.


10
Tabii ki C'nin doğru ve bariz bir seçim olduğu uygulamalar var, ama kişisel olarak, bir daha asla bir bellek bloğunu bozmazsam, mutlu öleceğim.
Adam Crossland

Evet- Kurslar için atlar.
Martijn Verburg

Bu ne anlama geliyor?
Luca Matteis

At yarışlarını takip edenler için eski bir söz. Temel olarak, herhangi bir At, Kurs (Kuru, Çamurlu, Uzun, Kısa, ne olursa olsun) uygun olduğu sürece gününde kazanabileceği anlamına gelir. Programlama dilleri için de aynı şey geçerlidir - her zaman bağlama ve sorun alanına bağlıdır.
Martijn Verburg

2
Hayır, ama sadece bugün C'nin iyi bir dil seçimi olacağı hiçbir proje üzerinde çalışmıyorum. Bana yarın tekrar sor.
James McNellis

Yanıtlar:


38

C, Sistem programlama için mükemmel bir dildir

Bazı donanım yazılımı sürücüleri uygularsam C'yi kullanırdım. Kendi İşletim Sistemi çekirdeğimi veya kendi Sanal Makinemi uygularsam C'yi kullanırdım.

Windows API, Linux, Mac OS X, Solaris ve benzeri için donanım veya düşük düzeyli OS API'leriyle uğraşmanız gerekiyorsa düşük düzeyli şeyler yapmak çok iyi bir dildir ... Gömülü sistemler genellikle C için iyi bir desteğe sahiptir. bir derleyici + geliştirme kiti ile.


4
"Mac OS linux" un nerede olduğunu söyleyebilir misiniz? Mac OS'nin Darwin olduğunu düşündüm: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers

1
@Stephen Furlani: LOL - evet, bu biraz yetersiz. :-) Xenix, DYNIX ve A / UX gibi birçok ölü Unices var ve çoğumuz HP-UX gibi görmüyoruz. Soy ağacı, Avrupalı ​​kraliyet ailelerininki kadar karmaşık ve karışıktır.
Bob Murphy

4
C, sistem programlaması için korkunç bir dildir. Morris Worm'dan bu yana 20 yıldan fazla bir süredir ve onu hala herhangi bir güvenlik gereksinimi olan herhangi bir proje için, özellikle işletim sistemleri veya ağa dönük uygulamalar için kullanan herkesin cezai ihmal suçlarıyla karşı karşıya kalması gerektiğini biliyoruz.
Mason Wheeler

2
@Mason Wheeler: Bunun yerine ne kullanmalıyız?
Steve S

1
@Mason Wheeler: Hmm ... Pascal'ı geçmişte işten çıkarmıştım, ama belki başka (daha yakından) bir görünüm alma zamanı. Başka önerileriniz var mı?
Steve S

17

Evet tabi ki. C'yi performans açısından kritik sistem parçaları veya düşük seviyeli iletişim parçaları yazmak için kullanırdım. Örneğin , Erlang projesinde NIF'leri yazmak için C'yi sadece bu tür bir iş için Doğru Araç (tm) olduğu için kullanırım. Ya da Perl projesinde benzer parçaları (XS) yazmak için C'yi kullanırdım.


16

C'yi neredeyse her gün profesyonel olarak kullanıyorum. Aslında, C düzenli olarak programladığım en üst düzey dildir.

C'yi nerede kullandığım: Mümkün olduğunca verimli olma şartı olan düşük seviyeli kütüphane kodunu yazıyorum. Tutkal kodum C, iç hesaplama döngüleri montajda yazılır.

Neden C kullanıyorum: Karmaşık argüman yapılarını ve hata koşullarını işlemede olduğundan çok daha basittir ve gerçek hesaplamaya başlamadan önce bu tür bir durum kontrolü için performans yükü genellikle ihmal edilebilir. C basit, iyi tanımlanmış bir dil olduğundan, kabul edilemez performans tehlikeleriyle derlenmiş kod gördüğümde kod üretimini geliştirmek için derleyici ekibiyle birlikte çalışmak için kolay bir zamanım var.

Taşınabilirlik, C'nin bir başka büyük erdemidir. Tutkal kodum, üzerinde çalıştığım kütüphanelerin donanıma özgü birden fazla uygulamasında paylaşılıyor ve bu da yeni platformlar için destek getirmeyi gerçekten kolaylaştırıyor. Çoğu platformda ayın dil lezzeti için sanal bir makine veya yorumlayıcı yoktur. Bazı platformlarda iyi bir C ++ derleyicisi yoktur. Kullanılabilir bir C derleyicisinden yoksun çok az platform var (ve derleyici ekibimizle iyi bir iş ilişkim olduğundan, genellikle ihtiyacım olan desteği almakta zorlanıyorum).


6
Gerçekten eğlenceli bir işin varmış gibi görünüyor!
Paul Nathan

Bu benim hayalimdeki iş.
rsmahanti

5

Evet, C'yi kaynak kısıtlı bir gömülü sistemde kullanırım. Ben edebilir Keşke o kadar kolay yazılım bileşenleri arasındaki güçlü arayüzleri teşvik etmek yapar, ama proje üzerinde çalışan tüm mühendisler o C anlamaya yalnızca ++ sanal işlevler ve şablonlar kaçınmak şeyler örnekleridir (kod boyutu kabartmak giden kötüye kolaydır yerine çünkü C ++ kullanmanız ).

Ayrıca iyi bir fikir değil, 1K yığını üzerinde 10K nesne oluşturmaya çalışan bir C ++ programcısı gördüm.


2
aslında virtualfonksiyonlar "kullanmadığınız şeyler için ödeme yapmazsınız" prensibini takip ettikleri için uygundur, ancak hafıza kısıtlı ortamda istisnaları ve RTTI'yı devre dışı bırakmak isteyebilirsiniz.
Matthieu M.

Çevre arayüzleri sağlamak için her zaman sadece C ++ 'da singleton nesneleri oluşturduğumu hissediyorum. Ben insanlar C ++ "daha iyi" olduğunu düşünüyorum çünkü gömülü sistemlerde C + C + C seçin.
Erik

5

Çoğunlukla Xen hipervizörü, sunduğu çeşitli kütüphaneler ve Linux çekirdeği ile çalışıyorum. Bazen, bir aygıt sürücüsü yazmak zorundayım (ya da nxx sanal makinelerinin HRNG gibi tek bir aygıtı paylaşabilmesi için yeniden yazmak zorundayım). C benim ana dilim ve bundan oldukça memnunum.

Bunu kullanarak bir elektronik tablo programı yazmaya çalışabilir miyim? Olmaz. Her aracın kendi uygulamaları vardır ve birçok araca sahip olduğum için mutluyum.

C'yi seviyorum, ama bir çekiçle vidaları vurmaya çalışmıyorum.

C yeni bir proje için mantıklı bir seçimse, kesinlikle. Değilse, başka bir şey kullanacağım.


4

Bazı projeler için yapardım. Kesinlikle gömülü bir sistem uygulamak zorunda kalırsam, otonom bir uçak kontrolörü için söyleyin. Hatta montaj ile bazı parçalarda daha düşük seviyeye bile gidebilir.

Projeye uyuyorsa, hiçbir sorunum yok.

Bir web uygulaması geliştirmek istiyorsanız, hmm, muhtemelen hayır (ya da çok güçlü ve gerçek destekli bir gerekçe görmem gerekir).

Ayrıca, bir darboğaz açıkça tanımlandığında ve yerel kod kullanılarak bir optimizasyon uygulanabildiğinde, diğer dillerle geliştirilen diğer projelerden de kullanırım. Örneğin, bazı gelişmiş oluşturma işlemleri (örneğin, bir oluşturma motoru vb.) İçin yoğun hesaplamalar gerçekleştirmesi gereken bir Java çözümü. Desteklenen bir platform değilse bir Java uygulamasını varsayılan olarak kullanabilir, ancak bazı desteklenen platformlar için C'den yerel olarak derlenmiş bir uygulama sağlayabilir ve hoş bir performans artışı elde edebilirsiniz.


Web uygulaması için kullanmak için bir neden mi istiyorsunuz? Memcached C dilinde yazılmıştır ve birçok web uygulamasının temel bir parçasıdır. Ayrıca, bir meslektaşım, C'deki bir sosyal ağ sitesine ait bir kod yazdı - algoritmik olarak karmaşık hale geldiğinde, ekonomik olarak kullanılabilir RAM'in boyutuyla sınırlanan veri kümeleri ve sayfa başına ortalama 23 kez çalışan sorguları ele alıyor. 4 günlük C uygulaması ile 4 aylık bir programcı maaş değerinde sunucu kurtardık.
qdot

@qdot: Geçerli bir neden. Ayrıca C ve C ++ web geliştiricileri için iyi çerçeveler olmasının bir nedeni de var. Genel bir web uygulaması veya web sitesi geliştirmek gerekirse sadece benim 1 seçimim olmaz. Memcached gibi bir çerçeve söz konusu olduğunda, açıkça mükemmel bir anlam ifade eder. Benzer şekilde sunucunun C olması mantıklı olabilir. Bu yüzden muhtemelen değil. Memcached (ve bir web uygulamasının hesaplama yoğun bir kısmının özel C uygulamanız) C'nin web geliştiricisi için mükemmel şekilde geçerli kullanımlarıdır. Ancak bunu yapmak için iyi bir C programcısına ihtiyacınız var. Sadece yolda olan ya da sorun bekleyen biri değil.
haylem

Ve diğer insanların bunun gibi başka geçerli nedenleri varsa, lütfen bunları buraya gönderin! Okuyucular için yararlıdır.
haylem

C kullanırsanız, önce harika performans, iyi öğrenme deneyimi ve açıklanamayan tonlarca sorun beklemeyi öğrenirsiniz. İnsanları C'yi kullanmaya teşvik etmeye çalıştım, çünkü "milyonda bir" PHP / Ruby / Python geliştiricisi olmaktan ve büyük hesaplama sorunlarına karşı başınızı çizmeye başladığınızda çok önemli hale geliyor.
qdot

@qdot: gerçekten. Yazık ki bir çok insan artık C'yi gerçekten tanımıyor, gerçekten.
haylem

4

Dışarıdaki her dilin iyi bir kullanım alanı var. Kendimi sık sık üst düzey dillerde şeyler uygularken bulurum ve daha yüksek performansa sahip olmaları ya da sadece daha taşınabilir olmaları gerekiyorsa bunları yavaş yavaş C-topraklarına indiririm. Var olan hemen hemen her şey için C derleyicileri vardır ve evrensel olarak kullanılabilen bir API'ye (POSIX gibi) yazarsanız, çok yararlı olabilir.

Bugün programlamayı öğrenmekle ilgilenen insanlara sık sık söylediğim şey, bazılarında noktada C'yi öğrendiklerinden ve onunla rahat olduklarından . Kendinize ihtiyacınız olan durumlarda bulabilirsiniz. Birden fazla vesileyle, küçük, statik olarak bağlı bir "hızlı yeniden başlatma" programı derlemek ve disk alt sisteminin tamamen gitti bir sunucuda bir RAM disk üzerine koymak için scp kullanmak zorunda kaldı. (Ucuz, ucuz sunucular, çevrimiçi yedeklilik yok ve sadece küçük bir program yükleme yeteneği? C gitmek için bir yoldur.)

Ayrıca, kendinizi ayağa vurmadan C'de nasıl çalışacağınızı öğrenmek, kişinin diğer dillerde ve çevrede verimli yazma yeteneğine önemli ölçüde katkıda bulunabilir. En azından benim deneyimim bu oldu.

Kesinlikle her şey, hatta çoğu şey için kullanmama rağmen, yeri var ve oldukça evrensel: bu yüzden evet, geçmişte kullandım ve gelecekte kullanacağım ( şu anda ne zaman olduğunu biliyorum).


4

Evet, her zaman yaparım.

Herhangi bir kütüphaneyi çağırmazsanız, C'den oluşturulan kod OS desteği gerektirmez. Ayrıca, oluşturulan makine dili üzerinde iyi kontrol sağlar. Bu nedenle, çekirdek alanlarda yaşayan sürücüler veya diğer kodlar yazmak ve birçok gömülü sistem gibi diğer kısıtlı durumlar yazmak için harikadır. Ayrıca X Windows, GTK + ve Clutter gibi birlikte çalıştığım açık kaynaklı projeler için birincil dil.

C ++ 'da her şeyi yapabilmenize rağmen, C ++' ların mekanizmaları daha hızlı ve kod yazmayı kolaylaştırır. OOP'u ve C ++ sınıflarının işlevselliği kapsama şeklini ve RAII'yi seviyorum. Bir nesne kapsam dışına çıktığında otomatik yıkıcı çağrısının dikkatli kullanılması, C programlamasının sıkıntısı olan bellek ve kaynak sızıntılarının çoğunu ortadan kaldırır. STL temel olarak yüksek derecede optimize edilmiş algoritmaların ve veri yapılarının dev bir kütüphanesidir; eğer onları C'den kullanmak istersen, bunları kendin yazman ya da bir yerden satın almalısın.

Ne yazık ki, anlamadığım nedenlerden ötürü, Linux'taki çalışma zamanı sistemi, herhangi bir C ++ çalıştırmak için özel bir paylaşılan nesne kitaplığı (Windows'ta DLL, Mac'te dylib'e eşdeğer) gerektirir ve bir C programı çalıştırdığınızda bulunmaz. Bu yüzden en sevdiğim Mac ve Windows numaralarından birini yapamam, bu da C tabanlı bir API ile C ++ tabanlı bir paylaşılan nesne yazmak ve bunu bir C programından çağırmak.

İşte benim karar alma sürecim:

  1. Aygıt sürücüsü gibi kısıtlı bir durumda mı çalışıyorum? C kullanın.
  2. Başka birinin kullanması gerekecek bir Linux kütüphanesi mi yazıyorum? C kullanın.
  3. Zaten C ile yazılmış kod içinde mi çalışıyorum? C kullanın.
  4. Mac veya Windows kitaplığı mı yoksa yalnızca kullanacağım bir Linux kitaplığı mı yazıyorum? İç C ++ yazın, ancak kırılgan ikili arayüz sorunu önlemek için sadece bir C arayüzü maruz.
  5. C ++ kullanın.

Güzel bir şey, C ++ C'yi derleyebileceğidir, çünkü belirli bir durum için oluşturulan kod üzerinde gerçekten ayrıntılı bir kontrole ihtiyacınız varsa, bunun için sadece C ve geri kalanı için C ++ yazabilir ve hepsini C ++ derleyicisiyle derleyebilirsiniz. .


C ++ ile malloc sorunu nedeniyle "hepsini bir C derleyicisi ile derleyemezsiniz" - C ++ ile döküm yapmak zorundasınız, ancak C'de değil. Tabii ki tamamen yasal ama sinir bozucu C kodunu döktüyseniz, tamam .
alternatif

1
@mathepic: Evet, C ++, yazılan göstergelere geçersiz işaretçiler atama da dahil olmak üzere birçok şey hakkında C'den kesinlikle daha katıdır. Ancak, kısmen C ++ ile C dosyalarını derleyerek birkaç eski projede hataları düzeltiyorum. C ++ derleyicisi C mükemmel yasal kod nedeniyle ince hataları ortaya çıkarmak için ödemek için küçük bir fiyat olarak malloc sonuçları döküm bulmak
Bob Murphy

3

Evet, ama projeye bağlı. C, bazı düşük seviyeli projeler veya en büyük çözümün bir parçası için çok iyidir.

Örneğin. İş mantığı için ok, ancak kullanıcı arayüzü için değil.


2

eğer ikisi de olmalı

  • hızlı ve
  • taşınabilir

sonra C kullanıyorum. Belki C ++.


Hızlı ve taşınabilir, bu da Java veya C # olabilir.
Jonas

11
@Jonas: değil. Taşınabilir sadece 'windows veya linux' anlamına gelmez ;-)
Steven A. Lowe

1
@Jonas: Hızlı ve taşınabilir, ne Java ne de C # olmaz. C ++, mikrodenetleyici gibi platformlarda ve gömülü cihazlarda taşınabilir ve C, diğer diller için bile taşınabilirdir (yabancı işlevler olarak). Her ikisi de işlevsel olmayan ve bu nedenle yığın tabanlı ama yine de çöp toplanan dillerden daha hızlıdır. Her ikisine de ihtiyacınız yok: bir yığın ve bir çöp toplayıcı.
comonad

2
@Jonas: okuyun; uyarıları not edin ve tekrar "taşınabilir" sadece windows / linux anlamına gelmez. Soru C'yi ne zaman kullanacağınızı soruyor; cevap: her yerde hızlı koşması gerektiğinde . Java ve C # 'ı seviyorum, ancak balyozlar ve eski / gömülü sistemlerin çalışma zamanı yok. Birçoğunun çalışma zamanını tutacak yeri bile yok!
Steven A. Lowe

2
@Jonas: Tutkunuzu takdir ediyorum, ancak "yeni platformlar" konu değil. Size daha spesifik bir örnek vereyim, bunun işe yarayıp yaramadığını görmek için: Savaş alanındaki tanklar için ateş kontrol desteği sağlayan mikroişlemcilerde C derleyicileri var. Bir JVM'ye sahip değiller veya hiç olmayacaklar.
Steven A. Lowe

2

Evet, aslında son zamanlarda aldım!

C programlamayı seviyorum. Python programlamamın çoğunu yapıyorum, ancak hızlı koda ihtiyaç duyduğum zamanlar var ve dilin sadeliğinden gelen zarafetin tadını çıkarıyorum.

Şu anda üzerinde çalıştığım proje, tahmin edebileceğiniz gibi performans açısından kritik bir veritabanı. Şu anda C ve bazı python kullanıyorum, ancak eninde sonunda tamamen C olmasa da ağırlıklı olarak olacak.


2

Evet!

C düşük seviyeli bir dildir ve C'nin mikro denetleyicileri programlamak için C'yi kullanmak gibi tek seçenek olduğu veya Paralel, Seri veya hatta Modem gibi klasik bağlantı noktalarından cihazlarla etkileşim kurmak için bazı kodları bir araya getirdiği bir durum vardır!


2

Evet. Kariyer programlamamın çoğunu C ++ ile geçirdim, ancak şimdi kodumun çoğunu Ruby'de yazıyorum ve performansa veya düşük seviyeli öğelere erişime ihtiyacım varsa bir C uzantısı yazıyorum. Gelecekteki dostum!


Bazı cevaplar taşınabilirlik ve hızı C kodunun faydaları olarak ele aldı, ancak bağlantı bir diğer önemli özelliktir. Basit "klasik" yığın disiplini nedeniyle C ile yazılmış "yabancı" kodu bağlamak nispeten kolaydır. Birçok C derleyicisi, bir mimaride çok düşük seviyeye gitme kolaylığı olarak "satır içi montajcıya" izin verecektir (açıkça taşınabilirlikten ödün vermek).
hardmath

1

Bir işletim sistemi yazıyorsam C'yi kullanırdım. Önümüzdeki yirmi yıl içinde gerçekleşmeyeceğinden, lotoya çarpıp kendi harika Linux dağıtımımı yapmaktan başka yapacak bir şeyim olmadıkça, muhtemelen sadece C #, Java, Python, vb. C'yi çok uzun süre kullanmadım ama her zaman kullanmaktan zevk aldım; Yine de, bu günlerde kafam OO'nun etrafına o kadar sarılmış ki, eğer ona geri dönmem gerekirse, tekrar yuvarlanmam biraz zaman alacaktı.


0

C ++ , platformlar ve mikrodenetleyiciler gibi yerleşik aygıtlar arasında taşınabilir. (C ++ C'ye derlenebilir, bu nedenle mikrodenetleyiciler.)

C bile (yabancı işlevler olarak) diğer dillere taşınabilir. Bu nedenle, iff I düşük seviye kütüphaneleri programlamak, sonra C ++ daha fazla uyumluluk istiyorum.

Haskell platformlar arasında taşınabilir (ARM yakında), ancak mikrodenetleyiciler gibi gömülü cihazlar DEĞİLDİR. Hızı C ve C ++ ile karşılaştırılabilir; ancak işlevsel olduğu için, çalışma zamanı yığını yerine bir çöp toplayıcı kullanır, bu nedenle farklı zamanlarda (çöp toplama) ve farklı durumlarda (alt rutin çağrılar yerine devamlar) C'den daha hızlı ve daha yavaş olabilir.


Mümkün olan en soyut dili seçiyorum, çünkü program hızı farklı değil geliştirme süresi ve hata oranı. C ve C ++ çok farklıdır, ancak Haskell açısından farklı değildir.

Bir ya da iki eli dolu bilsem bile diğer dilleri tercih etmiyorum. … Birkaç vaka dışında, bash .


0

Gömülü sistemler genellikle birkaç kilobayttan fazla RAM'e ve belki de birkaç düzine kilobayt flaşa sahiptir ve işlemci saat hızı birkaç MHz'dir. C, böyle çıplak metal bir ortamda herhangi bir anlam ifade eden tek seçenektir.

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.