D Programlama Dili Ali Çehreli



Benzer belgeler
C++11'in Bazı Yenilikleri ve D'deki Karşılıkları

C#(Sharp) Programlama Dili

C++ Giriş Ders 1 MSGSU Fizik Bölümü Ferhat ÖZOK Kullanılacak kaynak: Published by Juan Soulié

Programlama Dilleri III 1

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Programlama Dillerinde Kullanılan Veri Tipleri

Veri Tipleri Aşağıdaki programdaki 5 hatayı bulunuz.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

/*int sayi1, sayi2,toplam=0;

HSancak Nesne Tabanlı Programlama I Ders Notları

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

Mühendislik Fakültesi Elektrik-Elektronik Mühendisliği C Programlama 3. Bölüm Veri Tipleri ve Değişkenler

Görsel Programlama 1

1 PROGRAMLAMAYA GİRİŞ

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

Programlama Dilleri 3

HSancak Nesne Tabanlı Programlama I Ders Notları

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

// hataları işaret eden referans

Fonksiyonlar. C++ ve NESNEYE DAYALI PROGRAMLAMA 51. /* Fonksiyon: kup Bir tamsayının küpünü hesaplar */ long int kup(int x) {

Nesne Tabanlı Programlama

NESNEYE YÖNELİK PROGRAMLAMA C++ a Giriş

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

PROGRAMLAMAYA GİRİŞ DERS 2

Yrd. Doç. Dr. Caner ÖZCAN

Değişkenler tanımlanırken onlara ne tür veriler atanabileceği de belirtilir. Temel veri türleri oldukça azdır:

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

Nesne Tabanlı Programlama

Yrd. Doç. Dr. Caner ÖZCAN

Program Nedir? Program, bir problemin çözümü için herhangi bir programlama dilinin kuralları ile oluşturulmuş komut kümesidir.

10/17/2007 Nesneye Yonelik Programlama 3.1

YZM 2105 Nesneye Yönelik Programlama

Konular. Hafta 5 Veri Tipleri (Devam) BLG339 PROGRAMLAMA DİLLERİ KAVRAMI

BLM 112- Programlama Dilleri II. Hafta 2 C Programlarının Bellek Düzeni ve Rekürsif (Özyinelemeli) Fonksiyonlar

NESNEYE YÖNELİK PROGRAMLAMA

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

B02.6 Karar Verme, Eşitlik ve Bağıntı Operatörleri

GtkD ile Görsel Programlama

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

2.2- DEĞİŞKENLER VE SABİTLER ÇALIŞMA YAPRAĞI

BĠLGĠSAYAR PROGRAMLAMA II C++ Programlamaya GiriĢ Published by Juan Soulié

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

Fonksiyonlar -Genel Test- A

Programlama Dilleri 1. Ders 4: Diziler

Karabük Üniversitesi, Mühendislik Fakültesi... WEB TEKNOLOJİLERİ

Operator Aşırı Yükleme (Operator OverLoading)

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

public static int Toplam int x, int y

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

TEMPLATES. Binnur Kurt Bilgisayar Mühendisliği Bölümü İstanbul Teknik Üniversitesi. C++ ile Nesneye Dayalı Programlama 1

Dizi ( Array ) ve Dizgi ( String )

C PROGRAMLAMA D İ L İ

Nesneye Dayalı Programlama

Programlama Dilleri 1. Ders 12: Belirleyiciler ve Niteleyiciler

NESNEYE YÖNELİK PROGRAMLAMA

Bölüm 9. Altprogramlar ISBN

BLM 111 ALGORİTMA VE PROGRAMLAMA I

Örnek: İki fonksiyondan oluşan bir program. Fonksiyon Tanımı

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

ALGORİTMA VE PROGRAMLAMA II

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

Aynı tipten çok sayıda değişken topluluğudur. X Y Score1 Score2 (0) (1) (2)...

Teknikleri. Önsöz. iskender atasoy

enum bolumler{elektronik, insaat, bilgisayar, makine, gida};

/ C Bilgisayar Programlama Final Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Hafta 13 Fonksiyonlar

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

Dr. Fatih AY Tel: fatihay@fatihay.net

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

ALGORİTMA VE PROGRAMLAMA II

Karma C/C + + Kodlama

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

Android Ders Notları

Bilgisayar Teknolojileri Bölümü Bilgisayar Programcılığı Programı. Öğr. Gör. Cansu AYVAZ GÜVEN

C++ Hata Düzeneği Güvenliği

İNTERNET TABANLI PROGRAMLAMA

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Lecture 11: Generics

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

BLM 111 Algoritma ve Programlama I Güz 2018

PASCAL PROGRAMLAMA DİLİ YAPISI

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ

JAVADA DİZİ İŞLEMLERİ

Algoritma ve Programlama: Karar Yapıları ve Döngüler

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

Transkript:

D Programlama Dili Ali Çehreli import std.stdio; void main() writeln("merhaba dünya."); 22 Temmuz 2011; Bahçeşehir Üniversitesi, Beşiktaş http://ddili.org 1

Tanışma Hangi forumlardasınız? Hangi dilleri kullanıyorsunuz? Düzenli olarak katıldığınız toplantılar var mı? http://ddili.org 2

Asıl İzlemeniz Gereken Andrei Alexandrescu'nun "Three Cool Things About D" isimli sunumu. Dilin yaratıcılarından. Üç önemli D olanağını anlatmaya çalışır. Ama zamanı yetmez. Buradaki bazı fikirleri oradan ödünç alıyorum. http://ddili.org 3

Çok İyi Başka Diller de Var Burada amaç başka dilleri eleştirmek değil, D'yi tanıtmak. Her dilin zayıf ve güçlü tarafları vardır. D'nin olanaklarının neden farklı olduklarını anlatabilmek için C'nin ve C++'ın D'den daha zayıf olarak görülen bazı taraflarını göstereceğim. C ve C++ kullanıyorum. http://ddili.org 4

Kaynaklar Türkçe Genel: http://ddili.org/ Kitaplar: http://ddili.org/ders/ D Programlama Dili, Ali Çehreli GtkD ile Görsel Programlama, Mengü Kağan ve Can Alpay Çiftçi SDL ile Oyun Programlama, Faruk Erdem Öncel Makaleler: Andrei Alexandrescu'nun makalesi Neden D ve başkaları Forum: http://ddili.org/forum/ Wiki (Kütüphane belgeleri, vs.): http://ddili.org/wiki/ İngilizce Yeni: http://d-programming-language.org/ Eski: http://digitalmars.com/ Kitap: "The D Programming Language", Andrei Alexandrescu Wiki: http://www.prowiki.org/wiki4d/ vs. http://ddili.org 5

Kişiler ve Tarihçe Walter Bright Empire oyununun yazarı İlk C++ derleyicisi: Zortech'in yazarı Digital Mars'ın C ve C++ derleyicilerinin yazarı D1'in yaratıcısı, 2001 D'nin yaratıcısı, 2007 (Eskiden D2 deniyordu.) Andrei Alexandrescu "C++ şablon sihirbazı" ünvanlı, "Modern C++ Design" ve başka kitapların yazarı Programlama dili uzmanı (Yüksek lisans konusu ve sonra D tasarımı) Phobos aralıklarının (range) yaratıcısı (Bkz. "Eleman Erişimi Üzerine" makalesi) Çok sayıda gönüllü github'da dmd (D derleyicisi) github'da Phobos (Standart D kütüphanesi) http://ddili.org 6

Genel Bakış Üst düzey sistem dili Çok hızlı derleme Çok hızlı programlar C (ve bazı C++) kütüphaneleri ile bağlanabilme (link) Baştan C++'tan türemiş (gibi) Java, C#, Haskell, Eiffel ve başka bir çok dilden olanaklar Hem çöp toplayıcılı hem değil (RAII, el ile, vs.) Güvenli bellek modeli Kod güvenliği ve doğruluğu ön planda Komite değil, programcılar tarafından geliştirilmiş Pratiklik önemli http://ddili.org 7

Derlemeli Bir Dil Derleyiciler: dmd: Digital Mars'ın derleyicisi gdc: gcc'nin D derleyicisi; şimdilik ana sürümle gelmiyor; bir geliştirici sürümünden kurmak gerekiyor LDC: Ön tarafta dmd, arka tarafta LLVM; şimdilik D1 ile sınırlı Dilin belirli bir alt kümesi, CTFE olanağı (Compile Time Function Execution) sayesinde derleme zamanında işletilebiliyor: enum menü = menühazırla([ "Ekle", "Sil", "Çık" ]); menü, bütünüyle derleme zamanında oluşturulur. Hash bang düzeneği ile kaynak kod bile çalıştırılabilir: #!/usr/bin/env rdmd import std.stdio; void main() writeln("merhaba dünya."); http://ddili.org 8

C Ailesinden Söz dizimi C ve C++'a çok benzer ama çok sorunsuzdur: Her karakter bir kere okunur; her isim bir kere yüklenir. İlintisi (binding) bulunan C kütüphanelerini doğrudan kullanabilir. C kütüphanesi (malloc(), free(), vs.), Qt, Gtk, curl, vs. // Örnek ilinti (D binding) dosyası module benim_ncurses; extern (C): enum TRUE = 1; enum FALSE = 0; alias void WINDOW; WINDOW * initscr(); int cbreak(); int noecho(); //... Göstergeler kadar alt düzeydir int i; int * p = &i; *p = 42; http://ddili.org 9

Programlama Yöntemleri Emirli (imperative) auto isimler = [ "Ayşe", "Barış" ]; foreach (isim; isimler) writefln("merhaba %s.", isim); Nesne yönelimli (object oriented) class Kedi : Hayvan string şarkısözü() return "miyav"; Fonksiyonel (functional) auto işlem = (int sayı) return sayı * 2; ; işlem(42); Meta programlama (meta programming) T topla(t)(t a, T b) return a + b; http://ddili.org 10

Program Doğruluğu Temel bir felsefe: "En kolay yöntem, en güvenli ve doğru yöntemdir de." Örnekler: Bütün değişkenler normalde ilklenirler ama istendiğinde ilklenmeyebilirler de Değişkenler normalde iş parçacıkları tarafından paylaşılamazlar (thread-local) ama paylaşılabilirler de Dizi indeksleri normalde denetlenirler ama denetlenmeyebilirler de vs. Safe D: Dilin bellek hatalarına izin vermeyen alt kümesi (@safe) Birim testleri (unit testing) Sözleşmeli programlama ("contract programming" veya Eiffel'in "design by contract" kavramı): İşlevlerin giriş ve çıkış koşulları ve yapıların ve sınıfların mutlak değişmezleri Hata yönetimi Hata atma düzeneği (exception handling) Sonlandırıcı işlevlerden (destructor) bile hata atılabilir; ek hatalar asıl hataya bağlı liste düğümleri biçiminde eklenirler. scope deyimi sayesinde RAII türleri tanımlamak gereksizdir http://ddili.org 11

D'nin Merhaba Dünya Programı Doğrudur import std.stdio; void main() writeln("hello, world!"); http://ddili.org 12

C'nin ve C++'ın Merhaba Dünya Programları Yanlıştır "Neden D" makalesinde ve "Three Cool Things About D" sunumunda Andrei Alexandrescu'nun program doğruluğu ile ilgili olarak söylediği: C: C++: "C'nin ve C++'ın merhaba dünya programları yanlıştır." #include <stdio.h> main() printf("hello, world\n"); #include <iostream> int main() std::cout << "Hello, world!\n"; http://ddili.org 13

Merhaba Dünya Programlarının Doğruları C programının doğrusu: #include <stdio.h> int main() return printf("hello, world\n") < 0; C++ programının doğrusu: #include <iostream> int main() std::cout << "Hello, world!\n"; return std::cout.bad(); Java, Perl, J#, vs. de yanlıştır. Python, C#, vs. doğrudur. http://ddili.org 14

Safe D @safe ile işaretlenmiş olan işlevlerde veya -safe ile derlenmiş modüllerde bellek hatalarına izin veren olanaklar kullanılamaz. Örneğin şu olanaklara derleyici izin vermez: Program içinde assembler kullanımı. Bir değeri göstergeye dönüştürmek. Tehlikeli gösterge kullanımları. const, immutable veya shared belirteçlerinin tür dönüşümü yoluyla kaldırılması. Kısıtlı olarak izin verilen bir olanak: T1* türü, T2* türüne ancak güvenli yönde dönüştürülebilir. Örneğin T* void* veya int* short* olur. http://ddili.org 15

Birim Testleri (Unit Testing) Programcının en büyük yardımcısı string tekrarla(string dizgi, int adet) //... unittest assert(tekrarla("abc", 2) == "abcabc"); assert(tekrarla("ğ", 5) == "ğğğğğ"); assert(tekrarla("a", 0) == ""); Bir yapının birim testleri: struct Dizi @property int uzunluk(); void ekle(int eleman); unittest auto dizi = Dizi(); assert(dizi.uzunluk == 0); dizi.ekle(42); assert(dizi.uzunluk == 1); http://ddili.org 16

Sözleşmeli Programlama (Contract Programming) İşlevlerde giriş koşulları için in, çıkış koşulları için out blokları: string tekrarla(string dizgi, int adet) in assert(!dizgi.empty); out (sonuç) assert(sonuç.length == (dizgi.length * adet)); body string sonuç; foreach (i; 0.. adet) sonuç ~= dizgi; return sonuç; Yapılarda ve sınıflarda mutlak değişmezler için invariant blokları: class Zaman int saat; int dakika; invariant() assert((saat >= 0) && (saat <= 23)); assert((dakika >= 0) && (dakika <= 59)); //... 'saat' ve 'dakika'yı değiştiren çeşitli işlevler... http://ddili.org 17

RAII gibi scope Dosya kopyalayan bu program ya başarıyla kopyalar ya da geride yarım dosya bırakmaz. import std.exception; import std.file; void main(string[] parametreler) enforce(parametreler.length == 3, "Kullanım: trcopy <kaynak> <hedef>"); auto aradosya = parametreler[2] ~ ".ara_dosya"; scope(failure) if (exists(aradosya)) remove(aradosya); copy(parametreler[1], aradosya); rename(aradosya, parametreler[2]); (Kabul: exists() veya remove() da başarısız olabilir.) scope(failure): Hatayla çıkıldığında scope(success): Başarıyla çıkıldığında scope(exit): Herhangi bir yolla çıkıldığında http://ddili.org 18

Modül Sistemi #include değil, import #ifndef başlık korumalarına gerek yoktur. Bildirim ve tanım ayrımı yoktur. Çoğu durumda tanım sırasının önemi yoktur. module deneme; import std.stdio; void main() selamver(); // bu modülün ismi // standart giriş/çıkış modülünü kullanıyor // önceden bildirmeye gerek yok void selamver() writeln("merhaba dünya."); http://ddili.org 19

Temel Türler C'den ve C++'tan farklı olarak türlerin uzunlukları standarttır (real hariç). // Mantıksal ifade türü: bool b; // Karakter türleri: char c_8; wchar w_16; dchar d_32; // Tamsayı türleri: byte b_8; short s_16; int i_32; long l_64; // cent c_128; ileride kullanılmak üzere /* Yukarıdakilerin işaretsiz olanları: * ubyte, ushort, uint, ulong, ucent */ // Kesirli sayı türleri: float f_32; double d_64; real r_platforma_bağlı; // benim ortamımda 128 bit // Kısıtlı olarak 'void': void[] baytlar; /* Yakında kütüphanede halledilecek olan karmaşık sayı türleri: * cfloat, cdouble, creal, ifloat, idouble, ireal */ http://ddili.org 20

Dizgiler Unicode'dur Hem kaynak kodda hem dizgilerde: bool ASCII_geçmişte_kaldı = true; string söz = "Görüşelim dünya."; wstring söz_16 = "Görüşelim dünya."; dstring söz_32 = "Görüşelim dünya."; // UTF-8 // UTF-16 // UTF-32 Dizgi hazır değerlerinin kodlamaları açıkça belirtilebilir: kullan("merhaba"w); // UTF-16 kullan("merhaba"d); // UTF-32 http://ddili.org 21

const ve immutable C ve C++ gibi başka dillerdeki const bazen yetersizdir: const olan bir referansla erişilen değerin değişip değişmeyeceğinden emin olunamaz. const, C'deki ve C++'taki anlamdadır: "bu referans yoluyla erişildiğinde değiştirilemez". Başka yerde değiştirilebilir. int senesonunotu(const ref Öğrenci öğrenci) /* öğrenci burada değiştirilemez ama çağrıldığı yerde * değişiyor olabilir. *... */ immutable, "kesinlikle değiştirilemez" anlamındadır. immutable rapornumarası = 42; string s = "merhaba"; // immutable(char)[] Eş zamanlı programlamada kilitlenmesi gerekmez. Kesinlikle değişmediği bilindiğinden derleyicinin daha fazla eniyileştirme olanağı vardır. İkisi de geçişlidir: int senesonunotu(const ref Öğrenci öğrenci) öğrenci = new Öğrenci; // DERLEME HATASI öğrenci.numara = 100; // bu da DERLEME HATASI //... http://ddili.org 22

Nesne Yaşam Süreçleri Seçime bağlıdır: Çöp toplayıcı RAII Açıkça programcı tarafından http://ddili.org 23

Yapılar (struct) C++'takinden farklı olarak C köklerine çok daha yakındır. struct Nokta double x; double y; void yansıt() x = -x; y = -y; Değer türüdür. Normalde C++'taki gibi hemen sonlandırılır ama new ile oluşturulduğunda çöp toplayıcı tarafından da sonlandırılabilir. Nesne yönelimli programlamayı desteklemez. http://ddili.org 24

Sınıflar (class, interface) C++'taki struct ve class'a yakındır. interface Hayvan void ilerle(int mesafe); interface Şarkıcı string söyle(); class Kedi : Hayvan, Şarkıcı void ilerle(int mesafe) foreach (i; 0.. mesafe) writeln("tıpış"); string söyle() return "miyav"; Referans türüdür. Normalde çöp toplayıcı tarafından sonlandırılır ama scoped() ile oluşturulduğunda C++'taki gibi kapsamdan çıkılırken sonlandırılabilir. Nesne yönelimli olanaklar içindir; çoklu kalıtım yoktur ama birden fazla interface'ten türetilebilir. http://ddili.org 25

C dizilerinin bir eleştirisi: C Dizileri (?) C'de dizi hem vardır hem yoktur. Tek değişken göstergesi dizi yerine geçer. Bir gösterge ve bir uzunluk, anlaşmaya bağlı olarak dizi olarak kullanılır. Bazen değer türüdür (örneğin bir yapı üyesi olduğunda) Bazen referans türüdür (örneğin işlev parametresi olduğunda) Diziler üzerinde hiçbir işlem tanımlı değildir (belki memmove()). Örneğin eleman eklemek için realloc() ile açıkça yer ayırmak gerekebilir. Söz dizimi ters yüzdür char alan[1][2]; // 1 adet char[2] mi, 2 adet char[1] mi? printf("%zu", sizeof(alan[0])); // 1 mi yazar, 2 mi? (Neyse ki C++'ta std::vector var.) Daha fazla bilgi için bkz. Walter Bright'ın "C's Biggest Mistake" ("C'nin En Büyük Hatası") adlı makalesi. http://ddili.org 26

Sabit Uzunluklu Diziler Uzunluğu değiştirilemez. Değer türüdür. İndeks hatası derleme zamanında yakalanabilir. int[3] dizi= [ 10, 42, 100 ]; assert(dizi.length == 3); dizi[0] = 11; int a = dizi[5]; // derleme zamanı hatası Söz dizimi doğaldır: // Her zaman için Tür[uzunluk] char[2] dizi; // 2 adet char char[2][1] alan; writeln(alan[0].sizeof); // 1 adet char[2] // 2 yazar D zamanla güçlendiğinden şimdilik dilin iç olanağı olan diziler yakında kütüphane olanağı olacaklar. http://ddili.org 27

Dinamik Diziler Eleman adedi değişebilir. Referans türüdür. Ekleme işlemi için ~ işleci kullanılır int[] dizi= [ 10, 42, 100 ]; dizi.length += 10; assert(dizi.length == 13); dizi[0] = 11; int a = dizi[20]; // çalışma zamanı hatası dizi ~= 7; auto yenidizi = dizi ~ dizi; Aslında dilimlerle aynı şeydir. Daha fazla bilgi için bkz. Steven Schveighoffer'in "D Dilimleri" makalesi. http://ddili.org 28

Çok hızlı, çok kolay ve çok güvenli. Dilimler (Slices) int[] dizi = [ 10, 20, 30, 40 ]; int[] dilim = dizi[1..3]; // 20 ve 30 Bir dizginin palindrom olup olmadığını bildiren bir işlev: bool palindrom_mu(string dizgi) return ((dizgi.length < 2) ((dizgi[0] == dizgi[$-1]) && palindrom_mu(dizgi[1..$-1]))); unittest assert(palindrom_mu("abccba")); assert(!palindrom_mu("abca")); main'in parametrelerini işleyen bir program: void main(string[] parametreler) // Program ismini atla işle(parametreler[1..$]); http://ddili.org 29

Eşleme Tabloları (Associative Arrays) Çok hızlı bir hash table gerçekleştirmesidir. string'den string'e dönüştüren bir tablo: string[string] renkler = [ "red" : "kırmızı", "blue" : "mavi", "green" : "yeşil" ]; writeln(renkler["red"]); // 'kırmızı' yazar string'den double'a dönüştüren bir tablo: double[string] evrenselsabitler; evrenselsabitler["pi"] = 3.14; evrenselsabitler["e"] = 2.72; tohash() üye işlevini tanımlayan yapılar ve sınıflar da indeks türü olarak kullanılabilirler. Eskiden dilin iç olanağıydı; şimdi bütünüyle kütüphane olanağı. http://ddili.org 30

İşlev şablonları Şablonlar (Templates) auto min(soltür, SağTür)(SolTür soldaki, SağTür sağdaki) return sağdaki < soldaki? sağdaki : soldaki; Yapı ve sınıf şablonları struct Nokta(T = long, int boyut = 2) T[boyut] koordinatlar; void yansıt() foreach (ref koordinat; koordinatlar) koordinat = -koordinat; alias Nokta!(double, 3) Nokta3D; //... Nokta3D merkez; http://ddili.org 31

Türden Bağımsız Programlama Şablonlar çok güçlü ve çok kolay Şablon kısıtlamaları (C++0x'e giremeyen concepts olanağı) struct Eksili(T) if (isinputrange!t) //... static if çok kullanışlı void baytlarınıgöster(t)(ref T değişken) //... static if (isarray!t) writeln("elemanlar:"); //... //... static assert dile dahil static assert((t.sizeof % 4) == 0, "Türün büyüklüğü dördün katı olmalıdır"); http://ddili.org 32

Phobos: Standart Kütüphane Çok sayıda modül içeriyor; hâlâ gelişiyor std.algorithm: çok sayıda türden bağımsız algoritma std.range: aralıklar std.array: dizileri aralık olarak kullandıran olanaklar, vs. std.string: dizgi olanakları std.parallelism: koşut programlama std.concurrency: eş zamanlı programlama vs. Algoritmalarla toplulukları bir araya getirmek için aralık soyutlamasını kullanan ilk kütüphane http://ddili.org 33

Koşut İşlemler için std.parallelism Modülü Bağımsız işlemleri aynı anda işletmek için. Tek çekirdek üzerinde 4 saniye: auto öğrenciler = [ Öğrenci(1), Öğrenci(2), Öğrenci(3), Öğrenci(4) ]; foreach (öğrenci; öğrenciler) öğrenci.uzunbirişlem(); Dört çekirdek üzerinde 1 saniye: foreach (öğrenci; parallel(öğrenciler)) http://ddili.org 34

Eş Zamanlı Programlama Birbirine bağlı işlemleri aynı anda işletmek için (threads). En dertli programcılık sorunlarından birisidir. Verilerin doğrudan paylaşılmalarına dayanan eş zamanlı programlamada programın doğruluğunun kanıtlanamayacağı kanıtlanabilir. (Buna rağmen D bu yöntemi de destekler.) D bellek modelinde veriler normalde paylaşılamazlar (threadlocal). Yalnızca değişmez oldukları için immutable veriler ve açıkça shared ile işaretlenen veriler paylaşılabilirler. Veri paylaşımı için en güvenli yöntem mesajlaşmadır (messaging). std.concurrency modülü mesajlaşma yöntemini uygular. http://ddili.org 35

std.concurrency Modülü import std.stdio; import std.concurrency; void main() auto işçi = spawn(&işparçacığı); işçi.send(42); işçi.send("merhaba"); işçi.send(sonlan()); struct Sonlan void işparçacığı() bool tamam = false; while (!tamam) receive( (int mesaj) //..., (string mesaj) //..., (Sonlan mesaj) tamam = true; ); http://ddili.org 36

Aralıklar Algoritmalar bir kere yazılmalıdırlar ve her toplulukla o topluluğa en uygun biçimde işlemelidirler. Bunun için bir eleman erişimi soyutlaması gerekir. C++'ın STL'si çok güçlü bir soyutlamadır ama hem yeterli değildir hem de sorunları vardır: güvenlikten yoksunluk, kullanım güçlüğü, tanım güçlüğü, ve C++ diline fazla bağlılık. Andrei Alexandrescu aralık soyutlamasını "Eleman Erişimi Üzerine" adlı makalesinde ortaya atar. InputRange empty, front, popfront() (giriş aralığı) ForwardRange save() (ilerleme aralığı) BidirectionalRange RandomAccessRange (sonsuz) (çift uçlu aralık) (rastgele erişimli aralık) RandomAccessRange (sonlu) (rastgele erişimli aralık) http://ddili.org 37

Giriş Aralığı: InputRange Üç üye işlev herhangi bir türü giriş aralığı yapmaya yeter: empty: Aralık boş olduğunda true değerini vermelidir. front: Aralığın başındaki elemanı vermelidir. popfront(): Aralığı başından daraltmalıdır. [ 10, 11, 12 ] [ 11, 12 ] [ 12 ] [ ] struct FibonacciSerisi int baştaki = 0; int sonraki = 1; static immutable bool empty = false; // sonsuz aralık @property int front() const return baştaki; void popfront() int ikisonraki = baştaki + sonraki; baştaki = sonraki; sonraki = ikisonraki; http://ddili.org 38

InputRange Kullanım Örneği writeln(take(cycle(take(fibonacciserisi(), 5)), 20)); Çıktısı: [0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3, 0, 1, 1, 2, 3] Açık yazılımı: auto seri = FibonacciSerisi(); auto baştarafı = take(seri, 5); auto tekrarlanmışı = cycle(baştarafı); auto tekrarlanmışınınbaştarafı = take(tekrarlanmışı, 20); writeln(tekrarlanmışınınbaştarafı); Hepsi tembeldir. Asıl işlemler popfront() sırasında aralık baş tarafından daraltılırken halledilir. http://ddili.org 39

Aralık Kullanan Başka Bir Aralık struct Eksili(T) if (isinputrange!t) T aralık; this(t aralık) this.aralık = aralık; @property bool empty() return aralık.empty; @property auto front() return -aralık.front; void popfront() aralık.popfront(); static if (isforwardrange!t) Eksili!T save() return Eksili!T(aralık.save()); Eksili!T eksili(t)(t aralık) return Eksili!T(aralık); Çıktısı: writeln(eksili(take(fibonacciserisi(), 5))); [0, -1, -1, -2, -3] http://ddili.org 40

Sorular? http://ddili.org 41