bilgisayar mühendisliği
DESCRIPTION
Bilgisayar MühendisliğiTRANSCRIPT
BİLGİSAYAR MÜHENDİSLİĞİ
DERS NOTU
T.C.
GAZİ ÜNİVERSİTESİ
Sürekli Eğitim Uygulama
ve Araştırma Merkezi
2015
"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
Bilgisayar Mühendisliğine Giriş
1
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ı,
il tüm yazılım yapısını planlayan
kişidir.
kullanarak
yazılımın işleyişini tanımlar.
Geliştirme Aşaması,
ojilerini kullanarak
ürün geliştiren kişidir.
özelliklere sahip kişidir.
2
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İĞİ
3
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.
4
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.
5
: 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.
6
Yazılım Mühendisliği
7
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.
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.
9
•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.
10
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.
11
•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)
12
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)
13
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
14
•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ı.
15
•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
16
• 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ı.
17
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
18
• 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
19
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.
20
• 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.
21
• 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.
• Ö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.
23
• 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.
24
• 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
25
Java ile Nesneye Yönelik Programlama
26
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
27
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
28
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.
29
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
30
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
31
� 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.
32
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.
33
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.
34
Mikroişlemciler
35
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.
Veri Yolu
CPU Bellek Giriş/Çıkış
Adres yolu
Kontrol yolu
36
Ş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
37
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.
38
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
39
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..).
40
Donanım
Yazılım
Donanım
Yazılım
Komut Kümesi Mimarisi
Ş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
Ön
bellek
CPU
Mikrokod ROM
Kontrol Birimi
Kaydediciler Kaydediciler
Şekil 2.3.: Bir mikrokod ROM’un sistemdeki yeri
41
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.
42
CPU
Mikroişlemci
Giriş/Çıkış
ünitesiRAMbellek
Çevresel
üniteler
monitör,
klavye,
yazıcı,
modem
Ş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 code-
opcode) 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.
43
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.
Ş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ı
4F
5F
Program Hafızası
0023
0022
0024
op-codeadres
Ş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.
Komut
Okuma
(Fetch)
Yürütme
(Execute)
Durma
(Halt)
Komut mikroişlemcide
Komut yürütmesi biter
Durma(Halt) Komutu RESET
Donanım sıfırlaması
olmadığı sürece dur
RESET
44
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.
I/O Bellek
PIC
MikrodenetleyicisiÇEVRESEL
ÜNİTELER
Lamba, motor,
LCD, ısı,ışık
sensörü vb.
Ş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.
RAM ROMG/Ç
Portu
CPU(Genel amaçlı
Mikroişlemci)
Timer
Seri,
Paralel,
port
Veri yolu
Adres yolu
Tek chip
a) Genel amaçlı mikroişlemci sistemi
RAM ROM
G/Ç
Portu
CPU
Timer
Seri,
Paralel,
port
Tek chip
b) Mikrodenetleyici sistemi
Şekil 2.8. Mikroişlemcili sistem ile mikrodenetleyici sistemler
45
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
HafızaRAM
EPROM
EEPROM
CPU4 bit
8 bit
16 bit
32 bit
Zamanlayıcı Osilatör
ADRES ADRES
DATA
Ş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.
46
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.
MAR
MBR
PCDAR
IR
AALUDR
Komut kod
çözücü
Zamanlama ve
kontrol birimi
Bellek
Diğer CPU
elemanlarına
Dahili veri yolu
Dahili adres yolu
Adres yolu
Veri yolu
Kontrol yoluR/W
Şekil 2.10 : Basit bir 8-bitlik işlemcinin yapısını oluşturan ana birimler
47
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
A DR
Bayraklar
ALU
Dahili veri yolu
ALU
Ş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.
48
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.
AH AL
BH BL
CH CL
DH DL
SI
DI
BP
SP
CS
DS
SS
ES
IP
Veri Yolu
kontrolu ve
adres üretimi
Bayraklar
Kontrol Birimi
ALU
Komut kuyruğu
Segment
kaydedicileri
VERİ YOLU BAĞDAŞTIRMA
BİRİMİ (BIU)Genel amaçlı
kaydediciler
İCRA
BİRİMİ
(EU)
ALU
Sistem
veriyolu
Ş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
49
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.
Komut ön belleği
8KB
Algetir tamponu
Komut kod çözücü
Tamsayı
ALU-U
Tamsayı
ALU-V
Kaydediciler
Veri Ön Belleği
8 KB
FPU
Ver
i Y
olu
Bağ
daş
tırm
a
Bir
imi
Dallanma
tahmini
64 bit
32 bit
veriyolu
adresyolu
Ş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)
50
- 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
51
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,
I2C, 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.
52
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” .
53
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
KONTROL
BİRİMİALU
G/Ç
Birimi
CLK
Durum Bilgisi
Veri
Adres ve
Kontrol
Komut
Ş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
CPU8 bit
Şekil 3.2. Von Neuman mimarisi
54
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ğiCPU
Program
Belleği8 bit 14 bit
Ş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.
55
KONTROL
BİRİMİALU
G/Ç
Birimi
CLK
Durum Bilgisi
Veri
Adres ve
KontrolKomut
Veri BelleğiKomut
Belleği
Ş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.
56
Yüksek Düzeyli Dil
Mikro-kod
Kaydediciler, ALU ve diğerleri
Makina Dili
Donanım
Yazılım
Derleme
İşleme
Çözme
Ş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.
57
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
Ön bellek
Kontrol BirimiMikrokod ROM
Komut ve Veri yolu
Ana bellek
Komut
Ön belleğiVeri Ön belleği
Donanım Kontrol Birimi
Veri yolu
a) b)
Şekil 3.6. a) Mikrokod denetimli CISC mimarisi; b) Donanım denetimli RISC mimarisi
58
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:
59
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)
60
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.
61
ADC DAC
DSP
Ana
Bilgisayar
Sistemi
dijital
veridijital veri
analog
veri
analog
veri
Ş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”.
62
İnternet Programlama: PHP
63
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" (Hiper-
metin ö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ı
64
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
65
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
66
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
67
geliştiren kurum ve firmalarla yaptığı yakın işbirliği sonucu ikinci sürümünden itibaren veri-
yö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.
68
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>
69
</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.
70
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>
71
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.
72
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
73
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:
$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
75
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
76
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>");
77
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>";
$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>";
?>
</H2>
</B>
</BODY>
78
</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
79
İş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.
80
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:
81
<?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şik-
atama (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ı
82
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
83
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)) {
}
84
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"
85
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);
?>
86
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.
87
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 {
88
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>");
}
?>
89
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
90
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.
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.
92
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>İyileri 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
93
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>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
$sayac ++;
}
while ( $sayac <= 7 ) ;
94
?>
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>İyileri 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.
95
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>İyileri 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.
96
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>İyileri 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.)
97
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.
98
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,
99
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");
100
}
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.
101
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;
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">
104
<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.");
?>
105
</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.
106
YARARLANILAN KAYNAKLAR
Nesneye yönelik programlama, https://tdsoftware.files.wordpress.com/.../nesneye-yc3b6nelik-
programla...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.