PHP kod yapısı ve yorum satırları
PHP kodları sunucu (server) tarafında çalıştırılır ve HTML üretilip çağıran tarayıcıya gönderilir. PHP dosyaları metin dosyalarıdır. Varsayılan dosya uzantısı “.php” dir.
Yazdığımız kodların PHP kodları olduğunu belirtmek için aşağıdaki yapıyı kullanırız:
<?php // Kodlar buraya ?>
“Kodlar buraya” kısmına yazdıklarımız PHP kodları olarak değerlendirilir. PHP’nin kurallarına uyarak yazılan kodların HTML çıktıları tarayıcıya gönderilir. Bir örnek üzerinde ne demek istediğimi anlatayım. Aşağıdaki php kodlarını yazıp çalıştırın. (Nasıl yapılacağı ile ilgili PHP dosyalarımızı nasıl çalıştırırız? makalemize bakabilirsiniz)
<!DOCTYPE html> <html> <body> <h1>PHP Öğreniyorum</h1> <?php //echo komutu birşeyleri yazdırmak için kullanılır. echo 5*3; ?> </body> </html>
Tarayıcıda görüntüsü şu şekilde olacaktır:
PHP kodlarınız çalıştırılıyor ve üretilen HTML tarayıcıda görüntüleniyor. 3*5 ifadesi 3 ile 5’in çarpımı demektir. Sonuç olarak 15 sayısı echo ile yazdırılmıştır.
PHP satırları noktalı virgül (;) ile biter.
Yorum Satırı // , # , /* */
Yukarıdaki kodda görülen
//echo komutu birşeyleri yazdırmak için kullanılır. # Bu şekilde de yazılabilir.
satırı PHP tarafından dikkate alınmaz, yani çalıştırılıp sonuç üretilmez, yorum satırıdır. Tek satır yorum yazmak için //
veya # kullanılır.
Birden fazla satır yorum yazmak için ise aşağıdaki ifade kullanılır.
/* Birden fazla satır kullanılarak yazılmış olan yorum satırları */
Büyük / Küçük Harf Duyarlılığı
PHP için ayrılmış olan kelimeler (if, else, for, echo vb.)
kullanılırken büyük / küçük harf ayrımı yapmadan yazabilirsiniz. Yani ECHO, echo, Echo
aynı şeyi ifade eder.
Fakat değişken isimleri büyük / küçük harf duyarlıdır. Yani $numara, $Numara, $NUMARA veya $NuMaRa
farklı birer değişkendir.
Görüşmek üzere…
PHP dosyalarımızı nasıl çalıştırırız?
Bu makale, kendi bilgisayarınızda PHP dosyalarınızı nasıl çalıştırılacağınızı anlatır.
HTML sayfalarımızı yazdıktan sonra denemek için tarayıcı (Chrome, Microsoft Edge, Firefox vb.) ile açıp inceleyebiliyoruz. PHP dosyaları bu şekilde incelenemiyor, çünkü yazılan PHP kodlarının değerlendirilip sonuç üretilmesi için web server üzerinde çalıştırılması gerekiyor.
Ben bu iş için XAMPP tercih ediyorum. Kendi ifadeleri ile “XAMPP en popüler PHP geliştirme ortamı”. Bu paket Apache web server programı, MariaDB (MySQL), PHP ve Perl içeriyor. Tek program kuruyoruz ve her birinin ayarları ile tek tek uğraşmaya gerek kalmıyor. Bu adresi ziyaret edip işletim sisteminize uygun olan sürümü indirebilirsiniz.
PHP yazmak için herhangi bir metin editörü yeterli. Biraz daha özellik isterseniz (kod renklendirme, tamamlama vb.) Atom ya da Sublime Text deneyebilirsiniz.
İlk PHP scriptimizi yazalım
Tercih ettiğiniz editörü kullanarak aşağıdaki kodları yazın:
<?php
echo "Merhaba Dünya!"
?>
Bunu bir hello.php ismi ile kayıt edeceğiz. Fakat herhangi bir yere değil!
Kayıt edeceğimiz yer XAMPP programının sunucu ana klasörü olan “C:\xampp\htdocs” klasörü (Windows kullanıcıları için geçerli). Dosyanızı buraya kayıt edin.
Favori tarayıcınız açın. Adres çubuğuna http://localhost/hello.php yazın.
Tarayıcınıza yazdığınız localhost kendi bilgisayarınızı temsil ediyor. (127.0.0.1 de yazabilirsiniz.) hello.php dosyasını ana klasörde olduğu için doğrudan yazabiliyoruz. Dosyayı eğer htdocs klasörünün içinde başka bir klasöre (varsayalım deneme olsun) koyarsanız o zaman adres çubuğuna localhost/deneme/hello.php yazmanız gerekir.
Tebrikler, ilk PHP scriptinizi yazdınız ve çalıştırdınız.
Görüşmek üzere…
Flutter’da Ekran Yönü Kilitleme
Bu makale, Flutter’da setPreferredOrientations metodu kulanarak ekran yönünün nasıl kilitleneceğini anlatır.
Mobil uygulama hazırlarken bazen cihaz yan çevrilince uygulamamızın ekran görüntüsünün sabit kalmasını isteriz. Kullanıcı ekranı yatay ya da dikey kullanımlarında bizim uygulamamız sabit kalmalı ise aşağıdaki kodlar işimizi görecektir.
Öncelikle services.dart kütüphanesini ekliyoruz.
import 'package:flutter/services.dart';
SystemChrome.setPreferredOrientations metodu ile uygulama arabiriminin görüntüleyebileceği yönler kümesini belirtiriz. portraitUp ve portraitDown kullanarak uygulamamızın cihazın dikey konumda olduğu gibi görüntülenmesini yatay konuma geçince otomatik olarak uygulamamızın görüntüsünün değişmemesini sağlıyoruz.
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
Yönler kümesi içinde kullanılabilecek olan yönler:
landscapeLeft
landscapeRight
portraitDown
portraitUp
Gelelim bu kodları nerede kullanacağımıza:
Widget build edilirken kullanılabilir
@override
Widget build(BuildContext context) {
if (Platform.isAndroid)
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
......
Ya da Widget yüklenirken aktif etmek istersek, initState içinde çalıştırabiliriz
@override
void initState(){
super.initState();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
}
Bu özelliği aktif hale getirdikten sonra uygulamamızın diğer ekranlarında pasif hale getirmek istersek, dispose olayına
@override
dispose(){
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
super.dispose();
}
yazmamız yeterli.
setPreferredOrientations metodu doküman sayfası için tıklayınız.
Görüşmek üzere…
Firebase Android Projemize Nasıl Eklenir?
Bu makale, Android uygulamamızda Google Firebase’i kullanmak için ilk adım olarak Firebase’i uygulamamıza eklemeyi anlatır.
Öncelikle, Firebase için herşeyin doğru versiyon olup olmadığını kontrol edeceğiz. Sonra Firebase Console kullanarak projemizi oluşturacağız. Ve son olarak da Android geliştirme tarafında Firebase için projemizde bazı modifikasyonlar yapacağız.
1. Oluşturduğumuz projeyi test etmek için kullandığımız Android cihazımız ya da emülatörümüz en az Android 4.0 (Ice Cream Sandwich) olmalı
2. Play Service 9.0 ya da daha yeni olmalı
3. Android Studio’nun yeni versiyonu olmalı.
Bir de Android SDK’yı kontrol etmelisiniz. Firebase’ın youtube kanalındaki 2016 yılındaki videosuna göre, Google Play Services Revision 30 veya daha yenisi, Google Repository Revision ise 26 ve daha yukarı olmalı. Benim sistemimdekiler aşağıdaki resimde görülüyor. Kontrol etmek isterseniz, Android Studio’yu açtıktan sonra toolbardan Android SDK Manager açılır. Oradan SDK Tools menüsü ile karşınıza aşağıdaki ekran gelecektir. İşaretlediklerimin yüklü ve versiyonlarının da doğru olması gerekir.
Daha sonra firebase.google.com adresine giriyoruz. Sağ üstteki Konsola Git butonu ile konsola ulaşıyoruz. Daha sonra aşağıdaki ekranda görüldüğü gibi Proje Ekle seçeneği ile projemizi ekleyeceğimiz forma ulaşıyoruz.
Projemize bir isim veriyoruz. Daha sonra Konumlar (Analitycs) kısmında ülkeyi seçiyoruz. Bu kısım kuruluşumuzun ülkesini temsil ediyor, gelir raporu için para birimini belirliyor. Proje Oluştur butonuna bastığınızda karşınıza projenizle ilgili sayfanız gelecektir.
Daha sonra tam ortada bulunan Android butonuna basarak Firebase’i Android uygulamamıza ekleme işlemlerine başlıyoruz.
Aşağıdaki ekran gelecektir. Bu ekranda Android paket adını ve SHA-1 imza sertifikası alanlarını doldurmamız gerekmekte.
Android paket adı kısmını doldurmak için, Android Studio’yu açıyoruz. build.gradle dosyasından applicationId değerini alıyoruz ve bu alana kopyalıyoruz.
İkinci kısmı doldurmak için kendi SHA-1 debug key’imize ihtiyacımız olacak. SHA-1 Firebase’e bizim debug uygulamamızın Firebase servislerini kullanmaya yetkili olduğunu kanıtlayacak. Bu kısım Uzaktan Yapılandırma (Remote Config), Kimlik Doğrulama (Authentication) gibi işlemleri yapacak iseniz gerekli. Nasıl bulunduğuna bakalım:
SHA-1 hash’i elde etmek için komut satırı arayüzünü açıyoruz. Ve aşağıdaki komutu giriyoruz.
keytool -exportcert -list -v -alias androiddebugkey -keystore C:\Users\ayhankoc\.android\debug.keystore
Komutun sonundaki kısmı kendi bilgisayarınızdaki kullanıcı dizininiz ile değiştirmeyi unutmayın.
Komutu çalıştırdıktan sonra keystore parolası isteyecektir. Varsayılan parola olarak android girin. Parolayı girdikten sonra istediğimiz bilgiye ulaşacağız. Çıkan listeden SHA1’in yanındaki sayıları kopyalıyoruz. Şöyle bir şeye benzeyecektir:
1C:E6:7C:AF:22:26:37:3F:D8:C4:DF:A9:33:5B:62:14:33:52:78:19
İki bilgiyi de girdikten sonra Uygulamayı Kaydet butonuna basıyoruz. Karşımıza gelen ekrandan google-services.json dosyasını indiriyoruz. Ve resimde görüldüğü gibi projemizini ana klasöründeki app klasörü altına taşıyoruz.
Firebase ayarlarınızı daha sonra değiştirirseniz, güncellenmiş JSON dosyasını indirmeniz ve projenize eklemeniz gerekecektir.
Firebase istemci kütüphanesini uygulamamıza eklemek için Gradle dosyalarında birkaç ekleme yapmamız gerekiyor. İlk olarak proje düzeyindeki build.gradle dosyasını açıyoruz. Ve dependencies bölümüne aşağıdaki satırı ilave ediyoruz.
buildscript { dependencies { // Alttaki satırı ekleyin classpath 'com.google.gms:google-services:4.0.1' } }
Ekleme yapacağımız diğer dosya uygulama düzeyindeki build.gradle dosyası. Aşağıdaki eklemeyi yapıyoruz. Bu plugin biraz önce indirdiğimiz json dosyasını okuyacak ve içerisindeki bilgileri buraya aktaracaktır.
// Dosyanın en altına alttaki satırı ekleyin apply plugin: 'com.google.gms.google-services'
Son değişikliğimiz ise Firebase core ile ilgili. Son versiyonu kullandığımızdan emin olmak için Firebase Android Setup dokümanına gidiyoruz. Oradaki son versiyonu alıp build.gradle dosyamızda dependencies bölümüne ekliyoruz.
dependencies { // Alttaki satırı ekleyin implementation 'com.google.firebase:firebase-core:16.0.5' }
Tüm eklemeleri yaptıktan sonra Gradle’ı senkronize etmek gerekiyor.
Senkronizasyon işlemi bittikten sonra, uygulamızı emülatör üzerinden çalıştırabiliriz (ya da fiziksel cihaz üzerinden). Uygulamamızı çalıştırırken Firebase Konsol’dan uygulamamızı eklediğimiz adımların sonuncusunda Firebase uygulamamızın sunucu ile olan bağlantısınıı bekleyecek ve uygulamamız çalıştığında aşağıdaki penceredeki gibi bir şeyle karşılaşacağız.
Başarıyla uygulamamıza Firebase’i ekledik.
Görüşmek üzere…
Yarım Toplayıcı ve Tam Toplayıcı (Half Adder – Full Adder)
Bu makalede, mantık kapılarını kullanarak ikili toplama işleminin nasıl yapıldığı, yarım ve tam toplayıcı anlatılmıştır. Yarım ve tam toplayıcı devrelerinin doğruluk tabloları ve tasarımları da gösterilmektedir.
Boolean Mantığı Nasıl Çalışır isimli makalemizde mantıksal kapıların nasıl çalıştığına, Bit ve byte ile ilgili makalemizde ise ikili sayılarda toplama işlemine basitçe değinmiştik.
Tek bitlik toplama (ekleme) işlemi yapmak istediğimizi varsayalım. Bu işlemi yapabilecek bir devre tasarlamaya tüm mantıksal kombinasyonları yazarak başlayalım:
0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10
Görüldüğü gibi çok basit. Bu işlem istenilirse aşağıdaki gibi de gösterilir ki bizim işimizi daha kolaylaştırır.
0 + 0 = 00 0 + 1 = 01 1 + 0 = 01 1 + 1 = 10
Tek sorun 1+1 işlemindeki taşma. Carry bit (taşma biti) önemsemez isek, devrenin çıkışlarına bakıldığında XOR kapısı ile çıkışlar aynı olduğu için devre XOR kapısı ile çözülür.
Yarım Toplayıcı (Half Adder)
CO : Carry-Out => Elde
Bu tabloya baktığımızda, çıkış Q için XOR kapısı ve elde CO için bir AND kapısı ile 1-bitlik toplayıcı devresi yapılır.
İki tane 8 bitlik toplama yapmak istersek işler biraz karışabilir. Toplama yaparken elde biti bir sonraki basamağa ilave edilmelidir. Bunu yapacak devreyi tasarlamak 3 giriş biti kullanmalıyız. Birisi CI: Carry In (Elde girişi) ki bu önceki basamaktan gelecek, A ve B girişleri. Çıkış olarak Q ve CO: Carry Out (Elde). 3 giriş bitli bu devreye tam toplayıcı (full adder) denir. 8 tam toplayıcıyı bir araya getirerek bir byte’lık bir toplama yapabiliriz ve bir bitin diğerine taşma bitini kademelendirebiliriz.
Tam Toplayıcı (Full Adder)
Tabloyu dikkatle incelersek, Q bitinin üst 4 tanesinin A ve B girişlerine göre XOR kapısı, alttaki 4 bitinin ise XNOR kapısı gibi davrandığını görebiliriz. CO’nun üstteki 4 bitinin A ve B’ye göre AND kapısı, alttaki 4 bitin ise OR kapısı gibi davrandığını görebiliriz. Aşağıdaki devre CI’nin de dahil edilmesiyle elde edilen tam toplayıcı devresidir.
Tam toplayıcı devresi için en uygun çözüm bu devre değil fakat tablodan devreye nasıl dönüştürülebileceğine dair bir örnek olması açısından önemli.
Yarım toplayıcıları artarda ekleyerek tam toplayıcı devresi yapmak da mümkün. Bu şekilde daha az mantık kapısı kullanılmış olacaktır.
İki devre de aynı işi yapmakla beraber daha az mantık kapısı kullanan devre tercih edilir.
Devreleri daha kolay çizebilmek için tam toplayıcı bir kutu şeklinde de gösterebiliriz.
Kutu şeklinde çizmek kapılarla çizmekten kolay olduğu gibi, içerisinde olanları her defasında düşünmektense sadece mantığına odaklanmamızı da sağlıyor. CI yani elde girişini ve A ile B girişlerini toplayarak Q çıkışını ve CO yani taşmayı üreten bir kutu çizmiş olduk.
4-bit toplama yapmak istediğimizde 4 adet tam toplayıcıyı birbirlerine aşağıdaki gibi bağlayabiliriz.
Tam toplayıcıda CO’lar diğer basamağı oluşturan tam toplayıcının CI girişine verilmiştir. Böylece eldeli 4 bitlik toplama devresi oluşturulmuştur. Toplama işlemini yaparken ilk önce Elde (CI) biti ile beraber A0 ve B0 toplanır ve Q0 değeri elde edilir. Daha sonra işlemde elde var ise A1 ve B1 toplamına ilave edilir Q1 elde edilir. İşlem bu şekilde devam ederek 4 bitlik toplama işlemi yapılır. (Bazı gösterimlerde Q yerine Sum – toplam anlamında S kullanılabilir.)
Bu zinciri istediğimiz kadar uzatıp örneğin 8, 16 veya 32 bitlik toplayıcılar elde edebiliriz.
4-bitlik bu toplayıcı ripple-carry yani dalgalanma taşıyan toplayıcı olarak adlandırılır. Dalgalanma tabiri elde bitlerinin bir toplayıcıdan diğerine aktarılması bir anlamda dalgalanmasından gelir. Bu uygulama basitlik avantajına sahiptir fakat hız olarak bir dezavantaja sahiptir. Gerçek bir devrede kapıların çıkışları anında değişmez. Çıkış ve elde oluşması biraz zaman alır. Bu zaman nanosaniye boyutundadır fakat yüksek hızlı bilgisayarlar için bu zaman önemlidir. Bir toplayıcının çıkış durumunun değişme zamanını örnek olarak 20 nanosaniye düşünürsek 4 bitlik bir toplayıcıda nihai toplam ancak 80 nanosaniyede elde edilebilir. Zaman problemini çözmek için Carry-lookahead toplayıcıları geliştirilmiştir. Carry-lookahead toplayıcılarını yapmak için daha fazla kapı gereklidir ancak çıkışları çok daha hızlı gereken değeri alabilirler.
Entegre Devre Toplayıcılar
Yarım toplayıcılar ile sadece 1 bit toplama yapılabildiği için pratikte tam toplayıcılar kullanılır. Çünkü tam toplayıcılar ile 1 bitlik sayılar da toplanabilir. Toplanmak istenen bit sayısı artınca devreler karmaşıklaşır ve kullanılacak kapı ve dolayısıyla entegre sayısı artar. Bunun için toplayıcılar entegre devre haline getirilmiştir. 4 bitlik paralel toplayıcı entegreleri 7483, 74283, 54283 ve 4008 dir. Örnek olarak CD4008BMS isimli entegrenin katalog bilgilerine buradan ulaşabilirsiniz.
Entegrenin görünüşü ise bu şekilde:
Bacak bağlantı ise aşağıdaki gibidir.
Bu makalemizde bilgisayarın en fazla yaptığı iş olan toplama işlemi üzerinde durduk. Diğer makalemizde görüşmek üzere…
Bit ve Byte Nedir?
Bilgisayar kullanan her insan mutlaka bit ve byte kavramlarını duymuştur. Bilgisayarımızın ana belleği olan RAM ve dosyalarımızı kayıt ettiğimiz Harddisk, CD-ROM, DVD-ROM, Blue-Ray, Flash disk gibi cihazların kapasiteleri byte ile ölçülür. İşletim sistemlerinde dosya görüntüleyici kullanarak özellilklerinden dosyalarınızın boyutlarına baktığınızda byte cinsinden ölçüldüğünü görürsünüz.
“CORE İ3 5005U 2.0GHZ-4GB RAM-500GB HDD-15.6″W10 NOTEBOOK” yazan reklemları görmüşsünüzdür. Bu bilgisayarda 4 Gigabyte Ram, 500 Gigabyte harddisk var. Bu makalede bit ve byte kavramlarından bahsedip tam olarak anlamanıza yardımcı olacağız.
Onlu Sayılar (Decimal Numbers)
Bitleri anlamanın en kolay yolu bunları bildiğimiz bir şeyle karşılaştırmak olacaktır, Rakamlar. Rakam sayıları göstermek için kullandığımız sembollerdir. Onlu sayma sisteminin rakamları 0,1,2,3,4,5,6,7,8 ve 9 ‘dur. Bir rakam bir basamak yer kaplar. Bir basamaktan büyük sayıları oluşturmak için rakamları gruplar halinde birleştiririz. Örneğin, 1508 sayısı dört basamaklı bir sayıdır. 1508 sayısında 8’in “birler”, 0’ın “onlar”, 5’in “yüzler”, 1’in ise “binler” basamağında olduğunu söyleriz. Rakamlar bulundukları basamak kuvvetine göre değer alırlar.
(1 * 1000) + (5 * 100) + (0 * 10) + (8 * 1) = 1000 + 500 + 0 + 8 = 1508
Bunu 10’lu sistemin basamak kuvvetlerini kullanarak da ifade edebiliriz. “^” sembol üs alma işlemini belirtiyoruz. (Örneğin 10’un karesini 10^2 ile göstermiş oluyoruz.)
(1 * 10^3) + (5 * 10^2) + (0 * 10^1) + (8 * 10^0) = 1000 + 500 + 0 + 8 = 1508
Bu ifadede dikkat ederseniz, ilk basamak 10’un 0. kuvveti olan 1 ile başlıyor. Bu bizim “birler” basamağımız. Sola doğru gittikçe kuvvet 1 artıyor. Böylece “onlar”, “yüzler”, “binler” … basamakları elde ediliyor.
10’lu sistemi günlük hayatımızda her yerde kulllanıyoruz. Belki de 10 parmağımız olduğu için bu sistemi kullanıyoruz. 8 parmağımız olsaydı belki de 8’li sayı sistemi kullanıyor olabilirdik. Sekizli sayı sistemi Octal sayı sistemi olarak adlandırılır. Örneğin, Sümerler 60’lı sayı sistemi kullanıyorlardı. Bilgisayarlar ise 2’li sayı sistemi kullanırlar.
İkili Sayılar (Binary Numbers)
Bilgisayarlar base-2 yani 2’li sayı sistemi kullanırlar. Bunun nedeni, bilgisayarları mevcut elektronik teknoloji ile gerçekleştirmenin daha kolay olmasıdır. Base-10 yani 10’lu sistemi kullanan bilgisayarlar da yapılabilir fakat çok daha pahalıya mal olacaktır. 2’li sistem nispeten ucuzdur.
Bit kelimesi “Binary digIT” yani ikili basamak (ikili rakam) kelimesinden gelir. Ondalık basamaklar 0 ile 9 arasında değişen 10 farklı değere sahip olsa da, bitlerin yalnızca iki olası değeri vardır: 0 ve 1. Bu nedenle, bir ikili sayı sadec 0 ve 1’lerden oluşur. Örneğin: 1001.
1001 ikili sayısının değerinin ne olduğunu nasıl anlayabiliriz?
Çözüm yukarıda 10’lu sistemde yaptığımız gibi bulunur. Sadece 10 yerine 2 tabanını kullanacağız. Şöyle ki:
(1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (1 * 2^0) = 8 + 0 + 0 + 1 = 9
Aşağıda ikili sayılardan bazılarını görebilirsiniz. 0’dan 16’ya kadar 10’lu sayılar ve o sayıların 2’li karşılıkları:
0 = 0 1 = 1 2 = 10 3 = 11 4 = 100 5 = 101 6 = 110 7 = 111 8 = 1000 9 = 1001 10 = 1010 11 = 1011 12 = 1100 13 = 1101 14 = 1110 15 = 1111 16 = 10000
Basamak sayılarına dikkat ederseniz, 2’nin katları olan 2,4,8, ve 16 sayılarının karşılıklarında bir artmaktadır. Bir bit 1 ise ona 1 ilave ettiğinizde ondalık sistemde 2 olacaktır. İkili sayı sisteminde ise 2 rakamı bulunmadığından yukarıda görüldüğü üzere 2 sayısı 10 ile gösterilmektedir. Yani 1 sayısına 1 ilave ettiğinizde 2 basamaklı bir sayı elde edersiniz. Onlu sistemde düşünürsek 9 sayısına 1 ilave ettiğinizde 10 elde edersiniz ve bunu da 2 basamak ile gösterirsiniz.
Bilgisayar dünyasında bitler nadir olarak yalnız görünürler. Çünkü 1 bit ile sadece 2 durumu ifade edebiliriz. Neredeyse her zaman 8 bitlik gruplar halinde kullanılırlar. Ve bu 8 bite 1 byte denir.
1 byte ile yani 8 bit ile 256 farklı değeri ifade edebiliriz.
0 = 00000000 1 = 00000001 2 = 00000010 3 = 00000011 ... 253 = 11111101 254 = 11111110 255 = 11111111
Standart ASCII Karakter Seti
Metin belgelerindeki her bir karakteri ifade etmek için 1 byte kullanılır. ASCII karakter setinde 0 ile 127 arasındaki her bir ikili değere bir karakter ataması yapılmıştır. Yani hangi ikili sayının hangi karakteri temsil edeceği standart hale getirilmiştir. 1 byte ile gösterilebilecek 256 değerin, 0 ile 127 den sonraki 128 ile 255 arasındaki karakterler, aksanlı karakterler ve özel karakterlerden oluşur. ASCII tablosuna bu adresten ulaşabilirsiniz.
Bilgisayarlar metin belgelerini hem diskte hem bellekte karakterlerin ASCII kodlarını kullanarak saklarlar. Örnek olarak, Windows işletim sisteminde Not Defterini açın. “Bilisim Makaleleri” yazısını yazıp herhangi bir isimle kayıt edin. Dosyanızı dosyanızın boyutuna bakın (Dosya yöneticisinden dosyanızın üzerine gelip sağ tuş menüsünden Özellikleri seçerek). Dosyanız disk üzerinde her bir karakter için 1 byte kullanarak 18 byte yer kapladığını göreceksiniz. (Boşluk da bir karakterdir -ASCII karakteri 32- ve 1 byte yer kaplar.)
Byte Katları ve İkili Matematik
Çok sayıda byte ile çalışmaya başladığımızda kilobyte, megabyte, gigabyte gibi byte’ın üst katlarına ihtiyaç duyarız.
Binary sisteminde çarpanlar:
Kilo (K) : 2^10 = 1024
Mega (M) : 2^20 = 1.048.576
Giga (G) : 2^30 = 1.073.741.824
Tera (T) : 2^40 = 1.099.511.627.776
Peta (P) : 2^50 = 1.125.899.906.842.624
Exa (E) : 2^60 = 1.152.921.504.606.846.976
Zetta (Z) : 2^70 = 1.180.591.620.717.411.303.424
Yotta (Y) : 2^80 = 1.208.925.819.614.629.174.706.176
Tablodan Kilo’nun yaklaşık bin, Mega’nın yaklaşık bir milyon, Giga’nın yaklaşık bir milyar kat olduğunu görebiliriz. “Bu bilgisayarın 2 TB sabit diski var” dendiğinde, 2 tera byte veya 2 trilyon byte ya da tam olarak 2.199.023.255.552 byte kapasiteye sahip olduğunu anlayabiliriz.Bir CD-ROM’un yaklaşık 650 MB alana sahip olduğunu düşünürsek 2 TB’lık bir diski kapasitesini daha rahat anlayabiliriz.
2 TB’lık disk ile:
- Tanesi 4 MB’dan yaklaşık 500 bin adet mp3 formatında şarkı
- Ortalama boyutu 700 MB’dan yaklaşık 2800 civarında film
- 1 GB’lık yaklaşık 2000 adet oyun
- 100 KB’lık fotoğraflardan 2 milyon adet depolayabiliriz.
İkili Matematik
İkili matematik aslında ondalık matematik gibi çalışır.Ancak her bitin değeri 0 ya da 1 olabilir. Ondalık matematiği ele alalım sonra ikili matematikten devam edelim:
582 + 765 --- 1347
Bu iki sayıyı toplamak istediğimizde, önce sağ taraftan (birler basamağından) başlayıp, 2 + 5 = 7 işlemi yapılır. Sonra 8 + 6 = 14 işlemi yapılarak 4 sayısı yazılı. 1 sayısı diğer basamağa taşar. Daha sonra 1 + 5 + 7 = 13 işlemi yapılarak önce yüzler basamağına 3 yazılır. Artan 1 binler basamağına yazılarak 1347 sonucu bulunur.
Aynı yolla ikili sayıları toplayalım:
011 + 101 --- 1000
En sağdan başlayalım, 1 + 1 = 10 yapar (ikili sayı sistemindeki 10 sayısı onlu sistemde 2’ye eşittir). 0 sonucun birler basamağına yazılır. Artan bir ile beraber 1 + 1 + 0 = 10 işlemi yapılır. 0, sonucun ikiler basamağına yazılır. Artan bir ile beraber 1 + 0 + 1 = 10 işlemi yapılır. 0, sonucun dörtler basamağına yazılır. Artan 1 ise başka işlem olmadığı için sonucun sekizler basamağına yazılarak işlem bitirilir.
Bu makalemizde bit ve byte hakkında bilgi vermeye çalıştık. Umarım faydalı olmuştur.
Görüşmek üzere…
Referans:
https://computer.howstuffworks.com/bytes.htm
Yorumlayıcı (Interpreter) ve Derleyici (Compiler) Nedir?
Programlama konusundaki makalemizde, yazdığımız kaynak kodun makine diline çevrilmesinden bahsetmiştik. Okumadıysanız önce onu okumanızı öneririz: Programlama Nedir?
Genel olarak yüksek seviyeli bir dil kullanarak bilgisayar programı yazarız. Yüksek seviyeli bir dil, bizim tarafımızdan anlaşılır bir dildir. Programlama dillerinin çoğu İngilizce kelime ve kelime grupları içeren anahtar kelimeler kullanırlar. Fakat bilgisayarlar bu kelimeleri anlamazlar. Sadece makine kodu denilen 0’lar ve 1’lerle yazılmış olan programları anlarlar.
Yüksek seviyeli dil ile yazılmış olan programa kaynak kodu denir. Kaynak kodunun bilgisayarda çalıştırılabilmesi için makine koduna dönüştürülmesi gerekir. İşte bu iş ya Derleyici (Compiler) ya da Yorumlayıcı (Interpreter) tarafından gerçekleştirilir.
Derleyici (Compiler)
Derleyici (Compiler), girdi olarak yüksek seviyeli programlama diliyle yazılmış kaynak kodu alan, makinenin mimarisine göre makine dilinde çıktı üreten bir programdır. Çıktı olarak üretilen makine kodu sonradan herhangi bir zamanda farklı girdilerle tekrar tekrar çalıştırılabilir.
Örnek olarak; Java derleyicisi javac verilebilir. Javac, .java uzantılı kaynak dosyasını Java Sanal Makinesi (Java Virtual Machine) olarak bilinen bir hayali makine için makine dili olan Java bytecode ile yazılmış .class dosyasına dönüştürür.
Derleyici, kaynak kodu derlemeden önce kodları kontrol eder. Herhangi bir yazım hatası veya derleyicinin sevmediği durumlar var ise bu raporlanır. Bu da tam olarak çalışan program elde etmeden önce tüm kodlama hatalarını düzeltmemizi sağlar. Ancak bir programın başarılı olarak derlenmiş olması tam olarak hatasız olduğu ve istenileni yapacağı anlamına gelmez. Programımızı çeşitli verilerle test edip, mantıksal olarak da çalıştığından emin olmamız gerekir.
Eğer Linux işletim sistemi üzerinde derlenmiş olan bir C programımız var ise derlenmiş olan bu programı kopyalayıp Windows işletim sistemi üzerinde çalışmasını bekleyemeyiz. Windows üzerinde aynı C programımızı çalıştırmak istersek, Windows bilgisayarda bir C derleyicisi kullanarak programı yeniden derlememiz gerekecektir.
Yorumlayıcı (Interpreter)
Yorumlayıcı (Interpreter), girdi olarak program için olan verilerle birlikte kaynak kodu alan, ve kaynak programı satır satır yürüten bir programdır.
Örnek olarak Java yorumlayıcısı java verilebilir. Java .class uzantılı dosyayı üzerinde çalıştığı makinede çalıştırılabilecek olan doğal makine kodlarına çevirir.
Java’da derleyici ve yorumlayıcı beraber çalışır. Yani, önce oluşturulan kaynak koddan bir ara kod (bytecode) üretilmek için derlenir. Daha sonra bu derlenen bytecode Java Sanal Makinesi (JVM) üzerinde yorumlanarak yürütülür. Bu bazı avantajları da beraberinde getirir. En önemlisi platform bağımsızlığıdır. JVM çalışan her makinede bytecode’larımız sorunsuz çalışacaktır. İkinci avantajı ise Java bytecode’umuz bir sanal makine üzerinde çalıştığı için kötü amaçlı programlara karşı koruma sağlayan bir güvenlik katmanı ile korunmuş oluruz.
Java bytecode ve java yorumlayıcısı sadece Java dilinde kullanılmaz. Örnek olarak, Jython’u Python dilinden Java bytecode’una derlemek için kullanabiliriz ve daha sonra da yorumlamak için java‘yı kullanabiliriz. Ayrıca ML, Lisp ve Fortran derleyicileri de java bytecode’una derlerler.
Derleyici ve yorumlayıcı arasındaki farklar:
Yorumlayıcı | Derleyici |
---|---|
Programı satır satır işler | Tüm programı tarar ve bir bütün olarak makine koduna çevirir |
Kaynak kodu analiz etmekle zaman harcamaz. Ancak genel yürütme süresi daha yavaştır. | Kaynak kodun analizi için büyük zaman harcar. Ancak genel yürütme süresi daha hızlıdır. |
Herhangi bir hata olana kadar programı çalıştırır. İlk hata gördüğü yerde durur. Bu nedenle hata ayıklama kolaydır. | Tüm kaynak kodu taradıktan sonra hata mesajı üretir. Bu nedenle hata ayıklama nispeten zordur. |
Python, Ruby, Java gibi diller yorumlayıcı kullanır. | C, C++ gibi diller derleyici kullanır. |
Bu makalemizde Derleyiciyi ve Yorumlayıcıyı anlatmaya çalıştık. Umarım faydalı olmuştur.
Görüşmek üzere…
Kaynaklar:
https://www.lifewire.com/compiled-language-2184210
https://www.programiz.com/article/difference-compiler-interpreter
https://introcs.cs.princeton.edu/java/82compiler
Programlama Nedir?
Bilgisayarlar donanım ve yazılım olmak üzere ikiye ayrılır. Bilgisayarın işlemcisi, belleği, diski gibi kasa içindeki elemanları ve monitör, yazıcı, klavye ve fare gibi çevre birimleri donanım olarak adlandırılır. Yazılım ise donanım bileşenlerinin birbirleriyle ve kullanıcı ile iletişimini sağlayan programlardır.
Bir bilgisayarın olmazsa olmaz yazılımı, işletim sistemidir. İşletim sistemi olmadan bilgisayarı kullanmamız mümkün değildir. İşletim sistemleri bilgisayar donanımını kullanmamızı ve programları çalıştırmamızı sağlar. Klavyeden yazdığınız yazının ekranda görünmesi, yazdığınız yazıların bir dosya halinde diskte saklanması gibi işlemlerden işletim sistemleri sorumludur. Yazı yazdığınız uygulama programını çalıştırmak da işletim sisteminin sorumluluğudur.
Yazılımı üçe ayırmak mümkündür: işletim sistemleri, uygulama programları ve programlama dilleri.
Program
Türk Dil Kurumu, sözlüğünde program kelimesini şöyle tanımlar, “Bilgisayara bir işlemi yaptırmak için yazılan komutlar dizisi.”
Başka bir tanım daha yapar, “Yapılacak bir işin bölümlerini, bölümlerin sırasını ve zamanını gösteren tasarı.”
Programlama
Programlama ise, bir algoritma alma ve onu programlama dilinin istediği şekilde yazma (kodlama) işlemidir. Böylece yapılan program bilgisayarda çalıştırılabilir.
Birçok programlama dili ve birçok farklı bilgisayar türü olsa da önemli olan ilk adım, çözümün olması gerektiğidir. Bir algoritma olmadan program olmaz.
Algoritma
Algoritma, bir problemi çözmek için izlenecek kuralların bir listesidir. Algoritma adımlarını doğru sıraya koymak gerekir. Sabah giyinmek için bir algoritma düşünün. Ceketinizi kazağınızdan önce giyerseniz ne olur? Bir algoritma yazarken talimatların sırası çok önemlidir.
Algoritmayla günlük yaşantımızda da karşılaşırız. Bir kek yapmak istediğinizde, algoritma kek tarifidir. Bir yemek kitabında bu sorunu çözmek için gereken algoritmayı bulabilirsiniz. Ya da parkı bulamıyorsunuz. İhtiyacınız olan algoritma parka ulaşmak için bir yönler kümesidir. Parka gitmenin farklı yolları da olabilir. Böylece farklı algoritmalara sahip olabilirsiniz. Son bir örnek daha verelim. Sürpriz yumurtalardan çıkan oyuncağı yapmak istiyorsunuz. İhtiyacınız olan algoritma, oyuncağı nasıl yapacağınızı gösteren talimatlar listesidir.
Programlama Dili
Programlama dilleri, programcıların bilgisayarda çalışacak yazılımları geliştirebilmesi için kullandıkları özel dillerdir. Bu diller, bir bilgisayara veya bilgi işlem aygıtına belirli görevleri yerine getirmeyi öğretmek için kullanılan bir kelime hazinesi ve dilbilgisi kuralları kümesidir. Her programlama dilinin kendine özgü bir söz dizimi (syntax) vardır.
Toparlayacak olursak, bir problemimiz var ve bu problemi bilgisayar ile çözmek istiyoruz. Bunun için çözüm yolumuzu yani algoritmamızı, komutlar dizisine çevirmemiz gerekiyor. Çözüm yolumuzu oluşturacak komutları programlama dilinin kurallarını kullanarak yazıyoruz. Daha sonra bizim yazdığımız komutlar bilgisayarın anlayacağı Makine Diline çevriliyor ve böylece çalıştırılabilir hale geliyor.
Makine dili, sadece birler (1) ve sıfırlardan (0) oluşur. Bilgisayarlar elektronik aygıtlardır, bu sebeple sadece elektriğin varlığı ve yokluğundan anlarlar. Biz makine dilinde kodlama yapamayacağımız için kendi dilimize (hemen hemen tüm programlama dilleri İngilizce komut seti kullanır) yakın olan yüksek seviyeli diller ile program yazarız. Yazdığımız bu koda Kaynak Kod (Source Kod) denir.
Aşağıdaki kod parçası Python diline aittir. Ekrana “Hello World” yazar.
print("Hello World")
Yüksek seviyeli bir dil olan Python dili, bizim anlayacağımız dile yakındır. Aşağıdaki ise Makine dilinde “Hello World” yazar.
b8 21 0a 00 00 a3 0c 10 00 06 b8 6f 72 6c 64 a3 08 10 00 06 b8 6f 2c 20 57 a3 04 10 00 06 b8 48 65 6c 6c a3 00 10 00 06 b9 00 10 00 06 ba 10 00 00 00 bb 01 00 00 00 b8 04 00 00 00 cd 80 b8 01 00 00 00 cd 80
Makine dilinde program yazabilir misiniz?
Yazdığımız kaynak kodu makine koduna dönüştürmemiz gerekiyor ki bu işlem Derleyici (Compiler) ya da Yorumlayıcı (Interpreter) programlar tarafından yapılır.
Görüşmek üzere…
Boolean Mantığı Nasıl Çalışır?
Boolean Mantığı
Bir bilgisayarın nasıl hesaplama yapabildiğini, nasıl satranç oynayabildiğini veya bir belgenin yazım denetimini nasıl yapabildiğini, nasıl Go oyununu kendi kendine öğrendiğini hiç merak ettiniz mi? Bunlar, bundan 20 ya da 30 yıl kadar önce sadece insanların yapabileceği şeylerdi. Şu anda ise bunları bilgisayarlar gayet kolay bir şekilde yapabiliyor. Hatta insanlardan bile kolay şekilde. Silikon ve kablolardan oluşan bir chip (çip) insan düşüncesi gerektiren böyle şeyleri nasıl yapar?
Bu sorunun cevabını gerçekten anlamak istiyorsanız, işe Boolean Mantığından (Boolean Logic) başlamalıyız. Boolean mantığı 1800’lerin ortalarında George Boole tarafından geliştirilmiştir. Boolean mantığı bit ve byte’lar ile ilgilenir. Bilgisayarların nasıl işlem yaptıklarını anlamak için ihtiyaç duyduğumuz Boolen mantığı parçaları oldukça basittir. Bu makalede, öncelikle basit mantık kapılarını tartışıp sonra onları yararlı birşeylere nasıl dönüştüreceğimizi göreceğiz.
Mantık Kapıları (Logic Gates)
Nasıl bakmak istediğimize göre, öğrenmemiz gereken üç, beş ya da yedi kapı var (Birazdan anlayacaksınız 🙂 ). Bu basit kapılar ile hayal edebileceğiniz herhangi bir dijital bileşeni yapabilecek kombinasyonlar elde edebiliriz. Bu kapılar ilk bakışta çok sade ve basit gelecek, ancak okumaya devam ettikçe bazı ilginç kombinasyonlar da göreceğiz.
Değil Kapısı (NOT Gate)
Olabilecek en basit kapı invertör veya Değil (NOT) kapısı olarak adlandırılır.
Giriş olarak bir bit alır ve çıkış olarak da bu bitin tersini verir.
Değil (NOT) kapısı, A olarak adlandırılan bir girişe sahiptir ve Q olarak adlandırılan bir çıkış kullanır. Doğruluk tablosu kapının nasıl davrandığını gösterir. A’ya 0 (sıfır) uyguladığımızda Q 1 (bir) üretir. A’ya 1 (bir) uyguladığımızda Q 0 (sıfır) üretir. Basit değil mi? (A girişine 1 uygulamak demek, A’ya 5 Volt vermek demektir.)
VE Kapısı (AND Gate)
VE kapısı, A ve B gibi iki girişte mantıksal bir “ve” işlemi gerçekleştirir.
VE (AND) Kapısının arkasındaki mantık şudur: “Eğer A ve B her ikisi de 1 ise, o zaman Q 1’dir”. Doğruluk tablosunda da bu davranış görülebilir. Tablo satırları aşağıdaki gibi okunur:
A B Q
0 0 0 Eğer A 0 VE B 0 ise, Q 0’dır.
0 1 0 Eğer A 0 VE B 1 ise, Q 0’dır.
1 0 0 Eğer A 1 VE B 0 ise, Q 0’dır.
1 1 1 Eğer A 1 VE B 1 ise, Q 1’dir.
VEYA Kapısı (OR Gate)
Bir sonraki kapımız VEYA kapısı. Çalışma mantığı, “Eğer A veya B 1 ise (ya da her ikisi de 1 ise) o zaman Q 1’dir.”
Bunlar mantık devrelerinde kullanılan üç temel kapıdır. (Saymanın bir yolu). Çok yaygın olan iki kapı daha var: VE DEĞİL (NAND) ve VEYA DEĞİL (NOR) kapıları. Bu iki kapı aslında AND kapısı veya OR kapısı ile NOT kapısının bir kombinasyonudur. Bu iki kapıyı da sayarsak 5 kapı ediyor. Aşağıda NAND ve NOR kapılarının doğruluk tablolarını göreceksiniz. Doğruluk tablolarını incelediğinizde AND ve OR kapılarının tersi olduğunu göreceksiniz.
Listeye son iki kapıyı daha ekleyelim 5 ya da 7 adet olsunlar. XOR (ÖZEL VEYA) ve XNOR (ÖZEL VEYA DEĞİL) kapıları.
XOR (ÖZEL VEYA) Kapısı
Özel Veya kapısının çalışma mantığı: “Girişler birbirinden farklı ise çıkış 1’dir” şeklindedir.
XNOR (ÖZEL VEYA DEĞİL) Kapısı
Özel Veya Değil kapısı Özel Veya kapısının tersidir. Özel Veya Değil kapısının çalışma mantığı: “Girişler aynı ise çıkış 1’dir” şeklindedir.
Boolean mantığına bir giriş yaptık. Bu serimiz devam edecek.
Görüşmek üzere…