BİLGİSAYAR MÜHENDİSLİĞİ DERS NOTU

Benzer belgeler
BİLGİSAYAR MÜHENDİSLİĞİNE GİRİŞ

YAZILIM MÜHENDİSLİĞİ Şubat 2012 Yrd.Doç.Dr. Yunus Emre SELÇUK GENEL BİLGİLER

YAZILIM YAŞAM DÖNGÜSÜ VE YAZILIM GELİŞTİRME SÜREÇLERİ

Yaz.Müh.Ders Notları #1 1

Yaz.Müh.Ders Notları #3 1

BMH-405 YAZILIM MÜHENDİSLİĞİ

YAZILIM ÖLÇÜTLERİ GENEL BİLGİLER

YAZILIM MÜHENDİSLİĞİNE GİRİŞ

YAZILIM MÜHENDİSLİĞİ TEKNOLOJİ FAKÜLTESİ / BİLGİSAYAR MÜHENDİSLİĞİ

MESLEKİ TERMİNOLOJİ I 1. HAFTA YAZILIM MÜH. TEMEL KAVRAMLAR

Bir yazılım geliştirme metodolojisi aşağıdaki adımlardan meydana gelir; Yazılım geliştirme sürecine destek verecek araçlar, modeller ve yöntemler.

BMH-405 YAZILIM MÜHENDİSLİĞİ

5. PROGRAMLA DİLLERİ. 5.1 Giriş

Nesneye Dayalı Yazılım Metrikleri ve Yazılım Kalitesi. Ural ERDEMİR, Umut TEKİN, Feza BUZLUCA

YZM 2108 Yazılım Mimarisi ve Tasarımı

Yazılım Mühendisliği Bölüm - 3 Planlama

SİSTEM VE YAZILIM. o Bilgisayar sistemleri donanım, yazılım ve bunları işletmek üzere gerekli işlemlerden oluşur.

Veritabanı Yönetim Sistemleri (Veritabanı Kavramı) Veri Modelleri

DOĞRUDAN FAALİYET DESTEĞİ

Yaz.Müh. Ders Notları 2

Bilgisayarda Programlama. Temel Kavramlar

BİLİŞİM SİSTEMLERİ GÜVENLİĞİNDE YENİ EĞİLİMLER

Bilgisayar Mühendisliği. Bilgisayar Mühendisliğine Giriş 1

NESNEYE YÖNELİK TASARIM SÜRECİ

Bilişim Sistemleri. Modelleme, Analiz ve Tasarım. Yrd. Doç. Dr. Alper GÖKSU

BM526 YAZILIM PROJE YÖNETİMİ. Yrd.Doç.Dr.Hacer KARACAN

Akdeniz Üniversitesi

Yaz.Müh. Ders Notları 1

çeşitli tüm aşamalarda tam izlenebilirlik

Proje İzleme: Neden gerekli?

Arayüz Nedir? Arayüz Çeşitleri Arayüz Tasarım Yöntemleri Arayüz Tasarım Hataları. Ömer Faruk MIZIKACI

NESNEYE YÖNELİK ÇÖZÜMLEME SÜRECİ

Yaz.Müh.Ders Notları #4 1

Yazılım Mühendisliği 1

UZAKTAN EĞİTİM MERKEZİ

bt-pota Bilgi Teknolojileri Hizmetleri Belgelendirme Standartları Merve Saraç Nisan 2008

Kısaca. Müşteri İlişkileri Yönetimi. Nedir? İçerik. Elde tutma. Doğru müşteri Genel Tanıtım

Bilgisayar Mühendisliğine Giriş. Yrd.Doç.Dr.Hacer KARACAN

YAZILIM SINAMA TEKNİKLERİ GENEL BİLGİLER

İŞ YERİNDE GELİŞİM. Yeni, gelişmiş iletişim teknolojilerine adapte olma

9.DERS Yazılım Geliştirme Modelleri

İşletim Sistemi. BTEP205 - İşletim Sistemleri

Java Temel Özellikleri

Programın Adı: Eğitim ve Öğretim Yöntemleri Proje/Alan Çalışması. Diğer Toplam Kredi AKTS Kredisi

BiliĢim Teknolojileri Alanı

IBM Rational ile Yazılım Yaşam Döngüsü Mehmet Çağrı ELIBOL IBM Rational Satış Yöneticisi

VERİ MADENCİLİĞİ önemsiz olmayan, gizli, önceden bilinmeyen, potansiyel olarak kullanışlı

Öğr.Gör. Gökhan TURAN Gölhisar Meslek Yüksekokulu

DERS BİLGİ FORMU. IV Türkçe Zorunlu Ders. Haftalık. Ders. Okul Eğitimi Süresi. Saati

Java. Hakkımızda. Java Eğitimi


BÖLÜM-IV ÜRÜN GELİSTİRME İŞLEMİ Genel Problem Çözme İşlemi

SİSTEM ANALİZİ VE TASARIMI

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 10. LINUX OS (Programlama) BİLGİ & İLETİŞİM TEKNOLOJİLERİ GENEL BAKIŞ

Başlıca Ürün-Bilgi Sistemleri

MerSis. Bilgi Teknolojileri Yönetimi Danışmanlık Hizmetleri

Chapter 8 Yazılım Testi. Lecture 1. Chapter 8 Software testing

EKLER EK 12UY0106-5/A4-1:

TÜRKİYE BİLİMSEL VE TEKNOLOJİK ARAŞTIRMA KURUMU ULUSAL AKADEMİK AĞ VE BİLGİ MERKEZİ YÖNETMELİĞİ. BİRİNCİ BÖLÜM Genel Hükümler

1.Yazılım Geliştirme Metotları 1

Akdeniz Üniversitesi

EĞİTİM ÖĞRETİM MÜNEVVER ÖZTÜRK ORTAOKULU II. DÖNEM BİLİŞİM TEKNOLOJİLERİ VE YAZILIM DERSİ DERS NOTLARI

Ders Adı : Nesne Tabanlı Programlama-I Ders No : Teorik : 3 Pratik : 1 Kredi : 3.5 ECTS : 4. Ders Bilgileri.

YAZILIM MODELLEME VE TASARIM

Yazılım Mühendisliği Bölüm - 2 Yazılım Geliştirme Yaşam Döngüsü. Cengiz GÖK

BİLİŞİM TEKNOLOJİLERİ

Giriş: Temel Adımlar YAZILIM GELİŞTİRME YAŞAM DÖNGÜSÜ. Belirtim Yöntemleri. Belirtim Yöntemleri

Bilgisayar Mühendisliği

KULLANILABİLİRLİK TESTLERİ VE UYGULAMALARI

BULANIK MANTIK VE SİSTEMLERİ BAHAR DÖNEMİ ÖDEV 1. Müslüm ÖZTÜRK Bilişim Teknolojileri Mühendisliği ABD Doktora Programı

FEF LİSANS PROGRAMLARI DEĞERLENDİRME ÖLÇÜTLERİ

Bilgisayar Mühendisliği ve Yeni Teknolojiler. İbrahim SARAÇOĞLU

Yaz.Müh. Ders Notları 1

Yaz.Müh. Ders Notları 1

Yaz.Müh. Ders Notları 1

İç kontrol; idarenin amaçlarına, belirlenmiş politikalara ve mevzuata uygun olarak faaliyetlerin etkili, ekonomik ve verimli bir şekilde

Yaz.Müh. Ders Notları 1

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

Bilgi Sistemlerinde Merkezi Kayıt Yönetimi ve Olay İlişkilendirme

Y I L D I Z T E K N I K Ü N İ V E R S İ T E S İ MÜHENDİSLİĞİ

ANKARA ÜNİVERSİTESİ ELMADAĞ MESLEK YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI PROGRAMI DERS İÇERİKLERİ

Çoğul Ortam Akıtma Platformlarında, Uçbirimlerdeki Fonksiyonel İşlemlerin Bulut Bilişim (Cloud Computing) Hizmetine Çekilmesi Projesi

Varlık davranış modeli: Bu aşama her entity ye etki eden durumların tanımlandığı, modellendiği ve dokümante edildiği süreçtir.

VERİ KAYNAKLARI. Bilgi sisteminin öğelerinden biride veri

Bilgi Güvenliği Risk Değerlendirme Yaklaşımları

İş Sağlığı ve Güvenliğine İlişkin İşyeri Tehlike Sınıfları Listesi-NACE Kodları-J

11.DERS Yazılım Testi

TELEKOMÜNİKASYON MÜHENDİSİ

YÜKSEKÖĞRETİM KURUMLARINDA UZAKTAN ÖĞRETİME İLİŞKİN USUL VE ESASLAR (Değişik; tarihli YÖK Genel Kurulu)

Programlama Dillerinde Kullanılan Veri Tipleri

Analiz Raporu. Hedef kitleden bazılarına sorular yöneltildi. Buna göre ne tür değişimler beklediklerini saptadık. Ara yüzünün

İstemci Yönetimi ve Mobil Yazdırma Çözümleri

Gereksinim İzlenebilirlik Matrisi. Gereksinimi Açıklayan Bir Metin Gereksinimin Dahil Edilme Gerekçesi Sahibi Kaynağı Öncelik Anki Durum

SİSTEM ANALİZİ VE TASARIMI. Sistem Analizi -Bilgi Sistemleri-

Tarih Saat Modül Adı Öğretim Üyesi. 01/05/2018 Salı 3 Bilgisayar Bilimlerine Giriş Doç. Dr. Hacer Karacan

Sistem Analizi ve Tasarımı DERS2

Aşırı Programlama İçin Üç Yeni Pratik

Akdeniz Üniversitesi

Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS

VERİ TABANI YÖNETİM SİSTEMLERİ

Transkript:

T.C. GAZİ ÜNİVERSİTESİ Sürekli Eğitim Uygulama ve Araştırma Merkezi 2015 BİLGİSAYAR MÜHENDİSLİĞİ DERS NOTU

"Bilgisayar Mühendisliği" bölümüne ait bu döküman İnternet üzerindeki çeşitli kaynaklardan yararlanılarak ortaya çıkarılmıştır. Yararlanılan kaynaklar en son bölümde belirtilmiştir.

İÇİNDEKİLER DERS ADI SAYFA ARALIĞI Bilgisayar Mühendisliğine Giriş 1-6 Yazılım Mühendisliği 7-25 Java ile Nesneye Yönelik Programlama 26-34 Mikroişlemciler 35-62 Internet Programlama: PHP 63-106

1 Bilgisayar Mühendisliğine Giriş

2 Bilgisayar Mühendisliği Nedir? Bilgisayar mühendisliği; Bilgisayar Mühendisi Ne İş Yapar? Bilgisayar Mühendisi kavramı artık daha genel bir alanı nitelemektedir. Teknolojinin gelişmesiyle de farklı uzmanlık alanları ortaya çıkmıştır. Genel olarak: 1. Yazılım 2. Veri tabanı 3. Bilişim güvenliği 4. Bilgisayar ağları 5. Donanım/Elektronik 6. Web tasarımı ve programcılığı 7. Çoklu ortam (Multimedya) 8. Teknik destek 1- YAZILIM Bilgisayar mühendislerinin en bilinen çalışma alanlarından birisi yazılım sektörüdür. Yazılım geliştirme işi genelde adına Yazılım yaşam döngüsü denilen bir süreç içerisinde yürür. Bilgisayar mühendisleri; Planlama/Analiz Aşaması, anlamaya yönelik çalışmalar yapan pozisyondur. ihtiyaca göre çözümler öneren kişidir. Tasarım Aşaması, kişidir. yazılımın işleyişini tanımlar. Geliştirme Aşaması, ürün geliştiren kişidir. il tüm yazılım yapısını planlayan kullanarak ojilerini kullanarak özelliklere sahip kişidir.

3 metodolojisi ve süreçlerinde tavsiyelerde bulunurlar, uygulamanın genel tasarım ve yapısını oluşturur ve korurlar, projenin doğru tanımlanmasını sağlarlar, tasarımın dökümante edilmesi ve kodlama standartlarının belirlenmesi ile uğraşırlar. e Yöneticisi: Proje Lideri/Yöneticisi yazılım ekibini bir arada tutan ve zaman çizelgelerine uyulması için gerekli motivasyonu sağlayan yöneticidir. Test/Kalite Güvence Aşaması, yazılım projesinin standartlara uygunluğunu ve ihtiyaçları karşıladığını denetleyen çalışmalar demektir. : İhtiyaçların ve geliştirilen çözümün doğru belirlenip belirlenmediğini, yazılımın belirli standartlarda olup olmadığını denetleyen kişidir. : Yazılım hatalarını tespit etme, hataların sebepleri ve sonuçları ile ilgili süreci yönetme işlerini yürütür. : Yazılımın testi geçip geçemediği, kabul edilmeye hazır olup olmadığı kararlarını verir. 2- VERİ VE VERİTABANI YÖNETİMİ İş hayatında bilgisayarlaşmanın artmasıyla çok miktarda veri depolanmaya başlamıştır. Artık bilgileri kaydetmekten çok bu verilerin analiz edilmesi ve işlenmesi önem kazanmaya başlamıştır. Bilgisayar mühendisleri verilerin ve içinde tutuldukları veritabanlarının yönetimi ile ilgili bir çok pozisyonda yer almaktadırlar. İş Tanımları : Veri yöneticisi veriyi kullanıcılar tarafından kullanılmaya hazır hale getirir. Bunun için daha çok analiz etme, veri toplama ve dizayn aşamalarında yer alır. : Veri ambarı üzerinde çok miktarda veri üzerinde çok karmaşık sorgulama ve analizleri gerçekleştirerek sonuçlar üretir. : Veri modelleme uzmanı; bir taraftan, verilerin şekil ve metin olarak ifade eden modelleri kurarken, bir taraftan da gereken veritabanı tablo tasarımlarını yapar. : Aslında veri analistliğine benzeyen bu pozisyon, anlamsız görünen verilerden belli metodolojiler kullanarak anlamlı sonuçlar ve istatistikler çıkarır. : Veritabanı basit olarak bilgi depolayan, bu bilgiyi verimli ve hızlı bir şekilde yönetip değiştirebilen bir yazılımdır. Veritabanı yöneticisinin görevleri kısaca şu başlıklar altında toplanabilir: Veritabanı yazılımının Kurulması ve versiyon takibi, Veritabanı oluşturulması, Kullanıcı yönetimi, Yedekleme, Performans ayarları vb. : Yeni bir veritabanının tasarlanması ve oluşturulması görevlerini yerine getirir. Veritabanı mimarı, sadece yeni tasarım ve geliştirme işine bakar. Uzmanı: Veritabanı güvenlik uzmanı sistem güvenliği ve veri güvenliği denilen iki işi yapar. 3- BİLİŞİM GÜVENLİĞİ

4 Baş döndürücü hızla gelişen yeni teknolojiler, beraberinde güvenlik tehlikelerinin de hızla ortaya çıkması sonucunu getirmektedir. Şirketler gittikçe çoğalan sayısal verilerini korumak istedikleri için bilişim güvenliği de başlı başına bir sektör haline dönüşmüştür. Güvenlik uzmanları bugün iş ilanlarında en çok aranan kişilerdir İş Tanımları : Şirketlerin güvenlik altyapısını tasarlayan, kuran, yöneten ve geliştiren kişilerdir. : Var olan tehditleri sürekli olarak takip ve analiz etme, bu tehditlere karşı alınabilecek önlemleri inceleme, gerekli önlemleri devreye alma, önlemlerin düzgün çalıştığını sürekli olarak kontrol etme işlerini gerçekleştirir. : Uzman oldukları alanlara göre şirketlerin güvenlik konusundaki bilgi ihtiyacını karşılar ve gerekli çözümleri önerir ya da üretirler. 4- AĞ YÖNETİMİ Bilgisayar mühendisleri ağ kurulumu ve yönetiminin tüm aşamalarında görev alarak işlerin düzenli yürümesini sağlarlar. Ağ bir şirket içi ağ olabileceği gibi dışarıya açık bir ağ da olabilir. Ağ yönetimi konusunda bir çok iş alanı mevcuttur. : İhtiyaçları iyi anlayıp ağ altyapısının tasarımını yapar, kullanılacak donanım ve ağ trafiğini en iyi performansla sağlayacak ekipmanı belirler, kurulumun her aşamasında rol alır. : Şirket gereksinimlerine göre network tasarımı ve yönetimi ve işletim sistemlerinin tasarımı, kurulumu ve yönetimi konularından sorumludur. Ayrıca yedekleme gibi günlük işlemlerin yönetimi, kullanıcı gereksinimlerini karşılanması ve işlemleri içerir. : Daha çok fiziksel ağ işleriyle uğraşır. Kablo sistemleri, yerel ve geniş ağ bağlantıları, router vb. ekipmanların kurulumu ve ayarları, yönetim yazılımları, trafik izleme konularında çalışır. : Ağ ile ilgili kurulum ve kullanım sorunlarına destek verir. Kablolama, ağ ekipmanları, ağ kurulumu ve bakımı gibi görevlerde çalışır. 5- DONANIM VE ELEKTRONİK Bilgisayar mühendisliğinin en çok bilinen bir alanı yazılımsa diğeri de donanımdır. Son yıllarda yazılım ve donanım bütünleşmesine dayanan teknolojiler (VOIP, Embedded Sistemler, Robotik) büyük ivme kazanmıştır. Genellikle Elektronik Mühendisliğinin işi gibi görünse de, Bilgisayar Mühendislerinin de donanım alanının alt kollarında uzmanlaşması ve iş bulması mümkündür. İş Tanımları : Çip teknolojileri, devre ve kart tasarımları, donanım parçalarının tüm üretim aşamaları, bilgisayar montajı, modem, yazıcı, monitör vb. teknolojiler bu pozisyonun ilgi alanıdır. : Elektrik, elektronik, mekanik ve bilgisayar tabanlı tüm endüstriyel üretim sistemlerinin amaçlanan ve planlanan biçimde çalışmasını sağlar. Otomatik kontrol teorisi ve uygulamaları, endüstriyel otomasyon, ölçme, bilgisayar tabanlı endüstriyel bilişim sistemlerinin tasarımı ve uygulamaları konularında çalışır.

5 Mühendisi: Robot tasarlar, üretim ve geliştirmelerini yapar, çalışmaları için gerekli yazılım uygulamalarını geliştirir. : İletişim alanındaki teknolojileri tasarlayan ve uygulayan kişidir. Mesela cep telefonu santralleri, kablosuz ağ sistemleri, Internet altyapı sistemleri çalışma alanlarıdır. 6- WEB / INTERNET 90 lı yıllardan itibaren Internet in hayatımızın her noktasında yer almasının bir sonucu olarak web siteleri ile ilgili işler bilişim mesleklerinin önemli bir alanı haline gelmiştir. İş Tanımları : Bir web sitesinin içeriğinden sorumlu kişidir. Sitedeki yazılı, sesli ya da görüntülü içeriğin planlanması, eklenmesi, kontrolü ve yönetimi ile uğraşır. : Web tasarımcıları, bir web sitesinin görünümünden, tasarımından ve kullanılabilirliğinden (usability) sorumlu kişilerdir. Web tasarımcısı olmak hem grafik, hem multimedya hem de programlama konusunda bilgi sahibi olmak demektir. : Özellikle web tabanlı uygulamalar geliştiren yazılım mühendisleridir. (HTML, XML, ASP, JSP, PHP) Yöneticisi: Web siteleri için alan adı almak, hosting (yer) kiralamak, hazırlanmış projeleri yüklemek, çalışır hale getirmek, arama motorlarına kaydettirmek, yönetmek, hatalarıyla uğraşmak, kullanım istatistiklerini inceleyerek gerekli iyileştirmeleri yapmak, yedek almak, bakım ve versiyon güncellemeleri yapmak gibi işleri yaparlar. 7- ÇOKLU ORTAM Multimedya ya da diğer bir deyişle çoklu ortam, grafik yanında ses ve video üzerinde çalışmaları da içermektedir. 2 ve 3 boyutlu (2D/3D) bilgisayar grafikleri, hem oyunlarda hem de animasyon işlerinde kullanılmaktadır. İş Tanımları : Web siteleri, tanıtım CD leri, oyunlar, eğlence amaçlı yazılımlar vb. teknoloji ürünlerinde hoşumuza giden resim ve tasarımlar bu uzmanların elinden çıkmaktadır. (Photoshop, AfterEffects, 3D Studio Max) : Multimedya tasarımcıları hem grafik hem de animasyon konusunda bilgi sahibidir. Ses, görüntü, animasyon, çizim, fotoğraf gibi malzemeleri kullanarak prodüksiyonlar yaparlar. m Tasarımcısı: Bilişsel eğitim dediğimiz çok yönlü öğrenme tekniklerini kullanan materyaller tasarlar. Dolayısıyla, e-öğrenme, Internet, multimedya alanlarında kendilerini yetiştirmeleri gerekir. 8- TEKNİK DESTEK İş Tanımları : Bir ürün ya da teknoloji konusunda şirket personeline veya müşterilere destek hizmeti veren kişilerdir.

6 : Müşterilere uzaktan destek verilmesi amacıyla kurulan çağrı merkezleri ve yardım masası bölümlerinde çalışan uzmanlar genelde sesli ya da yazılı destek verirler. : Bilgisayar mühendisleri bilgi ve tecrübelerine bağlı olarak bu üç seviyede de çalışabilir. 9- DİĞER ÇALIŞMA ALANLARI : Bilgisayar mühendisleri eğitimcilik kabiliyetleri varsa özel şirketlerde, eğitim merkezlerinde eğitim verebilirler. Ya da akademik kariyer yapmayı tercih edip üniversitede kalabilirler. : Yazılım/Donanım ürünleri ile ilgili kullanım kılavuzu, programlama kılavuzu vb. dokümanları hazırlar -ticaret uzmanı: Bilgisayar mühendisleri de e-ticaret sistemlerinin hem altyapı hem de işleyiş kısımlarında rol alırlar. : CIO(Chief Information Officer) ya da Türkçesiyle Bilişim Direktörü, üst düzey bir yönetici pozisyonudur. CIO lar şirketlerin bilişim vizyonunu belirler, teknoloji bütçelerini yönetir, stratejik teknoloji yatırım kararlarını verir ve yapılan yatırımların getirisini ölçer.

7 Yazılım Mühendisliği

YAZILIM Yazılım: Herhangi bir boyuttaki herhangi bir tür donanımda çalışan bilgisayar programını ve basılı veya elektronik ortamdaki her tür dokümanı içeren üründür. Yazılım hem bir üründür, hem de başka ürünler elde etmeye yarayan bir araçtır. Yazılım fiziksel bir ürün olmadığı için aşınmaz, ancak zamanla yetersizleşebilir. Yazılım, yaşam döngüsü süresince değişikliklere uğrar. Değişiklikler, yazılımda yeni hatalar oluşturabilir. Yeni hatalar tam olarak düzeltilmeden yeni değişiklikler gerekebilir. Yazılımın bir fikir olarak doğmasından, kullanım dışı bırakılmasına kadar geçen süreç yaşam döngüsü olarak adlandırılır. YAZILIM TÜRLERİ Sistem Yazılımı: Diğer programlara hizmet sunmak üzere hazırlanmış programlardır. Derleyiciler, işletim sistemleri, vb. Karmaşık olsa bile belirli bilgi yapıları ile uğraşır. Belirli: Girdi, işlem ve çıktıların sırası ve zamanlamasının önceden tahmin edilebileceği sistemlerdir. Mühendislik Yazılımı / Bilimsel Yazılım: Mühendislik ve bilimsel hesaplamalarda kullanılmak üzere hazırlanmış programlar. Büyük hacimli verilerle uğraşır. Numara öğütmek / Number crunching. Gömülü (Embedded) Yazılım: Bir ürün veya sistemin bir parçası olup, bu sistemin kendisi ve/veya son kullanıcısı için denetim işlemleri yürüten programlar. Gerçek zamanlı uygulamalardır. Şirket Yazılımı: Belirli ticari iş gereksinimlerine yönelik programlar. İş süreçleri ile ilgili bilgiye sahip olmalıdır. Genellikle müşteriye özel tasarlanır. Veri dönüştürme ve değerlendirme uygulamaları, iş süreçlerinin kimi zaman gerçek zamanlı izlenilmesi, vb. Uygulama Yazılımı: Product-line, shrink-wrapped, off-the-shelf, vb. Farklı müşteriler tarafından kullanılabilecek genel amaçlı yazılımlar Cari hesap uygulamaları, çeşitli otomasyon programları, kelime işlem uygulamaları, vb. Ağ Yazılımları: Ağ üzerinden haberleşerek hizmet almaya veya vermeye yönelik uygulamalar. E-ticaret, B2B, B2C, web servisleri, web tarayıcıları, vb. Şirket yazılımları ile etkileşimde bulunabilirler.

9 Yapay Zeka Yazılımları: Sayısal olmayan algoritmalarla karmaşık sorunları çözmeye yönelik yazılımlar. Robotik, uzman sistemler, örüntü tanıma (ses ve görüntü), vb. YAZILIMI ETKİLEYEN EĞİLİMLER Yaygınlaşan Bilgi-İşlem: Hesaplama gücünün giderek küçülen alanlara sıkıştırılabilmesi, bilişimin günlük yaşantımızla daha kolay bütünleşmesine olanak sağlıyor. Yaygınlaşan Haberleşme Ağı: Kablosuz ağların yaygınlaşması, bilişimin günlük yaşantımızla daha kolay bütünleşmesine olanak sağlıyor. Özgür / Açık Kaynak Yazılım: Gevşek bir ekip tarafından geliştirilen yazılım, daha anlaşılır ve geliştirilebilir olmalıdır. ESKİ YAZILIM (Legacy Software): İş sürecinin önemli bir parçası olan ve çok uzun süredir kullanılan yazılımlar. Eski yazılımda bulunabilecek olumsuzluklar: Eksik veya hatalı dokümantasyon Zamanla karmaşıklaşmış kod Esnek olmayan yapı Eski donanımla çok sıkı ilişki Yazılım mühendisliğindeki gelişmelerden yoksunluk nedeniyle düşük kalite. Eski yazılımın değiştirilmesini gerektiren nedenler: İş alanındaki yeni gereksinimler Güncel sistemlerle birlikte çalışabilmesi için uyumluluk kazandırılması Donanımın ömrünün dolması nedeniyle daha güncel ortama taşınma gerekliliği YAZILIM HAKKINDAKİ YANILGILAR: MÜŞTERİ AÇISINDAN Programın yazılmasına başlanması için amaçları genel olarak belirlemek yeter, ayrıntılar sonra kararlaştırılabilir. Nasıl olsa yazılım esnektir. Belirsiz gereksinimler, çürük atılmış temele benzer. Yazılım esnektir. Değişen gereksinimler kolayca sisteme uyarlanabilir. Yazılım yaşam döngüsünde ilerledikçe, değişen gereksinimleri yazılıma uyarlamanın bedeli üstel olarak artar. Yazılım esnek bir oyun hamurundan çok kil veya cam gibidir. Çevik süreçlerle esnekliğin arttırılması hedeflenmektedir. YAZILIM HAKKINDAKİ YANILGILAR: PROGRAMCI AÇISINDAN Yazılımı tamamlayınca işimiz biter. Yazılım üstünde harcanan çabanın yarısından fazlası, yazılımın müşteriye ilk teslimatından sonra harcanmaktadır.

10 Kalite güvence yöntemleri yazılım hayat döngüsünün her aşamasında uygulanabilir. Çözümleme sürecinde dahi kullanılabilecek kalite ölçütleri bulunmaktadır. Yazılım ürünü, doğru çalışan program demektir. Dokümantasyonu unutmayın! Yazılım mühendisliğinin gereklerini uygulayarak boşuna çaba harcıyoruz. Sayfalarca gereksiz doküman hazırlayacağımıza zamanımızı ve çabamızı daha verimli kullanalım. Haritası olmayan yolunu kaybeder. Kalite için harcanan çaba, karşılığını yazılım hayat döngüsünün ilerleyen aşamalarında fazlasıyla ödeyecektir. YAZILIM HAKKINDAKİ YANILGILAR: İDARİ İşler yetişmiyorsa takıma yeni programcılar ekleriz. Yazılım hayat döngüsü içerisinde ilerledikçe, yeni elemanların yazılıma hakim olması üstel olarak zorlaşır. İşler daha da gecikir. Elimizde yazılım geliştirme ile ilgili zengin bilgi kaynakları bulunmakta. İşimiz kolay olacak. Kaynaklar tam, doğru ve güncel mi? Bu kaynaklar projemize uyarlanabilir mi? Ekip bu içeriği özümseyebilmiş mi? Geliştirmesini üstlendiğim yazılımı tamamen veya kısmen fason yaptırırım. Proje ilerlemesini kendi içinde denetleyemeyen bir firma, dışarıya verdiği işi izlemekte de zorlanacaktır. YAZILIM SÜREÇLERİNİN GENEL ADIMLARI Çözümleme (Analysis) Tasarım (Design) Gerçekleme (Implementation) Sınama (Testing) Bakım (Maintenance) ÇÖZÜMLEME Çözümleme: Bir şeyi anlayabilmek için parçalarına ayırmaktır. Sistemi anlamaya yönelik çalışmalardan ve üst düzey planlama eylemlerinden oluşur. Tasarım: Bir araştırma sürecinin çeşitli dönemlerinde izlenecek yol ve işlemleri tasarlayan çerçevedir. Çözümleme ile anlaşılan sorun tasarım aşamasında kağıt üzerinde (!) çözülür. Yazılım Tasarıma yönelik şemalar (NYP'de UML şemaları), elektronik devre şemaları, mimari kat planları vb. bu aşamada gerçekleştirilir. GERÇEKLEME Eldeki tasarım, bir programlama dili ile kodlanır. SINAMA Yazılım sürecinde ilerledikçe, ortaya çıkabilecek hataların giderilme maliyeti üstel olarak artar. Aksi gibi, hataların büyük çoğunluğu isteklerin belirlenmesi ve tasarım aşamalarında ortaya çıkar. Bu yüzden: Erkenden, sık sık ve kolay sınama yapın.

11 BAKIM Yazılımın faaliyete geçirilmesinden sonra sistemde yapılan değişikliklerdir. Yazılım hatalarının düzeltilmesi: Kodlama hataları, Tasarım hataları (!), Gereksinim ve analiz hataları (!!), Sistemin işlevlerini değiştirme veya işlevlere eklemeler/çıkarmalar (!), Yazılımın farklı bir ortama taşınması (yazılım, donanım, iklim) gibi aşamalar buna örnek olarak verilebilir. Olası eylem olarak, yazılımın belgelendirilmesi, yazılımın güncel bir programlama diline geçirilmesi (!), tasarımın iyileştirilmesi/değiştirilmesi ve yazılımın farklı bir ortama taşınması vb. işlemler yapılır. YAZILIM YAŞAM DÖNGÜSÜ VE YAZILIM GELİŞTİRME SÜREÇLERİ YAZILIM YAŞAM DÖNGÜSÜ Yazılımın bir fikir olarak doğmasından, kullanım dışı bırakılmasına kadar geçen aşamalardır. Döngünün aşamalarının belirlenmesi ve tanımlanması ile yazılım geliştirme modelleri/süreçleri elde edilir. YAZILIM GELİŞTİRME SÜREÇLERİ/MODELLERİ Yazılım geliştirme bir süreçtir Süreç: Önceden belirlenmiş adımlardan oluşan iş akışı. Yazılım geliştirme modelleri, sürecin yapısını ve adımlarını belirler. Önceden ve iyi planlanmış bir süreç, zamanında ve kaliteli bir ürün elde edilmesini sağlar. Çeşitli modellerin kendine özgü avantaj ve dezavantajları vardır. Gerçeklenecek projeye uygun modelin seçilmesi gerekir. ŞELALE MODELİ Ardışıl Model / Şelale Modeli (Sequential / Waterfall) Adımlar: Analiz (Çözümleme) Tasarım Kodlama Sınama Bakım. Bir adımın tamamlanmasından sonra diğerine geçilir. Eksiklikler veya hatalar farkedilirse bir önceki adıma geçilir. Artılar: En eski model, yaygın kullanımda. İyi tanımlanmış adımlar. Son ürünün eldesi uzun süreceğinden müşteri sabırlı olmalıdır. Adımları geride bıraktıkça, ilerleyen aşamalarda karşılaşılan hataların düzeltilmesi üstel olarak zorlaşmaktadır. Bir çok müşteri de gereksinimleri eksiksiz ve kesin belirtmekte zorlanmaktadır. Sonuç: Hiç model kullanmamaktan iyidir! ÖN ÜRÜN MODELİ Ön ürün modeli / Prototip modeli Adımlar: Müşteriyi dinle Ön ürün oluştur Müşteri ön ürünü dener Artılar : Kullanıcı gereksinimlerinin daha iyi elde edilmesi.

12 Kullanıcının erkenden ürünü değerlendirmeye başlayabilmesi. Eksiler : Ön ürün mükemmel değildir. Eksik ürün zaman ve maliyet kısıtlamaları nedeniyle olgunlaşmadan canlı kullanıma alınabilmektedir. Sonuç: Prototip oluşturmayı başlı başına bir model olarak kullanmamalı, daha olgun bir modelin analiz aşamasında kullanılacak bir araç olarak ele almalı ve prototip ürünü silip atmalı. ARTIMSAL / YİNELEMELİ MODELLER Artımsal / Yinelemeli Modeller (Incremental / Iterative) Adımlar: Analiz Tasarım Kodlama Sınama Bakım Artılar : Ön ürün modeli ve ardışıl modelin güçlü yönlerini kendinde toplayarak dezavantajlarını geride bırakmıştır. Nesneye yönelik programlama metodolojisi ile uyum içerisindedir. Eksiler : Yazılımın küçük artımlarına fazla yoğunlaşmak, sistemin geneline bakıldığında kolayca görülebilecek sorunların gözden kaçmasına neden olabilir. Sonuçlar: Sistemin genelini göz ardı etmemek şartıyla güçlü bir modeldir. Güncel modellerin temelini yinelemeli ilkeler oluşturmaktadır. SARMAL (Spiral) MODEL Kazan-Kazan Sarmal Modeli (WINWIN Spiral Model)

13 HIZLI UYGULAMA GELİŞTİRME (RAD: Rapid Application Development) Kısa geliştirme çevrimleri üzerinde duran artımsal bir model. Gereksinimler: Uygulamanın yaklaşık/ortalama 3 aylık bölümlere ayrılabilmesi, Yeterli sayıda bölümün eşzamanlı ilerlemesinin sağlanabilmesi, Yazılımın bileşenlerden kurulabilmesi. Artılar: Bu sürece uygun yazılım projelerinde verimliliğin artması. Eksiler: Büyük ölçekli çalışmalarda yeterli sayıda bölümü eşzamanlı ilerletebilecek sayıda çalışanın bulunamaması. Çalışanlar hıza uyum sağlayabilmelidirler. Yüksek teknik risklere uygun değil. Sonuç: Prototip geliştirmede kullanılması veya ana fikirlerinin diğer süreçlere uygulanması yerinde olacaktır. BİLEŞEN TABANLI (Component Based) UYGULAMA GELİŞTİRME Uygulamanın hazır yazılım bileşenlerinden oluşturulmasını öngörür. Aşamaları: Konu alanı mühendisliği (Domain Engineering) Aday bileşenlerin sınıflandırılması ve seçilmesi (Qualification) Seçilen bileşenlerin kendi yazılımımıza uyarlanması (Adaptation) Bileşenlerin bir araya getirilmesi (Composition)

14 Artılar: Yeniden kullanımın özendirilmesi (azalan giderler) Eksiler: Uygun bileşenlerin bulunması gerekliliği Bileşenlerin uyarlanması gerekliliği Sonuçlar: Özellikle hızlı uygulama geliştirme olmak üzere, ana fikirleri çeşitli süreçlere uygulanabilir. ÇEVİK (Agile) SÜREÇLER Değişen gereksinimler, teknik riskler gibi önceden belirlenemeyen durumlara ve yazılım ürününü etkileyebilecek her tür değişikliğe karşı esneklik sağlayan süreçlerdir. Bireyler ve etkileşimler Çalışan yazılım Müşterinin sürece katılımı Değişikliklere uyum sağlamak Süreçler ve gereçler Ayrıntılı belgeler Sözleşme pazarlığı Bir planı izlemek Bir ilerleme olmaksızın yalnızca sürekli uyum sağlamak başarı değildir. Yazılımın artımsal gelişimi Müşteriye erken ve sık ürün teslimi Başarımın birincil ölçütü çalışan yazılımdır. Çevik süreci yürütecek ekibin özellikleri: Yüz yüze görüşme, en etkili bilgi aktarım yoludur. Takım üyeleri çevik yaklaşım hakkında eğitilmelidir. Ekip üyelerinin ortak amacı, çalışan yazılım üreterek müşteriye zamanında teslim etmek olmalıdır. Ekip üyeleri birbirleriyle ve müşteriyle işbirliği içinde olmalıdır. Ekip üyeleri karşılıklı saygı ve güven içerisinde olmalıdır. Ekipler hem teknik, hem de tüm proje hakkında kararlar verebilmelidir. Boşuna harcanan çaba yoktur: Çözülen bir sorun gereksizleşse bile, çözüm sürecinde edilen deneyim ekibe ileri aşamalarda yararlı olabilir. Kendi kendini düzenleme: Ekibin kendisini yapılacak işe göre uyarlaması, Ekibin kullanacağı süreci yerel ortama uyarlaması, Üstünde çalışılan artımsal yazılım parçasını teslim etmek için gerekli çalışma zamanlamasını ekibin kendisinin belirlemesi. Çevik Süreç Örnekleri: Aşırı Programlama (XP: Extreme Programming) Sürü (Scrum) Çevik Modelleme

15 Aşırı Programlama (XP) Adımlar: Planlama Tasarım Kodlama Sınama Artımsal Ürün Planlama: Müşteri, kullanıcı öyküleri (KÖ) oluşturur. Müşteri, öyküleri önemine göre derecelendirir. Yaklaşık 3 haftada gerçeklenemeyecek öyküler varsa, ekip müşteriden bunları alt öykülere bölmesini ister. Ekip ve kullanıcı, öykülerin sıradaki artımsal ürüne nasıl ekleneceğine karar verir: Ya önce yüksek riskli öyküler gerçeklenir, Ya da önce yüksek öncelikli öyküler gerçeklenir. Her olasılıkta tüm öyküler kısa sürede (birkaç hafta) gerçeklenmelidir. İlk artımsal ürün projenin hızını ölçme amacıyla değerlendirilir: Eldeki artımın hızına göre sonraki artımların teslim tarihleri belirlenir. Aşırı sözler verildiği ortaya çıkarsa artımsal ürünlerin içeriği de yeniden kararlaştırılabilir. Süreç ilerledikçe müşteri yeni öyküler ekleyebilir, eski öykülerin önceliğini değiştirebilir, öyküleri farklı şekillerde bölüp birleştirebilir, bazı öykülerden vazgeçebilir. Bu durumda ekip kalan artımları ve iş planlarını uygun biçimde değiştirir. Tasarım: Basit tasarım karmaşık gösterimden üstündür. (KISS: Keep It Simple, Stupid!) CRC (Class-Resposibility-Collaboration) kartları ile yazılımın sınıf düzeyinde incelenmesi. Karmaşık bir tasarımdan kaçınılamazsa işlevsel bir ön gerçekleme yapılır (Spike solution). Refactoring teşvik edilir. Bu aşamanın ürünleri CRC kartları ve ön gerçeklemelerdir (başka ürün yok). Kodlama: Önce birim sınamaları hazırlanır. Programcı tarafından yapılan, sınıfların (NYP'de; yapısal'da fonksiyonlar, vb.'lerin) temel işlevselliklerini sınama amaçlı kod. Sadece sınavı geçmeye yarayan kod yazılır (KISS). Çift kişi ile kodlama: Bir programcı eldeki sorunu çözerken diğeri çözümün genel tasarıma uygunluğunu gözetir ve kodlamanın takımın karar verdiği ölçütlere (kalite, vb.) uygunluğunu denetler. Sınama: Birim sınamalarının otomatik çalıştırılması.

16 Müşterinin artımsal ürünü denemesi. Çevik Modelleme Bir amaç için modelleme yapın: Neyi, kime, hangi düzeyde anlatmak istiyorsunuz? Buna göre uygun modelin ve ayrıntılandırmanın seçimi. İçerik sunumdan daha önemlidir. Gerekli bilgiyi içermeyen hatasız model işe yaramaz! Kullandığınız modelleme yolunun özünü ve modellerinizi oluşturmak için kullanacağınız araçları iyi öğrenin. DİKKAT: Önemli olan dengeyi korumaktır. Çevik çalışacağız diye serseri programcı olmayın. Disiplinli çalışacağız diye sırtınızda tuğla çuvalı taşımayın. SÜREÇ SERTİFİKASYONU Olgunlaşmış bir yazılım geliştirme sürecine sahip olmayan bir yazılım firması, projelerini başarı ile sonuçlandıramaz. Bir yazılım firması, süreçlerinin yeterliliğini bağımsız kurumlara onaylatmayı seçebilir. Gerekli olduğu durumlar: Bazı büyük müşteriler sertifikalı yazılım firmaları ile çalışmayı şart koşarlar. Gereksiz olduğu durumlar: Çok küçük şirketler ve/veya projeler için ek yük olarak görülebilir. Güncel model ve standartlar: CMMI: Capability Maturity Model Integration SEI tarafından önerilmiştir (Software Engineering Institute of Carnegie-Mellon University) PMI: Genel amaçlı bir proje yönetimi yaklaşımı ISO 9001:2000 standartları (Genel) ISO/IEC 90003:2004 (Yazılım geliştirmeye özel) Genel vs. Özel (Peynir mi üretiyoruz?) CMMI DÜZEYLERİ 1. Düzey: Giriş düzeyi (Level 1: Initial). İş şansa ve anahtar kişilere kalmış. 2. Düzey: Yinelenebilir (Repeatable). Temel planlama ve izleme yöntemleri kullanılarak, önceki projelerdeki başarılar yeni projelerde tekrarlanılabilir. 3. Düzey: Tanımlanmış (Defined). Kişi ve risk yönetimi ile projenin yönetimi iyileştirilir. Büyük müşteriler en azından bu düzeyde yazılım evleri ile çalışmak ister. 4. Düzey: Yönetilen (Managed). Süreç ve yazılım ölçütleri kullanılarak kalite yönetimine geçilir. İlerleme sürekli izlenir, bütçe ve zaman hedeflerinden sapmalar erkenden belirlenerek gerekli önlemler alınır. 5. Düzey: İyileştirilmiş (Optimized). Süreç yönetimi geçmiş deneyimlerin ışığında sürekli iyileştirilir. CMMI, her düzeyde belli süreç alanlarının kapsanıyor olmasını ister. Süreç alanları belli hedeflere ulaşmak için beklenen uygulamalardır. CMMI türleri: CMMI-DEV (Development): Yazılım geliştirme

17 CMMI-SVC (Service): Hizmet sunumu ve yönetimi CMMI-ACQ (Acquistion): Ürün ve hizmet alımı CMMI Level 3+ sertifikası almış kamu ve özel kurumlarımıza örnekler: MilSoft (Level 5) TÜBİTAK BİLGEM Yazılım Teknolojileri Araştırma Enstitüsü (Level 4) ASELSAN (Level 3) Cybersoft (Level 3) Havelsan (Level 3) Koç Sistem (Level 3) GEREKSİNİM MÜHENDİSLİĞİ Üzerinde çalışılmaya başlanacak projenin amaçlarını, boyutlarını ve etkilerini belirlemeye yönelik çalışmalardır. Genel amaçlı proje yönetimi faaliyetleri arasında yer alan yapılabilirlik (feasibility) çalışmasına bir girdi olarak düşünülebilir. Müşteri ne istediğini bilmez mi? Gereksinimler zaten belli değil mi? Çoğunlukla müşterinin kafasında sadece genel bir fikir vardır. Yoruma açık ve ayrıntıları kesin çizgilerle belirlenmemiş gereksinimler projenin başarısızlığına davetiye çıkarır. Kesin belirlenmiş gereksinimler bile zaman içerisinde değişebilir. Deyişler: Şeytan ayrıntıda gizlidir. Yanlış veya eksik işi yapan mükemmel yazılım değil, doğru işi yapan iyi çözüm gereklidir. SONUÇ: Gereksinim mühendisliği gerekli bir etkinliktir. GEREKSİNİM MÜHENDİSLİĞİ ADIMLARI Gereksinim mühendisliğinin genel adımları: Başlangıç (Inception) Bilgi Toplama (Elicitation) İşleme (Elaboration) Pazarlık (Negotiation) Tanımlama (Specification) Doğrulama (Validation) Yönetim (Management) Gereksinim mühendisliği adımları gerçeklenecek yazılımın doğasına ve kullanılan sürece göre düzenlenmelidir. Gereksinim mühendisliği adımları süresince yazılım ekibi ve müşteri birlikte çalışmalıdır. Müşterinin bir ekibinin, yazılım geliştirme sürecinin mümkün olduğunca çok adımının bir parçası olması yararlıdır. Başlangıç: Yazılım projesinin ilk aşamalarının başlatılıp başlatılmamasına karar verilen adımdır. Müşterinin bir yazılım projesi başlatılmasını düşünmesine neden olan olaylar: Yeni bir iş gereksiniminin belirlenmesi. Mevcut iş süreçlerinde güçlüklerle karşılaşılması.

18 Bir uygulama yazılımı söz konusu ise: Yeni bir pazarın veya hizmetin farkına varılması, Yazılım şirketinin üst düzey karar vericileri ve teknik ekibinin sözlü konuşması ile yeni bir yazılım projesi başlatılabilir. Başlangıç aşamasında paydaşlar belirlenmelidir. Paydaş, gerçeklenecek sistemden doğrudan veya dolaylı olarak yararlanabilecek ve etkilenebilecek herkestir. Her paydaş sisteme farklı bir açıdan bakar. Projenin başarısı veya başarısızlığı paydaşları farklı şekillerde etkiler. Paydaşlara sorulacak sorularla belirlenmesi gerekenler: Paydaşların bakış açıları, Paydaşları etkileyebilecek nedenler, Söz konusu etkilerin sonuçları. Bilgi toplama aşamasının genel ilkeleri: Gereksinimler hakkında ayrıntılı bilgiler, tüm paydaşların etkin katılımı ile elde edilmelidir. Tüm paydaşların katıldığı toplantılar yapılmalıdır. Toplantılara hazırlık ve katılım kuralları belirlenmelidir. Gündem belirlenmelidir: Önemli konuları atlamayacak kadar sıkı, yaratıcılığı önlemeyecek kadar açık olmalıdır. Düzeni sağlayacak ve tıkanıklıkları çözecek bir oturum başkanı seçilir. İşleme: Bilgi toplama aşamasında toplanan ham bilgilerin işlenmesi. Son kullanıcının ve diğer paydaşların yazılımla nasıl etkileşimde bulunacağının belirlenmesi ve ayrıntılandırılmasını amaçlar. Etkileşimler, kullanım senaryoları ile gösterilir (ileride anlatılacak). İşleme kimi bilgilerin genişletilmesi, kimi bilgilerin özetlenmesi şeklinde gerçekleşir. Gereksinimlerin sınıflandırılması Normal gereksinimler Beklenen gereksinimler: Çok temel gereksinimleri kullanıcı belirtmeyebilir. Bunların da elde edilmesi gereklidir. Heveslendirici gereksinimler: Müşteri beklentilerinin ötesinde ve varlığında müşteriyi sevindirecek özellikler. Müşteriler sınırlı insan, zaman ve bütçe kaynakları çerçevesinde karşılanamayacak aşırı isteklerde bulunabilir. Paydaşlar gereksinimleri farklı önem düzeylerinde görebilir. Farklı paydaşların gereksinimleri birbiri ile çelişebilir. Pazarlık sonucunda tüm paydaşların razı olacağı bir gereksinimler listesi elde edilir. Tanımlama: Gereksinimler tanımlama aşamasında, pazarlık sonucu üzerinde uzlaşılan haliyle kağıda dökülür. Tanımlama araçları: Konuşma dili ile yazılmış belgeler Kullanıcı senaryoları: Görülecek Kullanım şemaları: Görülecek

19 Formel modeller (Matematiksel gösterim, işlenilmeyecek) Bir ön ürün Birden fazla tanımlama aracı birlikte kullanılabilir. Doğrulama: Tanımlanmış gereksinimlerin tutarsızlıklara karşı sağlaması yapılır. Gereksinimler açıkça ve yoruma yer bırakmayacak şekilde tanımlanmış mı? Birbiri ile çelişen gereksinimler var mı? Gereksinimlerde hatalar ve eksikler var mı? Eksik gereksinimler var mı? Gerçekçi olmayan gereksinimler var mı? Doğrulama yapma için önerilen temel yol teknik değerlendirmedir Yönetim: Yazılım geliştirme süreci içerisinde gereksinimlerde değişiklikler olabilir: Yeni gereksinimler eklenmesi Mevcut gereksinimlerden bazılarının geçerliliğini yitirmesi Gereksinimlerin önem sıralamasının değişmesi Hatalı kestirimlerden dolayı bazı gereksinimlerden vazgeçilmesi Gereksinimlerde ne tür değişikliklerin nasıl ve hangi şartlarla yapılabileceği, resmi bir sözleşme ile önceden belirlenebilir. Gereksinimlerde değişiklikler müşteri ile karşılıklı anlaşma ile yapılmalıdır. Yazılım geliştirme süreci içerisinde gereksinimlerin gerçeklenmesinin (ve varsa gereksinimlerdeki değişikliklerin) izlenmesi gerekir. İzleme tablolar aracılığı ile yapılır. YAZILIM KALİTESİ VE YAZILIM ÖLÇÜTLERİ GENEL BİLGİLER Ölçme (Measuring): Somut veya soyut bir varlığın sahip olduğu bir özelliğini, sayısal veya derecelendirilmiş bir veri olarak ifade etmek. Benim boyum 163 santimetredir. Hava bugün 22 santigrat derecedir. İlk ara sınav çok zordu. Ölçüt (Metric): Varlığın ölçülecek özelliğini ölçme biçimi. Mesafe ölçütleri: Bir labirentteki Öklid ölçütü (Pisagor teoreminden) ve kuş uçuşu ölçütü. Sıcaklık ölçütü: Santigrat ve Fahrenhayt Ölçüm (Measurement): Belli bir ölçüte göre yapılan ölçme eyleminin sonucu. Ölçme/ölçüt/ölçüm karışıklığı İngilizce'de daha da zor Türkçe'de daha kolay Yine de neyin isim, neyin sıfat, neyin eylem olduğunu karıştırmamalı. Neden ölçeriz? Gerçek dünya ile ilgili, işimize yarayacak, anlamlı sonuçlar elde etmek için. Yorumlama engeli (Intelligence barrier): Ölçmenin sonucu, aradığımız sonuçları elde etmek için doğrudan bir yol

20 sunmayabilir, ya da yapacağımız yorumlama zor olabilir. Örnek: Otostopçunun galaksi rehberi'nde hayatın anlamı. YAZILIM ÖLÇÜMÜ Yazılım ölçümü zordur: Bir başka deyişle, yorumlama engeli yüksektir. Zorluğun nedenleri: Yazılımın karmaşıklığı Ölçütlerin nicel doğası Yazılımı neden ölçeriz? Ne kadar iyi bir ürün ortaya çıkardığımızı anlamak Ne kadar iş yapacağımızı kestirmek Böylece ne kadar zaman ve para harcayacağımızı anlamak Ölçülemeyen ilerleme yönetilemez: Proje yönetiminde yazılım ölçütleri kullanılır. YAZILIM KALİTE ÖLÇÜTLERİ Dış kalite ölçütleri: Yazılımı kullananları ilgilendiren ölçütler. Doğruluk(Correctness): Yazılımın hatalar içermemesi, gereksinimlerde belirtildiği şekilde çalışması. Etkinlik(Efficiency): Bellek ve işlemci gibi sistem kaynaklarının en az oranda kullanımı. Güvenilirlik(Reliability): Sistemin her koşulda istenildiği gibi çalışması, hatalar arasındaki ortalama zaman aralığının (MTBF) yüksek olması. Güvenlik(Security): İzinsiz ve yetkisiz işlemler mümkün olmamalı. Bütünlük(Integrity): Veriler ve işlemler arasındaki tutarlılığın korunması. Uyarlanabilirlik(Adaptability): Sistemin değişik uygulamalar veya ortamlarda kullanılabilmesi için mümkün olduğunca az değişiklik gerektirmesi. Hassaslık (Accuracy): Sistemin kendisinden beklenen işi mümkün olduğunca iyi yapabilmesi.

21 Sağlamlık(Robustness): Aykırı girişlere veya güç çalışma ortamlarına karşılık sistemin çalışmayı sürdürebilmesi. Kullanılabilirlik(Usability): Yazılım kolay kullanılabilir olmalıdır. Bu ölçütler örtüşebilir, bazı durumlarda birbirinden daha iyi veya daha zor ayrılabilir. İç kalite ölçütleri: Yazılımı geliştirenleri ilgilendiren ölçütler. Yeniden kullanılabilirlik(reusability): Sistemin parçalarının başka sistemlerde kullanılabilmesinin kolaylığı. Bakım kolaylığı (Maintainability): Yazılıma yeni yetenekler eklemenin, yazılımdaki hataları gidermenin veya yazılımın başarımını attırmanın mümkün olduğunca kolay olması. Esneklik(Flexibility): Yazılımın orijinal olarak tasarlandığı uygulamanın dışında çalışabilmesi için gerekli olan değişikliklerin olduğunca az olması. Taşınabilirlik(Portability): Yazılımın farklı donanım ve işletim sistemleri gibi değişik çalışma ortamlarına kolaylıkla aktarılabilmesi. Okunabilirlik(Readability): Kodun kaynak kodunun incelenmesinin kolay olması. Anlaşılabilirlik(Understandablility): Yazılımın sistem, bileşen ve kod düzeylerinde anlaşılabilirliğinin mümkün olduğunca kolay olması. Okunabilirlik sadece kod düzeyinde anlaşılabilirliği sağlar. Sınanabilirlik(Testability): Sistemin istenen gereksinimleri karşılayıp karşılamadığının sınanabilmesinin bileşen ve tüm sistem çapında mümkün olduğunca kolay olması. ÖLÇME İLKELERİ Ölçme eyleminin içermesi gereken adımlar: Tanımlama (Formulation): Ölçütler ölçülecek yazılıma uygun bir şekilde tanımlanır Kullanılan yaklaşım: Yapısal programlama, NYP, vb. Yazılımın türü: Gerçek zamanlı, gömülü, uygulama, vb. Toplama (Collection): Tarif edilen ölçütlerin gerektirdiği verileri elde etme. Hesaplama (Analysis): Ölçütlerin hesaplanması = Ölçümlerin elde edilmesi. Matematiksel araçlar kullanılabilir. Hesaplama mümkün olduğunca otomatik yapılmalıdır. Yorumlama (Interpretion): Elde edilen ölçüm değerlerinden yararlı anlamlar çıkartılması. Geri besleme/kullanma (Feedback): Çıkartılan sonuçların yazılım ekibine bildirilmesi ve ekibin sonuçları kullanarak yazılımı iyileştirmesi. Bir ölçütün sahip olması arzu edilen özellikler: Uygun matematiksel özelliklere sahip olmalı: Anlamlı bir ölçekte olmalı. Ör. 0-1 arası sonuçlar üretmeli. Doğru (veya ters) orantıya sahip olmalı. Sonucun yükselmesi, ölçülen özelliğin iyi bir sonuca doğru ilerlemesi (gerilemesi) anlamına gelmeli. Deneysel olarak doğrulanabilmeli Doğrulanmasının ardından kullanılmalı. ÖNERİLEN YAZILIM ÖLÇÜTLERİ Nesneye yönelik ölçütler: Kaliteli bir yazılıma götüren tasarım ilkelerine yöneliktirler.

NYP'de çözümleme ve tasarım arasında kopukluk olmadığı için, aynı ölçütler çözümleme ve kodlama aşamalarında da kullanılabilir. Böylece yazılım ekibi, 'kaliteli bir ürüne giden yolda' iz üstünde olup olmadıklarını anlayabilir. Proje yöneticisi de, başka ölçütlerle birlikte, kestirimlerde bulunabilir. Chidamber ve Kemerer'in ölçütleri (CK metrics suite): WMC: Sınıftaki ağırlıklı metot sayısı (Weighted Methods per Class). DIT: Kalıtım ağacının derinliği (Depth of Inheritance Tree). NOC: Alt sınıf sayısı (Number of Children) RFC: Sınıfın yanıt kümesinin eleman sayısı (Response For a Class) CBO: Sınıflar arası bağlaşım (Coupling Between Objects) LCOM: Uyum eksikliği (Lack of COhesion in Methods) CK ÖLÇÜTLERİ ÖRNEĞİ: WMC: C1 sınıfının M1 Mn metotlarının karmaşıklıkları c1..cn. Eleştiriler: Metot karmaşıklığı neye göre belirlenecek? Belirlemedeki öznellik güçlü yön mü, zayıf yön mü? Ölçütün rehberliği: Bir sınıfın karmaşıklığını belirler. Çok sayıda metodu olan sınıf: Çok fazla sorumluluk yüklenmiştir, dağıtılması uygun olabilir. Yüksek uyumun olup olmadığına tekrar bakılmalıdır. Uygulamaya özeldir, yeniden kullanılabilirliği düşüktür. DİĞER KALİTE ÖZELLİKLERİNE YÖNELİK ÖLÇÜTLER Bazı bağlaşım ölçütleri COMIAS CBMC Sınanabilirlik ölçütleri Halstead ölçütleri (Tartışmalı) Binder'in seçtiği ölçütler Bakım kolaylığı ölçütleri IEEE Std. 982.1-1998'de yazılım olgunluk ölçütü NE YAPILABİLİR? Ölçütlerin büyük çoğunluğu mükemmel değildir. Yine de bu zayıf noktalar genellikle çok özel durumlarda ortaya çıkar. Bu nedenle ölçütler kullanılmalı, ancak tabulaştırılmamalı, sadece (çok da hassas olmayan) bir rehber olarak kullanılmalı. Belli bir kalite ölçütüne yönelik olarak, şimdiye dek önerilen ölçütlerden bazıları seçilip, sezgisel olarak bir araya getirildikten sonra piyasada sınanarak iyileştirilebilir. Sezgisel yetenek nasıl bulunacak? Özel sektör gerekli çabaya nasıl ikna edilecek? YAZILIM PROJE YÖNETİMİNE GİRİŞ GENEL BİLGİLER Yazılım projeleri önemli oranda başarısızlığa uğramaktadır: Yazılım geliştirmedeki zorluklar.

23 Ölçek büyüklüğünden kaynaklanan zorluklar: Yazılım ölçeği, kişi ölçeği, vb. Kestirimdeki zorluklar. İnsanlarla çalışmadaki zorluklar. Teknolojideki değişimler. Gereksinimlerdeki değişimler. Politik değişimler. Mali değişimler. Yazılım proje yönetimi, sayılan zorlukların çözümüne odaklanır. Önem sırasına göre proje yönetiminin ilgi alanları: Kişiler Ürün Süreç Proje Temel amacın kullanıcılara bir yarar sağlamak olduğunu hiçbir aşamada unutmayın. Planlama yaklaşımları: Basitlik yaklaşımı: Geleceğin getireceği değişiklikler çoğu zaman ayrıntılı planlama gereğini ortadan kaldırır. Geleneksel yaklaşım: Planlama proje için bir yol haritası belirler; harita ne kadar ayrıntılı ise kaybolma olasılığı o kadar düşer. Çevik yaklaşım: Ön hazırlık gereklidir ancak asıl harita proje ilerledikçe çizilir. PLANLAMA Planlama ilkeleri: Projenin sınırlarını belirleyin: Nereye gideceğinizi bilmezseniz kaybolursunuz. Müşteriyi planlama eylemlerine katın: Öncelikleri, sınırları ve zamanlamayı müşteri belirler (bu sırada) ancak gerçekçiliği korumak amacıyla yazılım ekibi pazarlık yapar (aksi sırada). Planlamanın doğası yinelemelidir: Plan asla taşa yazılmaz. Bildiklerinizi kullanarak kestirimlerde bulunun: Bilginin kapsamı, doğruluğu ve belirginliği kestirimin doğruluğunu etkiler. Planın her aşamasına risk değerlendirmesini ekleyin: Teknik, mali, kişisel, politik riskler. Gerçekçi olun: Yazılımcı süpermen veya robot değildir. Planların ölçeği: İnce ayrıntılı planlar daha kısa vadeli, genel ayrıntılı planlar daha uzun vadelidir. Zaman ilerledikçe genel ayrıntıdan ince ayrıntıya geçilir. Planın gidişinden gözünüzü ayırmayın ve gerekli ayarlamaları yapın. Kalite güvence eylemlerini tanımlayarak plana ekleyin. Değişikliğin nasıl kabul edileceğini müşteri ile sözleşmeye bağlayın. PROJE YÖNETİMİNDE KİŞİ ETKENLERİ Takım yöneticisi: Teknik ekibin bir parçası olduğundan teknik yetenekleri yüksek olmalıdır. Ağırlıklı olarak insanlarla ilgili eylemlerde bulunacağından, sosyal ve yönetimsel yetenekleri de yüksek olmalıdır. İyi bir teknik yöneticinin özellikleri: Teknik ekibi istekli kılabilmelidir. Kişileri ve yazılım geliştirme sürecini, üzerinde çalışılan ürüne/ürün parçasına göre düzenleyebilmelidir.

24 Düzenleme küçük veya büyük ölçekte olabilir. İyi bir sorun çözücü olmalıdır. Hem teknik hem de yönetimsel sorunlarla uğraşabilmelidir. Sorunlara tanı koyabilmeli ve ortaya uygun bir çözüm koyabilmelidir. Seçilen çözüm tıkandığında ısrarcı olmamalıdır. Sorumluluk alabilmelidir. Yazılım geliştirme ekibi (teknik ekip): Takım ruhuna uygun kişilerden oluşmalıdır: Takım üyeleri birbirine saygı duymalıdır. Takım üyeleri ortak amaç etrafında kenetlenebilmelidir. Takım üyeleri birbirlerini tamamlayan yeteneklere sahip olmalıdır. Takım ruhunu bozan etkenler: Telaşlı iş ortamı. Sık ortaya çıkan hayal kırıklıkları ve başarısızlıkların takım üyeleri arasındaki sürtüşmeyi arttırması. Doğru yönetilemeyen yazılım geliştirme süreci. Takım yapısının ve rollerinin belirsiz tanımlanması. Takım yapıları: Kapalı yaklaşım: Geleneksel bir yetki hiyerarşisi ve kontrol mekanizmaları bulunur. Geçmiş deneyimlere benzer projelerde başarılı bir yapıdır. Yaratıcı fikirler ortaya çıkarmak için çok uygun değildir. Rastgele (Random) yaklaşım: Serbest yaklaşım. Takım üyelerinin bireysel ve teknik yeteneklerine göre kendi aralarında bir yapı kurmasıdır. Yaratıcı fikirler ortaya çıkarmak için en uygun yaklaşımdır. Disiplin elde etmek zor olabilir. Açık yaklaşım: Kapalı ve rastgele arasında. Kontrol mekanizmaları bulunur ancak yapılanma serbesttir. Demokratik yapı. Karmaşık sorunların çözümü için uygun. Etkinliği (efficiency) sağlamak zor olabilir. Eşzamanlı (synchronous) yaklaşım: Problemin takımın üzerine düşen bölümünün de alt parçalara ayrılabildiği durumlarda kullanılabilir. Takım kendi içerisinde problemin alt parçalarını paylaşır. Alt takımlar arasında etkileşim azdır. Takım içi ve takımlar arası haberleşme: Resmi yollar: Yazı ile, zamanlı mesajlaşma ile, kurallı ve zamanlanmış toplantılar ile. Gayrı resmi yollar: Sözlü iletişim, kişisel etkileşimler, gün içerisinde gerektikçe. PROJE YÖNETİMİNDE ÖLÇÜM Proje Ölçümü: Yazılımın ölçülmesidir (İncelendi). Odak: Teknik düzey.

25 Amaç: İç kalite ölçütlerini yüksek tutmak Yöntem: Ölçüm sonuçlarına göre, yazılım geliştirme ekibini iyiye doğru yönlendirmek. Süreç Ölçümü: Yazılım geliştirme sürecinin ölçülmesidir. Odak: Yönetimsel düzey. Amaç: Dış kalite ölçütlerine yöneliktir. Yöntem: Sürecin tüm aşamalarında tutulan istatistiklere göre, hem teknik hem de yönetimsel açıdan süreçleri iyileştirmek. YAZILIM PROJELERİNİN VAZGEÇİLMEZ ARAÇLARI IDE ler. UML modelleme araçları: İki yönlü dönüşüm yeteneğine sahip olması (model ve kod arasında) tercih edilir. Sürümlendirme yazılımı (version control systems) Sınama yazılımı (testing framework): Bir yapılandırma yazılımı (build system) ile tümleşik olması tercih edilir. İş kalemleri izleme yazılımı (work item tracking) Tüm araçların IDE tümleşik olması tercih edilir. Java: IBM Rational Application Developer.NET: Microsoft Team System

26 Java ile Nesneye Yönelik Programlama

27 Java ile Nesneye Yönelik Programlama Java platformu, ağ(network) ın önemi hesaba katılarak ve aynı yazılımın birçok değişik bilgisayar ortamında veya değişik tür makinalarda çalışması fikri ile geliştirilmiş yeni bir teknolojidir. Java teknolojisi kullanılarak aynı uygulamayı değişik ortamlarda çalıştırabiliriz örneğin Pc lerde, Macintosh bilgisayarlarda, hatta cep telefonlarında. Java diğer programlama dilleri gibi başlı başına bir ürün değildir. Java ve Java ya bağlı alt teknolojiler, Sun Microsystems tarafından verilmiş belirtimlerden (specifications) oluşmaktadır.eğer bu belirtimlere sadık kalınmaz ise hukuki olarak suç işlenmiş olur. Java İle Neler Yapılabilir? Java Programlama dili ile projelerimizi diğer programlama dillerine göre daha kolay ve sağlıklı bir şekilde yapmamız mümkündür. Kısaca göz atacak olursak, Java ile; GUI (graphical user interface, grafiksel kullanıcı ara yüzü) uygulamaları, Appletler. Distributed components (ör. EJB, RMI, CORBA). Servlet, Jsp (web tabanlı uygulamalar). Veri tabanlarına erişim ile alakalı uygulamalar. Cep telefonları, Smart kartlar için uygulamalar. Ve daha niceleri için uygulamalar yazmamız mümkündür. Bir Kere Yaz Her Yerde Çalıştır Java uygulamaları JVM (Java Virtual Machine) tarafından yorumlanır( interpreted ). JVM, işletim sisteminin en tepesinde bulunur. Java uygulamaları değişik işletim sistemlerinde, herhangi bir değişiklik yapmadan çalışabilir, Java nın felsefesi olan bir kere yaz heryerde çalıştır sözü gerçekleştirilmiştir. Çalışma Evreleri

28 Java nın Gelişim Evreleri Java nın Başarılı Olmasındaki Sebepler Nitelikli bir programlama dili olması C++ da olduğu gibi bellek problemlerinin olmaması, Nesneye yönelik (Object - Oriented) olması, C/C++/VB dillerinin aksine dinamik olması, Güvenli olması, Internet uygulamaları için elverişli (Applet, JSP, Servlet, EJB, Corba, RMI). Platform bağımsız olması : bir kere yaz her yerde çalıştır Çöp Toplayıcı (Garbage Collector) Bir programın çalışma durumunda ortaya çıkan ve sonradan kullanılmayan (gereksiz) nesneleri bulur ve

29 onları yok eder (destroy). Bellek yönetiminin (memory management) yükü, kodu yazan kişiden Java ya geçmiş olur Diğer dillerde, örneğin C++ da, oluşturulan nesnelerin yok edilme sorumluluğu kodu yazan kişiye aittir. Çöp toplayıcısı(garbage collector) JVM in yazılışına (implementation) göre değişkenlikler gösterebilir. Java da Yorum Satırı Java kaynak kodunun içerisine istediğiniz yorumları yazabilmeniz için belli yol izleminiz gerekmektedir. Java da yorum satırlarını belirtme iki şekilde mümkün olur: 1. /* yorum */, slash -yıldızdan, diğer yıldız-slash arasına kadar istediğiniz yorumu yazabilirsiniz. Uzun satırlı yorumlarda bu yöntemi kullanabilirsiniz. 2. // yorum, teksatırlık yorum yapmak için idealdir. Kısa yorumlarınız için bu yöntemi kullanabilirsiniz. Herşey Nesne - 1 Java da herşeye nesne olarak davranırız. Herseyin nesne olmasına rağmen nesneleri yönetmek için referanslar kullanılır. Örnek : Diyelim ki elimizde bir maket uçak (nesne olarak düşünün) ve bu maket uçağa ait bir de kumanda (referans) olduğunu düşünelim. Bu maket uçağı havada sağa sola döndürmek için elimizdeki kumanda cihazını kullanmak zorundayızdır; benzer şekilde havalandırmak veya yere indirmek için de kumanda cihazından faydalanırız. Burada dikkat edilmesi gereken unsur kumanda cihazından çıkan emirlerin maket uçağı tarafından yerine getirilmesidir. Herşey Nesne - 2 Elimizde uzaktan kumandanın (referans) olması, maket uçağımızın (nesne) olduğu anlamına gelmez. Uzaktan kumandamız (referans) da tek başına hayatı sürdürebilir. String kumanda ; // kumanda referansı şu an için //String bir nesneye bağlı değil. Herşey Nesne - 3 Bir referansa mesaj göndemek istiyorsak onu bir nesneye bağlamamız gerekir. String kumanda= new String("Selamlar") ; String kumanda="selamlar" ; Sınıf Nedir? Nesne Nedir? Sabun s = new Sabun(); Java da Depolanan Veriler Nerede Durur? Stack : Bulunduğu nokta RAM dır... Stack üzerinde referansların kendileri bulunur. Heap : Burası genel amaçlı bir havuzdur. Nesnelerin kendisi bu alanda durur.

30 Statik Alan : Bu alan RAM de bulunur. Statik alanda yer alan veriler, programın çalışması süresince orada yaşarlar. Nesnelerin kendileri bu alanda yer almazlar. Non-RAM Bellek : Bazı durumlarda uygulamaların içerisinde oluşturduğumuz nesnelerin, uygulama sonlandıktan sonra bile varlıklarını sürdürmelerini isteriz. 1. Akışkan Nesneler (streamed objects) : Bu nesneler, genellikle ağ(network) üzerindeki başka bir makineye gönderilmek üzere bayt ırmaklarına dönüştürülürler. 2. Kalıcı Nesneler (persistent objects) : Bu nesneler kendi durumlarını(state) saklarlar ve diskimizde saklanırlar. Kendi durumlarını saklamaktan kasıt ise özelliklerinin (attribute) değerlerinin korunmasıdır. Temel (Primitive) Tipler Temel tipler stack alanında saklanırlar. Temel tip Boyut Minimum Maximum Sarmalıyıcı Sınıf Tipi boolean Boolean char 16- bit Unicode 0 Unicode 216-1 Character byte 8- bit -128 +127 Byte short 16- bit -2 15 +2 15 1 Short int 32- bit -2 31 +2 31 1 Integer long 64- bit -2 63 +2 63 1 Long float 32- bit IEEE754 IEEE754 Float double 64- bit IEEE754 IEEE754 Double void Void Sarmalayıcı (Wrapper) Sınıflar Temel tiplerin birer adet sarmalıyıcı (wrapper) sınıfları bulunur. char c = 'x' ; // temel tip Character C = new Character(c); // sarmalayıcı sınıf Geçerlilik Alanı (Scope) { int a = 177; /* sadece a mevcut*/ { int b = 196; /* a ve b mevcut */ } /* sadece a mevcut */ /* b geçerlilik alanının dışına çıktı */ } C ve C++ doğru ama Java da yanlış olan bir ifade { // dış alan int a = 12; { // iç alan

31 int a = 96; /* java da yanlış ama C ve C++ doğru */ } // iç alanın sonu } //dış alanın sonu Nesneler İçin Geçerlilik Alanı (Scope of Objects) if (true){ String s = new String("Selamlar"); } /* geçerlilik alanının sonu*/ Geçerlilik alanının sonunda String nesnesi Çöp Toplayıcısı (Garbage Collector) tarafından bellekten silinececektir. Yeni Sınıf Oluşturma public class YeniBirSinif {... } Alanlar Alanlar, temel bir tip veya sınıf tipinde olabilir. public class YeniBirSinif { public int i; public double d; public boolean b; } Temel (primitive) Tip Mevcut değer (Default value) boolean false char \u0000 (null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d Alanlar - 3 public class YeniBirSinif { public int i = 5 ; public double d = 3.23; public boolean b = true ; } Alanlara Ulaşım Nesnenin alanlarına ulaşmak için. (nokta) kullanılır. Bu alanların erişim belirleyicileri private

32 protected friendly olabilir. ybs.i ; ybs.d ; ybs.b ; Alanlara Değer Atama YeniBirSinif ybs = new YeniBirSinif(); ybs.i = 5; ybs.d = 5.3; ybs.b = false; Sınıf Tipindeki Alanlar public class YeniBirSinif { public int i; public double d; public boolean b; public String aciklama = new String("aciklama"); } Yordamlar (Methods) dönüştipi YordamIsmi( /* parametre listesi */ ) { /* Yordamın gövdesi */ } dönüştipi= Yordamların iki şansı vardır: Değer döndürürler Temel (primitive) bir tipde değer (int, double, short vb..) Sınıf tipinde bir değer (String, Double, Short vb...) Değer döndürmezler = void yordamismi = Java nın kendisine ait olan sözcükler (if, else, import, class, return..vb) ve Türkçe karakterler haricinde istenilen isim kullanılabilir. Ancak, yordamlar bir eylem içerdikleri için, yordam isimlerinin de bir eylemi belirtmesi tercih edilir. Örneğin: sayisirala() enbuyuksayibul() sqlcalistir() parametre listesi= Yordam içerisinde işlemler yapabilmek için gerekli olan parametreler. Bu parametreler temel tipte veya sınıf tipinde olabilirler. Yordam gövdesi = Bu kısım kodu yazan kişinin yaratıcılığına bağlı olarak değişir.

33 int boyutdondur(string kelime) { return kelime.length() ; } // yordamın sonu Yordam (Method) Örneği - 2 String elmahesapla(int elmasayisi) { return new String("elma sayisi = " + elmasayisi*2); } // yordamın sonu Yordam İçindeki Yerel Değişkenlerin İlk Değerlerini Alması void hesapla(string kelime, int kdv ) { int sondeger = 0; int kelimeboyut = 0 ; int toplamboyut ; // Hatalı!! toplamboyut++ ; // Hatalı!! kelimeboyut = kelime.length(); sondeger = kelimeboyut + kdv ; } İlk Java Programı - 1 public class Selam { public static void main(string args[]) { System.out.println("Selamlar!"); } } public class Selam : Bu kısım da yeni bir sınıf oluşturuyor... public static void main(string args[]) Java da bir sınıfın tek başına çalışması isteniyorsa (standalone) bu yordam yazılmak zorundadır. Bu yordam sınıflar için bir başlagıç noktasıdır. static yordamlar nesneye bağımlı olmayan yordamlardır. Bu yordamı kullanmak için, ilgili sınıfa ait bir nesne oluşturma zorunluluğu yoktur. Diziler (Arrays) main() yordamı parametre olarak String sınıfı tipinde dizi alır, bu String sınıfı tipindeki dizinin içerisinde, konsoldan Java uygulamasına gönderilen parametreler bulunur. args[0] : konsoldan girilen 1. parametre değerini taşır args[1] : konsoldan girilen 2. parametre değerini taşır args[n-1] : konsoldan girilen n. parametre değerini taşır Java da diziler sıfır dan başlarlar.

34 System.out.println("Selamlar!") Bu komut satırı, bilgileri konsola (ekrana) basmamızı sağlar. Java nın dokümanlarına bakarsak; System sınıfı altında static bir alan olan out alanının mevcut olduğunu görüyoruz. Bu yüzden System sınıfını oluşturmak zorunda değiliz (new System() ). out alanı bize PrintStream nesnesi oluşturur ve PrintStream nesnesinin println() methodu ile bilgileri konsola(ekrana) bastırırız.

35 Mikroişlemciler

36 BÖLÜM 1. GİRİŞ Günümüzde hızla gelişen teknoloji bilgisayarla kontrol edilen cihazları bizlere çok yaklaştırdı. Öyle ki günlük hayatımızda sıkça kullandığımız bir çok elektronik cihaz (cep telefonu, faks, oyuncaklar, elektrikli süpürge, bulaşık makinası, vs.) artık çok küçük sayısal bilgisayarlarla (mikro denetleyiciler) işlev kazandırılabilmektedir. Benzer işler, ilk zamanlarda mikroişlemci tabanlı bilgisayar kartları ile yapılabilmekteydi. Mikroişlemci ile bir cihazı kontrol etme işlemi Giriş/Çıkış ve hafıza elemanı gibi ek birimlere ihtiyaç duyar. Böylesi bir tasarım kolay olmamakla birlikte, maliyet ve programlama açısından da dezavantajlara sahiptir. İşte mikrodenetleyiciler bu sorunları ortadan kaldırmak ve bir çok fonksiyonu tek bir entegrede toplamak üzere tasarlanmış olup, günümüzde hemen hemen bir çok elektronik cihazda farklı tipleri bulunmaktadır. Mikroişlemci, saklı bir komut dizisini ardışıl olarak yerine getirerek veri kabul edebilen ve bunları işleyebilen sayısal bir elektronik eleman olarak tanımlanabilir. Mikroişlemci temelde mantık kapıları, flip-floplar, sayıcı ve saklayıcılar gibi standart sayısal devrelerden oluşur. Genel olarak bilgisayar ile iki şekilde ilgilenilir : 1. Yazılım (Software) : Bilgisayarın fiziksel parçalarını işler hale getiren bileşenlerdir. 2. Donanım (Hardware) : Bilgisayarı oluşturan fiziksel parçaların tümüdür. Her ikisi de birbirinin tamamlayıcısıdır.birisi olmazsa diğeri de olmaz.sistem öncelikli olarak tasarlanırken önce sistemi meydana getirecek elemanlar,yani donanım parçaları göz önüne alınır.daha sonra yazılım bu yapıya bakılarak yazılır.yazılım,donanımın hangi yönteme göre nasıl çalışacağını gösteren bir sanal uygulamadır. Hangi zamanda hangi elemanın devreye girerek üzerindeki bilgiyi işlemesini sağlamaktadır. Basit bir bilgisayarın ana elemanları Şekil 1.1. de görülmektedir. Tüm sayısal bilgisayarlar şekilde gösterilen elemanlara sahiptirler. Bunların dışındaki eleman ya da cihazlar seçimliktir. Adres yolu CPU Bellek Giriş/Çıkış Kontrol yolu Veri Yolu

37 Şekil 1.1: Genel Bilgisayar yapısı Bilgisayarı oluşturan bu sistemdeki elamanlar; mikroişlemci(cpu), bellek ve giriş/çıkış(g/ç) birimleridir. Mikroişlemcinin işleyeceği komutlar ve veriler geçici veya kalıcı belleklerde tutulmaktadır. Bilgiyi oluşturan komut ve veriler bellekte karmaşık veya farklı alanlarda tutulabilir.yazan kişinin karakterini veya seçtiği yolu gösteren çeşitli algoritmalardan meydana gelen program işlemciyi kullanarak verilerin işlenmesini sağlar.bilginin işlenmesi sırasında ortaya çıkabilecek ara değerler,en sonunda sonuçlar bellekte bir yerde depolanmak zorundadır.bütün bu yapılan işlemler bir hesaba dayanmaktadır.bilgisayarın bilgiyi işlemedeki ana karar vericisi sistemin kalbi sayılan mikroişlemcidir.cpu tarafından gerçekleştirilen iki temel işlem vardır.birincisi komutların yorumlanarak doğru bir sırada gerçekleşmesini sağlayan kontrol işlevi,diğeri toplama,çıkarma vb özel matematik ve mantık işlemlerinin gerçekleştirilmesini sağlayan icra işlevidir. Bilgisayarda çalıştırılan yazılımlar kendi aralarında ikiye ayrılır.bunlar, programcı tarafından yüksek düzeyde yazılan programlardır ki insanlar tarafından anlaşılabilir düzeydedir ve bu yazılan programların makine tarafından anlaşılmasını sağlayan bağdaştırıcı (interface) yazılımlardır ki işletim sistemi(os) olarak anılırlar.mikroişlemci mantıksal 0 ve 1 esasına göre çalıştığından,verilen komutların da bu esasa dayanması gerekmektedir.kısaca sayısal bilgisayarların kullandığı doğal dile makine dili denir.programcı tarafından yüksek düzeyde yazılan programlar ancak yine insanlar tarafından anlaşılabilir.bu programların makine tarafından anlaşılabilmesi için derleyici,yorumlayıcı ve assembler gibi aracı programların kullanılması gerekir. Demek ki, yazılım denildiğinde akla, işletim sistemi, üst düzey diller vasıtasıyla yazılan çeşitli uygulama programları gelir. Bu diller; - Yüksek seviyeli diller - Orta seviyeli diller - Düşük seviyeli diller olmak üzere üç sınıfa ayrılabilir.bu yüksek, orta, düşük kelimelerinin anlamı donanımın yazılıma ne kadar yakın olduğunu gösterir. Yüksek seviyeli dillerin kontrol sistemlerinde kullanımı zordur. Yüksek seviyeli bir dilde yazılan program derleyici tarafından derlendiğinde bilgisayar bunu düşük seviyeli dile (makina diline) çevirerek anlar. Orta seviyeli dillerin (assembly) kontrol sistemlerinde kullanımı uygundur. Assembly dilini kullanırken donanımı bilmemiz zorunludur. Örneğin Intel 8085 ve Motorola 6800 mikroişlemcilerinin assembly dilleri farklıdır. Çünkü donanımları farklıdır. Orta seviyeli diller

38 makina dilinde, yani ikili sayı sistemi ile program yazma zor ve zahmetli bir iştir. Bunun için makina dilinin komutlar şeklinde verilmesini sağlayan assembly diller geliştirilmiştir. Assembly dilinde program yazmak makina diline göre daha kolay ve anlaşılırdır. Fakat fazla miktarda komut içerir. Bunun için anlama ve kullanımı belli bir zaman alır. Assembly makinaya yönelik dillerdir. Programcı kullandığı bilgisayarın donanımını ve adresleme tekniklerini çok iyi bilmelidir. Assembly programları standart değildir. Aynı model olmayan her mikroişlemcinin kendine özgü assembly dili vardır. Programcı bu dille makinayla en basit şekilde iletişim kurar. Assembly dilinde yazılan her program bellekte saklanırken veya işlenirken 0 veya 1 ler formuna çevrilmeye gerek duyar. Bu çevirme işi programcı tarafından üretici firmanın databook kitabına bakılarak elle veya bir assembler (Assembly derleyicisi) yardımıyla yapılır. Tek tek komut kodu karşılığına bakılarak ikili komut kodları bulunuyorsa ve eğer program çok uzun veya tekrarlamalı ise,kaynak programı amaç programa çevirmek çok zor ve hata yapma payı yüksek olacaktır. Bu gibi durumlarda iyi bir assembler programı kullanılmalıdır. Bazen programcılar Assembly dili ile assembleri karıştırmaktadırlar. Assembly dili, konuşma dilinde emir şeklindeki cümleden özenle seçilerek alınmış ve sayısı genelde üç en fazla dört olabilen harflerden meydana gelen ve bir komut anlam ifade eden hatırlatıcıları içerir. Assembly dilinde program yazmak makine dilinde yazmaktan daha kolay ve takibi daha basittir. Fakat bu programın belleğe konulmadan önce makine diline çevrilmesi gereklidir,işte bu işi assembler denilen (bir nevi paket programda denilen) çevirici program yapar.bu çevirme işlemine kaynak programın amaç programa çevrilmesi denir. Assembly dilinde yazılmış bir programın amaç programa çevirmede en çok kullanılan yöntem elle yapılan işlemdir.bu yöntemde her satırdaki hatırlatıcıya karşılık gelen kodlar üretici firma tarafından yayınlanan databook a bakılarak bulunur. Böylece amaç program bulunmuş olur. Assembly Dilinin Dezavantajları Assembly dilinde bir program yazmak için üzerinde çalışılan bilgisayarın özellikleri hakkında detaylı bilgi sahibi olunmalıdır. Mesela bunlar,bilgisayar mikroişlemcisinde bulunan kaydediciler ve sayısı,komut kümesi ve adresleme türleri gibi değişik özelliklerdir. Assembly dilinin diğer bir mahsuru elastiki olmamasıdır. Değişik firmalarca üretilen her mikroişlemcinin kendisine has bir programlama dili olmasıdır.bundan dolayı bir mikroişlemci için yazılan bir assembly dilindeki program diğer bir mikroişlemcide çalışmayabilir.

39 Assembly Dilinin Avantajları Assembly dilinde program yazanlar,donanımın çalışmasını çok iyi anlamak ve ona göre iyi programlar geliştirmek zorunda olduklarından kendilerine birçok kazanımlar sağlarlar.yüksek düzeyli dillerde program yazarken bilgisayar donanımının görünmeyen bazı yanlarına assembly dilinde sahip olunur. Assembly dilinde yazılan programlar yüksek düzeyli dillerle yazılan programlara nazaran daha hızlı ve küçük boyutludur. Assembly dili,program büyüklüğünde ve çalışma hızında ideal optimizasyon sağlar. Düşük seviyeli diller ise, makina dilleridir. Yine makinaya özgü bir dildir. Bu dilde programlama çok zor, hata yapma oranı çok yüksek ve programı kontrol etme imkanı nerede ise yoktur. Assembly ve makina diline uygun uygulamalar : - Hesaplamalardan daha çok giriş/çıkış gerektiren uygulamalar - Gerçek zaman denetimi ve uygulamaları - Fazla veri işlemesi gerekmeyen uygulamalar - Hızlılık istene uygulamalar

40 BÖLÜM 2. MİKROİŞLEMCİ VE MİKROBİLGİSAYARLAR 2.1. BİLGİSAYAR MİMARİSİ Bilgisayar mimarisi, komut kümesinin,donanım elamanlarının ve sistem organizasyonunun dahil olduğu bir bilgisayarın tasarımıdır. Mimari iki farklı yaklaşımla tanımlanmaktadır: ISA - Komut kümesi mimarisi HSA - Donanım sistem mimarisi ISA, bir bilgisayarın hesaplama karakteristiklerini belirleyen komut kümesinin tasarımıdır. HSA; CPU, depolama ve G/Ç sistemlerinin dahil olduğu alt sistem ve bunların bağlantı şekilleridir. Komut kümesinin yazılım ve donanımla ilişkisi Şekil 2.1. de görülmektedir. Şekil 2.1.: Komut kümesinin yazılım ve donanımla ilişkisi Bilgisayar sistemlerinde bütün mesele,bu iki kavramı yerli yerine oturtmaktır. Mimari bir kavram olarak HSA nın ne olduğu ve hangi elemanlardan meydana geldiği yukarıda açıklanmıştır. ISA ise, programcının bu elemanlara yön verecek programı yazması durumunda nasıl bir kabul göreceğidir.farklı şirketler tarafından üretilen farklı bilgisayarların fiyat/performans açısından elbette farklı mimarileri olabilir. Özel bilgisayar sistemleri(günümüzde bir çeşit oyun konsolları )için programcı kodlarını makinanın doğrudan özel donanımına göre yazmaktaydı.böylece bir makine için yazılan program aynı firma tarafından üretilse bile,ne rekabet ettiği bir makinasında ne de diğer makinasında çalışabilmekteydi. Mesela, A makinası için yazılan bir oyun B makinasında veya C makinasında çalışmayacaktır. Programcı tarafından yazılan kodlar donanımı açma anahtarı olarak düşünülebilir (Şekil 2.2..).

41 Yazılım Yazılım Komut Kümesi Mimarisi Donanım Donanım Şekil 2.2.: Komut Kümesi mimarisinin yazılım ve donanımla ilişkisi Programsal yaklaşım Bilgisayar sistemlerinde bütün mesele sistemi meydana getiren tüm elemanların bir komutla nasıl devreye sokulacağıdır.ufak tefek ayrıcalıkları olsa da birbirine benzer yapıdaki bilgisayarlar için farklı programlar yazmak oldukça maliyetli olduğundan,programcının yazdığı komutların her bilgisayar tarafından algılanarak yürütülmesi esas hedeftir. Ortaya atılan ilk çözüm mikrokod yaklaşımı daha sonraları iki standarttan biri olmuştur. Donanımı devreye sokacak öz bilgilerin yani komut kümesinin yer aldığı bu yere (bölgeye) mikrokod motoru denilmektedir. (Şekil 2.3.). Burası,CPU içinde CPU olarak da ifade edilebilir.programcının yazdığı kodları işlemcinin daha çabuk anlayabileceği veya çalıştırabileceği küçük mikrokodlara dönüştüren bu mikrokod motoru,işlemci ROM bellek vasıtasıyla yerleştirilmiştir. Mikroprogram ve icra birimi tarafından meydana gelen mikrokod ROM un görevi,özel komutların bir dizi kontrol sinyallerine çevirerek sistem elemanlarının denetlenmesini sağlar. Aynı zamanda, mikrokod CISC tipi işlemcilerdeki temel işlevi, alt düzey komut kümesiyle programcının çalıştığı üst düzey komutlar arasında soyutlama düzeyi oluşturmaktır. Ana Bellek CPU Mikrokod ROM Ön bellek Kontrol Birimi Kaydediciler Kaydediciler Şekil 2.3.: Bir mikrokod ROM un sistemdeki yeri

42 Mikroişlemci üreticileri,sistem tasarımında iki yönlü düşünmek zorundadırlar. Birincisi,mimariyi meydana getiren elemanların işlevleri,ikincisi bu elemanların nasıl devreye sokulacağıdır. Elemanları devreye sokmak için program yazmak gerekecektir.bu işin bir yanı; diğer yanı ise donanımdır.donanımla tasarım mühendisleri ilgilenir.fakat programcı öyle bir program yazmalı ki,sistem tarafından algılanarak doğru zamanda doğru eleman devreye sokulabilsin. Donanım mimarisini programcıya aktaracak en iyi yol ona kullanabileceği komut kümesini hazır vermektir.bilgisayar sisteminin donanımsal tüm özelliklerini içeren sisteme komut kümesi mimarisi denildiğine göre, programcı bu kümeye bakarak veya bu kümeyi kullanabilen derleyicileri kullanarak hiçbir endişeye gerek duymaz. Programcının yazdığı bir komut işletildiğinde, mikrokod ROM bu komutu okur ve sonra o komuta karşılık gelen uygun mikrokodları yükler ve çalıştır. Donanımsal Yaklaşım Mikrokod kullanılarak ISA sisteminin yürütülmesinin başlıca sakıncası başlangıçta komutların doğrudan çalıştıran sisteme göre yavaş olmasıdır. Mikrokod, ISA tasarımcılarına programcının ara sıra kullandığı her çeşit komutların komut kümesine eklenmesini ister. Daha çok komut demek daha fazla mikrokod, çekirdek büyüklüğü ve güç demektir. ISA mimarisinin yaşanan aksaklıklarından dolayı daha sonraları,komutların doğrudan donanım elemanları tarafından yorumlanarak sistemin denetlendiği diğer bir mimari yaklaşımda donanımsal çalışma modelidir..komutların anlaşılır standart bir boyuta getirilerek çalışıldığı sisteme RISC modeli denilmektedir.yani komutların donanımsal çalışma modeline sahip RISC tipi bilgisayarlarda, komut kümesindeki komutların sayısı azaltılmış ve her bir özel komutun boyutu düşürülmüştür. 2.2. MİKROİŞLEMCİLER VE MİKRODENETLEYİCİLER MİKROİŞLEMCİ, saklı bir komut dizisini ardışıl olarak yerine getirerek veri kabul edebilen ve bunları işleyebilen sayısal bir elektronik eleman olarak tanımlanabilir. Günümüzde basit oyuncaklardan, en karmaşık kontrol ve haberleşme sistemlerine kadar hemen her şey mikroişlemcili sistemlerle kontrol edilmektedir. Mikrodenetleyici veya sayısal bilgisayar üç temel kısım (CPU, Giriş/Çıkış Birimi ve Hafıza) ile bunlara ek olarak bazı destek devrelerinden oluşur. Bu devreler en basitten, en karmaşığa kadar çeşitlilik gösterir.

43 Çevresel üniteler monitör, klavye, yazıcı, modem Giriş/Çıkış ünitesi CPU M ikroişlemci RAM bellek Şekil 2.4 : Bir mikroişlemci sisteminin temel bileşenleri Giriş / Çıkış (Input / Output) : Sayısal, analog ve özel fonksiyonlardan oluşur ve mikroişlemcinin dış dünya ile haberleşmesini sağlar. CPU (Central Processing Unit Merkezi İşlem Birimi) : Sistemin en temel işlevi ve organizatörüdür. Bilgisayarın beyni olarak adlandırılır.komutları yürütmek, hesapları yapmak ve verileri koordine etmek için 4, 8, 16, 32 ve 64 bitlik sözcük uzunluklarında çalışır. Hafıza : RAM, ROM, PROM, EPROM, EEPROM veya bunların herhangi bir birleşimi olabilir. Bu birim, program ve veri depolamak için kullanılır. Osilatör : Mikroişlemcinin düzgün çalışabilmesi için gerekli olan elemanlardan biridir. Görevi; veri ve komutların CPU 'ya alınmasında, yürütülmesinde, kayıt edilmesinde, sonuçların hesaplanmasında ve çıktıların ilgili birimlere gönderilmesinde gerekli olan saat darbelerini üretmektir. Osilatör, farklı bileşenlerden oluşabileceği gibi hazır yapılmış bir modül de olabilir. Diğer devreler : Mikroişlemci ile bağlantılı diğer devreler; sistemin kilitlenmesini önlemeye katkıda bulunan Watchdog Timer, mantık aşamalarını bozmadan birden fazla yonganın bir birine bağlanmasını sağlayan adres ve veri yolları (BUS) için tampon (buffer), aynı BUS 'a bağlanmış devrelerden birini seçmeyi sağlayan, adres ve I/O için kod çözücü elemanlar (decoder). Mikroişlemcinin Çalışması: Bir mikroişlemcinin çalışmasında,kontrol birimi tarafından yerine getirilen ve Şekil 2.5 de gösterilen temel iki işlem vardır. Komut okuma (fetch) ve komut yürütme (execute). Komut okuma,mikroişlemcinin hafızadan bir işlem kodu (operation codeopcode) alıp komut saklayıcısına (Instruction Register IR) getirme işlemine denir. Komut saklayıcısına gelen komut ile hangi işlemin yapılacağı komut kod çözücüsü tarafından belirlenir.gereken sinyalleme kontrol birimi tarafından üretilir.eğer komut ile belirlenen işlem için,bazı işlem verisine (operand) gerek var ise,bu veriler hafızadan okunur.

44 Son olarak komutun yürütülmesi gerçekleştirilir. Bir komutun yürütülmesi bittikten sonra, benzeri şekilde; tekrar komut okuma ve yürütme işlemleri,sonsuz bir çevrim içinde, bir durma (halt) komutu yürütülünceye kadar yapılır. Mikroişlemcinin çalışmasının durduran bu komut ile işlemci bir üçüncü duruma girer ve bu durumdan çıkabilmesi için bir donanım sıfırlaması (reset) gerekir. Komut mikroişlemcide Komut Okuma (Fetch) Yürütme (Execute) Komut yürütmesi biter RESET Durma(Halt) Komutu Donanım sıfırlaması olmadığı sürece dur Durma (Halt) RESET Şekil 2.5:Bir mikroişlemcideki komut okuma ve yürütme çevrimleri Örnek: Bir mikroişlemcinin program hafızasında bulunan programın çalıştırılması adres 0022 0023 0024 op-code 4F 5F Program Hafızası Şekil-2.6. Program yüklü bulunan hafıza 1. Program sayacı o anda çalışan komutun adresini üzerine alır. PC =[0022] 2. Komut kayıtçısı, o anda çalışan komutu üzerinde bulundurur. Ir = 4F 3. Kontrol ünitesi bu komuta göre uygun elektronik sinyalleri uygun yere göndererek komutu çalıştırır. 4F için A akümülatörünü sıfırlayıcı işaret gönderir. 4. Daha sonra PC bir sonraki adrese geçer ve aynı işlemler tekrarlanır.

45 MİKROBİLGİSAYAR (MİKRODENETLEYİCİ, MİCROCONTROLLER) bir bilgisayar içerisinde bulunması gereken temel bileşenlerden Hafıza, I/O ünitesinin tek bir chip(yonga) üzerinde üretilmiş biçimine denir. ÇEVRESEL ÜNİTELER Lamba, motor, LCD, ısı,ışık sensörü vb. PIC M ikrodenetleyicisi I/O Bellek Şekil 2.7 : Bir mikrodenetleyici sisteminin temel bileşenleri Mikroişlemci ile kontrol edilebilecek bir sistemi kurmak için en azından şu üniteler bulunmalıdır; CPU, RAM, Giriş/çıkış ünitesi ve bu üniteler arasında veri/adres alış verişini sağlamak için bilgi iletim yolları (DATA BUS) gerekmektedir. Bu üniteleri yerleştirmek için baskı devre organizasyonu da önemli bir aşamadır. Mikrodenetleyici ile kontrol edilebilecek sistemde ise yukarıda saydığımız ünitelerin yerine tek bir yonga (mikrodenetleyici) kullanmak yeterli olacaktır. Tek bir yonga kullanmak ile, maliyet düşecek, kullanım ve programlama kolaylığı sağlanacaktır. Bu avantajlardan dolayı son zamanlarda bilgisayar kontrolü gerektiren elektronik uygulamalarda gelişmiş mikroişlemci (Embeded processor) kullanma eğilimi gözlenmiştir. Tek chip Veri yolu CPU (Genel amaçlı Mikroişlemci) RAM ROM G/Ç Portu Timer Seri, Paralel, port Adres yolu a) Genel amaçlı mikroişlemci sistemi Tek chip CPU RAM ROM G/Ç Portu Timer Seri, Paralel, port b) M ikrodenetleyici sistemi Şekil 2.8. Mikroişlemcili sistem ile mikrodenetleyici sistemler

46 Günümüz mikrodenetleyicileri otomobillerde, kameralarda, cep telefonlarında, fax- modem cihazlarında, fotokopi, radyo, TV, bazı oyuncaklar gibi sayılamayacak kadar pek çok alanda kullanılmaktadır. Mikrodenetleyiciler 1990 lı yıllardan sonra aşağıdaki ihtiyaçlara cevap verebilmek için gelişmeye başlamışlardır. Gelişim sebepleri; Karmaşık cihazlar da daha yüksek performansa ihtiyaç duyulması Daha geniş adres alanına sahip olması C gibi yüksek seviyedeki dillerde programlama desteğinin sağlanması Windows altında çalışan gelişmiş özelliklere sahip program geliştirme ortamlarının olması Daha az güç tüketimi ve gürültünün olması Büyük geliştirme yatırımları ve yazılım güvenliği açısından varolan çeşitli programların kullanılması Sistem fiyatlarının ucuz olması Giriş/Çıkış ADC DAC PWM ADRES DATA CPU 4 bit 8 bit 16 bit 32 bit ADRES Hafıza RAM EPROM EEPROM Zamanlayıcı Osilatör Şekil 2.9: Mikrodenetleyici sistem Teknolojik gelişmelerle birlikte mikroişlemcilerde zamanla gelişmeye başlamışlardır. Belirli bir sürede ele alınan bit sayısına bakılarak mikroişlemcinin güçlü olup olmadığı belirlenir. Bit uzunluklarına göre 8 bit, 16 bit, 32 bit ve 64 bitlik mikroişlemciler bulunur.

47 2.3. Basitten Karmaşığa Mikroişlemci Yapısı 2.3.1. 8-Bitlik Mikroişlemciler: Basit bir işlemci kaydediciler, aritmetik-mantık birimi ve denetim birimi olmak üzere 3 ana bölümden meydana gelmiştir. Dahili adres yolu MAR Adres yolu DAR PC Bellek Dahili veri yolu MBR Veri yolu IR DR ALU A Komut kod çözücü Diğer CPU elemanlarına Zamanlama ve kontrol birimi R/W Kontrol yolu Şekil 2.10 : Basit bir 8-bitlik işlemcinin yapısını oluşturan ana birimler

48 kaydedicisi), MBR (Memory Buffer Register- Bellek veri kaydedicisi), DAR(Data Address Register- Veri adres kaydedicisi) ve DR (Data register- Veri kaydedicisi) olarak ele alınabilir. Aritmetik ve Mantık Birimi:ALU mikroişlemcilerde aritmetiksel ve mantıksal işlemlerinin yapıldığı en önemli birimdir. Aritmetiksel işlemler denilince akla başta toplama, çıkarma, çarpma ve bölme gelir. Komutlarla birlikte bu işlemleri, mantık kapıları, bu kapıların oluşturduğu toplayıcılar, çıkarıcılar ve flipfloplar gerçekleştirir. Mantıksal işlemlere de AND, OR, EXOR ve NOT gibi işlemleri örnek verebiliriz. BELLEK Dahili veri yolu A DR ALU ALU Bayraklar Şekil 2.11 : Aritmetik ve mantık birimi Zamanlama ve Denetim Birimi: Bu kısım sitemin tüm işleyişinden ve işlemin zamanında yapılmasından sorumlu olan birimdir. Bu birim bellekte program bölümünde bulunan komut kodunun alınıp getirilmesi, kodunun çözülmesi, ALU tarafından işlenip, sonucun alınıp belleğe yüklenmesi için gerekli olan denetim sinyalleri üretir. İletişim yolları: Mikroişlemci mimarisine girmese de işlemciyle ayrılmaz bir parça oluşturan iletişim yolları kendi aralarında üçe ayrılır. Adres yolu; komut veya verinin bellekte bulunduğu adresten alınıp getirilmesi veya adres bilgisinin saklandığı yoldur. Veri yolu ise işlemciden belleğe veya Giriş/Çıkış birimlerine veri yollamada yada tersi işlemlerde kullanılır. Kontrol yolu ise sisteme bağlı birimlerin denetlenmesini sağlayan özel sinyallerin oluşturduğu bir yapıya sahiptir.

49 2.3.2. 16-Bitlik Mikroişlemciler: 16-bitlik mikroişlemciler basit olarak 8- bitlik mikroişlemcilerde olduğu gibi, Kaydediciler, ALU ve Zamanlama-Kontrol birimine sahiptir. Fakat mimari yapısı çoklu görev ortamına uygun hale getirildiğinden, işlemci içerisindeki bölümlerde fonksiyonel açıdan 2 mantıksal bölümden oluşurlar. Bu birimler Veri Yolu Bağdaştırma Birimi (BIU) ve İcra Birimi (EU) dir. BIU birimi, EU birimini veriyle beslemekten sorumluyken, icra birimi komut kodlarının çalıştırılmasından sorumludur. BIU bölümüne segment kaydedicileriyle birlikte IP ve komut kuyrukları ve veri alıp getirme birimleri dahilken, EU bölümüne genel amaçlı kaydediciler, kontrol birimi, aritmetik ve mantıksal komutların işlendiği birim dahildir. İCRA BİRİMİ (EU) Genel amaçlı kaydediciler AH BH CH DH SI DI BP SP AL BL CL DL VERİ YOLU BAĞDAŞTIRMA BİRİMİ (BIU) Segment kaydedicileri CS DS SS ES IP Veri Yolu kontrolu ve adres üretimi Sistem veriyolu Komut kuyruğu ALU Bayraklar Kontrol Birimi Şekil 2.12: 16- bitlik mikroişlemci mimarisi 2.3.3. 32-Bitlik Mikroişlemciler: 3. kuşak mikroişlemcilerdir. Diğerlerinden farklı olarak içerisine FPU (Floating Point Unit- Kayan nokta birimi) denilen ve matematik işlemlerinden sorumlu olan bir birim eklenmiştir. Bu gelişmiş işlemci 64-bitlik geniş bir harici veri yoluna sahiptir. Geniş veri yolu, işlemcinin bir çevrimlik zamanda daha çok veri taşıması ve dolayısıyla yapacağı görevi daha

50 kısa zamanda yapması demektir. Bu, işlemcinin bir tıklanmasıyla, işlemci ile bellek arasında veya işlemci ile G/Ç birimleri arasında, 8-bitlik bir işlemciye göre 8 kat fazla bilgi taşınması demektir. Dallanma tahmini Komut ön belleği 8KB Algetir tamponu Komut kod çözücü 64 bit veri yolu 32 bit Veri Yolu Bağdaştırma Birimi Tamsayı ALU-U Kaydediciler Tamsayı ALU-V FPU adres yolu Veri Ön Belleği 8 KB Şekil 2.13 : 32-bitlik mikroişlemci mimarisi 2.4. Mikrodenetleyicilerin (Mikrobilgisayarların) Gelişimi CPU, Bellek ve Giriş/Çıkış birimlerinin bir arada bulunması mikrodenetleyiciyi özellikle endüstriyel kontrol uygulamalarında güçlü bir dijital işlemci haline getirmiştir. Mikrodenetleyiciler özellikle otomobillerde motor kontrol, elektrik ve iç panel kontrol; kameralarda, ışık ve odaklama kontrol gibi amaçlarda kullanılmaktadır. Bilgisayarlar, telefon ve modem gibi çeşitli haberleşme cihazları, CD teknolojisi, fotokopi ve faks cihazları, radyo, TV, teyp, oyuncaklar, özel amaçlı elektronik kartlar ve sayılmayacak kadar çok alanda, mikrodenetleyiciler kullanılmaktadır. Bu kadar geniş bir uygulama alanı olan mikrodenetleyiciler aşağıda sıralanan çeşitli özelliklere sahiptirler. - Programlanabilir sayısal paralel giriş / çıkış - Programlanabilir analog giriş / çıkış - Seri giriş / çıkış (senkron, asenkron ve cihaz denetimi gibi) - Motor/servo kontrolü için darbe işaret çıkışı (PWM gibi) - Zamanlayıcı (Timer) ile kesme - Harici bellek arabirimi - Harici BUS arabirimi (PC ISA gibi) - Dahili bellek tipi seçenekleri (ROM, PROM, EPROM ve EEPROM)

51 - Dahili RAM seçeneği - Kesirli sayı (kayan nokta) hesaplaması - D/A ve A/D çeviricileri Bu özellikler mikrodenetleyicileri üreten firmalara ve mikrodenetleyicilerin tipine göre değişmektedir. Mikrodenetleyici uygulamalarında dikkate alınması gereken en önemli özellikler gerçek zaman (real time) işlemi ve çok görevlilik (multi-tasking) özellikleridir. Gerçek zaman işlemi, mikrodenetleyicinin ihtiyaç anında çalışma ortamına, gereken kontrol sinyallerini göndermesi ve ortamı bekletmeyecek kadar hızlı olmasıdır. Çok görevlilik ise mikrodenetleyicinin birçok görevi aynı anda veya aynı anda gibi yapabilme kapasitedir. Mikrodenetleyici özet olarak kullanıldığı sistemin birçok özelliğini aynı anda gözleme (monitoring), ihtiyaç anında gerçek-zamanda cevap verme (real-time response) ve sistemi denetlemeden (control) sorumludur. Bir çok firma tarafından mikrodenetleyiciler üretilmektedir. Her firma üretmiş olduğu mikrodenetleyici yongaya farklı isimler ve özelliklerini birbirinden ayırmak içinde parça numarası vermektedir. Bu denetleyicilerin mimarileri arasında çok küçük farklar olmasına rağmen aşağı yukarı aynı işlemleri yapabilmektedir. Her firma ürettiği chip e bir isim ve özelliklerini biri birinden ayırmak içinde parça numarası vermektedir. Günümüzde yaygın olarak 8051(intel firması) ve PIC adı verilen mikrodenetleyiciler kullanılmaktadır. Bunlardan başka Phillips, Dallas, Siemens, Oki, Temic, Haris, Texas gibi çeşitli firmalarda üretim yapmaktadır. Örneğin; bunlardan Microchip firması üretmiş olduklarına PIC adını verirken, parça numarası olarak da 12C508, 16C84, 16F877 gibi kodlamalar vermiştir, Intel ise ürettiği mikrodenetleyicilere MCS-51 ailesi adını vermiştir, Texas Ins. ise işaret işlemeye yönelik olarak Digital Signal Processing (DSP) mikrodenetleyici yongası üretmektedir. PIC mikrodenetleyicileri elektronik cihazlarda çok yaygın olarak kullanılmaktadır. Çünkü her amaca uygun boyut ve özellikte mikrodenetleyici bulmak mümkündür. Çeşitli tiplerde mikrodenetleyiciler kullanılabilir fakat, uygulamada en küçük, en ucuz, en çok bulunan ve yapılan işin amacına yönelik olmasına dikkat edilmelidir. Bunun içinde mikrodenetleyicilerin genel özelliklerinin iyi bilinmesi gerekir. Mikrodenetleyicili bir sistemin gerçekleştirile bilinmesi için, mikrodenetleyicinin iç yapısının bilinmesi kadar, sistemin yapacağı iş için mikrodenetleyicinin programlanması da büyük bir önem arz eder. Mikrodenetleyicili sistemler ile bir oda sıcaklığını, bir motorun hızını, led ışık gibi birimlerini kontrol edebiliriz. Bütün bu işlemleri nasıl yapacağını mikrodenetleyiciye tarif etmek, açıklamak gerekir. Bu işlemlerde mikrodenetleyicili sistemin program belleğine yerleştirilen programlar vasıtasıyla gerçekleştirilir. Mikrodenetleyiciler için programlar asembly veya C gibi bir programlama dilinde yazılabilir. Assembly dilinde yazılan bir program assembler adı verilen bir derleyici ile makine diline çevrildikten sonra mikrodenetleyiciye yüklenir. C dilinde yazılan programında bir çevirici ile makine diline çevrilmesi gerekmektedir. Makine dilindeki bir

52 programın uzantısı.hex dir. PIC mikrodenetleyicisi için program yazarken editör ismi verilen bir programa ihtiyaç vardır. En çok kullanılan editör programı ise MPLAB tır. MPLAB da yazılan programlar proje dosyalarına dönüştürülerek, aynı editör içerisinde derlenebilmektedir. Bütün bu özellikler dikkate alınarak en uygun mikrodenetleyici seçimi yapılmalıdır. Çünkü mikrodenetleyiciler ticari amaçlı birçok elektronik devrede yaygın olarak kullanılmaktadır. 2.5. Mikrodenetleyici Seçimi Mikrodenetleyici seçimi kullanıcı için oldukça önemlidir, çünkü mikrodenetleyiciler ticari amaçlı bir elektronik devrede yaygın olarak kullanılmaktadır. Bu sistemlerin öncelikle maliyetinin düşük olması için mikrodenetleyicinin de ufak ve ucuz olması istenir. Diğer taraftan ürünün piyasada bol miktarda bulunması da önemlidir. Tüm bu hususlar dikkate alınarak, kullanıcılar öncelikle hangi firmanın ürününü kullanacağına karar veririler. Daha sonra da hangi seriden, hangi ürünün kullanacaklarına karar verirler. Burada mikrodenetleyicinin belleğinin yazılım için yeterli büyüklükte olması, kullanılması düşünülen ADC (Analog Dijital Dönüştürücü) kanalı, port sayısı, zamanlayıcı sayısı ve PWM (Pulse Widht Modulation- Darbe Genişlik Modülasyonu) kanalı sayısı önemlidir. Ayrıca tasarımcı yapılacak iş için uygun hızda mikrodenetleyici kullanmalıdır. Tüm bu hususlar dikate alınarak uygun mikrodenetleyiciye karar verilir. Ürün geliştirmek için pencereli (EPROM) veya FLASH tipinde olan belleği silinip, yazılabilen mikrodenetleyici kullanılır. Çünkü ürün geliştirme aşamasında mikrodenetleyici defalarca silinip, yazılabilmektedir. Ayrıca belleği daha hızlı silinip, yazılabilen FLASH mikrodenetleyiciler öğrenmeye yeni başlayanlar için cazip olmaktadır. Seçimi etkileyen bu noktaları kısaca açıklarsak; Mikrodenetleyicinin İşlem Gücü: Her uygulamada farklı bir işlem gücüne gereksinim duyulabilir. Bunun için yapılacak uygulamada kullanılacak mikrodenetleyicinin çalışabileceği en yüksek frekans aralığı seçilmelidir. Belleğin Kapasitesi ve Tipi: Geliştirilecek olan uygulamaya göre program belleği, veri belleği ve geçici bellek kapasitesi dikkate alınmalıdır. Kullanılacak olan belleğin tipide uygulama için önemli bir faktördür. Giriş/Çıkış Uçları: Mikrodenetleyicinin çevre birimler ile haberleşmesinin sağlayan uçlardır. Bu nedenle giriş/ çıkış uçlarının sayısı oldukça önemlidir. Yapılacak olan uygulamaya göre bu faktörde dikkate alınmalıdır. Özel Donanımlar: Yapılacak olan uygulamanın çeşidine göre mikrodenetleyiciye farklı çevre birimleri de eklenebilir. Mikrodenetleyici çevre birimleri ile iletişim kurarken kullanacağı seri, I 2 C, SPI, USB, CAN gibi veri iletişim protokollerini destekleyen veya ADC, analog karşılaştırıcı gibi analog verileri işleyebilecek donanımlara sahip olması dikkate alınmalıdır.

53 Kod Koruması: Mikrodenetleyicinin sahip olduğu kod koruması özellikle ticari uygulamalarda program kodunun korunmasına olanak sağlamaktadır. 2.6. Bölüm Kaynakları 1. O. Altınbaşak, 2001. Mikrodenetleyiciler ve PIC Programlama, Atlaş Yayıncılık, İstanbul. 2. N. Gardner, 1998. PIC Programlama El Kitabı, Bileşim Yayıncılık, İstanbul. 3. O. Urhan, M.Kemal Güllü, 2004. Her Yönüyle PIC16F628, Birsen Yayınevi, İstanbul. 4. N. Topaloğlu, S. Görgünoğlu,2003. Mikroişlemciler ve Mikrodenetleyiciler, Seçkin Yayıncılık, Ankara. 5. Y. Bodur, 2001. Adım Adım PICmicro Programlama,İnfogate. 6. M. Kemal Güngör,2003. Endüstriyel Uygulamalar İçin Programlanabilir Kontrol Ünitesi.

54 BÖLÜM 3. MİMARİLER 3.1. Mikrodenetleyici / Mikrobilgisayar Tasarım Yapıları Bilgisayarın yüklenen tüm görevleri çok kısa zamanda yerine getirmesinde yatan ana unsur bilgisayarın tasarım mimarisidir. Bir mikroişlemci, mimari yetenekleri ve tasarım felsefesiyle şekillenir. 3.1.1. Von Neuman (Princeton) Mimarisi Bilgisayarlarda ilk kullanılan mimaridir. İlk bilgisayarlar Von Neuman yapısından yola çıkılarak geliştirilmiştir. Geliştirilen bu bilgisayar beş birimden oluşmaktaydı. Bu birimler; aritmetik ve mantıksal birim, kontrol birim, bellek, giriş-çıkış birimi ve bu birimler arasında iletişimi sağlayan yolardan oluşur. BELLEK Adres ve Kontrol Veri Komut G/Ç Birimi ALU KONTROL BİRİM İ Durum Bilgisi CLK Şekil 3.1. Von Neuman mimarili bilgisayar sistemi Bu mimaride veri ve komutlar bellekten tek bir yoldan mikroişlemciye getirilerek işlenmektedir. Program ve veri aynı bellekte bulunduğundan, komut ve veri gerekli olduğunda aynı iletişim yolunu kullanmaktadır. Bu durumda, komut için bir algetir saykılı, sonra veri için diğer bir algetir saykılı gerekmektedir. Program ve Veri Belleği 8 bit CPU Şekil 3.2. Von Neuman mimarisi

55 Von Neuman mimarisine sahip bir bilgisayar aşağıdaki sıralı adımları gerçekleştirir. 1. Program sayıcısının gösterdiği adresten (bellekten) komutu algetir. 2. Program sayıcısının içeriğini bir artır. 3. Getirilen komutun kodunu kontrol birimini kullanarak çöz. Kontrol birimi, bilgisayarın geri kalan birimlerine sinyal göndererek bazı operasyonlar yapmasını sağlar. 4. 1. adıma geri dönülür. Örnek 3.1: Mov acc, reg 1. cp : Komut okur 2.,.. cp : Veriyi okur ve acc ye atar. Von Neuman mimarisinde, veri bellekten alınıp işledikten sonra tekrar belleğe gönderilmesinde çok zaman harcanır. Bundan başka, veri ve komutlar aynı bellek biriminde depolandığından, yanlışlıkla komut diye veri alanından kod getirilmesi sıkıntılara sebep olmaktadır. Bu mimari yaklaşıma sahip olan bilgisayarlar günümüzde, verilerin işlenmesinde, bilginin derlenmesinde ve sayısal problemlerde olduğu kadar endüstriyel denetimlerde başarılı bir şekilde kullanılmaktadır. 3.1.2. Harvard Mimarisi Harvard mimarili bilgisayar sistemlerinin Von Neuman mimarisinden farkı veri ve komutların ayrı ayrı belleklerde tutulmasıdır. Buna göre, veri ve komut aktarımında iletişim yolları da bir birinden bağımsız yapıda bulunmaktadırlar. Veri Belleği 8 bit CPU 14 bit Program Belleği Şekil 3.3. Harvard Mimarisi Komutla birlikte veri aynı saykıl da farklı iletişim yolundan ilgili belleklerden alınıp işlemciye getirilebilir. Getirilen komut işlenip ilgili verisi veri belleğinden alınırken sıradaki komut, komut belleğinden alınıp getirilebilir. Bu önden alıp getirme işlemi, dallanma haricinde hızı iki katına çıkarabilmektedir.

56 Veri Veri Belleği Adres ve Kontrol Komut Belleği Komut G/Ç Birimi ALU KONTROL BİRİM İ Durum Bilgisi CLK Şekil 3.4. Harvard Mimarili bilgisayar sistemi Örnek 3.2: Mov acc, reg 1. cp : Öncelikle move acc, reg komutunu okur. 2. cp : Sonra move acc, reg komutunu yürütür. Bu mimari günümüzde daha çok sayısal sinyal işlemcilerinde (DSP) kullanılmaktadır. Bu mimaride program içerisinde döngüler ve zaman gecikmeleri daha kolay ayarlanır.von Neuman yapısına göre daha hızlıdır. Özellikle PIC mikrodenetleyicilerinde bu yapı kullanılır. 3.2.1. CISC (Complex Instruction Set Computer) Mimarisi Bu mimari, programlanması kolay ve etkin bellek kullanımı sağlayan tasarım felsefesinin bir ürünüdür. İşlemci üzerinde performans düşüklüğü ve işlemcinin karmaşık bir hale gelmesine neden olsa da yazılımı basitleştirmektedir. Bu mimarinin en önemli iki özelliği, değişken uzunluktaki komutlar diğeri ise karmaşık komutlardır. Değişken ve karmaşık uzunluktaki komutlar bellek tasarrufu sağlar. Karmaşık komutlar birden fazla komutu tek bir hale getirirler. Karmaşık komutlar aynı zamanda karmaşık bir mimariyi de oluşturur. Mimarideki karışıklık işlemcinin performansını da doğrudan etkilemektedir. Bu sebepten dolayı çeşitli istenmeyen durumlar ortaya çıkabilir. CISC komut seti mümkün olabilen her durum için bir komut içermektedir. CISC mimarisinde yeni geliştirilen bir mikroişlemci eski mikroişlemcilerin assembly dilini desteklemektedir.

57 Yazılım Yüksek Düzeyli Dil Derleme Makina Dili Çözme Donanım Mikro-kod İşleme Kaydediciler, ALU ve diğerleri Şekil 3.5. CISC tabanlı bir işlemcinin çalışma biçimi CISC mimarisi çok kademeli işleme modeline dayanmaktadır. İlk kademe, yüksek seviyeli dilin yazıldığı yerdir. Sonraki kademeyi ise makine dili oluşturur. Burada yüksek seviyeli dilin derlenmesi ile bir dizi komutlar makine diline çevrilir. Bir sonraki kademede makine diline çevrilen komutların kodları çözülerek, mikrokodlara çevrilir. En son olarak da işlenen kodlar gerekli olan görev yerlerine gönderilir. CISC Mimarisinin Avantajları Mikroprogramlama assembly dilinin yürütülmesi kadar kolaydır ve sistemdeki kontrol biriminden daha ucuzdur. Yeni geliştirilen mikrobilgisayar bir öncekinin assembly dilini desteklemektedir. Verilen bir görevi yürütmek için daha az komut kullanılır. Böylece bellek daha etkili kullanılır. Mikroprogram komut kümeleri, yüksek seviyeli dillerin yapılarına benzer biçimde yazıldığından derleyici karmaşık olmak zorunda değildir. CISC Mimarisinin Dezavantajları Gelişen her mikroişlemci ile birlikte komut kodu ve yonga donanımı daha karmaşık bir hale gelmiştir. Her komutun çevirim süresi aynı değildir. Farklı komutlar farklı çevrim sürelerinde çalıştıkları için makinanın performansını düşürecektir. Bir program içerisinde mevcut komutların hepsi kullanılamaz.

58 Komutlar işenirken bayrak bitlerinin dikkat edilmesi gerekir. Buda ek zaman süresi demektir. Mikroişlemcinin çalışmasını etkilemektedir. 3.2.2. RISC ( Reduced Instruction Set Computer) Mimarisi RISC mimarisi IBM, Apple ve Motorola gibi firmalarca sistematik bir şekilde geliştirilmiştir. RISC mimarisinin taraftarları, bilgisayar mimarisinin gittikçe daha karmaşık hale geldiğini ve hepsinin bir kenara bırakılıp en başta yeniden başlamak fikrindeydiler. 70 li yılların başında IBM firması ilk RISC mimarisini tanımlayan şirket oldu. Bu mimaride bellek hızı arttığından ve yüksek seviyeli diller assembly dilinin yerini aldığından, CISC in başlıca üstünlükleri geçersiz olmaya başladı. RISC in felsefesi üç temel prensibe dayanır. Bütün komutlar tek bir çevrimde çalıştırılmalıdır: Her bir komutun farklı çevrimde çalışması işlemci performansını etkileyen en önemli nedenlerden biridir. Komutların tek bir çevrimde performans eşitliğini sağlar. Belleğe sadece load ve store komutlarıyla erişilmelidir. Eğer bir komut direkt olarak belleği kendi amacı doğrultusunda yönlendirilirse onu çalıştırmak için birçok saykıl geçer. Komut alınıp getirilir ve bellek gözden geçirilir. RISC işlemcisiyle, belleğe yerleşmiş veri bir kaydediciye yüklenir, kaydedici gözden geçirilir ve son olarak kaydedicinin içeriği ana belleğe yazılır. Bütün icra birimleri mikrokod kullanmadan donanımdan çalıştırılmalıdır. Mikrokod kullanımı, dizi ve benzeri verileri yüklemek için çok sayıda çevrim demektir. Bu yüzden tek çevirimli icra birimlerinin yürütülmesinde kolay kullanılmaz. Ana bellek Ana bellek Ön bellek Komut Ön belleği Veri Ön belleği Komut ve Veri yolu Veri yolu Kontrol Birimi Mikrokod ROM Donanım Kontrol Birimi a) b) Şekil 3.6. a) Mikrokod denetimli CISC mimarisi; b) Donanım denetimli RISC mimarisi

59 RISC mimarisi küçültülen komut kümesi ve azaltılan adresleme modları sayısı yanında aşağıdaki özelliklere sahiptir. Bir çevrimlik zamanda komut işleyebilme Aynı uzunluk ve sabit formatta komut kümesine sahip olma Ana belleğe sadece load ve store komutlarıyla erişim; operasyonların sadece kaydedici üzerinde yapılması Bütün icra birimlerinin mikrokod kullanmadan donanımsal çalışması Yüksek seviyeli dilleri destekleme Çok sayıda kaydediciye sahip olması RISC Mimarisinin Üstünlükleri Hız: Azaltılmış komut kümesi, kanal ve süperskalar tasarıma izin verildiğinden RISC mimarisi CISC işlemcilerin performansına göre 2 veya 4 katı yüksek performans gösterirler. Basit donanım: RISC işlemcinin komut kümesi çok basit olduğundan çok az yonga uzayı kullanılır. Ekstra fonksiyonlar, bellek kontrol birimleri veya kayan noktalı aritmetik birimleri de aynı yonga üzerine yarleştirilir. Kısa Tasarım Zamanı: RISC işlemciler CISC işlemcilere göre daha basit olduğundan daha çabuk tasarlanabilirler. RISC Mimarisinin Eksiklikleri: CISC starım stratejisinden RISC tasarım stratejisine yapılan geçiş kendi problemlerinde beraberinde getirmiştir. Donanım mühendisleri kodları CISC işlemcisinden RISC işlemcisine aktarırken anahtar işlemleri göz önünde bulundurmak zorundadırlar. CISC ve RISC Tabanlı İşlemcilerin Karşılaştırılması CISC ve RISC tabanlı işlemcilerin karşılaştırılmasında iki önemli faktör farklılıklarını ortaya çıkarmada yeterlidir. Hız: Genelde RISC çipleri kanal tekniği kullanarak eşit uzunlukta segmentlere bölünmüş komutları çalıştırmaktadır. Kanal tekniği komutları kademeli olarak işler ki bu RISC in bilgi işlemini CISC den daha hızlı yapmasını sağlar RISC işlemcisinde tüm komutlar 1 birim uzunlukta olup kanal tekniği ile işlenmektedir. Bu teknikte bazıları hariç komutlar, her bir basamağında aynı işlemin uygulandığı birimlerden geçerler. Kanal teknolojisini açıklamak için herhangi bir komutun işlenmesindeki adımlar ele alınırsa:

60 Aritmetik ve Mantık Biriminde işleme tabii tutulur ve dördüncü adımda da sonuç kaydediciye yazılacaktır. Böylece bir komutun işlemesi için her bir basamak bir saat çevrimi gerektirirse, dört çevrimle (adımda) gerçekleşmiş olmakta ve bir adım bitmeden diğeri başlayamamaktadır. Kanal tekniği ile çalışan işlemcilerde birinci adımda komut kodu çözülür, ikinci adımda birinci komutun üzerinde çalışacağı veri (işlenen) kaydediciden alınırken, sıradaki ikinci işlenecek olan komutun kodu çözülür. Üçüncü adımda ilk komutun görevi ALU da yerine getirilirken, ikinci komutun işleyeceği işlenen alınıp getirilir. Bu anda sıradaki üçüncü komutun kodu çözülür ve işlem böylece devam eder. Kanal (Pipeline) tekniğinde çevrim zamanın düşmesi için komut kodlarının hızlı çözülmesi gereklidir. RISC mimarisinde tüm komutlar 1 birim uzunlukta oldukları için komut kodunu çözme işlemi kolaylaşır. Sistemde kullanılan kaydedicilerin simetrik bir yapıda olması, derleme işlemini kolaylaştırmaktadır. RISC işlemcilerde belleğe yalnız yükle ve depola komutlarıyla ulaşılır. Bazı eski CISC mimarisinde de olmasına rağmen RISC mimarisinin sabit uzunluktaki basit komutlarla çalışması pipeline sistemini daha iyi kullanmasına sebep olmaktadır. Bu yüzden hesaplama oranlarının birinci öncelik arz ettiği yerlerde iş-istasyonları ve dağıtıcılarda çok tercih edilmektedir. Transistör sayısı: CISC mimarisinde kullanılan transistor sayısı RISC e nazaran daha fazladır. Transistör sayısının bir yerde çok olması fazla yerleşim alanı ve ayrıca fazla ısı demektir. Bundan dolayı da fazla ısı üretimi soğutma olayını gündeme getirmektedir. CISC tabanlı Pentium işlemcilerde karışık ısı dağıtıcısı veya soğutma fanlar kullanılmaktadır. RISC mimarisindeki önemli üstünlüklere karşı bazı mahzurları ortaya çıkmaktadır. RISC mimarisi, CISC in güçlü komutlarından yoksundur ve aynı işlemi yapmak için daha fazla komut işlenmesini gerektirir. Bundan dolayı da RISC in bant genişliği artar. Bu sistemde güçlü komutların yokluğu ikinci bir yardımcı işlemciyle ya da işlemci içinde oluşturulacak ayrı bir pipeline bölümüyle giderilebilir. Komut ön-belleğinin kullanılması yüksek komut alıp getirme işlemini azaltmaktadır. RISC mimarisi diğerine nazaran daha kompleks yazılımlara ihtiyaç duyar. RISC (Hard- CISC (Microprogrammed Control Unit) Hızlı Nispeten yavaş Ucuz Pahalı Yeniden dizayn zor Esnek Daha az komut (instruction) Daha fazla komut (instruction) Daha fazla saklayıcı bellek (register) Daha az saklayıcı bellek (register)

61 3.2.3. EPIC Mimarisi Bu mimari RISC ve CISC mimarisinin üstün yönlerinin bir arada buluştuğu bir mimari türüdür. EPIC mimarisi, işlemcinin hangi komutların paralel çalışabildiğini denetlemesi yerine, EPIC derleyicisinden açık olarak hangi komutların paralel çalışabildiğini bildirmesini ister. Çok uzun komut kelimesi (VLIW) kullanan bilgisayarlar, yazılımın paralelliğine ilişkin kesin bilgi sağlanan mimari örneklerdir. EPIC varolan VLIW mimarisinin dallanma sorunlarını çözmeye çalışarak daha ötesine gitmeyi hedeflemektedir. Derleyici programdaki paralelliği tanımlar ve hangi işlemlerin bir başkasından bağımsız olduğunu belirleyerek donanıma bildirir. EPIC mimarisinin ilk örneği, IA-64 mimarisine dayalı Itanium işlemci ailesidir. EPIC Mimarisin Üstünlükleri Paralel çalıştırma ( çevrim başına birden çok komut çalıştırma) Tahmin kullanımı Spekülasyon kullanımı Derleme anında paralelizmi tanıyan derleyiciler Büyük bir kaydedici kümesi Dallanma tahmini ve bellek gecikmesi problemlerine karşı üstün başarı Gelişme ile birlikte eskiye karşı uyumluluk 3.2.4. DSP (Dijital Signal Processing -Dijital Sinyal işleme) Dijital Signal Processing (Dijital Sinyal işleme) sözcüklerinin bir kısaltmasıdır. 1970'lerin sonlarında mikro-işlemcilerin ortaya çıkmasıyla, DSP kullanımı geniş bir uygulama alanı bulmuştur. Kullanım alanları, cep telefonlarından bilgisayarlara, video çalıcılardan modemlere kadar çok geniş bir alana yayılmaktadır. DSP yongaları, mikro-işlemciler gibi programlanabilir sistemler olup, saniyede milyonlarca işlem gerçekleştirebilir. DSP kartları, üzerlerindeki DSP'ler sayesinde aynı anda bir çok efekt uygulayabilir. Özellikle modemlerde bulunurlar. Çok yüksek hızlarda kayan nokta matematiksel işlemleri yapmak üzere geliştirilmiş bir donanımdır. Diğer birçok şeyin yanı sıra DSP donanımı ses ve görüntü sinyallerinin gerçek zamanlı sıkıştırma ve açma işlemleri için kullanıla bilinir.

62 analog veri ADC DAC analog veri dijital veri DSP dijital veri Ana Bilgisayar Sistemi Şekil 3.7. DSP sistem ve elemanları 3.3. Bölüm Kaynakları 1. O. Altınbaşak, 2001. Mikrodenetleyiciler ve PIC Programlama, Atlaş Yayıncılık, İstanbul. 2. N. Gardner, 1998. PIC Programlama El Kitabı, Bileşim Yayıncılık, İstanbul. 3. O. Urhan, M.Kemal Güllü, 2004. Her Yönüyle PIC16F628, Birsen Yayınevi, İstanbul. 4. N. Topaloğlu, S. Görgünoğlu,2003. Mikroişlemciler ve Mikrodenetleyiciler, Seçkin Yayıncılık, Ankara. 6. Ö.Kalınlı, 2001. Signal Processing With DSP.

63 İnternet Programlama: PHP

64 PHP'ye Giriş C/C++, Pascal, hatta Visual Basic bilen kişiler için PHP öğrenmek hemen hemen bir öğleden sonrayı ayırmak suretiyle yapılabilecek bir iştir. Bu dillere aşina olmayanlar ise belki bir kaç öğleden sonralarını ayırmak zorunda kalabilirler! PHP, bir Script dilidir; yani kodları düz yazı dosyaları halinde kaydedilir ve kullanılacağı ortamda bir yorumlayıcı tarafından yorumlanır. Bu, PHP ile yazacağınız programları, derlemek yani ortaya bir EXE veya çalıştırılabilir başka bir dosya çıkartmaya gerek olmadığı anlamına gelir. Fakat PHP Script'lerinizi çalıştırabilmek için bu dili bilen bir programa ihtiyacınız vardır. Bu programın tek başına (komut istemci penceresinde veya terminal ekranında) çalışması mümkün olduğu gibi, Web Server tarafından da çalıştırılabilir olması gerekir. Başka bir deyişle Web Sunucu programının PHP anlar hale getirilmesini sağlamak zorundayız. PHP yorumcusu, bugün Zend-çekirdeği adı verilen bir Scripting teknolojine dayalı olarak, Zeev Suraski ile Andi Gutmans tarafından sıfırdan, tamamen yeniden yazılmış bulunuyor. Zend, tıpkı Windows Script Host ve mesela Visual Basic for Applications (VBA) gibi, işletim sistemine kendisi ile uyumlu Script dilleriyle yazılmış programları çalıştırma imkanı kazandıran bir teknolojidir (Zend konusunda ek bilgiyi Internet'te www.zend.com adresinde bulabilirsiniz.) Bugün bu dilin resmî adı "PHP: Hypertext Preprocessor" (Hipermetin ön-işlemcisi) olarak değiştirildi, ve çeşitli Web Server'ların PHP dili anlaması için gerekli yorumlayıcıları yeniden üretlidi. 20 Ocak 200'de İsrail'de PHP'nin ilk uluslararası konferansı yapıldı ve 4'ncü sürümünün betası ortaya kondu. Peki ama PHP nedir? PHP ile artık oturup her türlü işlevselliği sahip programlar yazabilirsiniz; yani PHP başlı başına uygulama alanları bulabilecek düzeye ulaşmıştır. Başka bir deyişle PHP ile oyun programından tutun veritabanı yönetimine kadar hemen her türlü programı

65 yazabilirsiniz. Bizi bu kitapçıkta ilgilendiren tarafıyla PHP, Web Sunucu'ya bir takım işler yaptırmak için program yazma dilidir. Tıpkı CGI/Perl veya ASP ya da ColdFusion, Java (Javascript değil!) gibi! PHP kodları, oluşturacağımız HTML sayfalarında HTML etiketlerinin arasında kendi özel ayracı içinde yazılır: <html> <?PHP echo ("Merhaba Dünya!");?> </html> İster kişisel bilgisayarımızda, ister gerçek Internet ortamında olsun, bir Web Sunucu, ziyaretçinin (Internet istemci programının, Browser'ın) talep ettiği dosya adının uzatması olarak ".PHP," ".PHP2," ".PHP3," veya ".PHP4" görünce, kendine kendine, "Yine bana iş çıktı!" diye düşünür! Çünkü Web Server, uzatması ".htm" veya ".html" olan bir dosyayı, kendi sabit disklerinden birinde bulur ve zahmetsizce, ziyaretçinin bilgisayarına gönderir. Fakat, ".asp,".pl," ".cfm" gibi, ".PHP" uzatması, Web Sunucu'ya bu sayfayı olduğu gibi, alıp ziyaretçinin Browser'ına göndermek yerine, önce PHP yorumlayıcıyı çağırarak, ona teslim etmesi gerektiğini bildirir. PHP yorumlayıcısı (yani Windows ortamında PHP.exe veya 4'ncü sürümle gelen PHP4isapi.dll, Unix ve türevlerinde çalıştırılabilir PHP dosyası), kendisine teslim edilen bu belgede önce "<?PHP" ve "?>" ayraçları arasındaki PHP kodlarını seçerek alır ve gereği ne ise onu yapar. Bu ayraçların içinde kalan kodlar, bizim yapılmasını istediğimiz işlemin komutlarıdır. HTML ile yetinmeyip, PHP kullanmamızın sebebi, bu komutların HTML'in yapayacağı şeyleri yapmasıdır. HTML'in yapamayacağı şeylerin başında, Web Sunucusu'nda yapılacak işler vardır. Sözgelimi HTML etiketlerini kullanarak, Web Sunucusu'ndaki bir veritabanı dosyasını açıp, içindeki verileri okuyamayız. HTML yoluyla Web Sunucusu'nun sabit disklerindeki düz yazı dosyalarını da okuyamayız ve bu disklere dosya yazamayız. HTML etiketleri ile Web ziyaretçimizden bilgi edinebilir ve bunları Sunucu'ya yollayabiliriz; ama o kadar! Bu bilgileri işe yarar şekle sokmak için bize Server'da çalışan bir program gerekir. Server'da çalışan

66 program, EXE ve DLL veya JSP (Java Server Pages) gibi bir "gerçek program"; veya Perl, ASP ve PHP gibi Script diliyle yazılmış bir program olabilir. (Gerçek programları yazanlar, tabiî, sizin Script diliyle yazılmış programlara "program" demenize çok kızarlar! Ama bu Script pogramlarının program olmasını hiç engellemez.) Özetlersek, PHP bir CGI programlama dilidir; bu dille, Web Sunucusu ile Web ziyaretçisi arasındaki buluşma noktası olan CGI'da bilgi alışverişi yapılabilir; Sunucu'da

67 bulunan başka programlar çalıştırılabilir ve böylece Web sayfalarımıza HTML'in sınırlamalarının ötesinde hareket ve ziyaretçi ile etkileşme olanağı kazandırılabilir. Sanırım iyi bir Web programcısı olarak şu anda ekrana "Merhaba Dünya!" yazdırmak için sabırsızlanıyorsunuz. Ama bunun için, PHP sayfanızı ya PHP-uyumlu bir Web Sunucusu'ndaki Web sitenize yüklemek, ya da kişisel bilgisayarınızdaki kişişel Web Sunucusu'na PHP öğretmek zorundasınız. Bu ikinci yöntemi kuvvetle tavsiye ederim; çünkü yazacağınız PHP programlarını gerçek Internet Sunucusunda sınamak, bazen arzu edilmeyen durumlara yol açabilir. Oysa kişinin bu denemeleri, evinde ve işyerinde kendi bilgisayarında yapması, çoğu zaman daha az başağrısı ve gözyaşına yol açar! En azından, PHP hatalarınızı ve gözyaşlarınızı sizden başka gören olmaz! PHP ve Veritabanı Kişisel bilgisayarınızdaki kişisel Web sunucusuna PHP öğretme işlemine geçmeden önce, hemen hemen PHP'nin ikiz kardeşi sayılan MySQL'den ve onun rakibi PostgreSQL'den kısaca söz edelim. PHP'nin varlık sebeplerinin başında, ticarî Unix ve Microsoft Windows işletim sistemlerinden ayrı, ticarî olmayan Açık Sistem ortamlarında çalışan bir Script dili ile bu dille kullanılabilecek yine Açık Sistem ürünü bir veritabanı erişim ve yönetim aracına sahip olmak gelir. Perl, gerçi PHP'den çok önce Açık Sistem ürünü olarak, isteyen Web Programcısı'nın ücretsiz edineceği bir CGI programlama dili olarak Web'in ilk gününden beri Web Programcısının emrinde idi. Ama Perl, metin dosyalarından yazı çekmek ve bunları biçimlendirerek rapor haline getirmek amacıyla geliştirilen bir dil olduğu için, özellikle veritabanına dayalı işlemlerde programcıya çok güçlük çıkartıyordu. ASP ise (ASP desteği sağlayan ve ücretsiz Web sitesi veren firmaların giderek artmasına ve veritabanı konusunda hem kolaylık, hem de büyük bir etkinlik sağlamasına rağmen) çoğunlukla ücretli Web sitesi aldığımız ticarî amaçlı evsahibi (Hosting) firmalarının sağladığı bir teknoloji olarak görüldü. PHP, tasarımcılarının MySQL ve PostgreSQL teknolojilerini

68 geliştiren kurum ve firmalarla yaptığı yakın işbirliği sonucu ikinci sürümünden itibaren veriyönlendirmeli Web uygulaması alanında önemli bir araç olarak belirdi. Dolayısıyla, PHP kurulumu dendiği zaman, kendiliğinden, MySQL kurulumu da kastedilmiş olur. Şimdi PostgreSQL da ekleyebiliriz. PHP, bir dildir; MySQL ve PostgreSQL ise bir demet sürücüdür. PHP ile, Web Server'a sayfanızı Internet ziyaretçisine göndermeden önce bir takım komutları icra etmesini, bir takım veri dosyalarını açıp içindeki bilgileri alıp bunları HTML kodlarıyla bezeyip, Browser'a bildiğimiz klasik HTML sayfası olarak göndermesi talimatını veririz. MySQL ve PostgreSQL ise, Windows sistemlerinde Denetim Masası'nda gördüğünüz ODBC Veri Kaynağı Yönetmeni adlı araç gibi, bir vertabanı sunucusu, yani Database Server pprogramlarıdır. Yakın zamana kadar bu iki veritabanı yönetim aracı arasında fazla bir çekişme yoktu. Ancak şimdi özellikle Linux kullanıcıları topluluklarında iki program arasında verimlilik testleri yapılıyor; hangisinin daha iyi olduğnuna ilişkin yoğun bir tartışma sürüyor. PHPBuilder.com uzmanları, yaptıkları bir çok denemede, MySQL'in daha hızlı ve daha etkin çalıştıkları sonucuna varıyorlar. (Bu konuda daha geniş bilgi edinmek için Internet'te www://phpbuilder.com/columns/tim20000705.php3 adresine bakabilirsiniz.) MySQL, bir kullanıcı lisansı 200 Dolar olan ticarî bir program iken 2000 yılı ortalarında GPL (GNU General Public License/GNU Kamusal Lisans) uygulamasına geçmiş ve ücretsiz dağtılır hale gelmiş bulunuyor. Buna göre MySQL'i bir ticarî uygulamanın içinde motor olarak kullanacaksanız üreteci firmaya lisans ücreti ödemeniz gerekir; bunun dışındaki uygulamalar için programı Internet'ten indirerek kullanabilirsiniz. PHP için MySQL'e gerek yoktur. PHP, bir NT veya Win9x tabanlı Web Server'da çalıştırılıyorsa, Microsoft'un ODBC sürücüleri ile çalışabilir; ve ODBC'nin okuduğu bütün veritabanlarından veri çekebilir. (ODBC'nin Unix-Linux sürümü de vardır.) Ayrıca PHP için Adabas, dbase, Empress, FilePro, Informix, InterBase, msql, Oracle, Solid, Sybase, Velocis ve bir çok Unix veritabanı yöneticisi için geliştirilmiş add-on (sonradan eklenen) modüller vardır.

69 PHP Dili PHP bir Script dilidir; PHP ile yazdığınız "programlar" birer düzyazı dosyasıdır. Dil ögelerini ayrıntılı olarak ele almadan önce bir iki yazım kuralından söz edelim. PHP yorumlayıcısı, bu "programı" çalıştırabilmek için dosyanın içinde PHP komutlarını arar. PHP komutları birinci bölümde gördüğümüz gibi iki şekilde yazılabilir: 1. <?PHP...?> 2. <?...?> Bunlara PHP komut ayracı denir; birinci türü uzun veya standart ayraç sayılır; ikincisine ike "kısa ayraç" denir. PHP yorumlayıcısının kısa ayraç kullanmasını istemiyorsak, PHP.ini dosyasındaki, short_open_tag = On: satırını short_open_tag = Off; yapmak yeter. Bununla birlikte uzun vadede, PHP programlarınızda HTML yerine XML kullanmak istiyorsanız, şimdiden elinizi uzun ayraca alıştırmanız yerinde olur; çünkü XML etiketleri "<?xml" şeklinde başlar ve "?>" şeklinde biter. ASP ile çalışan Web programcıları "<?" ve?>" yerine sık sık "<%" ve "%>" yazarlar! PHP dilini gelişterinler., çok yaygın olan bu hatanın PHP programlarının çalışmasına engel olmasını önlemek için bize bir kolaylık sağlıyorlar. Eğer ASP ile çalışan ve daha sonra PHP'ye geçen bir programcı iseniz, PHP.ini dosyasını açarak, asp_tags = Off; satırını short_open_tag = On; yapabilirsiniz. Şimdi artık rahatça ASP ayracını PHP yazmak için kullanabilirsiniz! PHP komutlarınızı daha uzun olmakla birlikte <SCRIPT> etiketiyle de kullanabilirsiniz. Yukarıdaki örnekte oluşturduğumuz merhaba.php'yi açın ve şu şekilde değiştirerek, merhaba2.php adıyla kaydedin: <HTML> <SCRIPT LANGUAGE="PHP"> print ("Merhaba Dünya!"); </SCRIPT>

70 </HTML> Web sunucusunda bu programı açarsanız, aynı sonucu aldığınızı göreceksiniz. Burada bir yanlış anlamaya yol açmayalım. Javascript veya VBScript gibi HTML kodlarının içine gömdüğümüz ve HTML sayfasının içinde, Web ziyaretçimizin bilgisayarına gönderilen ve orada (istemci-tarafından) icra edilen ve yine aynı şekilde SCRIPT> etiketi içine koyduğumuz Script kodları ile burada <SCRIPT> etiketi ile ifad eettiğimiz PHP kodlarının icra yerini karıştırmayalım. PHP, nasıl bir ayraç ve etiket ile yazarsak yazalım, daima sunucuda çalıştırılar ve ziyaretçiye asla PHP kodları gösterillmez. merhaba2.php'nin çalıştığı Browser'da kaynağı görüntülersek, istemciye gelen kodların saf-ve-temiz HTML olduğunu göreceğiz. PHP kodlarımız, oluşturulmasını istediğimiz sayfanın HTML kodları ile tabir yerinde ise içiçe yazılır. Bunun bir örneği olarak yukarıdaki dosyayı şöyle değiştirerek, merhaba3.adıyla kaydedin: <HTML> <HEAD> <TITLE>PHP ile Merhaba</TITLE> </HEAD> <CENTER> <B> <H1> <?PHP print "Merhaba Dünya!";?> </H1> </B> </CENTER> </BODY> </HTML> Sayfamızın görüntüsünde hiç bir değişiklik olmamakla birlikte, Browser'a giden HTML kodları önemli ölçüde değişmiş olacaktır.

71 Gerçi burada henüz ihtiyacımız yok; çünkü bir bakışta yazdığımız kodun marifetini anlayabiliyoruz; ama ciddî PHP programcılığına başladığımız zaman, hangi satırda neye niyet ettiğimi anlamamız daima mümkün olmayabilir. Biz kendi programımızı satır satır ezberlesek bile, işbirliği yaptığımız diğer Web programcılarının programımızı anlamalarını sağlamamız gerekir. Bunu, yorum satırları ile yapabiliriz. PHP ayraçları içinde iki türlü yorum bulunabilir: Çok-satırlı yorumlar ve tek satırlı yorumlar. Birinci grubu, başına "/*" ve sonuna "*/* işaretleri koyarak, ikinci grubu ise sadece başına *//* işareti koyarak belirtiriz: <HTML> <!- - Bu satır HTML'in yorum satırı Buraya istediğimiz kadar yorum yazabiliriz.. Browser bu satırları dikkate almaz - - > <HEAD> <TITLE>PHP ile Merhaba</TITLE> </HEAD> <BODY> <CENTER> <B> <H1> <?PHP /* Bu satır da PHP'nin çok-satırlı yorum bölümü.. Bunu da PHP yorumcusu asla dikkate almaz Buraya istediğimiz kadar yorum yazabiliriz. */ print "Merhaba Dünya!"; // Bu ise PHP'nin tek satırlı yorum bölümü // Bu satırları da PHP yorumcusu dikkate almayacaktır.?> </H1> </B> </CENTER> </BODY> </HTML>

72 PHP'rir bir diğer yorum işareti ise # (Diyez) işaretidir. Bu işaretin başında olrduğu satır da PHP tarafından dikkate alınmaz: <?PHP # Bu satır PHP'nin çok-satırlı yorum bölümü.. # Bunu da PHP yorumcusu asla dikkate almaz # Buraya istediğimiz kadar yorum yazabiliriz. print "Merhaba Dünya!";?> Diyez ile yorum haline getirdiğimiz satırların sonuna başka işaret koymaya gerek yoktur.

73 PHP'nin Yapı Taşları PHP, bir programlama dili olarak, değişkenler, değişkenlerin değerleriyle bir işlem yapmayı sağlayan işlemciler, işlemcilerle oluşturulan deyimler ve nihayet bunların tümünü toplu olarak kullanmamızı sağlayan işlevlere (fonksiyonlara) sahiptir. PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkanına ve bunların kullanılmasını sağlayan metodlara da sahiptir. Bütün bu imkanları kullanarak, PHP ile bir veritabanından veri alarak, bunları HTML etiketlerinin değerleri olarak kullanabiliriz; Web sitemizi ziyaret eden kişilerden bilgi alabiliriz, bu bilgilerle işlemler yapabiliriz. PHP'nin çeşitli komutlarını, deyimlerini ve fonksiyonlarını kullanarak, programımızın çalıştığı Web sunucusunun bulunduğu bilgisayara da çeşitli dosya işlemleri yaptırabiliriz. PHP programını durdurmak Şimdi belki PHP'yi durdurmayı hiç düşünmüyorsunuz; ama ilerde bir fonksiyonun vereceği sonucun bütün programın durdurulmasını gerektiği zamanlar olabilir. PHP'nin resmî el kitabına bile ilk baskısında konulması unutulmuş olan programı durdurma komutu, exit kelimesidir; hiç bir parametre almadan çalışır. Bu tür karmaşık uygulamalara geçebilmek için önce, PHP dilinin unsurlarını biraz yakından inceleyelim. Değişkenler Programcılıkta işlemlerimizi değişkenlerle yaparız. Değişkeni bir kap gibi düşünebilirsiniz. Sözgelimi "Gün," değişkenin adı ise bu değişkenin değeri Pazar, Pazartesi, Salı, vd., olabilir. Her değişken, türüne göre, ya bir ya da daha fazla değer tutar. Adından

da anlaşılacağı gibi değişkenin değeri değişir! Bu değişikliği biz yapabiliriz; programın kendisi yapabilir. PHP'de de, bir çok başka bilgisayar programlama dilinde olduğu gibi değişkenlerin içine bir değer konmadan önce tanımlanması mümkündür; fakat gerekli değildir. Değişkenleri adının önüne $ işareti koyarak tanımlarız: $adi; $soyadi; $123; $sevdigirenk; Değişkenler, harf, rakam veya alt çizgi (_) ile başlayabilirler; bu karakterleri içerebilirler; ama içinde boşluk veya diğer işaretler bulunamaz. PHP değişkenleri her türlü değişken tutabilirler: bir değişkenin adının yazılış şekli onun tutabileceği değerin niteliğini belirlemez. Dolayısıyla, "$adi" değişkenin değeri "Reşit" da olabilir, "1255" de olabilir. PHP'de genellikle değişkenleri değerini atayarak belirleriz: $adi = "Reşit"; $soyadi = "Gülen"; $123 = 123; $sevdigirenk = "yeşil"; Değişkenler, kullanıldıkları işleme, taşıdıkları değeri verirler: print $adi; komutu, eğer değeri "Reşit" ise "Browser penceresine "Reşit" kelimesini yazdırır. PHP'de özel bir değişkene değişken adı olarak kullanılacak değerleri de atayabiliriz: $adi = "Reşit"; $degisken = "adi"; print $$degisken; Burada Browser penceresine yine "Reşit" kelimesi yazılacaktır; çünkü PHP $degisken adlı değişkenin "adi" adlı değişkeni tuttuğunu bilecek ve iki Dolar işaretini görünce, $degisken'in değerini değil, onun tuttuğu değişkenin değerini yazacaktır. Bu, size şu anda karışık görünebilir. Daha sonra döngüleri gördüğümüzde bu tekniği bir satırlık kod ile yüzlerce değeri yazdırmakta kullanacağız. Bu teknik şöyle de kullanılabilir:

75 $degisken = "adi"; $$degisken = "Reşit"; print "$adi"; print $$degisken; print "${$degisken}"; print "${'adi'}"; Buradaki dört "print" komutu da Browser'a "Reşit" kelimesini yazdıracaktır. PHP'de bir değişkenin tuttuğu değer, bir başka değişkene atanabilir. Bu ya duragan, ya da dinamik olarak yapılır. Duragan yöntemde: $birinci_degisken = "Nurcan"; $ikinci_degisken = $birinci_degisken; $birinci_degisken = "Tülay"; print $ikinci_degisken; Buradaki "print" komutu Browser penceresine "Reşit" kelimesini yazdıracaktır. İki değişken arasındaki değer alış-verişi birinci değişkenin tuttuğu değeri değiştirmeden önce olduğu için, ikinci değişken birinci değişkenin ilk değerini almış oldu. Fakat kimi zaman iki değişken arasındaki değer alış-verişi sürekli (dinamik) olsun isteriz. PHP, buna, ilk atama sırasında & işareti kullanırsak izin verir: $birinci_degisken = "Nurcan"; $ikinci_degisken = &$birinci_degisken; $birinci_degisken = "Tülay"; print $ikinci_degisken; Buradaki "print" komutu ise Browser penceresine "Tülay" kelimesini yazdıracaktır. Çünkü iki değişken arasındaki değer alış-verişi birinci değişkenin tuttuğu değeri değiştirmeden önce halde, ikinci değişkene birinci değişkenin değerini dinamik olarak atamış olduk. Atama işlemi sırasında & işareti kullandığımız için, birinci değişkenin değeri değiştiğinde ikinci değişkenin de değeri değişecektir. Veri Türleri PHP, değişkenlere, tuttukları değere göre farklı bellek alanı tahsis eder; bu bakımdan verilerimizin türü etkin bir programcılık açısından önem taşır. Ayrıca PHP, diğer

76 bütün programlama dilleri gibi belirli veri türleri ile belirli işlemleri yapar veya yapamaz. Örneğin, ancak iki sayı arasında aritmedik toplama yapılabilir. İki metin tutan değişken aritmetik olarak toplanamaz; ancak içerdikleri değerler ardarda eklenebilir. Ne var ki, PHP sizin aritmetik toplama mı, yoksa ardarda ekleme mi yapmak istediğinizi bilmek durumunda değildir. (PHP'ye 'muazzam dil' dedik; içinde yapay zekâ var demedik!) Dolayısyla değerleri 5 ile 6 olan iki değişkeni topladığınız zaman ortaya 11 yerine 56 çıkarsa, kabahati PHP'de değil, değişkenlere veri atayan kişide (büyük bir ihtimalle kendinizde) aramalısınız. PHP açısından dünyada altı tür değer vardır: Tamsayı (Integer): 5,124, 9834 gibi Çift (Double): 3,567 gibi Alfanümerik (String): "Reşit" gibi Mantıksal (Boolean): doğru (true)/yanlış (false) gibi Nesne (Object) Dizi (Array) Bazı uzmanlara göre, gerçekte PHP'de mantıksal (boolean) değişken türü yoktur. B kanının sebebi, PHP'nin true (doğru) ya da false (yanlış) olarak atadığımız değerleri 1 ve boş/null değerlere çevirmesi, mantıksal olarak sorgulandığında 0 dışındaki tam ve ondalık değişkenleri TRUE, 0'ı FALSE sayması, ve boş alfanümerik değişkenleri FALSE, dolu alfanümerik değişkenleri ise TRUE olarak değerlendirmesidir. Ancak daha sonra gereceğimiz gibi PHP, Mantıksal/Boolean adında bir değişken değiştirme fonksiyonuna sahiptir ve bu tür değişkenlerin türü sorulduğunda "boolean" karşılığını verir. Tür Değiştirme Değişkenlere atadığımız değerlerinin türlerini genellikle biliriz; ama yüzlerce değişkenle uğraştığımız bir Web programında değişken türünü unutmak çok kolaydır. Kimi

77 zaman da değişkenlere program yoluyla değer atarız; başka bir deyişle programımız bazı değişkenleri kendisi oluşturabilir, ve bunlara kendisi değer atayabilir. Bu tür program yoluyla atanan değerlerin de türünde kuşkuya kapıldığımız anlar olabilir. Bir değişkenin değerinin türü hakkında kuşkunuz varsa, en emin yol bunu PHP'nin kendisine sormaktır. Bu sorgulamayı gettype() fonksiyonu ile yaparız. Fonksiyon PHP'nin gettype() ve print() gibi, kendi içinde bulunan kullanılmaya hazır bir çok fonksiyonu vardır. Daha sonra kendi fonksiyonlarımızı yazmanın yollarını da göreceğiz. Programcılık dilinde ister dile ait olsun, ister kendimiz yazmış olalım, bir fonksiyonu kullanmaya "fonksiyon çağırma" denir. Fonksiyonlar da fonksiyon çağırabilirler. Çağrılan bir fonksiyon ya kendisinden beklenen işi yapar, ya da kendisini çağıran işleme veya fonksiyonu bir değer sunar. Buna fonksiyondan dönen değer denir. Şimdi, bir PHP programı yazalım, bir takım değişkenlere değerler atayalım ve bunların türlerini PHP'ye soralım. Bir düzyazı programı ile şu metni yazın ve turler.php adıyla kaydedin: <HTML> <HEAD> <TITLE>PHP'de Degisken Turleri</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <B> <H2> <?php $sayi = 5; print("birinci değişkenin adı: \$sayi<br>");

78 print("değeri : "); print "$sayi<br>"; print("türü : "); print gettype( $sayi ) ; //tamsayi/integer print "<br>"; print "<br>"; $alfanumerik = "Reşit"; print "İkinci değişkenin adı: \$alfanumerik<br>"; print "Değeri : "; print "$alfanumerik<br>"; print("türü : "); print gettype( $alfanumerik ) ; //alfanümerik/string print "<br>"; print "<br>"; $ondalik = 5.1234; print "Üçüncü değişkenin adı: \$ondalik<br>"; print "Değeri : "; print "$ondalik<br>"; print("türü : "); print gettype( $ondalik ) ; //çift,ondalık/double print "<br>"; print "<br>";?> </H2> </B> </BODY> $mantiksal = true; print "Üçüncü değişkenin adı: \$mantiksal<br>"; print "Değeri : "; print "$mantiksal<br>"; print("türü : "); print gettype( $mantiksal ) ; //mantıksal/boolean print "<br>"; print "<br>";

79 </HTML> Bu programı çalıştığımızda karşımıza şöyle bir görüntünün gelmesi gerekir: Burada mantıksal (boolean) değer olarak doğru anlamına true değeri atadığımız halde, PHP'nin bu değişkenin değeri olarak 1'i gösterdiğine dikkat edin. PHP'de bir fonksiyon, elde ettiği değer doğru ise sonuç olarak 1 değerini verir. (Yanlış/false değerinin neye çevrildiğini bulabilir misiniz?) Escape turler.php dosyasını yazdıysanız, şu satırdaki, ters-bölü işareti dikkatinizden kaçmamış olmalı: print "İkinci değişkenin adı: \$alfanumerik<br>"; Daha önce gördük ki, tek veya çift tırnak içine de alsak, PHP, bir değişken adını gördüğü zaman onun yerine o değişkenin tuttuğu değeri yazar. PHP bunu, değişken adının başındaki $ görerek yaparak. $ işareti gibi PHP için özel anlamı olan işaretlerin anlamlandırılmasını önlemek ve bu işaretleri düz metin saymasını sağlamak için bu işaretlerin önüne ters-bölü işareti koyarız. Buna o karakteri kurtarma veya ESCaping denir. PHP'nin anlamlı işaretleri ve bunların ESCape-yazılışı şöyledir: \' Tek tırnak \" Çift tırnak \\ Ters-bölü \$ Dolar işareti \n Yeni Satır (New Line) \r Satır Başı (Return) \t Sekme (Tab) karakteri

80 İşlemciler (Operatörler) Yukarıdaki örnekleri birlikte yaptıysak, = işaretini bol bol kullandık ve böylece PHP'nin bir çok operatöründen biriyle tanıştık. Buna PHP dilinde "atama operatörü" denir. Bu işlemci sadece yukarıda kullandığımız gibi, bir değişkenin bir değere eşitliğini ilan etmek amacıyla kullanılmaz. Örneğin: print ( $sayi = 123 ) ; ifadesinde olduğu gibi, bir fonksiyonun içinde de hem atama işlemi yapılabilir; hem de işlem yürütülür. PHP'nin aritmetik, birleşik-atama, birleştirme, karşılaştırma ve mantıksal sınama operatörleri vardır. Aritmetik işlemciler: + Toplama 6+5 = 11 - Çıkartma 6-5 = 1 / Bölme 6/5 = 1.2 * Çarpma 6*5 = 30 % Kalan (Modulus) 6%5 = 1 Aritmetik işlemleri gerçek sayılarla yaptığımız gibi, tuttuğu değer sayı olan değişkenlerle de yapabiliriz. Daha önce, PHP'de değişken tanımlar ve bunlara değer atarken sayı olan değişkenleri tırnak işareti kullanmadan, alfanümerik değişkenleri ise tırnak içinde yazdığımızı hatırlayacaksınız. Bu, geleneksel hale gelmiş olan bir programcılık alışkanlığıdır.

81 PHP, tırnak kullanmasanız da bir değişkenin sayı olup olmadığını anlar; daha sonra bu değişkenlerle aritmetik işlem yapabilir. PHP ayrıca rakamla başlayan alfanümerik değişkenleri sayı olarak kullanmaya kalktığınızda, bu değerin başındaki bütün rakamları sayı olarak kabul eder. PHP açısından harf veya işaretle başlayan alfanümerik değişkenlerin sayı olarak değeri sıfırdır. Örnek: $a = 6; $b = "22/A" print ($a + $b) sonuç olarak 28'i verecektir; veya $a = 6; $b = "A/22" print ($a + $b) sonuç olarak 6 çıkacaktır. Bu küçük deneyi yaparsanız, PHP ile program yazarken hangi değişkenin ne sonuç vermesi gerektiğini dikkatle düşünmek zorunda olduğunuzu görürsünüz. Bir kişinin geliri ile adresini toplamak, programcı olarak arzu ettiğiniz bir işlem olmayabilir! Bununla birlikte elimizde bir kişinin adı ve soyadı ayrı değişkenler halinde ise, bunları birbirine ekleyerek (concatenation) ortaya yeni bir alfanümerik değişken çıkartabiliriz: <?php?> $adi = "Reşit"; $soyadi = "Muhtar"; $adi_soyadi = $adi. " ". $soyadi; print ("<br>"); print ($adi_soyadi); print ($adi. "'nın soyadı ". $soyadi. "'dir.") Bu örnekte, sadece ekleme yoluyla yeni bir değişken oluşturmakla kalmıyoruz; fakat alfanümerik değişkenleri, başka metinlerle de birbirine ekleyebildiğimizi görüyoruz. Bu işlemi nokta işaretiyle (.) yapıyoruz. Bu işlemciyle sadece değişkenlerin değerlerini değil fakat metinleri de birbirine ekleyebiliriz:

82 <?php print ("İyileri iyikleri ile alkışla; ". "...". "ve sen soluklarında daima Mesîh ol..! ")?> PHP'nin atama işlemcisinin eşittir (=) işareti olduğunu hatırlıyorsunuz birleşikatama (combined-assignment) işlemcileri, bu işarete diğer aritmetik işlemciler eklenerek oluşturulur. İşlemci Örnek Anlamı += $a += 5 $a = $a + 5 -= $a -= 5 $a = $a - 5 /= $a /=5 $a = $a / 5 *= $a *= 5 $a = $a * 5 %= $a %= 5 $a = $a % 5.= $a.= "metin" $a = $a" metin" Bu işlemi zihnimizde, "A değişkeninin mevcut değerine 5 ekle, çıkan sonucu A değişkenin yeni değeri yap!" şeklinde canlandırabiliriz. Bir Arttırmak veya Azaltmak için Değerleri sadece 1 arttırmak veya azaltmak için PHP, bir kolaylık sağlar: $a++veya ++$a: $a'nın değerini 1 arttırır; $a--veya --$a: $a'nın değerini 1 eksiltir. ++ veya -- işaretinin değişken adından önce veya sonra olmasının sonucu farklı olur. İşaretler değişkenin adından önce ise PHP önce değişkenin değerini bir arttırır veya eksiltir, sonra bu yeni değeri işleme katar; işaretler değişken adından sonra ise, PHP değişkenin o andaki değerini işleme kadar, sonra değeri bir arttırır veya eksiltir. PHP'nin karşılaştırma yapması için kullandığımız işlemciler ise işlem işaretinin sağı ve solundaki değerleri veya değişkenlerin değerlerini işaretin belirttiği karşılaştırmayı

83 yaptıktan sonra ortaya ya doğru (true) ya da yanlış (false) sonucunu çıkartırlar. Söz gelimi, değeri 6 olan değişkenin 5'ten büyük olup olmadığını sınarsak, sonuç doğru; 5'ten küçük olup olmadığını sınarsak sonuç yanlış çıkacaktır. PHP'nin karşılaştırma işlemcileri şunlardır: İşlemci Örnek Örnek $a=6 ise: == eşitse $a == 5 Yanlış/False!= eşit değilse $a!= 5 Doğru/True === aynı ise $a === 5 Yanlış/False > büyükse $a > 5 Doğuru/True < küçükse $a < 5 Yanlış/False <= küçükse $a <= 5 Yanlış/False veya eşitse >= büyükse $a >= 5 Doğru/True veya eşitse PHP'nin karşılaştırma işlemcileri hem tam ve ondalık sayı türü değerlerle, hem de alfanümerik değerlerle kullanılabilir. Daha ileri aşamalarda, bazen değişkenlerimizin karşılaştırmasının bu kadar basit olamayacağını; kimi zaman iki grup değişkenin karşılaştırılması gerektiği durumların bulunduğu göreceğiz. Diyelim ki, bir öğrencinin başarılı sayılması için hem vize notunun, hem de yılsonu sınav notunun belirli sayılardan büyük olması gerekiyor. Bu durumu ancak karmaşık-mantıksal sınamadan geçirmemiz gerekir. Bu sınamayı iki ayrı sınama sonucu ile birlikte kullanırız. Örneğin: vize notu yeterli - final notu yetersiz = kalır (yanlış/false) vize notu yeterli - final notu yeterli = geçer (doğru/true) PHP'de bu karşılaştırmayı iki grubun arasına koyduğumuz işaretlerle yaparız İşaretin sağ ve sol tarafının doğruluğu veya yanlışığı işarete göre nihai sonucun doğru veya yanlış olmasını sağlar. Bu karşılaştırmaları yaparken şu işlemcileri kullanırız: İşlemci Adı Anlamı Örnek veya sol veya sağ doğru doğru yanlış = doğru

84 or veya sol veya sağ doğru doğru yanlış = doğru && ve sol ve sağ doğru doğru yanlış = yanlış and ve sol ve sağ doğru doğru yanlış = yanlış Xor Şartlı-veya Sadece sol veya sağ doğru doğru yanlış = doğru! Değil sol veya sağ yanlış doğru yanlış = doğru "veya" ve "ve" sınamaları için iki ayrı işlem işareti bulunmasının sebebi, PHP'nin işlem sırasıyla ilgilidir. Birazdan oraya geliyoruz. Şimdi, kavranması kolay olmayan ikili mantıksal sınamalara bir örnek verelim; yukarıda öğrencinin durumunu PHP komutu olarak yazalım. <?php?> $vize = 45; $final = 65; if ($vize >= 50 && $final >= 50) { print ("Öğrenci geçti!"); } else { print ("Öğrenci kaldı!"); } Mantıksal karşılaştırma işlemleri daha da karmaşık olabilir. Örneğin, öğrencinin geçmiş sayılması için yılsonu vize ve final notlarının 45'dan yüksek, ve ya birinci sömester notunun ya da vize ve final notlarının ortalamasının 65'den yüksek olması şartı aranabilir. (Kabul; kötü bir örnek oldu. Ama sırf alıştırma için!) Bu durumda kodu şöyle yazmamız gerekirdi: <?php $vize = 45; $final = 65; $ilk_sem = 45; $ortalama = ($vize + $final) / 2; if (($vize >= 45 && $final >= 45) and ($ilk_se >= 65 $ortalama >= 65)) { }

85 else { print ("Öğrenci kaldı!"); }?> Burada, PHP önce veya && işaretinin sonucunu bulacak sonra and veya or işlemcisinin gereğini yapaçaktır. Bu kodun vereceği sonucu, bilgisayarda çalıştırmadan tahmin edebilir misiniz? İpucu: Bu öğrencinin yerinde olmak istemezdim! İşlem önceliği deyince.. Bütün programlama dilleri gibi PHP için de işlemlerin hangi sırada yapıldığı önem taşır. "5 + 4 * 2" işleminin sonucu, önce 5 ile 4'ün toplanması ve sonucun 2 ile çarpılması halinde başka, 4'ün 2 ile çarpılması ve sonucun 5 ile toplanması halinde başka olacaktır. Bu bakımdan, PHP'nin hangi işlemi önce yaptığı, hangi işlemi sonra yaptığını bilmemiz gerekir. PHP'deki işlemlerin yapılış sırası şöyledir: ++ ve -- / * % < <= => > == === = && = += -= /= %=.= and xor or r. Sabit Değerler İster Web, ister Web-dışı amaçlı olsun, bir programın bazen başındanh sonuna kadar değeri değişmeyen değişkene ihtiyacı olabilir. "Değeri değişmeyen değişken"

86 teriminin anlamsız olduğu kanısında iseniz, bunlara sabit değerler adını da verebilirsiniz! PHP'de sabit değerler, Script boyunca değişmeden kalır. Sabit değerler, değişkenlerden farklı şekilde oluşturulur. Bunun için PHP'nin define() fonksiyonunu kullanırız. Bu fonksiyonun yazım kuralı şöyledir: define ("SABIT_DEGER", değer); Burada SABIT_DEGER yerine, tanımlamak istediğimiz sabit değere vereceğimiz isim, değer yerine de sabit değeri yazarız. Örnek: <?php?> $Dolar_miktar = 125; define ( "DOLAR_KURU", 625675); $TL_Tutar = $Dolar_miktar * DOLAR_KURU; print ($TL_Tutar); Burada tanımladığımız DOLAR_KURU sabit-değeri, tıpkı bir değişken gibi kullanılabilir. Fakat bir sabit değeri tanımladıktan sonra içeriğini değiştiremezsiniz. Sabit değer ile aynı ismi taşıyan değişken oluşturmak mümkündür; ancak aynı ismi taşısa da bir sabit ile değişkeni (birinin adının önünde $ işareti bulunduğu için) karıştırmak kolay olmasa gerek. Tanımlanmış olan bir sabiti yeniden oluşturamayız; ama buna teşebbüs ettiğimizde PHP hata vermez. Bir sabit değerin oluşturulmuş olup olmadığını defined() fonksiyonu ile anlayabiliriz: <?php $Dolar_miktar = 125; if (defined( "DOLAR_KURU" )) { echo ("Sabit değer daha önce tanımlanmıştı.<br>");?> define ( "DOLAR_KURU", 625675); $TL_Tutar = $Dolar_miktar * DOLAR_KURU; print ($TL_Tutar);

87 Bu programı, bu şekilde ve define() komutunu en üst satıra alarak çalıştırırsanız, ikinci çalıştırışınızda programın sabit değeri yeniden oluşturmayı reddettiğini görecektiniz. Sabit değerleri, Web sitesinde ziyaretçilerin girdiği verilerden alarak kendiliğinden oluşturan bir program yazdığınızda, defined() fonksiyonu mantıksal hata yapmanızı önler. PHP'nin kullanılmaya hazır bir kaç sabid değeri vardır. True (doğru) değeri 1 olan, False (yanlış) ise değeri sıfır sayısı veya boş alfanümerik olan iki sabittir. Diğer sabitler şunlardır: FILE : O anda çalışmakta olan PHP dosyasının adı (kelimenin önünde ve sonunda iki alt-çizgi var); LINE : Bu ifadenin yer aldığı satırın sayısı (kelimenin önünde ve sonunda iki alt-çizgi var); PHP_VERSION: PHP'nin sürümü (İki kelimenin arasında bir alt-çizgi var); PHP_OS: PHP'nin çalıştığı işletim sistemi (İki kelimenin arasında bir alt-çizgi var); PHP_VERSION : PHP'nin sürümü (İki kelimenin arasında bir alt-çizgi var); Bunlara ek olarak, E_ERROR, E_WARNING, E_NOTICE ve E_PARSE şeklinde hata durumunda hatanın çeşitli özelliklerini bildiren sabit değerleri de kullanabiliriz. PHP hakkında çok daha geniş bilgiyi phpinfo() fonksiyonunu çağırak alabilirsiniz.

88 PHP'de Program Denetimi Bilgisayar programı, belirli değerlere göre kendi izleyeceği yolu kendisi bulmalıdır. Bir Web programı da aynı mantıkla tasarlanır. PHP, bir kısmını daha önceki bölümlerde, bir kısmını da şimdi ele aldığımız araçları kullanarak, belirli durumlarda belirli istikametlere gidecek, yeri geldiğinde geri dönecek, yeri geldiğinde başka bölümlere sıçrayacak bir akış planı tasarlamamıza imkan verir. Web programlarımızda, ziyaretçilerimizin sitemizde yaptıkları veya yapmak istediklerini bildirdikleri işe göre sayfalar, bu işlere göre sayfa içerikleri sunarız. Web programımız ziyaretçimizin hareket tarzına ve amacına uygun olarak ilerler. Bir programın akış planını kontrol etmemizi sağlayan unsurlar çoğu zaman programın kendi kendine karar vermesini sağlayan araçlardır. PHP'de program denetim unsurları, programın gidiş yönünü değiştirmemizi veya olduğu yerde durmasını ve beklemesini veya bir işi biteviye yapmasını sağlar. Bu bölümde bu araçları ele alacağız. if Deyimi İnsan olarak kararlarımızı hemen hemen daima "bir şey öyle ise böyle, öyle değilse şöyle davranmak" üzere almaz mıyız? PHP programında if deyimi bunu sağlar. Kelime anlamı eğer olan if deyimi ile programımızı karar almaya zorlarız. Ne var programımız bizim kadar akıllı olamayacağı için if şartının doğru veya yanlış olması durumunda ne yapacağını da ona biz söyleriz. if deyimi şöyle yazılır: if ( koşullar ) { koşullar doğru ise yapılacak işlere ilişkin komutlar } elseif (diğer koşullar) { diğer koşullar doğru ise yapılacak işlere ilişkin komutlar } else {

89 diğer her durumda yapılacak işlere ilişkin komutlar } PHP, if ifadesinin doğru olması halinde, ifadeye ait ilk süslü parantezin içindeki komutları icra eder; bu şartlar doğru değilse, elseif deyimi ile ileri sürebileceğimiz diğer bir grup şartın doğru olup olmadığını sınayabiliriz. Bu şartlar yerine geliyorsa, PHP, elseif bölümündeki işleri icra eder. Nihayet diğer her hangi bir durumda icra edilmesini istediğimiz komutları else bölümünde belirtiriz. PHP, if deyimi doğru değilse, deyime ait süslü parantezin içindeki işleri yapmadan yoluna devam eder; varsa elseif deyiminin şartlarını sınar; elseif bölümü yok fakat else bölümü varsa bu bölümdeki işleri icra eder. Deyimde else bölümü de yoksa, PHP yoluna if deyiminden sonraki ilk adımdan devam eder. Bunu bir örnekle belirtelim: <?php?> $sarki = "Güneş Doğacak"; if ( $sarki == "Güneş Doğacak" ) { echo ("Seçtiğiniz şarkının adı: Güneş Doğacak!"); } elseif ($sarki == "Beklerim Ben") { echo ("Seçtiğiniz şarkının adı: Beklerim Ben!"); } else { echo ("Lütfen bir şarkı seçiniz!"); } Çoğu zaman if deyimlerini birden fazla koşulu sınayacak şekilde yazarız; bununla birlikte elseif ve else bölümleri olmadan da yazılabilir: <?php?> if ( $parola == "" ) { echo ("Sitemize girmek için parola yazmanız gerekir.<br>"); echo ("Lütfen parolayı yazın! <br>"); }

90 Buradaki if deyimi $parola değişkeninin boş alfanümerik olması halinde ziyaretçiyi uyarak ve görevi bitecektir. Ziyaretçi bir parola yazmışsa, daha sonraki komutlar bu parolanın doğru olup olmadığını sınayabiliriz. switch deyimi PHP'de program akışını yönlendirmekte kullandığımız bir diğer unsur, switch deyimidir. Adı anahtar anlamına gelen switch deyimi, verilen bir değişkenin değerinin sıraladığımız koşullardan hangisine uygun olduğunu sınar ve o koşula ilişkin komutları icra eder. PHP'nin yaptığı işi bitirdikten sonra switch deyiminin dışına çıkmasını sağlayan, break komutu vardır: switch ( değişken ) { case KOŞUL-1 ; break; case KOŞUL-2 ; Koşul-2 doğru ise yapılacak işlere ilişkin komutlar break; case KOŞUL-3 ; Koşul-3 doğru ise yapılacak işlere ilişkin komutlar break; case KOŞUL-4 ; Koşul-4 doğru ise yapılacak işlere ilişkin komutlar break;...... default: diğer her durumda yapılacak işlere ilişkin komutlar } switch deyimini yazarken mutlaka break ifadesini kullanmamız gerekmez; switch deyiminin akışı break ile kesilmemişse, program ilk şart yerine gelmiş olsa bile diğer şartları da sınamaya devam eder ve en sondaki default deyimine ulaşarak (default'tan sonra noktalı virgül değil iki nokta üstüste işareti olduğuna dikkat edin), bu bölümdeki komutları icra eder. Ne var ki programcılık mantığına aykırı olabilir: bir değişkenin içeriği

verdiğimiz şartlardan birini tutmuşsa, muhtemelen diğer şartları yerine getirmeyecek demektir. Bu durumda diğer koşulların sınanması gereksiz e default işlerin icra edilmesi ise hata olur. Bu deyimi de bir örnekle görelim: switch ( $sarki ) { case "Güneş Doğacak" ; echo ("Seçtiğiniz şarkının adı: Güneş Doğacak<br>") ; break; case "Derdime Derman" ; echo ("Seçtiğiniz şarkının adı: Derdime Derman<br>") ; break; case "Haberi Yok" ; echo ("Seçtiğiniz şarkının adı: Haberi Yok<br>") ; break; case "Sonsuza kadar" ; echo ("Seçtiğiniz şarkının adı: Sonsuza kadar <br>") ; break; default: echo ("Seçtiğiniz şarkının adı bilinmiyor<br>") ; } Programımız, bu kodu icra ederken,, $sarki adlı değişkenin değerini, buradaki dört isimle karşılaştıracaktır. Şarkının adı, "Güneş Doğacak" ise ilk durum gerçekleşmiş olacak; program Browser pencerisine şarkının adını yazacak (ve muhtemelen bu sözlerini görüntüleyecek!) ve ikinci adıma break ifadesine geçecektir. break, switch deyiminin sona ermesini sağlar; PHP yoluna, switch deyiminin kapanan süslü parantezinden sonra devam eder. Bu örnekte break ifadesi kullanılmamış olsaydı, PHP, diğer şartları da sınacak ve boşun azaman kaybedecekti; daha da garibi, en sondaki default komutu da icra edileceği için programımız Browser pencerisine hem seçilen şarkının adını, hem de "Seçtiğiniz şarkının adı bilinmiyor" yazacaktı. Bunu gözönünde tutarak, switch deyimini daima break ile birlikte yazmamız gerekir.

92 switch için kısa yol Kimi zaman uzun uzadıya switch deyimi yazmamız gerekmeyebilir; bir değişkenin değerini sadece bir şarta uygunluk açısından sınamamız gerekir. Bunu soru ve iki nokta üstüste işaretleri (?... :) olarak yazılan işlemci ile yaparız. Diyelim ki, Web sitemizi ziyaret eden kişinin parola yazıp yazmadığını sıramak istiyoruz: <?php $uyari = ($parola == "" )? "Parola yazmanız gerekir" : "Teşekkür ederiz" ; echo ($uyari);?> Bu kod parçacığı, ziyaretçinin parola girip girmediğini $parola değişkeninin içinin boş olup olmadığına bakarak anlayacak ve $parola değişkenin içi boş ise (yani soru işaretinin sorguladığı durumun doğru olması halinde) iki nokta üstüskte işaretinden önceki metni $uyarı değişkenin içeriği haline getirecek; $parola değişkeninin içi dolu ise (yani koşul yerine gelmiyorsa, durum yanlış ise) iki nokta üstüste işaretinden sonraki metni $uyarı değişkeninin içeriği yapacaktır. Bir sonraki echo() komutu ise içeriği bu sınav sonucuna göre belirlennen $uyarı değişkeninin değerini Browser penceresinde görüntüleyecektir. Döngüler Yukarıdaki iki denetim ögesi de programın ileri doğru akışını bozmayan araçlardır. Oysa bazen programımızın bir koşul gerçekleşincele kadar yerinde sayması ve koşul gerçekleşmedikçe ilerlememesi gerekebilir. Kimi zaman da programımıza bir işi bitirmeden ileri gitmemesini biz bildiririz. Program akışının bu tür denetimini döngü deyimleri sağlar. PHP'de iki tür döngü vardır: bir durum devam ettiği veya etmediği sürece yapılan ve kaç kere tekrar edeceği bilinemeyen while döngüleri, ve tekrar sayısı belirli for döngüleri.

93 while döngüsü Bir değişkenin içeriğinin belirli bir şartı karşılaması veya karşılamaması halinde icra edilir. Burada dikkat edeceğimiz nokta, programın icrası sırasında değişkenin içeriğinin veya koşulun değişmesinin sağlanmasıdır. Aksi taktirde pıgramımız sonsuz döngüye girer ve muhtemelen çöker. while döngüsü şöyle yazılır: while (koşul) { Koşul doğru ise yapılacak işlere ilişkin komutlar } Bu yöntemin yaygın kullanıldığı alan, bir sayaçla yaptırılan işlerdir. Aşağıdaki programı while.php adılma kaydedip, çalışrırsanız, PHP, Browser'ın yazı türü boyutunu 1'den 7'ye kadar büyüterek, aynı metni yazdıracaktır: <HTML> <HEAD> <TITLE>PHP'de Döngü</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <?php $sayac = 1; while ( $sayac <= 7 ) { print ("<font size= $sayac >"); print ("<b><p>iyileri iyilikleri ile alkışlayınız!</b></p>"); print ("</font>"); $sayac ++; }?> </BODY> </HTML> Programımız, while döngüsü içindeki iken, sonsuz döngüden kurtulabilmek için, yazıyı yazdırdıktan sonra, $sayac değişkenini bir arttırıyor. Aksi taktirde, değişken hiç bir zaman while döngüsünün beklediği şarta kavuşarak 7'ye eşit hale gelemeyecektir. (Programı, sondaki "$sayac ++;" satırını kaldırarak denerseniz, zararsız bir sonsuz

94 döngünün ne olduğunu görebilirsiniz! Ama önce Browser'ın dur düğmesinin yerinde durup durmadığna bir bakın!) while döngüsün aradığı şartın yerine gelmesi, her zaman burada olduğu gibi, tabir yerinde ise "elle" yapılmaz; döngünün icra ettiği komutlar veya fonksiyonlar koşulu içeren değişkeni değiştirebilirler. Sözgelimi elektronik ticaret sitemizde Web ziyaretçimizin while içinde yaptığı alışverişin tutarını koşul olarak kullanabiliriz ve bu koşulu içeren değişken alışveriş ile değişebilir. do..while while döngüsü farkettiğiniz gibi, ileri sürdüğümüz şartı, iyi yapmadan önce sınar; ve bu şart ortadan kalkmamışsa (yani henüz doğru/true ise) yapacağı işi yapar; başka bir deyişle while döngüsünün yapacağı iş hiç yapılmayabilir. Fakat sınamanın iş yapıldıktan sonra yerine getirildiği bir şekli de vardır: do..while.. Bu döngü ise şöyle yazılır: do { Koşul doğru ise yapılacak işlere ilişkin komutlar } while (koşul); Burada gördğünüz gibi do..while döngüsü en az bir kere icra edilir; çünkü şartın sınanması yapılacak işe ilişkin komutlardan sonra gelmektedir. Bu döngünün aradığı şartın döngünün yaptığı işlerin sonucu veya kod bölümünde bizim tarafımızdan gerçekleştirilmesi için igerekli komutların bulunmasına dikkat etmelisiniz. Yoksa, bu döngü de sonsuzluğa erişir! Yukarıda örneği, bu yöntemle yazalım: <?php $sayac = 1; do { print ("<font size= $sayac >"); print ("<b><p>iyileri iyilikleri ile alkışlayınız!</b></p>"); print ("</font>"); $sayac ++; } while ( $sayac <= 7 ) ;

95?> Bu döngüyü yazarken, while satırının sorunda noktalı virgül bulunduğuna dikkat edin. for döngüsü PHP'de Web programlarımız, döngünün belirli bir sayıda olmasını ve mesela bu sayının bizim istediğimiz basamaklarda artmasını gerektiriyorsa, döngüyü for deyimiyle kurabiliriz. Ayrıca for deyimi sayaç gibi şartın yerine gelmesini sağlayacak arttırma veşa eksiltme işlemlerini kendisi yapacağı için, sonsuz döngüye girme tehlikesi de hemen hemen yoktur. Bu döngü şöyle yazılır: for ( $yeni_degisken atama ; koşul ; artış basaması ) { Koşul doğru ise yapılacak işlere ilişkin komutlar } for deyiminin ilk ögesi, döngü sayacı olarak kullanılacak bir değişken oluşkturulması ve buna değer atanmasına ilişkindir; sonra bir noktalı vrigül ile bu sayacın sınırı olan koşul belirtilir. Yine noktalı virgül ile ayırarak, sayaç değişkeninin artış hızı verilir. Bunu da yine yukarıdaki örnekle gösterelim: <?php?> for ($sayac = 1; $sayac <= 7 ; $sayac++ ) { print ("<font size= $sayac >"); print ("<b><p>iyileri iyilikleri ile alkışlayınız!</b></p>"); print ("</font>"); } Buradaki kod, while göre çok daha kısa; ve while döngüsü sayacı arttırmayı sağlayan satır unutulsa bile çalışacağı halde, for döngüsü unsurlara ilişkin noktalı virgüller eksik olursa çalışmayacak ve bize böylece sonsuz döngü tehlikesini hatırlatmış olacaktır. for döngüsü kendi sayacını verdiğiniz şartı karşılayıncaya kendisi arttıracak, yani buradaki örneği göre $sayaç değişkeni 7 oluncaya kadar çalışacak ve şart karşılandığı anda, sona erecektir.

96 foreach döngüsüdür. Ancak bir değişkenin bütün elemanlarını tekrar sayısında esas alan bu döngünün çalışma ilkelerini görebilmek için dizi değişken kavramını ele almış olmamız gerekiyor. Şimdilik bu döngünün varlığını bir kenara yazıp, dizi değişkenlere kadar, unutabilirsiniz. Döngüyü sona erdirmek için: break Programımızın akışı, bazen döngünün durdurulmasını gerektirir. Örneğin, sayaç değişkenini ziyaretçinin vermesi gerektiği ve vermediği durumda, döngünün başlamaması yerinde olur. Programın gerektirdiği böyle bir sebeple döngüyü break komutuyla durduruz. Sözgelimi aşağıdaki kodda kullandığımız $tekrar değişkenini değerini ziyaretçiden form yoluyla aldığımızı varsayalım: <?php?> $tekrar = 10 : for ($sayac = 1; $sayac <= $tekrar ; $sayac++ ) { if ( $tekrar <= 0 ) break; print ("<font size= $sayac >"); print ("<b><p>iyileri iyilikleri ile alkışlayınız!</b></p>"); print ("</font>"); } Bu kod parçasını, bir sayfa kodunun içine yerleştirir ve önce bu şekliyle, danha sonra $tekrar= 0 yazarak sınarsanız, break komutunun işe yaradığını göreceksiniz. ($tekrar değişkeninin değerini, Form yoluyla ziyaretçiden değişken değeri almayı öğreninceye kadar şimdilik kaydıyla biz yapıyoruz. Ayrıca buradaki if deyiminin süslü parantez olmadan yazıldığına dikkat edin.

97 Döngüyü sürdürmek için: continue break ifadesinin döngüyü tamamen durdurduğunu farkettiniz mi? Oysa programımızın akışı, kimi zaman da döngünün sadece belirli bir durumda kendisinden beklenen işi yapmamakla birlikte böyle tümüyle kesilmesini de gerektirmez. Yine yukarıdaki örneğe dönersek, sayaç değişkenini ziyaretçinin vermesi gerektiği ve vermediği durumda, döngünün tümüyle kesilmesini değil de, sadece sayacı gösteren $sayac değişkeninin sıfırdan büyük bir değere ulaşlmasını beklememiz yerinde olabilir. Bu devamlılığı continue komutuyla sağlarız: Yine bu örnekte kullandığımız $sayaçc değişkeninin değerini ziyaretçiden form yoluyla aldığımızı varsayarak, kodu şöyle değiştirebiliriz: <?php?> $sayac = -5 : for (; $sayac <= 7 ; $sayac++ ) { if ( $sayac <= 0 ) continue; print ("<font size= $sayac >"); print ("<b><p>iyileri iyilikleri ile alkışlayınız!</b></p>"); print ("</font>"); } Bu durumda PHP, conktinue komutunu gördüğü anda for döngüsünün geri kalan kısmını icra etmek yerine başa dönecek ve döngüyü yeniden icra etmeye başlayacaktır. Döngünün ilk satırınnda kod parçasını, bir sayfa kodunun içine yerleştirir ve önce bu şekliyle, danha sonra $sayac= 1 yazarak sınarsanız, continue komutunun programı sayaç değişkeninin değeri 1 oluncaya kadar durdurduğunu ama bu sırada for döngüsünün devam ettiğini göreceksiniz. ($sayac değişkeninin değerini, Form yoluyla ziyaretçiden nasıl alacağımızı daha sonra göreceğiz.)

98 Buraya kadar, PHP programı oluşturabilmek için gerekli temel yazım kurallarını, yapıtaşlarını ve program akışında yararlanacağımız kontrol ögelerini ele almış olduk. Şimdi bu unsurların hepsini bir arada kullanabileceğimiz grupları, fonksiyonları ele alabiliriz.

99 Fonksiyonlar Bir bilgisayar programının kalbi, fonksiyonlardır. Fonksiyonlar, bir kere tanımlanır ve bir çok kereler, ihtiyaç olduğu noktada hizmete çağrılır. Fonksiyonlar genellikle bir iş veya hesaplama yaparlar ve bunun sonucu olarak ortaya yeni bir değer çıkartırlar. Bu değere "fonksiyondan dönen değer" denir. Fonksiyonun bir program için ne kadar önemli bir unsur olduğunu bir örnekle belirtelim. Diyelim ki Web'de öğrencilerimizin yıl içinde aldıkları notları gösteren bir programımız var. Bu siteyi ziyaret eden öğrencilerin, iskterlerse, bir düğmeyi tıklayarak, o andaki not ortalamalarını hesap ettirmelerini sağlamak istiyoruz. Bu hesabı yapacak olan işlem, bir fonksiyondur. Web ziyaretçisi düğmeyi tıkladığı anda, program, ortalama hesabını yapacak olan fonksiyonu, o sayfada bulunan notları bildirecek; fonksiyon da kendisine verilen bu değerlerle yapması gereken hesabı yapacak; ve elde edeceği sonucu kendisini göreve çağıran program satırına bildirecektir. Bildirilen bu değerle ne yapılacağı, fonksiyonu göreve çağıran komuta veya işleme aittir. Fonksiyon kendisinden isteneni yapmakla yetinir. PHP'nin kullanılmaya hazır bir çok fonskiyonu vardır. Şu ana kadar sürekli kullandığımız echo() ve print() bu tür PHP fonksiyonlarıdır. PHP'nin kendi fonksiyonlarını göreve çağırmak, yine yukarıdaki örneklerde olduğu gibi, program içinde gerektiği yere adını ve kullanacağı değeri yazmakla olur: print ("Bu bir metindir!"); PHP bizim kendi fonksiyonlarımızı kullanmamıza da izin verir. Fakat bunun için önce fonksiyonu tanımlamamız gerekir. Fonksiyon Tanımlama ve Çağırma PHP'de fonksiyonlar function komutu ile oluşturulur. Tanımladığımız fonksiyon, kendisini göreve çağıracak komuittan, yapacağı işlemde kullanmak üzere değer alacaksa,

100 bu değerlere vereceğimiz değişken isimleri fonksiyon adının yanında parantez içinde gösterilir. Fonksiyon birden fazla değer bekleyecekse, bunların değişken adlarının arasına virgül koyarız. Fonksiyona ulaştırılan değerlere argüman denir. Fonksiyon, kendisine bir değer ulaştırılmasını beklemese bile içi boş parantez koymamız gerekir. Buna göre PHP'de fonksiyon şöyle yazılır: function fonksiyonun_adı (argüman1, argüman2,... argümann) { fonksiyonun yapacağı işe ilişkin komutlar } Fonksiyon adları, değişken adları ile aynı kurallara tabidir. Fonksiyon içinden fonksiyon çağrılabilir; fonksiyonların içinde PHP'nin kendi fonksiyonları kullanılabilir. Şimdi, ilk örnek fonksiyonumuzu yazalım. Yukarıdaki örneklerde, PHP'ye, bir Web sayfası oluştururken HTML ögesi olacak bazı satırların başına <H1>, satır sonlarına <BR> gibi etiketler koydurduğumuza dikkat etmiş olmalısınız. Bir programda bu işi sık sık yapacaksak, yani metinlerimiz <BR> ile bitecek, bazı başlıklarımız ise sayfamıza HTML'in başlık etiketleri ile gönderilecekse, bu etiketleri defalarca yazmamız sadece zorluk değil, fakat aynı zamanda yazım hatasını davet eden bir davranır olur. PHP'de kendisine vereceğimiz metinleri başlık veya gövde yazısı olarak biçimlendirecek fonksiyonlar tanımlayarak, programcılıkta daima tehlikeli olan insan unsurunu asgarîye indirebiliriz. Şu programı yazdir01.php adıyla kaydederek, Browser'da açın: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <?php function yazdirbr ($metin) { print ("$metin<br>\n");

101 } function yazdirh1 ($metin) { print ("<h1>$metin</h1>\n"); } function yazdirh2 ($metin) { print ("<h2>$metin</h2>\n"); } function yazdirh3 ($metin) { print ("<h3>$metin</h3>\n"); } function yazdirh4 ($metin) { print ("<h4>$metin</h4>\n"); } function yazdirp ($metin) { print ("<p>$metin</p>\n"); } // Başka kodlar buraya girebilir yazdirh1("bu H1 Başlık"); yazdirh2("bu H2 Başlık"); yazdirh3("bu H3 Başlık"); yazdirh4("bu H4 Başlık"); yazdirbr("bu kendisinden sonra BR olan birinci metin."); yazdirbr("bu kendisinden sonra BR olan ikinci metin."); yazdirp("bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir paragraf metni."); yazdirp("bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir diğer paragraf metni."); </BODY> </HTML> Bu programda, yazdirbr(), yazdirh1(), yazdirh3(), yazdirh4(), ve yazdirp() adlarıyla altı fonksiyon tanımladığımızı görüyorsunuz. Bu fonksiyonların hepsi kendilerini göreve çağıran satırdan, kendilerine bir değer verilmesini istiyorlar ve bu değeri $metin adlı değişkende tutuyorlar. Fonksiyonlarımız tümü de PHP'nin print() fonksiyonundan yararlanıyor; ancak bu fonksiyonun nasıl kullanılacağını, nasıl işletileceğini de belirliyorlar.

Buna göre bazı fonksiyonlarımız $metin adlı değişkenin değerini önüne ve arkasına bir HTML etiketi koyarak Browser'a gönderiyor; birisi ise sadece $metin değişkenin tuttuğu değerin sonuna bir HTML etiketi koyduruyor. Fonksiyonlarımı buradaki örnekte olduğu gibi hemen oluşturulduktan sonra göreve çağırmayız. Geleneksel olarak, bir programda kullanılacak fonksiyonlar, programın baş tarafında toplanır ve daha sonra nerede gerekirse orada, çağrılırlar. Fonksiyonları adlarını ve kendilerine verilmesi gereken bir değer varsa o değeri parantez içinde yazarak çağırırız. Burada olduğu gibi, fonksiyonu göreve çağırırken parantez içinde değerin kendisini yazabileceğimiz gibi, bu değeri tutan bir değişkenin adını da yazabiliriz. Bu programı çalıştırırsanız, Browser'da bu görüntüyü elde edebilirsiniz: Şimdi, bu penceredeki belgenin kaynağını görüntüleyelim. Karşımıza şuna benzer bir metin çıkmış olması gerekir: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <h1>bu H1 Başlık</h1> <h2>bu H2 Başlık</h2> <h3>bu H3 Başlık</h3> <h4>bu H4 Başlık</h4> Bu kendisinden sonra BR olan birinci metin.<br> Bu kendisinden sonra BR olan ikinci metin.<br> <p>bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir paragraf metni.</p> <p>bu uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun uzun bir diğer paragraf metni.</p> </BODY> </HTML>

Bu, bize, oluşturduğumuz bütün fonksiyonların kendilerinden bekleneni yaptığını ve kendilerine verdiğimiz metinleri, tıpkı istediğimiz gibi, arzu edilen HTML etiketleri ile birlikte Browser'a gönderdiklerini gösteriyor. Buradaki fonksiyon, kendisini bir iş yapan türden fonksiyondur. Oysa kimi zaman fonksiyonlar, kendilerini göreve çağıran komuta bir değer gönderirler. Şimdi de böyle bir fonksiyon örneği yazalım. Aşağıdaki kodu, hesapla.php adıyla kaydedin: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <?php function topla ($sayi1, $sayi2) { $sonuc = $sayi1 + $sayi2; return $sonuc; } function cikart ($sayi1, $sayi2) { $sonuc = $sayi1 - $sayi2; return $sonuc; } function carp ($sayi1, $sayi2) { $sonuc = $sayi1 * $sayi2; return $sonuc; } function bol ($sayi1, $sayi2) { $sonuc = $sayi1 / $sayi2; return $sonuc; } // Başka kodlar buraya girebilir $sayi1 = 12; $sayi2 = 5;

104 print topla($sayi1, $sayi2); print ("<br>"); print cikart($sayi1, $sayi2); print ("<br>"); print carp($sayi1, $sayi2); print ("<br>"); print bol($sayi1, $sayi2); print ("<br>");?> </BODY> </HTML> Bu programda, dört aritmetik işlemi yapan dört ayrı fonksiyon tanımlıyoruz. Fonksiyonlarımız kendilerini göreve çağıran komuttan, kendilerine iki değer vermesini bekliyorlar ve bu değerleri $sayi1 ve $sayi2 adlı değişkenlere yazıyorlar. Sonra herbiri, kendisinden beklenen aritmetik işlemi yaparak, sonucunu $sonuc adlı değişkene yazıyor. Burada dikkat edeceğimiz nokta, return komutudur. Bu komut, f onksiyonun elde ettiği değeri, değeri tutan değişkenin adıyla, fonksiyonu çağırmış olan satıra gönderir. return komutuyla, kendisini göreve çağıran satıra değil fakat mesela başka bir fonksiyona da değer gönderebiliriz: return ( baska_fonksiynon ( $degisken)) ; Fonksiyonun return satırında böyle bir başka fonksiyonun adı yazmıyorsa, bulunan değer göreve çağıran satıra gönderilir. Bu program, içine bizim yazdığımız iki değeri hesaplayarak, Browser'a gönderecektir. Ancak bu değerler ziyaretçinin dolduracağı bir formdan alınabileceği gibi, program tarafından da hesaplanabilir Bu sayfanın kaynağındaki HTML kodları ise şöyla olacaktır: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9">

105 <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> 17<br>7<br>60<br>2.4<br> </BODY> </HTML> Fonksiyonlarımız, kendilerinden bekleneni yaparak, gereken hesaplamanın sonucunu, kendilerini göreve çağıran komuta, burada PHP'nin print() fonksiyona göndermiş; bu fonksiyon da sadece bu sonuçları Browser'a iletmiş bulunuyor. Fonksiyona varsayılan değer verebiliriz Buradaki örneklerde tanımladığımız fonksiyonlara bekledikleri değerleri, onları göreve çağırdığımız noktada biz veriyoruz. Ancak öyle durumlar olabilir ki, fonksiyonun beklediği değerlerden biri veya bir kaçı, göreve çağıran satır tarafından verilmeyebilir; fonksiyon varsayılan bir değerle çalıştırılabilir. Şu örneği yazdir02.php adıyla kaydedin: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <?php function yazdir ($metin, $boyut=3) { print ("<font size=\"$boyut\">$metin</font><br>"); } // Başka kodlar buraya girebilir yazdir("bu Başlık", 5 ); yazdir("bu küçük boyutta bir metin", 2); yazdir("bu varsayılan boyutta bir metin"); yazdir("bu çok büyük Başlık", 8); yazdir("bu uzun bir paragraf metni. Boyutu varsayılan ölçüde. Bu uzun bir paragraf metni. Boyutu varsayılan ölçüde. Bu uzun bir paragraf metni. Boyutu varsayılan ölçüde.");?>

106 </BODY> </HTML> Bu örnekte, daha öncekilerden farklı olarak fonksiyonun, beklediği iki argümandan birisini, fonksiyonu tanımlarken verdiğimize dikkat edin: " function yazdir ($metin, $boyut=3)" ifadesi, PHP'ye, "Bu fonksiyona ikinci argüman eksik gönderilirse, telaşa kapılma, onun yerine 3 rakamını kullan!" anlamına gelir. Nitekim, programın daha ilerdeki bölümlerinde bu fonksiyon görevlendirilirken birinci argümanın değeri olan metin verildiği halde, iki ayrı yerde ikinci argümanın değeri verilmiyor. Bu iki durumda., PHP, yazdir() fonksiyonunda varsayılan değer olan 3'ü kullanıyor. Bunu, görüntülenen sayfanın kaynağında rahatça görebiliriz: <HTML> <HEAD> <TITLE>PHP'de Fonksiyon</TITLE> <meta http-equiv="content-type" content="text/html; charset=iso-8859-9"> <meta http-equiv="content-type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <font size="5">bu Başlık</font><br> <font size="2">bu küçük boyutta bir metin</font><br> <font size="3">bu varsayılan boyutta bir metin</font><br> <font size="8">bu çok büyük Başlık</font><br> <font size="3">bu uzun bir paragraf metni. Boyutu varsayılan ölçüde. Bu uzun bir paragraf metni. Boyutu varsayılan ölçüde. Bu uzun bir paragraf metni. Boyutu varsayılan ölçüde. </font><br> </BODY> </HTML> Programda, yazdir() fonksiyonunun ikinci ve dördüncü kullanımında ikinci argümanın bulunmadığına, yukarıdaki HTML'de bu satırlar için font size="3" etiketinin kullanıldığına dikkat edin.

YARARLANILAN KAYNAKLAR Nesneye yönelik programlama, https://tdsoftware.files.wordpress.com/.../nesneye-yc3b6nelikprogramla...adresinden 7 Eylül 2015 tarihinde erişilmiştir. Mikroişleciler, http://web.firat.edu.tr/mbaykara/mp/ymt216.pdf (İbrahim türkoğlu) adresinden 6 Eylül 2015 tarihinde erişilmiştir. İnternet Progrmlama: PHP, http://web.adu.edu.tr/panel/lesson/php.pdf (Seval Özbalcı) adresinden 3 Eylül 2015 tarihinde erişilmiştir. Yazılım Mühendisliği, Yrd. Doç. Dr. Yunus Emre Selçuk un hazırladığı ders notlarından 10 Eylül 2015 tarihinde erişilmiştir. Bilgisayar mühendisliğine giriş, https://oflazoglu.org/2014/06/bilgisayar-muhendisligine-giris-dersi-1- hafta-ders-notlari/ adresinden 3 Eylül 2015 tarihinde erişilmiştir.