İçeriğe geç

Kitaplar / Yöntem Birimler ve Araçlar Kılavuzu / 10. Araçlar

10. Araçlar

Araçlar JavaScript derleyicisinin yontem komutuyla gelir. Komutu kurmak için npm install -g yontem yazmanız yeterlidir (ayrıntıları Yöntem Kurulum Kılavuzu’nda bulabilirsiniz).

Yeni proje: yontem yeni

Terminal
yontem yeni hesap-defteri
cd hesap-defteri
yontem hesap-defteri.y
yontem test

Komut bir ana program, örnek bir birim, bir test ve bir BENIOKU.md içeren klasör oluşturur.

Test: yontem test

Yöntem’de test, çıktısı bilinen bir programdır. yontem test [klasör] her .y programını çalıştırır ve çıktıyı yanındaki aynı adlı .beklenen dosyasıyla karşılaştırır; fark varsa ilk farklı satırı gösterir. .beklenen yoksa programın hatasız bitmesi yeterlidir. .girdi dosyası varsa klavye girdisi olarak verilir.

Yöntem
program ToplaTesti
kullan Hesap                      { bir üst klasördeki Hesap.y birimi }

başla
  iddia(Topla(2, 3) = 5, 'Topla 2 + 3 için 5 vermeli')
  yaz(Topla(10, -4), 1)
bitir.

iddia(koşul, mesaj) koşul yanlışsa programı hatayla durdurur; test başarısız sayılır. Beklenen çıktıyı elle yazmak yerine yontem test --guncelle ile şimdiki çıktıdan üretebilirsiniz; üretilen dosyayı gözden geçirmenizi öneririz. testler/ klasöründeki programlar bir üst klasördeki birimleri kendiliğinden bulur. Aynı komut Python yorumlayıcısında da vardır: python3 yontem.py test.

Katı kip: {$katı} ve yontem denetle

Yöntem tipleri olağan durumda program çalışırken denetler: tamsayı bir değişkene metin atayan satır, ancak o satıra gelindiğinde hata verir. Dosyanın başına {$katı} yazarsanız aynı denetim derleme zamanında yapılır: program hiç çalışmadan, bütün tip hataları birden listelenir.

Yöntem
program Sepet
{$katı}

değişken
  adet: tamsayı
  fiyat: ondalık
  ürün := 'defter'

fonksiyon Tutar(adet: tamsayı; fiyat: ondalık): ondalık
başla
  dön adet * fiyat
bitir

başla
  adet := '3'
  fiyat := 12.5
  eğer adet ise yaz(ürün + ': ' + Tutar(fiyat, adet), 1)
  yaz(toplm, 1)
bitir.
Çıktı
Tip hatası [sepet.y, satır 15] 'adet' tamsayı tipinde; metin bir değer atanamaz
Tip hatası [sepet.y, satır 17] Koşul mantıksal olmalı, tamsayı verildi
Tip hatası [sepet.y, satır 17] 'Tutar' çağrısında 1. argüman tamsayı olmalı, ondalık verildi
Tip hatası [sepet.y, satır 18] Tanımsız tanımlayıcı: 'toplm'
4 tip hatası bulundu; program çalıştırılmadı.

Katı kipte şunlar derleme hatasıdır:

Listelerin ve sözlüklerin eleman tipini de bildirebilirsiniz; katı kip elemanları de denetler:

Yöntem
değişken
  notlar: tamsayı listesi
  yaşlar: tamsayı sözlüğü
  tablo: ondalık listesi listesi
  ad: metin
başla
  notlar := [70, 85, 'doksan']     { hata: metin bir eleman konamaz }
  notlar.Ekle(100)
  ad := notlar[0]                  { hata: 'ad' metin tipinde; tamsayı bir değer atanamaz }
  yaşlar['Ali'] := 'otuz'          { hata: metin bir eleman konamaz }

Eleman tipi atamada, Ekle çağrısında, liste[i] := değer atamasında, içindeki her döngüsünün değişkeninde ve parametrelerde denetlenir; diziler için eleman tipi başa yazılır: tamsayı dizisi, iç içe ondalık dizisi dizisi (dizisi ile listesi eş anlamlıdır). Eleman tipi yazılmamış düz bir liste her yere verilebilir ve çalışırken denetlenir.

Boyutu L.Uzunluk(12, 1) ile sabitlenen listeye Ekle ya da Sil uygulamak çalışma anında hata verir; bu denetim katı kipte de çalışma anında yapılır. Boyutu değişen veri için serbest liste kullanabilirsiniz; liste(L) serbest bir kopya verir.

Sınıf ve kayıt tipleri de izlenir. Tipi Daire olan bir değişkende olmayan bir alana ya da metoda erişmek (d.çap), bir alana uymayan değer atamak (d.yarıçap := 'iki'), bir metodu ya da kurucuyu eksik veya yanlış tipte argümanla çağırmak ve bir sınıfın nesnesini ilgisiz bir sınıfın değişkenine atamak derleme hatasıdır. Alt sınıfın nesnesi üst sınıf tipindeki değişkene atanabilir (şekil := daire); ama o değişken üzerinden yalnızca üst sınıfın üyelerine erişilir. Alt sınıfa özgü bir üyeye ulaşmak için değeri alt sınıf tipinde bir değişkene atayabilirsiniz.

Denetim, tipi derleme anında bilinen değerleri kapsar: sabitler, tipi bildirilmiş değişkenler, parametreler, alanlar ve elemanlar, dönüş tipi bildirilmiş fonksiyonlar ve metodlar, sonucu belli olan yerleşik işlevler (Uzunluk, Metin, Tamsayı, BüyükHarf, Ayır, İçerir gibi), Takvim, Desen, Güvenlik ve Ağ birimlerinin işlevleri (TarihYaz bir metin, GünFarkı bir tamsayı, Eşleşir bir mantıksal değer verir) ve bunlarla kurulan ifadeler. Yerleşik işlevler ve yerleşik birimlerin bütün işlevleri için argüman sayısı da denetlenir: TarihYap(2026, 1) derleme hatasıdır. Sonucu argümana göre değişen işlevler (Maks, Yuvarla, Bul) ile Pencere, Meşale gibi birimlerin döndürdüğü nesneler gibi tipi önceden bilinemeyen değerler eskisi gibi çalışırken denetlenir; katı kip çalışma zamanı denetimlerini kaldırmaz, onların önüne bir denetim daha koyar. Eleman tipi bildirimi yalnızca derleme zamanında denetlenir: çalışırken bir listeye konan elemanların tipine bakılmaz. Bir değişkeni bilerek her tipe açık bırakmak için tipini herhangi yazabilirsiniz.

Yönerge dosya başınadır: katı bir program katı olmayan birimleri kullanabilir, katı bir birimdeki hatalar onu kullanan program derlenirken bildirilir. Bütün projeyi katı yapmak için yontem.json dosyasına "kati": true eklemeniz yeterlidir (kurulan paketler bunun dışında kalır). Yönerge bir yorum olduğu için Python yorumlayıcısı onu görmezden gelir ve programı olağan kipte çalıştırır; derleme zamanı denetimi JavaScript derleyicisindedir.

Terminal
yontem denetle .            # programları çalıştırmadan derler, hataları listeler
yontem denetle . --kati     # yönergesi olmayan programları da katı kipte denetler

yontem denetle sürekli tümleştirmede ve bir projeyi katı kipe geçirmeden önce ne kadar iş çıkacağını görmek için kullanışlıdır. VS Code eklentisi katı dosyalardaki tip hatalarını yazarken gösterir.

Biçimlendirme: yontem bicimle

Terminal
yontem bicimle .             # klasördeki tüm .y dosyalarını düzenler
yontem bicimle . --denetle   # değiştirmeden, düzensiz dosyaları listeler

Biçimlendirici girintiyi programın yapısına göre yeniden kurar (düzey başına iki boşluk), satır sonu boşluklarını ve fazla boş satırları temizler. Yalnızca boşluklara dokunur: sözcükler, satır bölünmeleri ve yorumlar değişmez, bu yüzden programın anlamı değişemez. Çok satıra bölünmüş ifadelerde kendi hizalamanız korunur.

Hata ayıklama: yontem ayikla

Program beklediğiniz sonucu vermiyorsa araya yaz satırları eklemek yerine onu hata ayıklayıcıyla çalıştırabilirsiniz: program istediğiniz satırda durur, değişkenlerin o andaki değerlerine bakar, sonra satır satır ilerlersiniz. Örnek olarak notların ortalamasını bulan şu programı alalım:

Yöntem
program Ayıklama
{ Hata ayıklayıcıyı denemek için küçük bir program: notların ortalamasını bulur.
  Çalıştırmak için: yontem ayikla 07_ayiklama.y }

fonksiyon Ortalama(notlar: liste): ondalık
değişken
  toplam, n: tamsayı
başla
  toplam := 0
  notlar içindeki her n için
    toplam := toplam + n
  dön toplam / Uzunluk(notlar)
bitir

değişken
  notlar: liste
  ort: ondalık

başla
  notlar := [70, 85, 90]
  ort := Ortalama(notlar)
  yaz('Ortalama: ' + Yuvarla(ort, 1), 1)
bitir.

yontem ayikla 07_ayiklama.y programı ilk deyimde durdurur ve komut bekler. Aşağıdaki oturumda önce bir satır ilerliyor, sonra Ortalama fonksiyonunun içine giriyor, döngünün içine yalnızca n > 80 olduğunda duran bir kesme noktası koyuyor ve durduğu yerde değişkenlere bakıyoruz:

Çıktı
$ yontem ayikla 07_ayiklama.y
Yöntem hata ayıklayıcı — 07_ayiklama.y (komutlar için: yardım)
→   20    notlar := [70, 85, 90]
(ayıkla) sonraki
→   21    ort := Ortalama(notlar)
(ayıkla) adım
Ortalama içinde, 07_ayiklama.y:9
→    9    toplam := 0
(ayıkla) kes 11 eğer n > 80
Kesme noktası kondu: 07_ayiklama.y:11 (eğer n > 80)
(ayıkla) devam
Kesme noktası: 07_ayiklama.y:11
Ortalama içinde, 07_ayiklama.y:11
→●  11      toplam := toplam + n
(ayıkla) değişkenler
Ortalama:
  notlar = [70, 85, 90]
  sonuç = 0.0
  toplam = 70
  n = 85
Program:
  ort = 0.0
(ayıkla) yaz toplam + n
155
(ayıkla) yığın
→ #0  Ortalama  07_ayiklama.y:11
  #1  program Ayıklama  07_ayiklama.y:21
(ayıkla) sil 11
Kesme noktası kaldırıldı: 07_ayiklama.y:11
(ayıkla) çık
→   22    yaz('Ortalama: ' + Yuvarla(ort, 1), 1)
(ayıkla) yaz ort
81.66666666666667
(ayıkla) devam
Ortalama: 81.7
Program bitti (çıkış kodu 0).

Okun (→) gösterdiği satır henüz çalışmamıştır; sıradaki deyimdir. ● kesme noktasını gösterir.

Komut Ne yapar
adım (a) Sonraki deyime geçer; satırda bir çağrı varsa içine girer
sonraki (s) Sonraki satıra geçer; çağrıların içine girmez
çık (ç) Bulunulan alt programdan çıkana kadar çalışır
devam (d) Bir kesme noktasına ya da programın sonuna kadar çalışır
kes 12 (k) Kesme noktası koyar. Başka bir birimde: kes Birim:12. Koşullu: kes 12 eğer i > 3
sil 12 Kesme noktasını kaldırır; sil hepsi hepsini
yaz ifade (y) İfadeyi değerlendirir: y toplam * 2. Atama değişkeni değiştirir: y x := 5
değişkenler (dğ) Bulunulan alt programın, nesnenin ve programın değişkenlerini listeler
yığın (yğ) Buraya hangi çağrılarla gelindiğini gösterir; yukarı ve aşağı çağıranın değişkenlerine geçirir
liste (l) Çevredeki kaynak satırlarını gösterir
hatalar kapat Çalışma hatasında durmayı kapatır (hatalar aç geri açar)
bitir (q) Programı sonlandırır

Boş satır son adımlama komutunu yineler; komutlar Türkçe karaktersiz de yazılabilir (adim, cik, degiskenler). Program bir çalışma hatası verdiğinde ayıklayıcı hatanın oluştuğu satırda durur: değişkenler hâlâ yerindedir, hataya neyin yol açtığına bakabilirsiniz. Hata bir dene … yakala bloğunda yakalanacak olsa da durur; bunu istemiyorsanız hatalar kapat yazabilirsiniz. Programın oku çağrıları ile ayıklayıcı komutları aynı girdiyi paylaşır: program girdi beklerken yazdığınız satır programa gider.

Hata ayıklayıcı JavaScript derleyicisinin aracıdır; ayıklama kipinde derlenen program aynı çıktıyı verir, yalnızca biraz daha yavaş çalışır.

Paketler: yontem paket

Başkasının yazdığı birimleri projenize paket olarak kurarsınız. Paket, içinde birim dosyaları olan bir klasördür; merkezî bir paket deposu yoktur, paket bulunduğu yerden kurulur:

Terminal
yontem paket ekle github:kullanici/depo@v1.2.0     # GitHub deposu (etiket, dal ya da commit)
yontem paket ekle https://ornek.org/araclar.zip    # arşiv (.tar.gz, .zip) ya da tek .y dosyası
yontem paket ekle ../ortak-birimler                # yerel klasör

ekle paketi paketler/ klasörüne indirir ve iki dosyayı günceller. yontem.json projenizin bildirimidir: adı, sürümü ve doğrudan kullandığı paketler.

Çıktı
{
  "ad": "hesap",
  "surum": "0.1.0",
  "bagimliliklar": {
    "Selam": "github:kullanici/selam@v1.2.0"
  }
}

yontem.kilit.json ise kurulan her paketin (paketlerin kendi bağımlılıkları dahil) tam olarak nereden geldiğini ve içeriğinin SHA-256 özetini tutar. Kurulduktan sonra paketin birimleri kendi birimleriniz gibi kullanılır: kullan Selam. Program, bulunduğu klasörden yukarı doğru yontem.json içeren ilk klasörün paketlerini görür; birimler paketin kökünde ya da kutuphane/ klasöründe aranır. JavaScript derleyicisi ve Python yorumlayıcısı aynı kuralı uygular.

Komut Ne yapar
yontem paket ekle <kaynak> Paketi kurar ve yontem.json dosyasına yazar. Ad paketten gelir; --ad Ad ile değiştirilir
yontem paket kur yontem.json dosyasındaki paketleri kurar, içeriği kilit dosyasıyla doğrular
yontem paket kaldir <ad> Paketi ve başka hiçbir paketin istemediği bağımlılıklarını kaldırır
yontem paket guncelle [ad] Paketi (ya da hepsini) kaynağından yeniden indirir, kilit dosyasını yeniler
yontem paket liste Kurulu paketleri, sürümlerini ve sağladıkları birimleri gösterir

yontem.json ve yontem.kilit.json dosyalarını sürüm denetimine koymanızı, paketler/ klasörünü ise dışarıda bırakmanızı öneririz: projeyi alan kişi yontem paket kur ile aynı paketleri kurar. İndirilen içerik kilit dosyasındaki özetle aynı değilse kurulum durur; kaynağın değiştiğini siz guncelle ile onaylamadıkça yeni içerik projenize girmez. Bu yüzden kaynağı dal adıyla değil etiketle (@v1.2.0) vermek en sağlıklısıdır.

Kurulum yalnızca dosya kopyalar, paketteki hiçbir kod kurulurken çalışmaz; arşivlerde klasör dışına çıkan yollar reddedilir ve indirme yalnızca HTTPS ile yapılır. Yine de paket, programınızla birlikte çalışacak koddur: güvenmediğiniz bir kaynaktan paket kurmamanızı, kurduğunuz paketin birimlerini de okumanızı öneririz.

Kendi paketinizi yayımlamak için birimlerinizi bir Git deposunun köküne (ya da kutuphane/ klasörüne) koyup sürümü etiketlemeniz yeterlidir. Depoya bir yontem.json eklerseniz paketin adı ve sürümü oradan okunur; paketiniz başka paketlere dayanıyorsa bagimliliklar altında yazdıklarınız onu kuranlara kendiliğinden kurulur. İki paket aynı adlı paketi farklı kaynaklardan isterse kurulum durur ve hangisini seçeceğinizi sorar.

Paketleme: yontem paketle, yontem derle, yontem gomulu

Komut Ürettiği
yontem paketle program.y [--mobil] [--ad "Ad"] Pencere/Mobil programından web uygulaması; --mobil ile telefona kurulabilir
yontem derle program.y -o program.js Node.js ile çalışan JavaScript dosyası
yontem gomulu program.y ESP32 için Arduino/PlatformIO projesi

VS Code eklentisi

Depodaki araclar/vscode/yontem-dili-0.6.0.vsix dosyasını code --install-extension ile ya da Eklentiler → VSIX’ten Yükle ile kurabilirsiniz. Eklenti sözdizimini renklendirir, eğer, için, fonksiyon, sınıf gibi kod parçacıkları sunar, F5 ile etkin programı çalıştırır ve Belgeyi Biçimlendir (Shift+Alt+F) komutunu yontem bicimle’ye bağlar. Yazarken sözdizimi hatalarını ve bulunamayan birimleri altını çizerek gösterir, hiçbir yerde tanımlı olmayan adlar için yazım hatası uyarısı verir; dosyadaki adları, kullanılan birimlerin üyelerini ve yerleşikleri tamamlar (Güvenlik. yazınca yalnızca o birimin üyeleri gelir); bir adın üzerine gelince imzasını gösterir ve F12 ile tanımına gider.

Hata ayıklayıcı da eklentidedir: satır numarasının soluna tıklayarak kesme noktası koyabilir, F6 ile (ya da Çalıştır ve Hata Ayıkla panelinden) ayıklamayı başlatabilirsiniz. Program kesme noktasında durduğunda değişkenler, çağrı yığını ve izleme ifadeleri yan panelde görünür; listeler, sözlükler ve nesneler açılarak incelenir, adımlama düğmeleri adım, sonraki ve çık komutlarının karşılığıdır. Kesme noktasına sağ tıklayıp koşul yazabilirsiniz. VS Code’da programın oku çağrıları klavyeden okuyamaz; girdi gerekiyorsa launch.json içinde "girdi": "girdi.txt" ile bir dosya verebilirsiniz.

yontem komutu PATH’te değilse eklentinin yontem.komut ayarına tam komutu yazabilirsiniz.

Başka düzenleyiciler: yontem dil-sunucusu

Aynı özellikler bir dil sunucusu olarak da sunulur. Language Server Protocol destekleyen düzenleyicilerde (Neovim, Helix, Emacs, Sublime Text…) .y dosyaları için sunucu komutu olarak yontem dil-sunucusu (kısa adı yontem lsp) vermeniz yeterlidir; sunucu standart girdi ve çıktı üzerinden konuşur.