İçeriğe atla

Tanımsız durum

Tanımsız durum, (İngilizceUndefined behavior) programlamada bir standartın bir durumu tanımlayamacağı durumlara denmektedir.

C topluluklarında tanımsız durum bazen mizahi bir yolla "Nasal Demons" (Burun Şeytanları) olarak ifade edilir zira tanımsız durumun sonucunda ne olacağı belli değildir ve bu programcının burnundan şeytanların fışkırmasını dahi "mümkün" kılmaktadır.[1]

Tanımsız durum her zaman bir programlama hatası değildir ve bazı durumlarda program tanımsız durum kullanılarak optimizasyonlar yapılabilir, verimliliği artırılabilir ancak bu programın güvenilirliğini ve stabilitesini etkilemektedir ayrıca derleyicinin bir sürümünde istenen sonucu veren program, başka bir sürümde veya başka bir derleyicide farklı bir sonucu verebilir. Tanımsız durum bazen fark edilmeden bazı kütüphaneler kullanılırken de gerçekleşebilir zira bazı kütüphaneler, bir işaretçinin değerinin NULL olup olmadığını performans nedeni ile kontrol etmez.

Örnekler

C programlama dilindeki yaygın tanımsız durumlar ise: sayı aşımı, bellek dışına okuma/yazma, bellek güvenliğine aykırı durumlar.

Düz dizenin değiştirilmesi tanımsız duruma yol açar:[2]

char *p = "vikipedi"; /* C programlama dilinde doğru, C++98/C++03'te kullanılmaması gerektiği belirtilmekte, C++11'den beri doğru bulunmaz */
p[0] = 'V'; /* tanımsız durum zira düz dizeler sadece okunurdur */

Bir tam sayının sıfırla bölünmesi tanımsız durumdur:[3]

int x = 1;
return x / 0; /* tanımsız durum */

Bazı işaretçi işlemleri tanımsız durumla sonuçlanabilir:[4]

int arr[4] = {0, 1, 2, 3};
int *p = arr + 5;  /* tanımsız durum sınır dışına gitme */
p = NULL;
int a = *p;        /* tanımsız durum NULL'un değerini öğrenmek */

Negatif bir sayıya mantıksal işlemler (sol kaydırma) uygulama, bir veri tipinin bit sayısından fazla kaydırma:

int x = -1 << 1;
/* 64 bit tam sayıyı 64 ile kaydırmak tanımsız durumdur, maksimum 63 ile kaydırılabilir */
uint64_t vikipedi = 1ULL << 64;
return x;

Değer döndürmesi gereken bir fonksiyonda değer döndürmemek:

int f()
{
}  /* eğer fonksiyonun değeri kullanılır ise tanımsız durum */

Ayrıca bakınız

Kaynakça

  1. ^ "nasal demons". Jargon File. 29 Mart 2004 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Haziran 2014. 
  2. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §2.13.4 String literals [lex.string] para. 2
  3. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.6 Multiplicative operators [expr.mul] para. 4
  4. ^ ISO/IEC (2003). ISO/IEC 14882:2003(E): Programming Languages - C++ §5.7 Additive operators [expr.add] para. 5

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C (programlama dili)</span> programlama dili

C, yapısal bir programlama dilidir. Bell Laboratuvarları'nda, Ken Thompson ve Dennis Ritchie tarafından UNIX işletim sistemini geliştirebilmek amacıyla B dilinden türetilmiştir. Geliştirilme tarihi 1972 olmasına rağmen yaygınlaşması Brian Kernighan ve Dennis M. Ritchie tarafından yayımlanan "C Programlama Dili" kitabından sonra hızlanmıştır. Günümüzde neredeyse tüm işletim sistemlerinin yapımında %95'lere varan oranda kullanılmış, hâlen daha sistem, sürücü yazılımı, işletim sistemi modülleri ve hız gereken her yerde kullanılan oldukça yaygın ve sınırları belirsiz oldukça keskin bir dildir. Keskinliği, programcıya sonsuz özgürlüğün yanında çok büyük hatalar yapabilme olanağı sağlamasıdır. Programlamanın gelişim süreciyle beraber programlamanın karmaşıklaşması, gereksinimlerin artması ile uygulama programlarında nesne yönelimliliğin ortaya çıkmasından sonra C programcıları büyük ölçüde nesne yönelimliliği destekleyen C++ diline geçmişlerdir.

<span class="mw-page-title-main">C♯</span> programlama dili

C#; Microsoft tarafından .NET Teknolojisi için geliştirilen modern bir programlama dilidir. Sözdizimi C-like bir deneyim sunar.

<span class="mw-page-title-main">C++</span> bir programlama dili

C++, Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir.

Programlama dillerinde işaretçi, bellek adresi tutmak için tasarlanmış bir türdür.

Python, nesne yönelimli, yorumlamalı, birimsel (modüler) ve etkileşimli yüksek seviyeli bir programlama dilidir.

<span class="mw-page-title-main">Ada (programlama dili)</span> programlama dili

Ada, yapısal, statik tipli, zorunlu, geniş spektrumlu ve nesne yönelimli bir üst düzey bilgisayar programlama dilidir. Pascal ve diğer dillerin genişletilmiş halidir. Gömülü design-by-contract (DbC), güçlü yazımı, açık eşzamanlı, senkronize mesaj geçişi, korunmuş objeli ve belirsiz bir dildir. Ada kod güvenliğini ve sürdürebilirliğini derleyicide hataları bularak geliştirdi.

<span class="mw-page-title-main">Bellek yönetimi</span>

Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de bellek yöneticisi adı verilir.

Arabellek aşımı ya da arabellek taşkını, iki yazılım arasında veri iletişimi için ayrılmış olan bir arabelleğe boyutundan daha fazla veri konulması ile ortaya çıkan durumdur.

Matematikte matematiksel programlama, eniyileme ya da optimizasyon terimi; bir gerçel fonksiyonu minimize ya da maksimize etmek amacı ile gerçek ya da tam sayı değerlerini tanımlı bir aralıkta seçip fonksiyona yerleştirerek sistematik olarak bir problemi incelemek ya da çözmek işlemlerini ifade eder. Örneğin bu problem şöyle olabilir:

Programlama dili teorisi (PDT), programlama dilleri olarak bilinen biçimsel dillerin ve bunların bireysel özelliklerinin tasarımı, uygulanması, analizi, karakterizasyonu ve sınıflandırılması ile ilgilenen bir bilgisayar bilimleri dalıdır. Matematik, yazılım mühendisliği, dilbilim ve hatta bilişsel bilime bağlı ve onu etkileyen bilgisayar bilimi disiplinine girer. PDT'ye adanmış çok sayıda dergide ve genel bilgisayar bilimi ve mühendisliği yayınlarında yayınlanan sonuçlarla tanınmış bir bilgisayar bilimi dalı ve aktif bir araştırma alanı haline gelmiştir.

Programlama paradigmaları, programlama dillerini özelliklerine göre sınıflandırmanın bir yoludur. Diller birden fazla paradigma içinde sınıflandırılabilir.

Nesne yönelimli programlama dillerinde arayüz, değişik sınıflardan nesnelerin kategorize edilmesini sağlayan bir soyut tür çeşitidir. Tanımlanmakta olan kategorinin birbirleriyle alakasız sınıfları ortak bir çatı altında toplaması nedeniyle, arayüz tanımları, soyut sınıfların aksine, listeledikleri iletilerin gerçekleştirim ayrıntısı olan herhangi bir bilgi içeremezler. Dolayısıyla, bir arayüz tanımı iletilere karşılık gelen bir altyordam gövdesi veya altalan tanımı içeremez. Bir başka açıdan bakarsak, arayüz tanımında yer alan programlama öğelerinin zaman içinde değişme olasılığı düşük öğeler olması gerekir. Buna göre, arayüz tanımları gerçekleştirimci ile kullanıcının paylaştığı ve sabit olma özelliği bulunan altyordam imzaları ile simgesel sabit tanımlarını barındırabilir.

<span class="mw-page-title-main">Erişilmez kod</span>

Erişilmez kod bilgisayar programlamada programın başka yerlerinden kontrol akışı olmayan kaynak koduna verilen addır.

Kotlin, Java sanal makinesi (JVM) üzerinde çalışan ayrıca JavaScript kaynak koduna veya LLVM ile makine koduna derlenebilen, statik tipli bir programlama dilidir. İlk geliştirme Sankt-Peterburg, Rusya merkezli JetBrains programcıları tarafından yapılmıştır. İsmi Kotlin Adası'ndan gelmektedir. Java ile uyumlu sözdizimi olmasa da, Kotlin Java kodu ile birlikte çalışmak üzere tasarlanmıştır. Kotlin, Apple'ın Swift diline benzemektedir.

Bilgisayar biliminde boş işaretçi, sıfır referansı veya boş gösterici, geçerli bir nesne adresini göstermeyen işaretçi ya da dolaylamaya verilen genel isimdir. Bir başka deyişle, değeri sıfır olan işaretçidir; yani bilgisayarın belleğinde geçerli olan bir adresi işaret etmemektedir. Bilgisayar programlarında, uzunluğu bilinmeyen bir listenin sonu veya bazı eylemlerin gerçekleştirilememesi gibi koşulları göstermek için rutin olarak boş işaretçiler kullanır; boş işaretçilerinin bu kullanımı, sıfırlanabilir tip veya opsiyonel bir veri tipi gibi düşünülebilir.

C17, ISO/IEC 9899: 2018 için kullanılan gayriresmî addır. 2017'de geliştirilmesi devam ettiği ve resmi olarak Haziran 2018'de basıldığı için C18 olarak da bilinir. C programlama dilinin yayınlanan en son resmi standardıdır. C11'in yerini almıştır ve yerine C2y'in gelmesi beklenmektedir.

C dinamik bellek yönetimi ve tahsisi, C standart kütüphanesinde mevcut bulunan birtakım hazır metotları kullanarak, kullanılacak olan program için bellekte sanal bir alan oluşturulmasını sağlar. C programlama dilinde dinamik bellek tahsisi için malloc, realloc, calloc ve free metotları kullanılmaktadır. malloc metodu kullanılarak bellekte bulunan kullanılmaya uygun bir alan, kullanıcı için tahsis edilir. Benzer şekilde calloc da bellekte kullanılmaya uygun bir hafıza alanını kullanıcının kullanımına açar fakat calloc hazırlanan bellek alanının içindeki verileri de sıfırlar. realloc metodu ise önceden calloc veya malloc kullanılarak oluşturulan bellek alanının büyüklüğünü dinamik zamanda (run-time'da) değiştirmek için kullanılır. free ise diğer dinamik bellek tahsisi metotları ile oluşturulan ve kullanılan bellek alanlarını temizlemek için kullanılır.

C programlama dilinde, struct (yapı), bir bellek bloğunda tek bir ad altında fiziksel olarak gruplandırılmış değişkenler listesini tanımlayan ve farklı değişkenlere tek bir işaretçi (pointer) aracılığıyla erişilmesine izin veren bileşik bir veri türüdür. Struct veri tipi, başka veri türlerini içerebilir. Bu nedenle dosya uzunluğu, ad, uzantı... veya diğer karma türdeki kayıtlar gibi karma veri türü kayıtları için kullanılır.

Bilgisayar biliminde zorunlu programlama ya da emperatif programlama, programın durumunu değiştiren ifadeler kullanan yazılımın programlama paradigması'dır. Doğal dillerdeki zorunlu kipin komutları ifade etmesi gibi, zorunlu program da bilgisayar'ın gerçekleştireceği komutlardan oluşur. Zorunlu programlama, beklenen sonuçlarının üst düzey tanımlarından ziyade programın nasıl adım adım çalıştığını açıklamaya odaklanır.

C++17, C++ programlama dili için yayınlanan ISO/IEC 14882 standardının bir versiyonudur. C++17, bir önceki C++ standardı olan C++14'ün yerine geçmiş, sonrasında C++20 ile yerdeğiştirmiştir.