Bölüm 4.3: Programlamaya Giriş

Bilgisayar ve Programlamaya Giriş
DillerÇeviriProblem çözmeYazılım süreciTemel yapılar
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Öğrenme Çıktıları

Kavramlar

Kaynak kod, makine dili ve programlama dilini ayırt etmek.

Çalıştırma

Derleme, yorumlama ve hibrit çalışma biçimlerini açıklamak.

Problem çözme

Algoritmadan programa giden süreci kurmak.

Yapılar

Değişken, karar, döngü, fonksiyon ve diziyi tanımak.

Temel Kavramlar

Programlama Dili Nedir?

  • İnsanların bilgisayara işlem adımlarını ifade etmesini sağlayan biçimsel bir dildir.
  • Söz dizimi (syntax) hangi yapıların yazılabileceğini, anlam (semantics) bu yapıların ne yaptığını belirler.
  • Aynı problem farklı dillerle çözülebilir; seçim gereksinim ve ortama bağlıdır.
Algoritma: a ile b'yi topla, yazJavaSystem.out.println(a + b);Pythonprint(a + b)Cprintf("%d", a + b);Çıktı: 8a = 3, b = 5 için

Temel Kavramlar

Kaynak Kod ve Makine Dili

Kaynak kodinsan okur, yazartoplam = a + b;derleyici çevirirAssemblykomutların simgesel adıLOAD R1, a · ADD R1, b · STORE R1, toplamassembler çevirirMakine diliişlemci çalıştırır (ikili)0001 0001 1000 · 0011 0001 1001 · 0010 0001 1010Makine kodu örnektir (gerçek kodlama işlemciye göre değişir).
  • Kaynak kod geliştiricinin okuyup değiştirebildiği program metnidir; makine dili işlemcinin çalıştırdığı ikili komutlardır.
  • Derleyici veya yorumlayıcı aradaki köprüyü kurar: programlama dili ile işlemci dili aynı şey değildir.

Çalıştırma · Adım adım

Program Nasıl Çalışır?

Kaynak kodTopla.javaÇeviriderleyiciMakine / ara kodTopla.classÇalıştırmaişlemci / JVMÇıktı8

Programcı kaynak kodu bir metin dosyasına yazar. Bilgisayar bu metni doğrudan çalıştıramaz.

Kaynak kodTopla.javaÇeviriderleyiciMakine / ara kodTopla.classÇalıştırmaişlemci / JVMÇıktı8✗ derleme hatası

Çeviri: derleyici söz dizimini denetler. Noktalı virgül unutulursa derleme hatası burada çıkar, program hiç çalışmaz.

Kaynak kodTopla.javaÇeviriderleyiciMakine / ara kodTopla.classÇalıştırmaişlemci / JVMÇıktı8

Hata yoksa makine kodu ya da Java'da olduğu gibi ara kod (bytecode) üretilir.

Kaynak kodTopla.javaÇeviriderleyiciMakine / ara kodTopla.classÇalıştırmaişlemci / JVMÇıktı8✗ çalışma zamanı hatası

Çalıştırma: komutlar işlemcide (Java'da JVM üzerinden) yürütülür. 0'a bölme gibi çalışma zamanı hataları burada ortaya çıkar.

Kaynak kodTopla.javaÇeviriderleyiciMakine / ara kodTopla.classÇalıştırmaişlemci / JVMÇıktı8

Çıktı, verilen girdiye (a = 3, b = 5) ve program mantığına bağlıdır. Mantık hatası varsa program çalışır ama yanlış sonuç verir.

Hata türleri: derleme (söz dizimi kuralı), çalışma zamanı (yürütme sırasında), mantık (yanlış sonuç).

Çalıştırma

Çalıştırma Yaklaşımları

YaklaşımİşleyişÖrnek
DerlenenProgram önceden hedef makine koduna çevrilirC, C++, Rust
YorumlananKomutlar çalışma sırasında değerlendirilirPython, JavaScript
HibritAra kod sanal makinede yürütülürJava, C#
Derlenenkaynak.cderleyiciprogram.exeişlemciYorumlanankaynak.pyyorumlayıcıişlemciHibrit (Java)Topla.javajavacTopla.classJVMişlemcituruncu: çeviri aracı

Çalıştırma · Adım adım

Derleyici ve Yorumlayıcı Adım Adım

Derleyici: önce tümü çevrilir, sonra çalışır1yaz "Merhaba"çevriliyor2x ← 10çevriliyor3yaz x / 0çevriliyorkonsol

Derleyici programın tamamını baştan sona okur; henüz hiçbir satır çalışmadı.

Derleyici: önce tümü çevrilir, sonra çalışır1yaz "Merhaba"✓2x ← 10✓3yaz x / 0✓konsol

Satır 3'teki 0'a bölme söz dizimi hatası değildir; çeviri başarılı olur ve çalıştırılabilir dosya üretilir.

Derleyici: önce tümü çevrilir, sonra çalışır1yaz "Merhaba"▶ çalışıyor2x ← 10✓3yaz x / 0✓konsolMerhaba

Şimdi çalıştırma başlar: satır 1 → çıktı Merhaba.

Derleyici: önce tümü çevrilir, sonra çalışır1yaz "Merhaba"✓2x ← 10✓3yaz x / 0✗ hatakonsolMerhabaHATA

Satır 3 çalışırken çalışma zamanı hatası (0'a bölme). Derleyicinin ayıklayamadığı hata türü.

Yorumlayıcı: satır satır çevir ve çalıştır1yaz "Merhaba"▶ çalışıyor2x ← 103yaz x / 0konsolMerhaba

Yorumlayıcı ise çevir-çalıştır döngüsüyle ilerler: satır 1 çevrilir ve hemen çalışır → Merhaba.

Yorumlayıcı: satır satır çevir ve çalıştır1yaz "Merhaba"✓2x ← 10▶ çalışıyor3yaz x / 0konsolMerhaba

Satır 2 çevrilip çalışır: x = 10. Satır 3 henüz hiç okunmadı.

Yorumlayıcı: satır satır çevir ve çalıştır1yaz "Merhaba"✓2x ← 10✓3yaz x / 0✗ hatakonsolMerhabaHATA

Satır 3'e gelince hata. Önceki satırlar çoktan çalışmıştı. Basit, satır satır çalışan bir yorumlayıcıda bu hata da ancak o satıra gelince fark edilirdi.

Derleyici söz dizimi hatalarını program çalışmadan önce yakalar; yorumlayıcı hemen başlar; hatayı (basit yorumlayıcılarda) o satıra gelince görür. Python ve JavaScript gibi modern yorumlayıcılar önce tüm dosyayı ayrıştırır ve söz dizimi hatasını en başta bildirir; Python ayrıca bytecode'a derler.

Çalıştırma

Python Neden “Yorumlanan” Denir?

Kaynak kod (.py)
Bytecode
(derleme)
Sanal makine
(yürütme)
  • CPython önce kaynak kodu bytecode’a derler, sonra bunu bir sanal makinede komut komut yürütür; makine kodu dosyası üretilmez.
  • “Yorumlanan” etiketi bu yürütme biçiminden gelir; derleme adımı programcıdan gizlidir.
  • Modern JavaScript motorları (ör. V8) JIT kullanır: sık çalışan kodu çalışma sırasında makine koduna çevirir.
JavaScript motoru (ör. V8): önce yorumlar, sık çalışan kısmı JIT ile makine koduna çevirirKaynak kod.jsYorumlayıcıkomut komut yürütürsık çalışan kısımJIT derleyiciçalışırken çevirirMakine kodudoğrudan CPU'daSonraki çağrılarda yorumlama atlanır; program çalıştıkça hızlanır.
Derlenen / yorumlanan ayrımı dilin değil, uygulamanın özelliğidir; pratikte çoğu sistem iki yöntemi birleştirir.

Çalıştırma · Adım adım

Derleyicinin Aşamaları

SözcükçözümlemeSöz dizimiçözümlemeAnlamçözümlemeAra kod veiyileştirmeKodüretimiKaynak satır:alan = en * boy + 2;alantanımlayıcı=işleçentanımlayıcı*işleçboytanımlayıcı+işleç2sabit değer;ayırıcıboşluklar atıldı · 8 belirteç · her belirtecin türü belli

Sözcük çözümleme: karakter dizisi anlamlı parçalara, belirteçlere ayrılır; boşluklar ve açıklamalar atılır. # gibi dilde olmayan bir karakter ya da kapanmamış bir dizgi burada fark edilir.

SözcükçözümlemeSöz dizimiçözümlemeAnlamçözümlemeAra kod veiyileştirmeKodüretimi=alan+*2enboy* daha derinde:önce hesaplanırağacın kökü: atama

Söz dizimi çözümleme: belirteçler dilin kurallarına göre bir söz dizimi ağacına dizilir. Eksik ; veya kapanmamış parantez bu aşamada yakalanır.

SözcükçözümlemeSöz dizimiçözümlemeAnlamçözümlemeAra kod veiyileştirmeKodüretimien→ tanımlı · tip int ✓boy→ tanımlı · tip int ✓en * boy + 2→ int × int + int → int ✓alan ← int→ alan int: tipler uyumlu ✓boy hiç bildirilmeseydi → error: cannot find symbol

Anlam çözümleme: adların bildirilip bildirilmediği ve tiplerin uyumu denetlenir. Tanımsız değişken ve tip uyuşmazlığı burada bulunur.

SözcükçözümlemeSöz dizimiçözümlemeAnlamçözümlemeAra kod veiyileştirmeKodüretimiüç adresli ara kodt1 = en * boyt2 = t1 + 2alan = t2iyileştirme örneğien = 3, boy = 4 sabitse:alan = 14çalışmadan önce hesaplandısabit katlama: sonucu değişmeyen işlemler derleme sırasında yapılır

Ara kod ve iyileştirme: ifade, her biri tek işlem yapan basit komutlara bölünür; gereksiz işlemler atılır, sabit ifadeler önceden hesaplanır.

SözcükçözümlemeSöz dizimiçözümlemeAnlamçözümlemeAra kod veiyileştirmeKodüretimihedef işlemcinin komutlarıLOAD R1, enMUL R1, boyADD R1, #2STORE R1, alanikiliyemakine kodu0001 0001 1000 …javac ise bytecode üretir:iload iload imul iconst_2 iadd istore

Kod üretimi: hedef işlemcinin komutları seçilir ve ikiliye çevrilir. Java derleyicisinin hedefi gerçek bir işlemci değil, JVM'dir.

İlk üç aşama hata arar ve hatayı satır numarasıyla bildirir; son iki aşama çalışacak kodu üretir. 0'a bölme gibi değere bağlı hatalar hiçbir aşamada görünmez.

Çalıştırma

Bağlayıcı ve Yükleyici

main.chesap.cderleyiciher dosya ayrımain.ohesap.okütüphanehazır derlenmiş kodbağlayıcıprogram.exeyükleyici (işletim sist.)bellek → işlemcinesne dosyaları (.o / .obj) tek başına çalışmaz
  • Büyük programlar birçok kaynak dosyadan oluşur; derleyici her birini ayrı bir nesne dosyasına çevirir.
  • Bağlayıcı (linker) nesne dosyalarını ve kullanılan kütüphane kodunu tek bir çalıştırılabilir dosyada birleştirir. Çağrılan bir fonksiyon hiçbir parçada yoksa bağlama hatası verir.
  • Yükleyici (loader) işletim sisteminin parçasıdır: dosyayı belleğe alır, paylaşılan kütüphaneleri (.dll, .so) bağlar ve ilk komuttan çalıştırmayı başlatır.
  • Java'da ayrı bir bağlama adımı yoktur: JVM'nin sınıf yükleyicisi .class dosyalarını gerektiği anda yükler.

Çalıştırma

Derleme mi Yorumlama mı?

ÖlçütDerlenen (C)Yorumlanan (Python)Hibrit (Java)
Çalışma hızıGenellikle en hızlı: doğrudan makine koduDaha yavaş: komutlar çalışırken çözülürJIT sayesinde derlenene yakın
Hata bildirimiSöz dizimi ve tip hataları çalıştırmadan önceTip hataları çoğunlukla ancak o satır çalışıncaÇoğu derlemede, kalanı çalışırken
DağıtımHer işletim sistemi ve işlemci için ayrı dosyaKaynak kod + hedefte kurulu yorumlayıcıTek .class / .jar + her platformda JVM
Geliştirme döngüsüHer değişiklikten sonra yeniden derlemeKaydet ve hemen çalıştırDerle, sonra çalıştır
BaşlangıçHemen başlar, ek yazılım gerekmezÖnce yorumlayıcı yüklenirÖnce JVM başlatılır
Seçim bir değiş tokuştur: hız ve erken hata denetimi bir yanda, hızlı deneme ve esneklik öbür yanda. Bu yüzden aynı dil için hem derleyici hem yorumlayıcı yazılabilir.

Diller

Programlama Dillerinin Düzeyi

Makine dili10110000 01100001AssemblyMOV AL, 61hCx = x + 1;Java, C#System.out.println(x);Pythonprint(x)soyutlama artar, insan diline yaklaşır →← donanıma yakınlık, ayrıntılı denetim
  • Düşük düzeyli diller donanıma yakındır; yüksek düzeyli diller problemi insanın ifade biçimine yakın yazdırır.
  • Düzey, bir dilin iyi veya kötü olduğunu değil, soyutlama düzeyini anlatır.

Diller

Programlama Dillerinin Gelişimi

19501960197019801990200020102020Assembly1949FORTRAN1957COBOL1959BASIC1964C1972C++1983Python1991Java, JavaScript1995C#2000Go2009Rust 1.02015
1940–1960

Makine dili, assembly; ilk yüksek düzeyli diller FORTRAN ve COBOL.

1970–1990

C ile yapısal ve taşınabilir sistem programlama; C++ ile nesne yönelimli yaklaşım.

1990 sonrası

Python, Java, JavaScript, C#: web, yönetilen ortamlar, açık kaynak ekosistemleri.

Diller

Kullanım Alanları

Web

İstemci, sunucu ve web servisleri.

Mobil

Telefon ve tablet uygulamaları.

Veri ve yapay zekâ

Analiz, modelleme ve otomasyon.

Sistem

İşletim sistemi, sürücü ve gömülü yazılım.

Bilimsel hesaplama

Simülasyon ve mühendislik çözümleri.

Oyun

Oyun motoru, grafik ve etkileşim.

Diller

Dil Türleri

Genel amaçlı

Her tür problem için değişken, karar, döngü ve fonksiyon sunar: Java, C, Python.

for (int i = 0; i < 3; i++)
Alana özgü

Tek bir işe odaklanır: SQL veri tabanını sorgular, Excel formülü hücrede hesap yapar.

SELECT ad FROM ogrenci WHERE ort >= 60;
Betik dilleri

Tekrarlanan işleri otomatikleştirir, genellikle yorumlanır: Python, JavaScript, Bash, PowerShell.

Copy-Item *.txt yedek\
İşaretleme dilleri

HTML, XML ve Markdown içeriğin yapısını tanımlar; karar ve döngü olmadığından programlama dili sayılmaz.

<h1>Başlık</h1>

Scratch gibi blok tabanlı görsel diller komutları sürüklenen bloklarla kurar; söz dizimi hatası yapılamadığından programlamayı öğretmek için kullanılır.

Diller

Programlama Paradigmaları

  • Buyurgan yaklaşım (imperative) işlemlerin nasıl yapılacağını adım adım belirtir.
  • Nesne yönelimli yaklaşım veri ve davranışı nesnelerde birleştirir.
  • Fonksiyonel yaklaşım dönüşümleri ve değiştirilemez veriyi öne çıkarır.
  • Java birden fazla yaklaşımı birlikte kullanabilir.
Aynı görev, üç yaklaşım: notlar = {70, 90, 80} dizisinin toplamı (240)BuyurganNesne yönelimliFonksiyonelint toplam = 0;for (int n : notlar) toplam += n;toplam: 0 → 70 → 160 → 240durum adım adım değişirogrenci : Ogrencinotlar = {70, 90, 80}toplam() → 240ogrenci.toplam()veri ve davranış bir arada{70, 90, 80}topla240Arrays.stream(notlar).sum()dönüşüm; dizi değişmez

Diller

Dil Seçerken

  • Problem alanı ve kullanılacak platform değerlendirilir.
  • Kütüphane ekosistemi, topluluk ve bakım maliyeti dikkate alınır.
  • Performans, güvenlik, ekip deneyimi ve dağıtım koşulları birlikte düşünülür.
Problem alanı / platformSık seçilen dillerWeb arayüzü (tarayıcı)JavaScript, TypeScriptAndroid uygulamasıKotlin, JavaiOS uygulamasıSwiftVeri analizi, yapay zekâPython, RGömülü sistem, sürücüC, C++, RustKurumsal sunucuJava, C#, GoSon kararı kütüphane ekosistemi, performans, güvenlik, ekip deneyimi ve bakım maliyeti verir.
Popülerlik tek başına doğru dil seçimi için yeterli değildir.

Diller

Statik ve Dinamik Tipleme

Java: statik

int x = 5;
x = "beş";   // derlenmez
error: incompatible types:
String cannot be converted to int

Python: dinamik

x = 5
x = "beş"    # geçerli
print("a" + 1)
TypeError: can only concatenate
str (not "int") to str
  • Statik tiplemede değişkenin tipi kaynakta bildirilir ve derleme sırasında denetlenir: Java, C, C#. Hata program hiç çalışmadan bulunur.
  • Dinamik tiplemede tip değerle birlikte taşınır ve çalışırken denetlenir: Python, JavaScript. Aynı ad önce sayı, sonra metin tutabilir; Python'daki hata ancak o satır çalışınca çıkar.
  • Bazı diller tipleri sessizce dönüştürür: JavaScript'te "5" * 2 → 10, ama "5" + 2 → "52".

Diller

Sözde Koddan Dillere

Sözde kodJavaPython
oku xx = giris.nextInt();x = int(input())
yaz "Toplam: ", tSystem.out.println("Toplam: " + t);print("Toplam:", t)
x ← x + 1x = x + 1;x = x + 1
eğer x > 0 ise … değilse …if (x > 0) { … } else { … }if x > 0: … else: …
her i ← 1 … n içinfor (int i = 1; i <= n; i++)for i in range(1, n + 1):
koşul doğru iken tekrarlawhile (kosul) { … }while kosul:
  • Java blokları süslü parantezle, Python ise girintiyle belirler; Python'da yanlış girinti programın anlamını değiştirir.
  • Java her deyimi ; ile bitirir ve değişkenin tipini bildirmeyi ister; Python ikisini de istemez.
  • Sözde kodda atama için ← kullanılır; böylece eşitlik karşılaştırmasıyla karışmaz. Java'daki giris klavyeden okuyan bir Scanner nesnesidir.

Problem Çözme · Adım adım

Problemden Programa

Problemi tanımlaGirdi: en, boyÇıktı: alanKısıt: en, boy > 0Örnekleri dene3, 4 → 125, 5 → 25en 0 → geçersizAlgoritmayı kuroku en, boyalan ← en × boyyaz alanKoda dönüştüralan = en * boy;println(alan);(Java)Test et3, 4 → 12 ✓-2, 4 → -8 ✗→ kısıt kontrolü ekle

Önce ne istendiği netleşir: dikdörtgenin alanı. Girdi, çıktı ve kısıt yazılır.

Problemi tanımlaGirdi: en, boyÇıktı: alanKısıt: en, boy > 0Örnekleri dene3, 4 → 125, 5 → 25en 0 → geçersizAlgoritmayı kuroku en, boyalan ← en × boyyaz alanKoda dönüştüralan = en * boy;println(alan);(Java)Test et3, 4 → 12 ✓-2, 4 → -8 ✗→ kısıt kontrolü ekle

Elle birkaç örnek çözülür; sınır durumu (0) da düşünülür.

Problemi tanımlaGirdi: en, boyÇıktı: alanKısıt: en, boy > 0Örnekleri dene3, 4 → 125, 5 → 25en 0 → geçersizAlgoritmayı kuroku en, boyalan ← en × boyyaz alanKoda dönüştüralan = en * boy;println(alan);(Java)Test et3, 4 → 12 ✓-2, 4 → -8 ✗→ kısıt kontrolü ekle

Dilden bağımsız algoritma (sözde kod) yazılır.

Problemi tanımlaGirdi: en, boyÇıktı: alanKısıt: en, boy > 0Örnekleri dene3, 4 → 125, 5 → 25en 0 → geçersizAlgoritmayı kuroku en, boyalan ← en × boyyaz alanKoda dönüştüralan = en * boy;println(alan);(Java)Test et3, 4 → 12 ✓-2, 4 → -8 ✗→ kısıt kontrolü ekle

Algoritma seçilen dile (Java) çevrilir.

Problemi tanımlaGirdi: en, boyÇıktı: alanKısıt: en, boy > 0Örnekleri dene3, 4 → 125, 5 → 25en 0 → geçersizAlgoritmayı kuroku en, boyalan ← en × boyyaz alanKoda dönüştüralan = en * boy;println(alan);(Java)Test et3, 4 → 12 ✓-2, 4 → -8 ✗→ kısıt kontrolü eklegeri dön

Test: negatif girdi yanlış sonuç verdi → turuncu ok: algoritmaya dönülür, "en, boy > 0 değilse hata" adımı eklenir.

  • Her aşamanın çıktısı bir sonraki aşamanın girdisidir.
  • Yanlış tanımlanan problem, doğru çalışan ama yanlış işi yapan programa dönüşebilir.

Problem Çözme · Sözde kodu adım adım çalıştır

Algoritmayı İzleme: Dikdörtgen Alanı

en3boy—alan—

1. çalıştırma: en = 3 okunur; bellekte "en" adlı kutuya yazılır.

en3boy4alan—

boy = 4 okunur.

en3boy4alan—

Koşul: 3 > 0 ve 4 > 0 → doğru.

en3boy4alan12

alan = 3 × 4 = 12.

en3boy4alan12

Sonuç yazılır. "değilse" dalı bu çalıştırmada atlanır.

en-2boy—alan—

2. çalıştırma: en = -2 okunur; bellekte "en" adlı kutuya yazılır.

en-2boy4alan—

boy = 4 okunur.

en-2boy4alan—

Koşul: -2 > 0 ve 4 > 0 → yanlış (en negatif) → değilse dalına geçilir.

en-2boy4alan—

Uyarı yazılır; alan hiç hesaplanmadı. Test aşamasında bulunan hata böylece düzeltildi.

oku en
oku boy
eğer en > 0 ve boy > 0 ise
    alan ← en × boy
    yaz "Alan: ", alan
değilse
    yaz "Geçersiz ölçü"

Yazılım · Adım adım

Yazılım Geliştirme Süreci

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Gereksinim: kullanıcı ne istiyor? Örn. "öğrenci not ortalamasını hesaplayan uygulama".

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Tasarım: ekranlar, veri ve algoritmalar planlanır (akış diyagramı burada kullanılır).

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Kodlama: tasarım bir programlama diliyle yazılır.

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Test: beklenen ve gerçek sonuçlar karşılaştırılır; hata varsa kodlamaya geri dönülür.

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Dağıtım: program kullanıcıya ulaştırılır (kurulum, yayın).

1. Gereksinim2. Tasarım3. Kodlama4. Test5. Dağıtım6. Bakım

Bakım: hatalar giderilir, yeni istekler gelir → yeni gereksinimlerle döngü yeniden başlar.

  • Aşamalar projeye göre ardışık veya yinelemeli yürütülebilir; kullanıcı geri bildirimi gereksinimi ve tasarımı değiştirebilir.

Yazılım

Geliştirme Yaklaşımları

ŞelaleGereksinimTasarımKodlamaTestDağıtımÇevik1. döngüplan·kod·test2. döngüplan·kod·test3. döngüplan·kod·testher döngü sonunda çalışan sürüm + geri bildirim
YaklaşımGüçlü yönDikkat
Şelale modeliAşamalar ve belgeler nettirDeğişikliğe dönüş maliyetlidir
ÇevikKısa döngülerle geri bildirim alırSürekli iletişim gerektirir
PrototiplemeBelirsiz gereksinimi görünür kılarPrototip ürün sanılmamalıdır

Yazılım

Geliştirme Araçları

Kod düzenleyici / IDE

Kod yazma, tamamlama ve proje yönetimi.

Derleyici / çalışma ortamı

Programı çevirme ve çalıştırma.

Hata ayıklayıcı

Program durumunu adım adım inceleme.

Sürüm kontrolü

Değişiklik geçmişi ve ekip çalışması.

Test araçları

Beklenen davranışı otomatik doğrulama.

Paket yöneticisi

Bağımlılıkları yönetme.

Bir geliştirme turu: her araç döngünün farklı adımında devreye girerIDE / düzenleyiciyazDerleyiciçevir, çalıştırTest araçlarıdoğrulaHata ayıklayıcıhatayı buldüzelt ve yeniden deneSürüm kontrolü: her değişikliği kaydederPaket yöneticisi: kütüphaneleri getirir

Yazılım

Sürüm Kontrolü

K1ilk sürümK2alan eklendiK3çevre eklendiK4birleştirmeD1deneme dalı: yeni hesapana dalher kayıt: kim, ne zaman, ne değişti
  • Her kayıt (commit) dosyaların o anki hâlini; kimin, ne zaman, neyi değiştirdiğiyle birlikte saklar. Hatalı bir değişiklikten sonra eski bir sürüme dönülebilir.
  • Dal (branch) ana kodu bozmadan deneme yapmayı sağlar; iş bitince dal ana dala birleştirilir (merge).
  • Ekip üyeleri aynı dosyalar üzerinde çalışır; aynı satırı iki kişi değiştirirse araç bu çakışmayı gösterir ve birinin seçmesini ister.
  • En yaygın araç Git'tir; GitHub ve GitLab depoları ağ üzerinde saklayan hizmetlerdir.

Temel Yapılar

Değişkenler ve Veri Tipleri

  • Değişken, bellekte bir değeri tutan adlandırılmış kutudur; program boyunca değeri değişebilir.
  • Veri tipi değerin temsilini ve üzerinde yapılabilecek işlemleri sınırlar.
  • Anlamlı adlar programın amacını görünür kılar.
yas19tip: tam sayıboy1.75tip: kayan noktalı sayıad"Ali"tip: dizgigectidoğrutip: mantıksal

Java'daki karşılıkları: int, double, String, boolean.

Temel Yapılar

İşleç Önceliği

  1. Parantez içi
  2. Çarpma, bölme, mod (kalan)
  3. Toplama, çıkarma
  4. Aynı düzeydekiler soldan sağa
İfadeSonuç
2 + 3 × 414
(2 + 3) × 420
20 / 4 × 210 (soldan sağa)
10 − 4 − 33
7 mod 3 + 12
+2×34önce: 12sonra: 2 + 12 = 14
Formüldeki parantez unutulursa program hata vermez, yanlış sonuç üretir: ort ← a + b / 2 önce b'yi böler. Bu bir mantık hatasıdır; ancak test ederek bulunur.

Temel Yapılar

Karar ve Döngü

EvetHayırkoşul ?işlem Aişlem B

Karar: iki yoldan yalnızca biri

EvettekrarHayırkoşul ?gövdeçık

Döngü: geri dönen ok

  • Karar yapısı koşula göre farklı işlem yollarından birini seçer; döngü bir işlem grubunu koşul boyunca tekrarlar.
  • Her ikisinde de koşulun ne zaman değiştiği açık olmalıdır (yoksa sonsuz döngü).

Temel Yapılar · Sözde kodu adım adım çalıştır

Döngü İzleme: Sonsuz Döngü

İlk sürüm (4. satır yok)i1koşuli ≤ 3gövde çalışma sayısı0

İlk sürüm: 4. satır unutulmuş. i ← 1 ile döngü değişkeni hazırlanır.

İlk sürüm (4. satır yok)i1koşul1 ≤ 3 → doğrugövde çalışma sayısı0

Koşul 1 ≤ 3 → doğru: döngü gövdesine girilir.

İlk sürüm (4. satır yok)i1koşuli ≤ 3gövde çalışma sayısı1

yaz i → 1. Gövde bitti; koşula geri dönülür.

İlk sürüm (4. satır yok)i1koşul1 ≤ 3 → doğrugövde çalışma sayısı1

Koşul yine 1 ≤ 3 → doğru: gövdede i'yi değiştiren hiçbir satır yok.

İlk sürüm (4. satır yok)i1koşuli ≤ 3gövde çalışma sayısı2

Aynı çıktı bir daha: 1. Durum bir önceki turla birebir aynı.

İlk sürüm (4. satır yok)i1koşul1 ≤ 3 → doğrugövde çalışma sayısı…↻ ∞

Koşulu yanlış yapacak bir değişiklik olmadığı için döngü hiç bitmez: sonsuz döngü. Konsol programı ancak Ctrl+C ile durdurulur.

Düzeltilmiş sürümi1koşuli ≤ 3gövde çalışma sayısı0

Düzeltilmiş sürüm: gövdeye i ← i + 1 eklendi. Yeniden başlanır: i = 1.

Düzeltilmiş sürümi2koşul1 ≤ 3 → doğrugövde çalışma sayısı1

1 ≤ 3 doğru: 1 yazılır, ardından i ← 2. Döngü değişkeni artık her turda ilerliyor.

Düzeltilmiş sürümi3koşul2 ≤ 3 → doğrugövde çalışma sayısı2

2 ≤ 3 doğru: 2 yazılır, i ← 3.

Düzeltilmiş sürümi4koşul3 ≤ 3 → doğrugövde çalışma sayısı3

3 ≤ 3 de doğrudur (eşitlik): 3 yazılır, i ← 4.

Düzeltilmiş sürümi4koşul4 ≤ 3 → yanlışgövde çalışma sayısı3

Koşul 4 ≤ 3 → yanlış: döngüden çıkılır.

Düzeltilmiş sürümi4koşuli ≤ 3gövde çalışma sayısı3

Döngüden sonraki satır: bitti. Gövde 3 kez çalıştı, koşul 4 kez denetlendi.

i ← 1
i ≤ 3 iken tekrarla
    yaz i
    i ← i + 1      // ilk sürümde yoktu
yaz "bitti"

Temel Yapılar

Fonksiyonlar ve Diziler

4girdikare(x)x × x döndürsonuç16notlar dizisi85[0]72[1]90[2]64[3]indis 0'dan başlar
  • Fonksiyon belirli görevi adlandırır, girdi alabilir ve sonuç döndürebilir.
  • Dizi aynı tipteki çok sayıda değeri indisle saklar.
  • Bu yapılar programı küçük, test edilebilir parçalara ayırmaya yardımcı olur.

Temel Yapılar · Sözde kodu adım adım çalıştır

Fonksiyon İzleme: Çağrı ve Dönüş

ana programa = — b = —Tanım atlanır; çalışma 5. satırdan başlar.alan(3, 4) çağrılacakçağrı yığını (üstteki çerçeve çalışıyor)

Fonksiyon tanımı yalnızca kaydedilir, çalışmaz. Program 5. satırdan başlar ve alan(3, 4) çağrısını görür.

ana programa = — b = —alanen = 3 boy = 4Yeni çerçeve açıldı.argümanlar parametrelere kopyalandıçağrı yığını (üstteki çerçeve çalışıyor)

Çağrı yığınına alan için yeni bir çerçeve eklenir: 3 → en, 4 → boy.

ana programa = — b = —alanen = 3 boy = 4 sonuc = 12sonuc ← 3 × 4 = 12çağrı yığını (üstteki çerçeve çalışıyor)

Gövde çalışır: sonuc = 12. Bu değişken yalnızca bu çerçevede yaşar.

ana programa = — b = —alanen = 3 boy = 4 sonuc = 12döndür 12 ↓çerçeve kaldırılacakçağrı yığını (üstteki çerçeve çalışıyor)

döndür sonuc: 12 çağıran yere gönderilir ve fonksiyon biter.

ana programa = 12 b = —a ← 12en, boy, sonuc artık yokçağrı yığını (üstteki çerçeve çalışıyor)

Çerçeve yığından kalkar; dönen değer a'ya atanır: a = 12.

ana programa = 12 b = —alanen = 2 boy = 5alan(2, 5) çağrıldıaynı fonksiyon, yeni çerçeveçağrı yığını (üstteki çerçeve çalışıyor)

Aynı fonksiyon farklı argümanlarla çağrılır: yepyeni bir çerçeve, en = 2, boy = 5.

ana programa = 12 b = —alanen = 2 boy = 5 sonuc = 10sonuc ← 2 × 5 = 10çağrı yığını (üstteki çerçeve çalışıyor)

sonuc = 10. Önceki çağrının 12 değeri bu çerçevede görünmez.

ana programa = 12 b = —alanen = 2 boy = 5 sonuc = 10döndür 10 ↓çağrı yığını (üstteki çerçeve çalışıyor)

10 döndürülür, çerçeve kapanır.

ana programa = 12 b = 10b ← 10çağrı yığını (üstteki çerçeve çalışıyor)

Dönen değer b'ye atanır: b = 10.

ana programa = 12 b = 10yaz 12 + 10 → 22çağrı yığını (üstteki çerçeve çalışıyor)

22 yazılır. Bir kez yazılan fonksiyon iki kez kullanıldı; alan formülü tek yerde duruyor.

fonksiyon alan(en, boy)
    sonuc ← en × boy
    döndür sonuc
son
a ← alan(3, 4)
b ← alan(2, 5)
yaz a + b

Temel Yapılar · Sözde kodu adım adım çalıştır

Dizi İzleme: Notların Ortalaması

notlar85[0]72[1]90[2]64[3]toplam—

Dizi dört notu tek bir adla tutar; hücreler 0, 1, 2, 3 indisleriyle seçilir.

notlar85[0]72[1]90[2]64[3]toplam0

toplam ← 0: biriktirici sıfırdan başlar. Başlangıç değeri verilmeseydi toplamın ne olduğu belli olmazdı.

notlar85[0]72[1]90[2]64[3]i = 0 ▼toplam85

i = 0: notlar[0] = 85 → toplam = 0 + 85 = 85.

notlar85[0]72[1]90[2]64[3]i = 1 ▼toplam157

i = 1: notlar[1] = 72 → toplam = 85 + 72 = 157.

notlar85[0]72[1]90[2]64[3]i = 2 ▼toplam247

i = 2: notlar[2] = 90 → toplam = 157 + 90 = 247.

notlar85[0]72[1]90[2]64[3]i = 3 ▼toplam311

i = 3: notlar[3] = 64 → toplam = 247 + 64 = 311.

notlar85[0]72[1]90[2]64[3]toplam311ort = 77.75

Döngü 4 tur sonra biter. ort = 311 / 4 = 77.75. Son indis 3'tür: uzunluk − 1.

notlar85[0]72[1]90[2]64[3]toplam311ort = 77.75

Sonuç yazılır. Döngü notlar[4]'e uzansaydı dizinin dışına çıkılırdı: 4 öğeli dizide 4 numaralı hücre yoktur.

notlar ← [85, 72, 90, 64]
toplam ← 0
her i ← 0, 1, 2, 3 için
    toplam ← toplam + notlar[i]
ort ← toplam / 4
yaz "Ortalama: ", ort

Temel Yapılar

Kütüphaneler ve API

Senin programınkok ← karekök(16)yaz kok → 4.0API: ad, girdi, çıktıkarekök(16) çağrısı4.0 dönerKütüphaneNewton yöntemi, kayannokta ayrıntıları …içi görünmez
  • Kütüphane, başkalarının yazıp test ettiği hazır fonksiyonların topluluğudur; aynı işi her programda yeniden yazmayı önler.
  • API (uygulama programlama arayüzü) bir kütüphanenin ya da hizmetin dışarıya sunduğu fonksiyonları, girdilerini ve dönüş değerlerini tanımlar. Kullanan, içini bilmek zorunda değildir.
ÇağrıDilSonuç
Math.sqrt(16)Java4.0
Math.max(3, 8)Java8
len("Giresun")Python7

Hata Ayıklama

Hata Ayıklama Teknikleri

  • Hatayı yeniden üret: aynı girdiyle hata her seferinde çıkıyor mu?
  • Ara değerleri yazdır: şüpheli satırdan önce ve sonra değişkenleri yaz.
  • Kesme noktası koy: program o satıra gelince durur; değişkenler incelenir.
  • Adım adım ilerle: her satırdan sonra hangi değerin değiştiğine bak.
  • Alanı daralt: kodun yarısını devre dışı bırakıp hatanın hangi yarıda olduğunu bul.
  • Anlatarak düşün: kodu satır satır birine (ya da masadaki bir oyuncağa) anlatmak çoğu zaman hatayı gösterir.
Hata ayıklayıcıAdımDevam1n1 ← 702n2 ← 853n3 ← 90▶ort ← n1 + n2 + n3 / 35yaz "Ortalama: ", ortDeğişkenler: n1 = 70 n2 = 85 n3 = 90kesme noktası: 4. satırda durdu

Şekildeki program durdurulduğunda n3 / 3 = 30 hesaplanacağı görülür: ortalama 185 çıkar, beklenen 81.67'dir.

Hata Ayıklama · Sözde kodu adım adım çalıştır

İzleyerek Hata Bulma: En Büyük Sayı

Test 1: 7, 12, 5a7b12c5eb—

Test 1: girdiler 7, 12, 5; beklenen çıktı 12.

Test 1: 7, 12, 5a7b12c5eb0

eb ← 0: en büyük için başlangıç değeri.

Test 1: 7, 12, 5a7b12c5eb77 > 0doğru → eb = 7

7 > 0 doğru: eb = 7.

Test 1: 7, 12, 5a7b12c5eb1212 > 7doğru → eb = 12

12 > 7 doğru: eb = 12.

Test 1: 7, 12, 5a7b12c5eb125 > 12yanlış

5 > 12 yanlış: eb değişmez. Çıktı 12 ✓. Tek bir başarılı test programın doğru olduğunu kanıtlamaz.

Test 2: −5, −2, −9a-5b-2c-9eb—

Test 2: hepsi negatif, −5, −2, −9; beklenen çıktı −2.

Test 2: −5, −2, −9a-5b-2c-9eb0

eb ← 0. Bu değer hiçbir girdiden gelmiyor.

Test 2: −5, −2, −9a-5b-2c-9eb0-5 > 0 · -2 > 0 · -9 > 0üçü de yanlış

Üç karşılaştırmanın üçü de yanlış: hiçbir girdi 0'dan büyük değil, eb hiç değişmez.

Test 2: −5, −2, −9a-5b-2c-9eb0çıktı 0, beklenen -2✗ mantık hatası

Çıktı 0 ✗. İzleme suçluyu gösteriyor: 2. satırdaki başlangıç değeri girdilerin dışından geliyor.

Düzeltme: eb ← aa-5b-2c-9eb-2eb ← a ile yeniden✓ En büyük: -2

Düzeltme: eb ← a. eb = −5 → −2 > −5 doğru, eb = −2 → −9 > −2 yanlış. Çıktı −2 ✓. Test 1 de yeniden denenir: yine 12.

oku a, b, c
eb ← 0
eğer a > eb ise eb ← a
eğer b > eb ise eb ← b
eğer c > eb ise eb ← c
yaz "En büyük: ", eb

Hata Ayıklama

Sık Yapılan Hatalar

HataÖrnekNe olur?
Başlangıç değeri yok ya da yanlıştoplam başlatılmadan toplam ← toplam + xJava derlemez; bazı dillerde rastgele bir değerle hesaplar
Sınır hatası (bir eksik / bir fazla)her i ← 1 … n − 1 içinson öğe atlanır ya da bir fazla tur döner
Sonsuz döngüdöngü değişkeni gövdede güncellenmezprogram bitmez
Sıfıra bölmeort ← toplam / n, n = 0çalışma zamanı hatası
Dizinin dışına çıkmak4 öğeli dizide notlar[4]çalışma zamanı hatası
Parantez unutmakort ← a + b / 2yanlış sonuç (mantık hatası)
Girdiyi doğrulamamakyaş olarak −3 kabul etmekanlamsız sonuç, sonraki adımlarda hata
Sınır durumları (0, boş liste, en küçük ve en büyük değer, negatif sayı) bu hataların çoğunu ortaya çıkarır.

Hata Ayıklama

Yazılım Hatalarının Bedeli

Ariane 5 (1996)

64 bitlik kayan noktalı bir hız değeri 16 bitlik tam sayıya dönüştürülürken taşma oldu. Seyrüsefer yazılımı durdu; roket kalkıştan yaklaşık 37 saniye sonra rotasından saptı ve birkaç saniye içinde parçalandı.

Mars Climate Orbiter (1999)

Bir yazılım itme verisini İngiliz birimiyle (pound-kuvvet·saniye) üretti, diğeri metrik birim (newton·saniye) bekledi. Sonda Mars'a fazla yaklaştı ve kayboldu.

Therac-25 (1985–1987)

Radyoterapi cihazının yazılımındaki bir zamanlama hatası, işleç hızlı veri girdiğinde güvenlik denetimini atlattı; hastalar aşırı radyasyon dozu aldı.

  • Üçü de derleyicinin yakalayamayacağı hatalardır: biri sınır durumu, biri birim tutarsızlığı, biri zamanlamaya bağlı mantık hatası.
  • Ortak ders: test, sınır durumlarını denemek, birimleri açıkça yazmak ve kodun başka biri tarafından incelenmesi.

Hata Ayıklama

Okunabilir Kod

Çalışır ama okunmaz

a ← oku()
b ← oku()
c ← a*b/2
yaz c

Aynı program, okunur

// üçgenin alanı = taban × yükseklik / 2
taban ← oku()
yukseklik ← oku()
alan ← taban × yukseklik / 2
yaz "Alan: ", alan
  • Anlamlı adlar: c yerine alan; okuyan kişi değişkenin rolünü addan anlar.
  • Tutarlı girinti ve boşluk: iç içe blokların sınırı bir bakışta görünür.
  • Sihirli sayı yerine adlandırılmış sabit: 0.20 yerine KDV_ORANI ← 0.20; oran değişince tek satır düzeltilir.
  • Tekrarı fonksiyona taşı: aynı formül üç yerde yazılıysa bir düzeltme üç kez yapılmak zorunda kalır.
  • Açıklama kodun ne yaptığını değil neden yaptığını anlatır. Kod bir kez yazılır, defalarca okunur.

Özet

Bölüm Özeti

  • Programlama dili algoritmayı bilgisayarın yürütebileceği biçimde ifade eder.
  • Kaynak kod derleme, yorumlama veya hibrit bir süreçle çalıştırılır.
  • Diller düzey, tür ve paradigmaya göre sınıflandırılır.
  • Yazılım geliştirme gereksinimden bakıma uzanan yinelemeli bir süreçtir.
  • Değişken, karar, döngü, fonksiyon ve dizi temel programlama yapılarını oluşturur.
  • Hatalar sınır durumlarıyla test ederek ve programı adım adım izleyerek bulunur.
ProblemgereksinimAlgoritmasonlu, açık adımlarKaynak kodprogramlama diliderlemeyorumlamaÇalışan programCPU / sanal makinedeğişken · karar · döngü · fonksiyon · dizibakım ve yeni gereksinimler: süreç yinelemelidir

Özet

Kontrol Soruları

  1. Kaynak kod ile makine dili arasındaki fark nedir?
  2. Derlenen ve yorumlanan programlar nasıl ayrılır?
  3. Bir algoritma neden programlama dilinden bağımsız düşünülebilir?
  4. Yazılım testinin amacı nedir?
  5. Karar yapısı ile döngünün görevleri nasıl farklıdır?
  6. Bağlayıcı ve yükleyici programın çalışmasında hangi işi yapar?
  7. Statik ve dinamik tiplemede tip hatası ne zaman fark edilir?
  8. Buyurgan ve fonksiyonel yaklaşım bir dizinin toplamını nasıl farklı ifade eder?
  9. Bir döngü neden sonsuz döngüye dönüşür?

Özet

Alıştırmalar

  1. Aşağıdaki hataları derleme, çalışma zamanı ve mantık hatası olarak sınıflandırın: noktalı virgül unutmak; ortalama için toplamı n yerine n + 1 ile bölmek; sıfıra bölmek.
  2. "Bir öğrencinin üç sınav notunun ortalamasını hesapla" problemi için girdi, çıktı ve kısıtları yazın.
  3. Aynı problem için sözde kod yazın ve (70, 85, 90) girdisiyle izleyin; sonuç 81.67 olmalı.
  4. Dikdörtgen alanı algoritmasına çevre hesabını ekleyin: cevre = 2 × (en + boy). en = 3, boy = 4 için beklenen çıktılar nedir?
  5. Bir telefon uygulaması için yazılım geliştirme sürecinin her aşamasında yapılacak birer işi yazın.
  6. Java, Python ve C dillerini derlenen / yorumlanan / hibrit olarak sınıflandırın ve çalıştırma hatlarını çizin.
İpuçları
  1. Sırasıyla: derleme, mantık, çalışma zamanı.
  2. Girdi: üç not (0–100); çıktı: ortalama.
  3. (70 + 85 + 90) / 3 = 81.67
  4. Alan 12, çevre 14.
  5. —
  6. C derlenen, Python yorumlanan, Java hibrit.

Özet

Kaynaklar

  • Sebesta, Concepts of Programming Languages, 12. baskı, Pearson, 2019.
  • Aho, Lam, Sethi ve Ullman, Compilers: Principles, Techniques, and Tools, 2. baskı, Addison-Wesley.
  • Sedgewick ve Wayne, Computer Science: An Interdisciplinary Approach, Addison-Wesley, 2016.
  • Downey ve Mayfield, Think Java, 2. baskı, O'Reilly, 2019 (ücretsiz çevrim içi sürüm).
  • Oracle, The Java Tutorials: Getting Started.

Son

Programlamaya Giriş
Sonraki sunum: Java'ya Giriş ve İlk Program · Çalışma soruları · Terim sözlüğü
1 / 1Sercan KÜLCÜ, Tüm hakları saklıdır.