Thread overview
Birden fazla D dosyası nasıl derlenir?
Jun 05, 2022
Salih Dincer
Jun 05, 2022
Ali Çehreli
Jun 06, 2022
Salih Dincer
June 05, 2022

Merhaba,

Çok teknik/ürküten bir makale olmasın istedim. Olaya insancıl noktalardan yaklaşıp yeni başlayanlara bırakın D'yi programlamaya başlamanın (yani basit bir şekilde Merhaba Dünya yazmanın veya kapsamlı dosyalar ile çalışmanın) hiç de o kadar zor olmadığını göstermek istedim. Hatta bir iddiam/amacım:

Diğer dillerden en kolayı D'dir. Kolaylıklar ile doludur, insanı çoşturur ve verimli bir kodlama imkanı sağlar mesajlarını vermekti. Bilmiyorum ne kadar başarılı oldum. Tamamlayınca daha iyi hale gelecektir.


BU MAKALE BİR TASLAKTIR (Henüz Tamamlanmadı)

Birden fazla D dosyası nasıl derlenir? (+bonus: UFCS)

Öncelikle, halihazırda D’nin kendi paket yöneticisi DUB, zaten vardır. Üstelik gönüllüler tarafından her gün geliştirilen irili ufaklı kütüphanler ile yaşayan bir ağaçtır; kökleri, ana kütüphane Phobos’u bile aşan... (-bknz. https://code.dlang.org/)

İnsan tarafından rahatlıkla okunabilen JSON ile yönetilir ve GitHub’a benzeyen komutlarıyla, hatta çoğu zaman Git CLI komutlarından daha basit şekilde kullanılır. Eğer bu konuyla da tanışmak ve daha çok bilgi sahibi olmak isterseniz Zafer Çelenk’in şu makalesinden faydalanabilirsiniz: http://ddili.org/makale/dub_tanisma.html

Ancak her şey, JSON biçiminden de kolaydır (-bknz. https://en.wikipedia.org/wiki/Human-readable_medium/ ) ve evet, yine bir sürü parametre ve birçok özellik zaten vardır. Ama bunları isterseniz kullanırsınız. Tek ihtiyacınız olan derleyici DMD’ye sahip olmak ve biraz D programlamayı bilmek.

Başlıyoruz...

İlk Öğrenecemiz Parametre: dmd -run dosyaismi (uzantısını yazmasanız da olur!)

D, derlenebilen geleceğin favori programlama dilidir: O yüzden Java ve Python’dan keskin bir şekilde ayrılır. Ama hepsinden kolay anlaşılabilen bir dil olduğu için burdasınız. Üstelik ECMAScript ile uyumlu JS gibi dillerden geldiği için benzerlikleri de çoktur. Eğer siz isterseniz C++ kadar kapsamlı (ama karışık değil, düzenli) özelliklere de sahiptir. Ama istemezseniz basit birkaç bilgi ile D’yi hiçbir dilin taahhüt edemeyeceği şekilde kullanabilirsiniz. Örneğin hızlıca kullanmak için dmd -run parametresi ile tıpkı bir Pyhon scripti çalıştırır gibi deneyin lütfen!

Şu klasik kod ile başlayabilirsiniz:
(deneme.d dosyasının içi)

import std.stdio;

void main() {
  "Merhaba".writeln;
  "Dünya".write('!');
  writeln;
}

Çoklu dosyayı derlemeye geçmeden önce, birkaç yeni bir şey öğrenelim. Örneğin her yerde karşınızı çıkacak UFCS olayları:

UFCS: (-bknz. https://en.wikipedia.org/wiki/Uniform_Function_Call_Syntax/ )

Sonra ayrıntısına değineceğimiz UFCS destekli bir dile sahip olduğumuz için nokta (.) işaretini ve gerekirse () parantez aç/kapaları özgürce kullanabilirsiniz. Yani writeln(), diğer birçok dilde olduğu gibi ekrana yazan işlevsel ve kullanımı kolay bir işlev/fonksiyon. Ama onu ve dildeki bütün olanakları, dilerseniz tıpkı bir tesisat borusu gibi maşonlarla birleştirip (yani maşon == nokta) öncesinden parametre veya başka nesnenin çıktısını iletebilirsiniz. Tıpkı C ve türevlerinde olduğu gibi nesnenin alt elemanlarına erişmek gibi. Bunu modüller arası ayraç olarak da kullanacağız.

Bildiğiniz gibi tarihler ve birçok şeyi, / işareti (Türkçe’de bölü, taksim veya İngilizce’de slash olarak isimlendirilir) ile ayrılır. Biz bunu programlamada ve dosyalarda (özellikle Linux’da) çok kullanırız. Örneğin abc bir dizin/directory olsun bunun altındaki bir dosyayı kopyalamak/erişmek için şunu yaparız:

>

cp ./abc/deneme.d .
(cp, bir Linux komutudur, başka bir dilde copy veya başka kuralları olabilir)

D’de ise harici bir dosyayı içe aktarırken (hatırlayalım, örneğimizde std.stdio idi) import ile derleyeceğimiz dosyaya dahil ederiz. Bu C’deki #include ile tamamen aynıdır. Tek farkı, std kapsamındaki stdio’ya doğru bir şekilde erişebilimesi için nokta kullanmamızdır. Bunu module için de uygularız.

Peki modül(module) nedir?

D modülleri, çoğu zaman birbirinden bağımsızken, dilersek public import’lar ile birbirilerini etkiliyecek şekilde kullanabileceğimiz D kodu içeren dosyalardır. Yani main() dışındaki alanı ifade eder ve sadece bir tanesinde örneğin void main() {} bloğu olabilir. Tek bir dosyada veya başka bir modülde ikinci bir main/ana fonksiyonu olmaz. Zaten benzersiz/tek olan bu ifadeyi, temel programlama derslerinde, programın çalışmaya başlayacağı orijin nokta olarak bilmekteyiz.

Modüller neden varlardır?

Cevap vermeden önce, dileseydik olmayabilirler miydi diye sorsak? Evet, yani main() dışında ve aynı dosya içinde, sınıf/yapılar veya hiçbir nesneye bağlı olmayan serbest işlevler özgürce bulundurulabilir. Ancak yazılan program büyüdükçe bunları bölme ihtiyacı hissedildiği için kaynak dosyanın parçaları halinde modüller olmak zorundadır. Tabi hiç gerekmese bile, klasik Merhaba Dünya’yı şu şekilde de derleyebilirdik:

(merhaba.d dosyasının içi)

module merhaba;

auto selamla() {
  return Merhaba";
}

(deneme.d dosyasının içi)

import std.stdio, merhaba;

void main() {
  selamla().writeln(" Dünya!");
}
>

dmd deneme.d merhaba.d

Farkettiyseniz modül ismi küçük ve Türkçe harf veya – (tire) işareti gibi özel karakter içermeyecek şekilde yazılmakta. Ayrıca dosya isminin uzantısı olmadan aynı şekilde geçirilmiştir. Bunun teknik olarak işletim sistemi/dosya sistemi uyumluluğu gibi bir çok nedeni vardır. Her ne kadar D programlama dili, Türkçe karakter yazımını desteklese de bunu, module/import tanımlarken yapamıyoruz.

Ayrınca -run parametresini (çalışmayacağından) kullanmadık çünkü henüz package.d şekilde kütüphane paketlemeyi öğrenmedik. Sonraki bölümde asıl kolaylığı göreceğiz. Ama yukarda yazıldığı şekilde ve kolaylıkla (hatta uzantılarını yazmasanız bile) derleyebilirsiniz.

Terminal/konsol çıktıları, Linux'da ./deneme veya Windows'da deneme yazarak sırayla şu şekilde görünecektir:

Tek Dosya:

>

Merhaba
Dünya!

Modüler Olan:

>

Merhaba Dünya!


BU MAKALE BİR TASLAKTIR (Henüz Tamamlanmadı)

June 05, 2022
On 6/5/22 03:19, Salih Dincer wrote:

> Üstelik ECMAScript ile uyumlu JS gibi
> dillerden geldiği için benzerlikleri de çoktur.

Daha önce de söyledin. Onu yalnızca senden duyduğum için doğru olmadığını düşünüyorum. Benim bildiğim, D'nin en yakın olduğu dil C'dir. Bir kaynak olarak "Origins of the D Programming Language"i gösterebilirim.

Şurada duyurulmuştu:

  https://forum.dlang.org/post/rc1gd8$6gv$1@digitalmars.com

PDF olarak şurada:

  https://dl.acm.org/doi/pdf/10.1145/3386323

ECMAScript ile gerçekten bir ilgisi varsa bilmek isterim. :)

> `import` ile derleyeceğimiz dosyaya dahil ederiz. Bu
> C’deki #include ile tamamen aynıdır.

Hiç de tamamen aynı değildir. :) #include, kodun metin olarak işlenmesi ve ondan sonra olduğu gibi dahil edilmesidir. import ise modülü D kodu olarak tarar ve gerektiği kadarını derler.

> *BU MAKALE BİR TASLAKTIR (Henüz Tamamlanmadı)*

Güzel! :)

Ali

June 06, 2022

On Sunday, 5 June 2022 at 13:45:28 UTC, Ali Çehreli wrote:

>

On 6/5/22 03:19, Salih Dincer wrote:

>

Üstelik ECMAScript ile uyumlu JS gibi
dillerden geldiği için benzerlikleri de çoktur.

Daha önce de söyledin. Onu yalnızca senden duyduğum için doğru olmadığını düşünüyorum. Benim bildiğim, D'nin en yakın olduğu dil C'dir. Bir kaynak olarak "Origins of the D Programming Language"i gösterebilirim.

Şurada duyurulmuştu:

https://forum.dlang.org/post/rc1gd8$6gv$1@digitalmars.com

PDF olarak şurada:

https://dl.acm.org/doi/pdf/10.1145/3386323

ECMAScript ile gerçekten bir ilgisi varsa bilmek isterim. :)

Aslında söylediklerimin bir önemi yok çünkü bir otoriteyi temsil etmiyorum!

Ama dediğim gibi, benzerlikleri var ve sonuçta bu uluslararası bir standart. Yani sonuçta bir dil değil ve onu temel aldığını iddia etmiyorum. JS ise yüksek yoğunlukla ES.next'i takip edebildiği kadarıyla ediyor. Yorumlayıcıları yavaş kaldığı yerde Babel devreye giriyor. Neyse bir gün ayrı bir başlıkta bunu tartışmaya açarız. Çünkü çok farklı konulara girmiş oldum.

Ancak şöyle demeliydim belki:

>

D Programlama Dili, v2.1.0'dan itibaren *ES7'nin belirlediği birçok özelliğin benzer karşılığı vardır. Hatta sözleşmeli programlama, çoklu iş parçacıkları ile birlikte son standartlarda belirlenen şeyleri de içerir. JS ve Java'ya aşina iseniz D'ye yabancılık çekmeyeceksiniz!

Dip Not: ES8'den itibaren async/await geldiğinden böyle demek zorundayız. Çünkü hala D'de bu özellik kanayan yara...