Bunca Yıl Sonra, Dünya Hala C Programlama Tarafından Güçlendiriliyor

Yayınlanan: 2022-03-11

Bugün var olan C projelerinin çoğu onlarca yıl önce başlatıldı.

UNIX işletim sisteminin gelişimi 1969'da başladı ve kodu 1972'de C'de yeniden yazıldı. C dili aslında UNIX çekirdek kodunu derlemeden daha yüksek seviyeli bir dile taşımak için oluşturuldu, bu da aynı görevleri daha az kod satırıyla yapacaktı. .

Oracle veritabanı geliştirme 1977'de başladı ve kodu 1983'te Assembly'den C'ye yeniden yazıldı. Dünyanın en popüler veritabanlarından biri haline geldi.

1985 yılında Windows 1.0 piyasaya sürüldü. Windows kaynak kodu herkese açık olmasa da, çekirdeğinin çoğunlukla C ile yazıldığı, bazı bölümlerin montajda olduğu belirtildi. Linux çekirdeği geliştirme 1991'de başladı ve aynı zamanda C ile de yazılmıştı. Ertesi yıl, GNU lisansı altında yayınlandı ve GNU İşletim Sisteminin bir parçası olarak kullanıldı. GNU işletim sisteminin kendisi C ve Lisp programlama dilleri kullanılarak başlatıldı, bu nedenle bileşenlerinin çoğu C ile yazılmıştır.

Ancak C programlama, bugün olduğu kadar çok programlama dilinin olmadığı, onlarca yıl önce başlayan projelerle sınırlı değildir. Birçok C projesi bugün hala başlatılıyor; bunun için bazı iyi nedenler var.

Dünya C ile Nasıl Güçlendirilir?

Daha yüksek seviyeli dillerin yaygınlığına rağmen, C dünyayı güçlendirmeye devam ediyor. Milyonlarca kişi tarafından kullanılan ve C dilinde programlanan sistemlerden bazıları aşağıdadır.

Microsoft Windows

Microsoft'un Windows çekirdeği, çoğunlukla C'de, bazı bölümleri ise Assembly dilinde geliştirilmiştir. On yıllardır, pazar payının yaklaşık yüzde 90'ına sahip olan dünyanın en çok kullanılan işletim sistemi, C ile yazılmış bir çekirdek tarafından desteklenmektedir.

Linux

Linux ayrıca çoğunlukla C ile yazılmıştır ve bazı bölümleri montajdadır. Dünyanın en güçlü 500 süper bilgisayarının yaklaşık yüzde 97'si Linux çekirdeğini çalıştırıyor. Ayrıca birçok kişisel bilgisayarda da kullanılmaktadır.

Mac

OS X çekirdeği çoğunlukla C ile yazıldığından Mac bilgisayarlar da C tarafından desteklenir. Windows ve Linux bilgisayarlarda olduğu gibi Mac'teki her program ve sürücü, C ile çalışan bir çekirdek üzerinde çalışır.

mobil

iOS, Android ve Windows Phone çekirdekleri de C dilinde yazılmıştır. Bunlar yalnızca mevcut Mac OS, Linux ve Windows çekirdeklerinin mobil uyarlamalarıdır. Yani her gün kullandığınız akıllı telefonlar bir C çekirdeği üzerinde çalışıyor.

C ile Yazılmış İşletim Sistemi Çekirdekleri

veritabanları

Oracle Database, MySQL, MS SQL Server ve PostgreSQL dahil olmak üzere dünyanın en popüler veritabanları C ile kodlanmıştır (ilk üçü aslında hem C hem de C++'da).

Veritabanları her türlü sistemde kullanılır: finans, hükümet, medya, eğlence, telekomünikasyon, sağlık, eğitim, perakende, sosyal ağlar, web ve benzeri.

C Tarafından Desteklenen Veritabanları

3D Filmler

3D filmler genellikle C ve C++ ile yazılmış uygulamalarla oluşturulur. Bu uygulamaların çok verimli ve hızlı olması gerekir, çünkü çok büyük miktarda veriyi işlerler ve saniyede çok sayıda hesaplama yaparlar. Ne kadar verimli olurlarsa, sanatçıların ve animatörlerin film çekimlerini oluşturması o kadar az zaman alır ve şirket o kadar fazla para tasarrufu sağlar.

Gömülü sistemler

Bir gün uyandığınızı ve alışverişe gittiğinizi hayal edin. Sizi uyandıran çalar saat muhtemelen C'de programlanmıştır. Ardından, kahvaltınızı yapmak için mikrodalga fırını veya kahve makinenizi kullanırsınız. Onlar da gömülü sistemlerdir ve bu nedenle muhtemelen C'de programlanmıştır. Kahvaltınızı yaparken televizyonunuzu veya radyonuzu açıyorsunuz. Bunlar aynı zamanda C tarafından desteklenen gömülü sistemlerdir. Garaj kapınızı uzaktan kumandayla açtığınızda, büyük olasılıkla C'de programlanmış gömülü bir sistem de kullanmış olursunuz.

Sonra arabanıza biniyorsunuz. Aşağıdaki özelliklere sahipse, ayrıca C'de programlanmıştır:

  • Otomatik şanzıman
  • lastik basıncı algılama sistemleri
  • sensörler (oksijen, sıcaklık, yağ seviyesi vb.)
  • koltuklar ve ayna ayarları için hafıza.
  • gösterge paneli ekranı
  • ABS Fren sistemi
  • otomatik stabilite kontrolü
  • seyir kontrolü
  • iklim kontrolü
  • çocuk emniyetli kilitler
  • anahtarsız giriş
  • ısıtmalı koltuklar
  • hava yastığı kontrolü

Markete gidiyorsun, arabanı park ediyorsun ve bir soda almak için bir otomat makinesine gidiyorsun. Bu otomat makinesini programlamak için hangi dili kullandılar? Muhtemelen C. Sonra mağazadan bir şeyler satın alırsınız. Yazar kasa da C'de programlanmıştır. Peki kredi kartınızla ödeme yaptığınızda? Tahmin ettiniz: kredi kartı okuyucusu yine muhtemelen C'de programlanmıştır.

Tüm bu cihazlar gömülü sistemlerdir. Bunlar, yerleşik aygıtlarda yerleşik aygıtlarda yerleşik yazılım olarak da adlandırılan bir programı çalıştıran, içinde bir mikro denetleyici/mikroişlemci bulunan küçük bilgisayarlar gibidir. Bu program, tuş basışlarını algılamalı ve buna göre hareket etmeli ve ayrıca kullanıcıya bilgileri göstermelidir. Örneğin, çalar saat, kullanıcı ile etkileşime girerek, kullanıcının hangi düğmeye bastığını ve bazen ne kadar süreyle basıldığını tespit etmeli ve cihazı buna göre programlamalı, tüm bunları kullanıcıya ilgili bilgileri gösterirken yapmalıdır. Örneğin, otomobilin kilitlenme önleyici fren sistemi, lastiklerin ani kilitlenmesini algılayabilmeli ve frenlerdeki basıncı kısa bir süre için serbest bırakacak şekilde hareket ederek, kilitleri açarak kontrolsüz patinajı önleyebilmelidir. Tüm bu hesaplamalar programlanmış bir gömülü sistem tarafından yapılır.

Gömülü sistemlerde kullanılan programlama dili markadan markaya değişebilse de, dilin esneklik, verimlilik, performans ve donanıma yakınlık özelliklerinden dolayı en yaygın olarak C dilinde programlanırlar.

Gömülü Sistemler Genellikle C İle Yazılır

C Programlama Dili Neden Hala Kullanılıyor?

Bugün, geliştiricilerin farklı türden projeler için C'den daha üretken olmalarını sağlayan birçok programlama dili var. JSON, XML, UI, web sayfaları, istemci istekleri, veritabanı bağlantıları, medya manipülasyonu vb. ile çalışmayı basitleştiren çok daha büyük yerleşik kitaplıklar sağlayan daha yüksek düzeyli diller vardır.

Ancak buna rağmen, C programlamanın uzun süre aktif kalacağına inanmak için birçok neden var.

Programlama dillerinde tek bir boyut herkese uymaz. İşte C'nin rakipsiz ve belirli uygulamalar için neredeyse zorunlu olmasının bazı nedenleri.

Taşınabilirlik ve Verimlilik

C neredeyse taşınabilir bir derleme dilidir. Mevcut işlemci mimarileri için neredeyse evrensel olarak kullanılabilirken, makineye mümkün olduğunca yakındır. Hemen hemen her mevcut mimari için en az bir C derleyicisi vardır. Ve günümüzde, modern derleyiciler tarafından oluşturulan yüksek düzeyde optimize edilmiş ikili dosyalar nedeniyle, çıktılarını elle yazılmış derleme ile geliştirmek kolay bir iş değildir.

"Diğer programlama dillerinin derleyicileri, kitaplıkları ve yorumlayıcıları genellikle C'de uygulanır", taşınabilirliği ve verimliliği budur. Python, Ruby ve PHP gibi yorumlanan dillerin birincil uygulamaları C ile yazılmıştır. Hatta derleyiciler tarafından diğer dillerin makineyle iletişim kurması için kullanılır. Örneğin, C, Eiffel ve Forth'un altında yatan ara dildir. Bu, desteklenecek her mimari için makine kodu oluşturmak yerine, bu diller için derleyicilerin yalnızca ara C kodu oluşturması ve C derleyicisinin makine kodu oluşturma işlemini gerçekleştirmesi anlamına gelir.

C ayrıca geliştiriciler arasında iletişim kurmak için ortak bir dil haline geldi. Dropbox Mühendislik Müdürü ve Cprogramming.com'un yaratıcısı Alex Allain'in dediği gibi:

C, programlamadaki ortak fikirleri çoğu insanın rahat edeceği şekilde ifade etmek için harika bir dildir. Ayrıca, C'de kullanılan ilkelerin çoğu – örneğin, komut satırı parametreleri için argc ve argv ile döngü yapıları ve değişken türleri – öğrendiğiniz diğer birçok dilde görünecek ve böylece konuşabileceksiniz. C'yi bilmeseler bile, ikinizde de ortak olan bir şekilde insanlara.

Hafıza Manipülasyonu

Keyfi bellek adres erişimi ve işaretçi aritmetiği, C'yi sistem programlaması (işletim sistemleri ve gömülü sistemler) için mükemmel bir uyum haline getiren önemli bir özelliktir.

Donanım/yazılım sınırında, bilgisayar sistemleri ve mikro denetleyiciler, çevre birimlerini ve G/Ç pinlerini bellek adreslerine eşler. Sistem uygulamaları, dünyayla iletişim kurmak için bu özel bellek konumlarını okumalı ve bunlara yazmalıdır. Bu nedenle, C'nin keyfi bellek adreslerini manipüle etme yeteneği, sistem programlaması için zorunludur.

Örneğin, 0x40008001 adresinin bit sayısı 4 her ayarlandığında, 0x40008000 bellek adresindeki bayt evrensel asenkron alıcı/verici (veya çevre birimleriyle iletişim için ortak bir donanım bileşeni olan UART) tarafından gönderilecek şekilde bir mikro denetleyici yapılandırılabilir. 1'e ve bu biti ayarladıktan sonra çevre birimi tarafından otomatik olarak çözülecektir.

Bu, o UART üzerinden bir bayt gönderen bir C işlevinin kodu olacaktır:

 #define UART_BYTE *(char *)0x40008000 #define UART_SEND *(volatile char *)0x40008001 |= 0x08 void send_uart(char byte) { UART_BYTE = byte; // write byte to 0x40008000 address UART_SEND; // set bit number 4 of address 0x40008001 }

İşlevin ilk satırı şu şekilde genişletilecektir:

 *(char *)0x40008000 = byte;

Bu satır, derleyiciye 0x40008000 değerini bir char işaretçisi olarak yorumlamasını, ardından bu işaretçiyi (en soldaki * işleciyle) başvurudan çıkarmasını (işaret ettiği değeri vermesini) ve son olarak bu başvurulan işaretçiye byte değeri atamasını söyler. Başka bir deyişle: 0x40008000 bellek adresine byte değişkeninin değerini yazın.

Bir sonraki satır şu şekilde genişletilecektir:

 *(volatile char *)0x40008001 |= 0x08;

Bu satırda 0x40008001 adresindeki değer ve 0x08 ( binary olarak 00001000 , yani bit numarası 4'te 1) değerinde bitsel OR işlemi gerçekleştirip sonucu tekrar 0x40008001 adresine kaydediyoruz. Başka bir deyişle: 0x40008001 adresindeki baytın 4. bitini belirledik. 0x40008001 adresindeki değerin volatile olduğunu da beyan ederiz. Bu, derleyiciye bu değerin kodumuzun dışındaki işlemler tarafından değiştirilebileceğini söyler, bu nedenle derleyici bu adrese yazdıktan sonra o adresteki değer hakkında herhangi bir varsayımda bulunmaz. (Bu durumda, biz yazılım tarafından ayarlandıktan hemen sonra bu bit UART donanımı tarafından ayarlanmaz.) Bu bilgi derleyicinin optimize edicisi için önemlidir. Bunu bir for döngüsü içinde yaparsak, örneğin, değerin geçici olduğunu belirtmeden, derleyici bu değerin ayarlandıktan sonra asla değişmediğini varsayabilir ve ilk döngüden sonra komutu çalıştırmayı atlayabilir.

Kaynakların Deterministik Kullanımı

Sistem programlamanın güvenemeyeceği ortak bir dil özelliği, çöp toplama veya hatta bazı gömülü sistemler için yalnızca dinamik ayırmadır. Gömülü uygulamalar zaman ve bellek kaynakları açısından çok sınırlıdır. Genellikle çöp toplayıcıya deterministik olmayan bir çağrının karşılanamadığı gerçek zamanlı sistemler için kullanılırlar. Ve bellek yetersizliği nedeniyle dinamik ayırma kullanılamıyorsa, C işaretçilerinin izin verdiği gibi verileri özel adreslere yerleştirme gibi başka bellek yönetimi mekanizmalarına sahip olmak çok önemlidir. Büyük ölçüde dinamik ayırmaya ve çöp toplamaya bağlı olan diller, sınırlı kaynaklara sahip sistemler için uygun olmaz.

Kod Boyutu

C çok küçük bir çalışma süresine sahiptir. Ve kodunun bellek alanı diğer dillerin çoğundan daha küçüktür.

Örneğin, C++ ile karşılaştırıldığında, gömülü bir aygıta giden C tarafından oluşturulan bir ikili dosya, benzer C++ kodu tarafından oluşturulan bir ikili programın yaklaşık yarısı kadardır. Bunun ana nedenlerinden biri istisna desteğidir.

İstisnalar, C yerine C++ tarafından eklenen harika bir araçtır ve tetiklenmedikleri ve akıllıca uygulanmadıkları takdirde, pratikte yürütme süresi ek yükü yoktur (ancak kod boyutunu artırma pahasına).

C++'da bir örnek görelim:

 // Class A declaration. Methods defined somewhere else; class A { public: A(); // Constructor ~A(); // Destructor (called when the object goes out of scope or is deleted) void myMethod(); // Just a method }; // Class B declaration. Methods defined somewhere else; class B { public: B(); // Constructor ~B(); // Destructor void myMethod(); // Just a method }; // Class C declaration. Methods defined somewhere else; class C { public: C(); // Constructor ~C(); // Destructor void myMethod(); // Just a method }; void myFunction() { A a; // Constructor aA() called. (Checkpoint 1) { B b; // Constructor bB() called. (Checkpoint 2) b.myMethod(); // (Checkpoint 3) } // b.~B() destructor called. (Checkpoint 4) { C c; // Constructor cC() called. (Checkpoint 5) c.myMethod(); // (Checkpoint 6) } // c.~C() destructor called. (Checkpoint 7) a.myMethod(); // (Checkpoint 8) } // a.~A() destructor called. (Checkpoint 9)

A , B ve C sınıflarının yöntemleri başka bir yerde tanımlanır (örneğin diğer dosyalarda). Bu nedenle derleyici bunları analiz edemez ve istisna atıp atmayacaklarını bilemez. Bu nedenle, oluşturucularından, yıkıcılarından veya diğer yöntem çağrılarından kaynaklanan istisnaları işlemeye hazırlanmalıdır. Yıkıcılar atmamalıdır (çok kötü uygulama), ancak kullanıcı yine de fırlatabilir veya bir istisna atan bir işlevi veya yöntemi (açık veya dolaylı olarak) çağırarak dolaylı olarak fırlatabilir.

myFunction çağrılardan herhangi biri bir istisna atarsa, yığın çözme mekanizması önceden oluşturulmuş nesneler için tüm yıkıcıları çağırabilmelidir. Yığın çözme mekanizması için bir uygulama, istisnayı tetikleyen çağrının "kontrol noktası numarasını" doğrulamak için bu işlevden gelen son çağrının dönüş adresini kullanır (bu basit açıklamadır). Bunu, şuna benzer olacak şekilde, bu işlevin gövdesinden bir istisna atılması durumunda yığının çözülmesi için kullanılacak bir yardımcı otomatik oluşturulmuş işlevi (bir tür arama tablosu) kullanarak yapar:

 // Possible autogenerated function void autogeneratedStackUnwindingFor_myFunction(int checkpoint) { switch (checkpoint) { // case 1 and 9: do nothing; case 3: b.~B(); goto destroyA; // jumps to location of destroyA label case 6: c.~C(); // also goes to destroyA as that is the next line destroyA: // label case 2: case 4: case 5: case 7: case 8: a.~A(); } }

İstisna 1 ve 9 kontrol noktalarından atılırsa, hiçbir nesnenin yok edilmesine gerek yoktur. Kontrol noktası 3 için b ve a imha edilmelidir. Kontrol noktası 6 için c ve a imha edilmelidir. Her durumda imha emrine uyulmalıdır. 2, 4, 5, 7 ve 8 numaralı kontrol noktaları için yalnızca a nesnesinin yok edilmesi gerekir.

Bu yardımcı fonksiyon, koda boyut ekler. Bu, C++'ın C'ye eklediği alan yükünün bir parçasıdır. Birçok gömülü uygulama bu fazladan alanı karşılayamaz. Bu nedenle, gömülü sistemler için C++ derleyicileri genellikle istisnaları devre dışı bırakmak için bir bayrağa sahiptir. C++'da istisnaları devre dışı bırakmak ücretsiz değildir, çünkü Standart Şablon Kitaplığı, hataları bildirmek için istisnalara büyük ölçüde güvenir. Bu değiştirilmiş şemayı istisnasız kullanmak, olası sorunları tespit etmek veya hataları bulmak için C++ geliştiricileri için daha fazla eğitim gerektirir.

Ve, ilkesi "Kullanmadığınız şey için ödeme yapmazsınız" olan bir dil olan C++'dan bahsediyoruz. İkili boyuttaki bu artış, çok yararlı olan ancak gömülü sistemler tarafından karşılanamayan diğer özelliklerle ek yük ekleyen diğer diller için daha da kötüleşir. C size bu ekstra özelliklerin kullanımını sağlamazken, diğer dillere göre çok daha kompakt bir kod ayak izine izin verir.

C Öğrenmek için Nedenler

C öğrenmesi zor bir dil değildir, bu yüzden öğrenmenin tüm faydaları oldukça ucuza gelecektir. Bu faydalardan bazılarını görelim.

Ortak dil

Daha önce de belirtildiği gibi, C, geliştiriciler için ortak bir dildir . Kitaplarda veya internette birçok yeni algoritma uygulaması ilk (veya sadece) yazarları tarafından C'de kullanıma sunulmuştur. Bu, uygulama için mümkün olan maksimum taşınabilirliği sağlar. C'nin çok temel kavramlarını bilmediği için internette bir C algoritmasını diğer programlama dillerine yeniden yazmak için uğraşan programcıları gördüm.

C'nin eski ve yaygın bir dil olduğunu unutmayın, böylece web'de C ile yazılmış her türlü algoritmayı bulabilirsiniz. Bu nedenle, bu dili bilmek büyük olasılıkla fayda sağlayacaktır.

Makineyi Anlayın (C ile düşünün)

Meslektaşlarımızla kodun belirli bölümlerinin veya diğer dillerin belirli özelliklerinin davranışını tartıştığımızda, sonunda “C ile konuşuyoruz”: Bu bölüm nesneye bir “işaretçi” mi aktarıyor yoksa tüm nesneyi mi kopyalıyor? Burada herhangi bir "oyuncu" olabilir mi? Ve bunun gibi.

Üst düzey bir dilin kodunun bir bölümünün davranışını analiz ederken, kodun bir bölümünün yürütmekte olduğu derleme talimatları hakkında nadiren tartışırdık (veya düşünürdük). Bunun yerine, makinenin ne yaptığını tartışırken, C'de oldukça net konuşuruz (veya düşünürüz).

Ayrıca, durup ne yaptığınız hakkında bu şekilde düşünemezseniz, işlerin nasıl (büyülü bir şekilde) yapıldığına dair bir tür batıl inançla programlamaya başlayabilirsiniz.

C ile Makine Gibi Düşünün

Birçok İlginç C Projesinde Çalışın

Büyük veritabanı sunucularından veya işletim sistemi çekirdeklerinden, kişisel memnuniyetiniz ve eğlenceniz için evde bile yapabileceğiniz küçük gömülü uygulamalara kadar birçok ilginç proje C'de yapılır. Sevebileceğiniz şeyleri tek bir neden için yapmaktan vazgeçmeniz için hiçbir neden yoktur. C gibi eski ve küçük ama güçlü ve zamanla kendini kanıtlamış bir programlama dili bilmediğinizi

C ile Harika Projeler Üzerinde Çalışın

Çözüm

İlluminati dünyayı yönetmiyor. C programcıları yapar.
Cıvıldamak

C programlama dilinin bir son kullanma tarihi yok gibi görünüyor. Donanıma yakınlığı, mükemmel taşınabilirliği ve kaynakların belirleyici kullanımı, onu işletim sistemi çekirdekleri ve gömülü yazılımlar gibi düşük seviyeli geliştirmeler için ideal kılar. Çok yönlülüğü, verimliliği ve iyi performansı, onu veritabanları veya 3D animasyon gibi yüksek karmaşıklıktaki veri işleme yazılımları için mükemmel bir seçim haline getirir. Günümüzde birçok programlama dilinin kullanım amacı açısından C'den daha iyi olması, C'yi her alanda yendikleri anlamına gelmez. Performans öncelik olduğunda C hala eşsizdir.

Dünya, C ile çalışan cihazlarda çalışıyor. Farkında olsak da olmasak da bu cihazları her gün kullanıyoruz. C, yazılımın birçok alanı için geçmiştir, şimdidir ve görebildiğimiz kadarıyla hala gelecek.

İlgili: C ve C++ Dilleri Nasıl Öğrenilir: Nihai Liste