5. PROGRAMLA DİLLERİ 8.1 Giriş 8.2 Yazılım Geliştirme Süreci 8.3 Yazılım Geliştirme Sürecinde Programlama Dilinin Önemi 8.4 Programlama Dillerinin Tarihçesi 8.5 Programlama Dillerinin Sınıflandırılması 8.6 Nesneye Yönelik Programlama 8.7 Programlama Ortamı 5.1 Giriş Matematik, yazılım mühendisliği, dil bilimi ve eğitim bilimleri Arasında yer alan programlama dilleri teorisi bilgisayar mühendisliğinin en temel konularından biridir. Bilgisayar programı için bir tanım vermek gerekirse bu tanım bir hesaplamanın yapılabilmesini sağlayan ardışık simgeler dizisidir şeklinde olabilir. Programlama dili ise bir makineyi(bilgisayarı) kontrol etmek amacıyla kullanılan ve yukarıdaki tanımda sözü edilen simgelerden oluşan yapay bir dildir. Bu bölümde yazılım geliştirme süreci ve bu süreçte önemli bir yer tutan programlama dilleri konusunda genel bilgi verilecektir. 5.2 Yazılım Geliştirme Süreci Yazılım geliştirme süreci gereksinim analizi, yazılım tasarımı, kodlama, sertifikasyon, bakım aşamalarından oluşur. a. Gereksinim Analizi: Bir yazılım belirli kullanıcı grubunun ortaya koyduğu ihtiyaçları karşılamak amacıyla geliştirilir. Kullanıcı gereksinimlerinin, tasarlanacak ve geliştirilecek yazılım sistemi tarafından eksiksiz bir biçimde karşılanması beklenir. Bu gereksinimler önce kullanıcı grubu tarafından öncelikle uygun bir formda ve net bir biçimde bir metin halinde oluşturulmalıdır. Bu aşamada yazılımı geliştirecek ve kullanacak kişilerin ortak bir çalışma yapması uygundur. Sistemin başarısı, ihtiyaçların ne kadar doğru ortaya konduğu ve geliştirilen yazılımın bu ihtiyaçları ne kadar karşıladığına bağladır. Bu aşamanın sonucunda sistemden beklenenlerin yazılı bir metin haline getirilmesi, kullanıcı el kitaplarını hazırlanması ve maliyet ve fizibilite analizleri yapılmalıdır. b. Yazılım Tasarımı: Sistem tasarımı yukarıda sözü edilen gereksinim dokümanları ile başlar. Bu aşamanın sonucunda sistemin tasarımı ile ilgili dokümanlar ortaya konur. Bu dokümanda sistemi oluşturan modüller ve bu modüllerin ara yüzleri tanımlanmış olmalıdır. Bu aşamada kullanılan tasarım yönteminin sistemin gerçekleşmesinde kullanılacak programlama dilinin seçiminde önemli bir yer tuttuğu unutulmamalıdır. c. Kodlama: Yazılım tasarımı evresinde yapılan tanımlamaların kodlandığı evredir. Bu adımda programlama dili doğrudan kullanılır. Sonuçta tümüyle gerçeklenmiş ve raporlanmış bir sistem ortaya çıkar. d. Sertifikasyon: Yukarıda açıklanan üç aşama sonunda ortaya konan sistemin kalite denetimi yapılarak son kullanıcıya sunulur. Sertifikasyon tüm yazılım ortaya çıktıktan sonra yapılabileceği gibi her modül için ayrı ayrı yapılabilir. Sertifikasyon sırasında yazılımın gereksinimler belgesindeki beklentileri sorunsuz karşılayıp karşılamadığı test edilir. 1
e. Bakım: Yazılım sürecinde bakım, ortaya çıkan hataların düzeltilmesi ve yeni ihtiyaçların karşılanması için yeni bileşenlerin eklenmesi aşamalarını kapsar. Deneyimler göstermiştir ki, bir sistemin bakım maliyeti sistemin diğer evrelerinin oluşturulması için gereken toplam maliyete yakın hatta bazen daha pahalıdır. 5.3 Yazılım Geliştirme Sürecinde Programlama Dilinin Önemi Yazılım geliştirme sürecinin başarısında seçilen programlama dili önemli bir yer tutar. Bundan dolayı sitemin toplam başarımının yüksek olması için seçilen dilin ve bu dilde geliştirilen programın temel kriterleri sağlaması gerekir. Bu kriterler yazılımın güvenilir olması, bakıma elverişli olması verimli çalışması şeklinde sıralanabilir. 1. Yazılım Güvenli Olmalıdır Güvenli yazılımlar kullanmak programcılar için önemlidir. Kullanılan programların güvenli sayılabilmesi için bazı kalite ölçütlerine sahip olması gerekir. Bu ölçütler yazılabilirlik, okunabilirlik ve sırsa dışı durumları karşılayabilmedir. a. Yazılabilirlik: Yazılabilirlik, problemin gerektirdiği veri giriş çıkış, akış denetimi gibi unsurların programlama dili tarafından karşılanabilir olması ile ilgili bir kavramdır. Bu sayılan unsurların programlama dilinin doğasında olması programcının gereksiz detaylarla zaman kazanmasının önüne geçer. Genel olarak yüksek seviyeli diller düşük seviyeli dillere yazılabilirlik özelliği daha fazladır. b. Okunabilirlik: Okunabilirlik programın mantığını takip etmek, sınamak ve hata ayıklayabilmek ile ilgili bir kavramdır. Programlama dili ne kadar basit ise algoritmanın ifadesine doğal olarak ne kadar izin veriyorsa kodun incelenerek programın hangi işlemleri gerçekleştirdiğini anlamak o kadar kolay olur. Okunabilirlik de yazılabilirlik gibi programcının tarzına bağlı olduğu için ölçülebilmesi zordur. c. Sıra dışı durumları karşılayabilme: Programlama dili hatalı giriş, aritmetik taşma gibi durumlara hazırlıklı olmalı bu durumlara uygun çözümleri içermelidir. 2. Yazılım Bakıma Elverişli Olmalıdır Daha önceden geliştirilmiş bir yazılımın hatalarının ayıklanması ve giderilmesi, yeni modüller eklenmesi ve çıkarılması kullanıcı ihtiyaçları doğrultusunda yazılımın geliştirilmesi yazılım bakımının temel unsurlarıdır. Yazılımın okunabilirliğinin yanında değiştirilebilirliğinin de yüksek olması o programlama dilinin bakıma elverişli olamsı anlamına gelmektedir. 3. Yazılım Verimli Çalışmalıdır. Geliştirilen yazılımların verimliliği kullanılan programlama dilline doğrudan bağlıdır. Verimlilik esas olarak programlama dilinin tasarımı sırasında ele alınan bir konudur. İlk dönem programlama dillerinde verimlilik programlama dilinin mevcut donanımı etkin ve hızlı bir şekilde kullanması ile ölçülmekteydi. Bu gün bu anlayış değişmiş ve programlama dilinin verimliliği işletim hızı, bellek gereksinimi, geliştirme ve bakım sırasında harcanacak zaman gibi kavramlarla ölçülen bir değer olmuştur. 2
5.4 Programlama Dillerinin Tarihçesi İlk programlar fiziksel olarak yazılıyordu. Daha sonra fiziksel programlama yerini elektrik sinyaline bıraktı. Artık, kurulan elektronik devrelere düşük ya da yüksel voltajda akım gönderilerek bilgisayarın davranışı belirlenmeye başlandı. Yüksel voltaj 1, düşük voltaj 0 sayılarını ifade ediyordu. Böylelikle bugün de kullanılan makine dilinin ortaya çıkması için ilk adımlar atılmış oldu. Ancak bu şekilde programlar yazmak, sistemi oluşturan elektronik devrelerin her program için baştan kurulmasını gerektiriyordu. Bundan dolayı programlar bazı kavramlar çerçevesinde yazılmaya başlandı. Öncelikle bilgisayar donanımı her program için baştan kurulmamalı, bunun yerine basit bir donanımın üzerine yazılan komutlar kullanılmalıdır. Daha sonra, programlar tek bir komutlar zinciri yerine, küçük parçalar halinde yazılmalıdır. Bu parçaların programın içinde defalarca kullanılabilmesi yordam (subroutine) kavramını ortaya çıkarmıştır. Bu modelin kullanılması ise mantıksal karşılaştırmaları, döngülerin kullanılmasını ve yazılan kodlar tekrar kullanıldığı için kütüphane (library) mantığını ortaya çıkarmıştır. 1957 yılında IBM, düşük seviye (makine diline yakın) bir programlama dili olan FORTRAN dilini ortaya çıkardı. FORTRAN ile beraber basit mantıksal karşılaştırmalar, döngüler, (true-false) lojik ve (integer, double) sayısal değişkenler kullanılmaya başlandı. 1959 yılında, bu programlama dilinin özelliklerini alıp, giriş çıkış (Input Output IO) gibi yeni işlevler sağlayan COBOL dili ortaya çıktı. Daha sonra 1968 yılında, COBOL ve FORTRAN dillerinin en iyi özelliklerini alarak Pascal ortaya çıktı. Ayrıca Pascal dili, hafızadaki adresler üzerinde işlem yapmaya olanak veren işaretçi (pointer) kavramını beraberinde getirdi. 1972 yılında C, Pascal dilindeki birçok hatayı gidererek ortaya çıktı. C dili ilk defa Unix işletim sistemini yazmak için kullanılmaya başlanmıştır. C, düşük seviye bir dil olması, kuvvetli giriş çıkış işlemleri sağlaması gibi birçok özelliği ile işletim sistemleri yazılmasında tercih edilmiştir. Bütün programlama dilleri birçok özelliğe sahip olmasına rağmen, modüler programlamanın birçok eksiğini gidermek amacıyla, yeni bir programlama modeli olan nesneye yönelik programlama - OOP (object oriented programming) ortaya çıkarıldı. C dilinin ve OOP modelinin tüm özellikleriyle C++dilioluşturdu C++ dilini, Sun Microsystems tarafından çıkartılan Java takip etti. Java dilinin kullanım alanları, nesneye yönelik bir programlama dili olması ve beraberinde getirdiği çöp toplama GC (garbage collection) gibi performans arttırıcı özellikleri ile büyük ölçüde genişledi. Microsoft, 2000 yılında.net platformunu sunarak, otuzdan fazla programlama dilini aynı çatı altına topladı. VisualBasic.NET ve VisualC#.NET platformunu kullanan günümüzdeki en güçlü yüksek seviyeli programlama dilleri arasında yer almışlardır. 3
5.5 Programlama Dillerinin Sınıflandırılması a. Genel Sınıflandırma Temel Programlama Dilleri Fortran, C, Cobol, Basic, Pascal Veriye Yönelik Prog. Dilleri Lisp, Apl, Snobol, Icon Nesneye Yönelik Prog. Dil. Simula, C++, Java, VB b. Uygulama Alanlarına Göre Sınıflandırma Bilimsel ve Mühendislik Dilleri Fortran, C, Pascal Sistem Programlama Dilleri C, Assembler Veri Tabanı Dilleri Dbase, Clipper Yapay Zeka Dilleri Prolog, LISP Genel Amaçlı Programlama Dilleri C, Pascal, Basic 4
c. Seviyelerine Göre Sınıflandırma Düşük Seviye Assembler Orta Seviye C, C++, C## Yüksek Seviye Fortran, Basic, COBOL, Pascal Çok Yüksek Seviye Dbase, Clipper, VB, Paradox, Access 5.6 Nesneye Yönelik Programlama Nesneye yönelik programlama nesne kavramına dayanmaktadır. Burada nesne gerçek dünyada var olan veya programcı tarafından oluşturulmuş mantıksal bir varlıktır. Nesne, kendisini tanımlayan veriler ve bu veriler üzerinde yapılacak tüm işlemler ile bir bütün olarak düşünülür. Aynı gruptan nesnelere genel bir isim verilip yeni bir veri türü yaratılır. Bir genelleme olan bu yapı sınıf olarak anılır. Nesneye yönelik programlama veri soyutlama, kalıtım, çok biçimlilik yapıları üzerine inşa edilmiştir. Veri Soyutlama(Data Abstraction) : Kullanıcı tarafından yeni veri türlerini modelleyen sınıflar oluşturulmasıdır. Kalıtım(Inheritance) : Oluşturulan bu sınıfların genişleterek veya özelleştirilerek yeni sınıflar oluşturulmasıdır. Çok Biçimlilik(Polymorphism) : Aynı isimdeki işlemlerin değişik nesne grupları tarfından farklı algılanmasıdır. 5.7 Programlama Ortamı Programlama ortamı, programlama dili ile birlikte birçok bileşenden oluşur. Bu bileşenler, sembolik olarak tasarlamış programın bilgisayar donanımı tarafından istenilen işlevleri yerine getirmesi için gereken tüm unsurlardır. Programlama ortamının temel unsurları Editör(Editor), Derleyici(Compiler), Kütüphane(Library), Bağlayıcı, Hata ayıklayıcı(debugger) ve yorumlayıcı(interpreter) dır. Editör(Editor): Kaynak kodu oluşturmak ve gerektiğinde değişiklik yapmak için gerekli olan araçtır. Editörde yazılanlar seçilen dilin komutlarından oluşan metinlerdir. 5
Derleyici(Compiler): Editörde yazılan kaynak kodu makine koduna çeviren bir programdır. Şekil 8.1 de bir derleyicinin genel yapısı verilmiştir. Derleyicilerde ön uç(front end) kodun söz diziminin ve anlam yapısının kullanılan dile uygunluğunu kontrol ederken arka uç makine kodunu üretir. Ön uç, dile bağımlı iken arka uç makineye bağlıdır. Kütüphane(Library): Nesne dosyalarından oluşur. Bağlayıcı: Programın içerdiği tüm nesne dosyalarını birleştirerek tek dosya haline getirerek yürütülebilir bir dosya haline getirir. Hata ayıklayıcı(debugger): Programcının hataları ayıklayabilmesi için programın adım adım yürütülmesini sağlar. Yorumlayıcı(Interpreter): Programın kaynak kodunu doğrudan satır satır yürüten bir programdır. Kaynak Sözdizimi çözümleme ÖN UÇ Anlam Çözümleme Arka Kod Makineden bağımsız eniyileme ARKA UÇ Kod Üretimi Makine bağımlı eniyileme Makine Kodu Şekil 5.1 Bir Derleyicinin Genel Yapısı 6