bilgisayar mühendisliği

110
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

Upload: canki75

Post on 13-Jul-2016

72 views

Category:

Documents


16 download

DESCRIPTION

Bilgisayar Mühendisliği

TRANSCRIPT

Page 1: Bilgisayar Mühendisliği

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

Page 2: Bilgisayar Mühendisliği

"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.

Page 3: Bilgisayar Mühendisliği

İÇİ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

Page 4: Bilgisayar Mühendisliği

Bilgisayar Mühendisliğine Giriş

1

Page 5: Bilgisayar Mühendisliği

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

Page 6: Bilgisayar Mühendisliği

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

Page 7: Bilgisayar Mühendisliği

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

Page 8: Bilgisayar Mühendisliği

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

Page 9: Bilgisayar Mühendisliği

: 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

Page 10: Bilgisayar Mühendisliği

Yazılım Mühendisliği

7

Page 11: Bilgisayar Mühendisliği

YAZILIM Yazılım: Herhangi bir boyuttaki herhangi bir tür donanımda çalışan bilgisayar programını ve

basılı veya elektronik ortamdaki her tür dokümanı içeren üründür. Yazılım hem bir üründür,

hem de başka ürünler elde etmeye yarayan bir araçtır. Yazılım fiziksel bir ürün olmadığı için

aşınmaz, ancak zamanla yetersizleşebilir.

Yazılım, yaşam döngüsü süresince değişikliklere uğrar. Değişiklikler, yazılımda yeni hatalar

oluşturabilir. Yeni hatalar tam olarak düzeltilmeden yeni değişiklikler gerekebilir. Yazılımın

bir fikir olarak doğmasından, kullanım dışı bırakılmasına kadar geçen süreç yaşam döngüsü

olarak adlandırılır.

YAZILIM TÜRLERİ

Sistem Yazılımı:

•Diğer programlara hizmet sunmak üzere hazırlanmış programlardır.

•Derleyiciler, işletim sistemleri, vb.

•Karmaşık olsa bile belirli bilgi yapıları ile uğraşır.

•Belirli: Girdi, işlem ve çıktıların sırası ve zamanlamasının önceden tahmin

edilebileceği sistemlerdir.

Mühendislik Yazılımı / Bilimsel Yazılım:

•Mühendislik ve bilimsel hesaplamalarda kullanılmak üzere hazırlanmış programlar.

•Büyük hacimli verilerle uğraşır.

•“Numara öğütmek / Number crunching”.

Gömülü (Embedded) Yazılım:

•Bir ürün veya sistemin bir parçası olup, bu sistemin kendisi ve/veya son kullanıcısı için

denetim işlemleri yürüten programlar.

•Gerçek zamanlı uygulamalardır.

Şirket Yazılımı:

•Belirli ticari iş gereksinimlerine yönelik programlar.

•İş süreçleri ile ilgili bilgiye sahip olmalıdır.

•Genellikle müşteriye özel tasarlanır.

•Veri dönüştürme ve değerlendirme uygulamaları, iş süreçlerinin kimi zaman gerçek

zamanlı izlenilmesi, vb.

Uygulama Yazılımı:

•Product-line, shrink-wrapped, off-the-shelf, vb.

•Farklı müşteriler tarafından kullanılabilecek genel amaçlı yazılımlar

•Cari hesap uygulamaları, çeşitli otomasyon programları, kelime işlem uygulamaları,

vb.

Ağ Yazılımları:

•Ağ üzerinden haberleşerek hizmet almaya veya vermeye yönelik uygulamalar.

•E-ticaret, B2B, B2C, web servisleri, web tarayıcıları, vb.

•Şirket yazılımları ile etkileşimde bulunabilirler.

Page 12: Bilgisayar Mühendisliği

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

Page 13: Bilgisayar Mühendisliği

•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

Page 14: Bilgisayar Mühendisliği

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

Page 15: Bilgisayar Mühendisliği

•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

Page 16: Bilgisayar Mühendisliği

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

Page 17: Bilgisayar Mühendisliği

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

Page 18: Bilgisayar Mühendisliği

•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

Page 19: Bilgisayar Mühendisliği

•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

Page 20: Bilgisayar Mühendisliği

• 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

Page 21: Bilgisayar Mühendisliği

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

Page 22: Bilgisayar Mühendisliği

• 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

Page 23: Bilgisayar Mühendisliği

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

Page 24: Bilgisayar Mühendisliği

• 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

Page 25: Bilgisayar Mühendisliği

• 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.

Page 26: Bilgisayar Mühendisliği

• Ö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

Page 27: Bilgisayar Mühendisliği

• 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

Page 28: Bilgisayar Mühendisliği

• 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

Page 29: Bilgisayar Mühendisliği

Java ile Nesneye Yönelik Programlama

26

Page 30: Bilgisayar Mühendisliği

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

Page 31: Bilgisayar Mühendisliği

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

Page 32: Bilgisayar Mühendisliği

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

Page 33: Bilgisayar Mühendisliği

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

Page 34: Bilgisayar Mühendisliği

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

Page 35: Bilgisayar Mühendisliği

� 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

Page 36: Bilgisayar Mühendisliği

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

Page 37: Bilgisayar Mühendisliği

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

Page 38: Bilgisayar Mühendisliği

Mikroişlemciler

35

Page 39: Bilgisayar Mühendisliği

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

Page 40: Bilgisayar Mühendisliği

Ş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

Page 41: Bilgisayar Mühendisliği

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

Page 42: Bilgisayar Mühendisliği

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

Page 43: Bilgisayar Mühendisliği

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

Page 44: Bilgisayar Mühendisliği

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

Page 45: Bilgisayar Mühendisliği

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

Page 46: Bilgisayar Mühendisliği

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

Page 47: Bilgisayar Mühendisliği

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

Page 48: Bilgisayar Mühendisliği

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

Page 49: Bilgisayar Mühendisliği

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

Page 50: Bilgisayar Mühendisliği

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

Page 51: Bilgisayar Mühendisliği

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

Page 52: Bilgisayar Mühendisliği

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

Page 53: Bilgisayar Mühendisliği

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

Page 54: Bilgisayar Mühendisliği

- 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

Page 55: Bilgisayar Mühendisliği

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

Page 56: Bilgisayar Mühendisliği

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

Page 57: Bilgisayar Mühendisliği

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

Page 58: Bilgisayar Mühendisliği

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

Page 59: Bilgisayar Mühendisliği

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

Page 60: Bilgisayar Mühendisliği

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

Page 61: Bilgisayar Mühendisliği

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

Page 62: Bilgisayar Mühendisliği

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

Page 63: Bilgisayar Mühendisliği

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

Page 64: Bilgisayar Mühendisliği

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

Page 65: Bilgisayar Mühendisliği

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

Page 66: Bilgisayar Mühendisliği

İnternet Programlama: PHP

63

Page 67: Bilgisayar Mühendisliği

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

Page 68: Bilgisayar Mühendisliği

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

Page 69: Bilgisayar Mühendisliği

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

Page 70: Bilgisayar Mühendisliği

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

Page 71: Bilgisayar Mühendisliği

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

Page 72: Bilgisayar Mühendisliği

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

Page 73: Bilgisayar Mühendisliği

</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

Page 74: Bilgisayar Mühendisliği

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

Page 75: Bilgisayar Mühendisliği

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

Page 76: Bilgisayar Mühendisliği

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

Page 77: Bilgisayar Mühendisliği

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:

Page 78: Bilgisayar Mühendisliği

$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

Page 79: Bilgisayar Mühendisliği

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

Page 80: Bilgisayar Mühendisliği

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

Page 81: Bilgisayar Mühendisliği

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

Page 82: Bilgisayar Mühendisliği

</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

Page 83: Bilgisayar Mühendisliği

İş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

Page 84: Bilgisayar Mühendisliği

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

Page 85: Bilgisayar Mühendisliği

<?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

Page 86: Bilgisayar Mühendisliği

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

Page 87: Bilgisayar Mühendisliği

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

Page 88: Bilgisayar Mühendisliği

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

Page 89: Bilgisayar Mühendisliği

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

Page 90: Bilgisayar Mühendisliği

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

Page 91: Bilgisayar Mühendisliği

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

Page 92: Bilgisayar Mühendisliği

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

Page 93: Bilgisayar Mühendisliği

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

Page 94: Bilgisayar Mühendisliği

verdiğimiz şartlardan birini tutmuşsa, muhtemelen diğer şartları yerine getirmeyecek

demektir. Bu durumda diğer koşulların sınanması gereksiz e default işlerin icra edilmesi

ise hata olur. Bu deyimi de bir örnekle görelim:

switch ( $sarki ) {

case "Güneş Doğacak" ;

echo ("Seçtiğiniz şarkının adı: Güneş Doğacak<br>") ;

break;

case "Derdime Derman" ;

echo ("Seçtiğiniz şarkının adı: Derdime Derman<br>") ;

break;

case "Haberi Yok" ;

echo ("Seçtiğiniz şarkının adı: Haberi Yok<br>") ;

break;

case "Sonsuza kadar" ;

echo ("Seçtiğiniz şarkının adı: Sonsuza kadar <br>") ;

break;

default:

echo ("Seçtiğiniz şarkının adı bilinmiyor<br>") ;

}

Programımız, bu kodu icra ederken,, $sarki adlı değişkenin değerini, buradaki dört

isimle karşılaştıracaktır. Şarkının adı, "Güneş Doğacak" ise ilk durum gerçekleşmiş olacak;

program Browser pencerisine şarkının adını yazacak (ve muhtemelen bu sözlerini

görüntüleyecek!) ve ikinci adıma break ifadesine geçecektir. break, switch deyiminin sona

ermesini sağlar; PHP yoluna, switch deyiminin kapanan süslü parantezinden sonra devam

eder. Bu örnekte break ifadesi kullanılmamış olsaydı, PHP, diğer şartları da sınacak ve

boşun azaman kaybedecekti; daha da garibi, en sondaki default komutu da icra edileceği

için programımız Browser pencerisine hem seçilen şarkının adını, hem de "Seçtiğiniz

şarkının adı bilinmiyor" yazacaktı. Bunu gözönünde tutarak, switch deyimini daima break

ile birlikte yazmamız gerekir.

Page 95: Bilgisayar Mühendisliği

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

Page 96: Bilgisayar Mühendisliği

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

Page 97: Bilgisayar Mühendisliği

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

Page 98: Bilgisayar Mühendisliği

?>

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

Page 99: Bilgisayar Mühendisliği

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

Page 100: Bilgisayar Mühendisliği

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

Page 101: Bilgisayar Mühendisliği

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

Page 102: Bilgisayar Mühendisliği

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

Page 103: Bilgisayar Mühendisliği

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

Page 104: Bilgisayar Mühendisliği

}

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

Page 105: Bilgisayar Mühendisliği

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>

Page 106: Bilgisayar Mühendisliği

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;

Page 107: Bilgisayar Mühendisliği

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

Page 108: Bilgisayar Mühendisliği

<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

Page 109: Bilgisayar Mühendisliği

</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

Page 110: Bilgisayar Mühendisliği

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.