Olanakların Dil İçinde veya Kütüphanelerde Gerçekleştirilmeleri
Bu sayfadaki bilgiler Digital Mars'ın sitesindeki aslından alınmıştır.
C++ gibi bazı başka dillerde kütüphanelerle gerçekleştirilmiş olan bazı olanaklar D'de dilin iç olanaklarıdır:
- Dinamik diziler
- Dizgiler [string]
- Eşleme tabloları [associative arrays]
- Karmaşık sayılar
Bazılarına göre bu, yarar sağlamak yerine dilin gereksizce büyümesine neden olur. Onlara göre bu olanaklar standart kütüphanelerde gerçekleştirilmelidirler.
Önce bazı genel gözlemler:
- Bunların hepsi de çok yaygın olarak kullanılan olanaklar oldukları için, kullanışlılıklarını biraz olsun arttırmak çok kişiye yarar sağlar.
- Dil içi türlerin yanlış kullanılmaları durumunda derleyiciler daha anlaşılır ve daha yardımcı hata mesajları verebilirler. Kütüphane olanakları ile ilgili hata mesajları bazen son derece anlaşılmaz olurlar.
- Kütüphaneler yeni söz dizimleri, yeni işleçler, veya yeni anahtar sözcükler oluşturamazlar.
- Her seferinde kütüphane olanaklarının da tekrar tekrar derlenmeleri gerektiği için derleme yavaştır.
- Kütüphanelerin kullanıcıya esneklik sağlamaları beklenir. Eğer derleyicinin bile tanıyabileceği derecede standartlaştırılırlarsa (C++ standardı buna izin verir), zaten dil içi olanaklar kadar sabitleşmişler ve esnekliklerini kaybetmişler demektir.
- Kütüphanelerde yeni türler tanımlayabilme olanağı günümüzde çok gelişmiş olsa da, hâlâ dil olanakları kadar rahat değillerdir: uyumsuz kullanımlar, doğal olmayan söz dizimleri, içine düşülebilecek bazı garip durumlar.
Biraz daha ayrıntılı açıklamalar:
Dinamik diziler
Diziler C++'da dilin iç olanaklarındandırlar ama pek kullanışlı oldukları söylenemez. C++'da dizilerin sorunlarını gidermek yerine, standart şablon kütüphanesi [STL] içinde tanımlı bazı yeni diziler tanımlanmıştır. Bunların her birisi dizilerin değişik bir açığını kapatır:
- basic_string
- vector
- valarray
- deque
- slice_array
- gslice_array
- mask_array
- indirect_array
Dil içindeki dizinin sorunları giderilse, bunların hiçbirisine gerek kalmaz ve öğrenilecek tek bir tür olur. Değişik dizi türlerinin birbirleriyle kullanılabilmeleri için de çaba gerekmemiş olur.
Dil içi diziler bize yazım kolaylığı sağlarlar. Dizi sabitleri [literal] belirleyebiliriz ve dizilere ait yeni işleçler tanımlayabiliriz. Oysa kütüphane gerçekleştirmeleri mevcut işleçleri yüklemek zorundadırlar. D dizileri C++'daki dizi[i]
indeks işlecine ek olarak şu işleçleri de sunar: birleştirme işleci ~
, sonuna ekleme işleci ~=
, dilimleme işleci dizi[i..j]
, vektör işleci dizi[]
.
~
ve ~=
işleçleri, yalnızca mevcut işleçlerin yüklenebildiği durumda ortaya çıkan bir sorunun üstesinden gelirler. Normalde kütüphane dizilerini birleştirmek için +
işleci kullanılır. Ne yazık ki bu seçim +
işlecinin vektör toplamı anlamında kullanılmasını engellemiş olur. Ayrıca, birleştirme işlemi ile toplama işlemi aynı şey olmadıklarından, ikisi için aynı işlecin kullanılıyor olması karışıklık doğurur.
Dizgiler
Bu konuyla ilgili daha ayrıntılı bilgiyi Dizgilerin [string] C++ Dizgileri ile Karşılaştırılması sayfasında okuyabilirsiniz...
C++'da dil içindeki dizgiler sabit dizgiler [string literal] ve char dizileri olarak sunulurlar. Ama onların da sorunu, C++ dizilerinin bütün zayıflıklarını aynen taşımalarıdır.
Sonuçta dizgi bir char dizisi değil midir? Dolayısıyla dizilerin sorunları çözüldüğünde, dizgilerin sorunları da çözülmüş olur. D'de ayrı bir dizgi sınıfının bulunmuyor olması baştan garip gelebilir. Ama sonuçta char dizilerinden farklı olmadıklarına göre, özel bir sınıf olarak sunmaya gerek yoktur.
Dahası, kaynak kodda sabit olarak yazılan dizgilerin kütüphanedeki dizgilerle farklı türden olmaları sorunu da çözülmüş olur. [Çevirenin notu: "merhaba"
gibi bir dizgi sabiti std::string
türünden değildir.]
Eşleme tabloları
Bunun temel amacı yazım kolaylığı sağlamaktır. T
türünde bir anahtarla indekslenen ve int
türünde değerler tutan bir dizi çok doğal olarak şöyle yazılabilir:
int[T] foo;
ve şöyle bir kullanımdan çok daha kısadır:
import std.associativeArray; ... std.associativeArray.AA!(T, int) foo;
Eşleme tablolarının dilin iç olanağı olmaları onların kaynak kodda sabit olarak tanımlanabilmelerini de sağlar. Bu da çok arzulanan bir olanaktır.
Karmaşık sayılar
Bu konuyla ilgili daha ayrıntılı bilgiyi Karmaşık Sayı Türleri ve C++'nın std::complex'i sayfasında okuyabilirsiniz...
Bu olanağın dilin bir iç olanağı olmasının baş nedeni, C'deki sanal ve karmaşık kayan noktalı sayılarla [complex floating point] uyumlu olmaktır. Diğer bir nedeni, sanal kayan noktalı sayıları sabit olarak yazabilmektir:
c = (6 + 2i - 1 + 3i) / 3i;
Herhalde şöyle bir kullanımdan üstünlüğü açıktır:
c = (complex!(double)(6,2) + complex!(double)(-1,3)) / complex!(double)(0,3);