Algoritma Nedir ?

Başlatan muhittin_kaplan, 06 Ekim 2013, 10:46:36

muhittin_kaplan

Bakıyorum da Sanki Doğrudan kod yazıyoruz yani oturup düşünmüyoruz, veri yapısı nedir, en uygun ne olmalı, bu fonksiyon en optimize nasıl çalışır ?
Evet Dökülelim Bakalım, Zekat Vakti.

"Algoritma bir işin yapılması için gerekli adımların belirlenmesidir" tanımıyla başlayıp programlamada kullanılan iki yaklaşımı yazarak "araştırmak" üzere vereyim.
Algoritmik ve Heuristik.

FxDev

Muhittin hocam selamlar,

Genellikle Güç elektroniği ile uğraştığımdan ADC/PWM birimlerinin cycle cycle kesme gecikmeleri benim için çok kritik olduğundan daha ortada donanım yokken ben algoritmayı ortaya koyarım. Özellikle bu kontrol (PID - Vector) fonksiyonlarında kritik bir öneme sahip.

Bundan sonra ise donanım uyumlulukları göz önüne alırım. Özellikle işlemciyi ona göre seçerim: ADC biriminin sample işlemi, PWM ile tetiklenebilir olması vb. Buna göre Init. ayarlarını da yaparım.

Daha sonrası ise OKUNABİLİR kod yazımıdır ki burada struct union vb. kavramları önemli bir hal alır.

Mottom şudur, benden başka bir adam da benim projemi ele aldığında commentsiz dahi benim yazılımımı okuyabilmeli.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

z

#2
Bir problemin cozum yolunu adim adim aciklamaya algoritma diyebiliriz.
Algoritma bu haliyle cok yalindir bilimsel tekniklerle (matematik/sayi teorisi/fizik vs) optimize edilir ve ortaya optimize edilmis algoritmalar cikar.
Burada adi gecen problem kuskusuz ciddi problemlerdir. Herkesin cozebilecegi turden problemlerin cozumunu kodlamak basit algoritma yazimidir ve bu cogu zaman heuristik yaklasimla yapilir.

Algoritma yalin haliyle anlasilirdir fakat optimize edilmis algorimalar anlasilirliktan cok uzaktir.  Oyle uzaktirki program kodlarinin yanina isterseniz sayfalar dolusu aciklama yapin gene de isin derinlerinde olmayanlar anlayamaz.

Optimize algoritma gelistirmek dahilerin isidir. Akademik calisanlarin adlarini literature gecirdigi turden calismalardir.

Isin icinde hiz varsa algoritma kutuphanelerinde arastirma yapip mevcut algoritmalari kullanmak gerekir. Aksi takdirde ayni isi yapan kodlari yazabilirsiniz fakat hiz acisindan yavas olacaktir.

Heuristik yaklasim acemilerin lojik devre tasariminda izledikleri yaklasima benzer. Sezgiler onplandadir. Sonucta yari senkron yari asenkron bir tasarim ortaya cikar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

kantirici

#3
Optimizasyon denince aklıma bu geliyor.  http://en.wikipedia.org/wiki/Fast_inverse_square_root

Tabi bu @z hocanın dedigi gibi üzerinde çalışılarak geliştirilmiş. Bu denli olmasada günlük hayattaki kodları optimize yazmak için donanımı ve programlama dili hakimiyeti ve tecrübe ön plana çıkıyor. Ustadlar burada günlük kod yazımında kullanabilecegimiz basit optimizasyonlardan bashsederlerse faydalı olacaktır.

MC_Skywalker

Kod optimizasyounu ile ilgili göz attığım bazı yazılarda "volatie" karşıma çıkmakta.  Nedir bu volatile?


Klein

Volatile belirtecini kullanarak,  derleyiciye " Sen bu değişkenin değerinin değişmediğini veya değişmeyeceğini zannediyorsun. Ama bu değişkenin değeri senin bilmediğin başka bir yerden değiştiriliyor. Bu yüzden bu değişkeni optimize etmeye çalışma. Gördüğün gibi derle" diyoruz. 

z

Aslinda derleyici biraz akilli olsa kimin volatile olmasi gerektigine kendisi karar verebilir. Butun ipuclari zaten kodlarin icinde var.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mistek

Derleyeci kodları hex koduna çevirirken kodu çalıştırıyor mu? Mesela kodda çalışma zamanlı sıfıra bölme hatası varsa derleyici bunu bilecek kabiliyete sahip olabilir mi? En basit durumu

while(1)
{
i--
bolum /= i;
}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Tagli

Hayır, bu hata derleme sırasında farkedilemez.
Gökçe Tağlıoğlu

Burak B

İşlemcilerdeki Divison by Zero bayrağı, kesmesi, registeri de işte buna hizmet eder.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

muhittin_kaplan

#10
Doğru, DZ bayrağı o iş içindir.

volatile derleme esnasında yaptığınız tanımlı bölgeyi "burayı optimize etme, elleşme kardeşim ne görüyorsan öyle compile et" anlamına gelir. Bir adresi değişkene bağlamış olabilirsiniz, konuyla alakalı güzel bir yazı http://ozgurmurat.blogspot.com/2009/05/c-dilinde-volatile-anahtar-kelimesi.html


Neyse Devam Edelim.

Algoritmik Yaklaşım: Daha önce test edilip kullanılmış, doğru çalıştığı bilinen çözümlerden herhangi biri seçilerek Probleme Çözüm Bulmaya Algoritmik yaklaşım denir. Tüm Adımların çok kecin ve net bir şekilde ortada olması gerekir.

Heuristik yaklaşım: Problem algoritmik olarak çözülmemiştir. problem tam olarak tanımlanmamıştır da diyebiliriz. problemin çözümü tam olarak ortada değildir.
bir programcı algoritmik olarak çözümlemediği bir problemi farkında olmadan Heuristik olarak çözüyordur. aslında Heuristik olarak çözdüğü anda artık algoritmik olarak da çözebilir.

algoritmik çözüm Heuristik den daha hızlı sonuca ulaştırır.
--------------------------------0---------------------------------0--------------------------------0----------------------------------0-----------------------------------0------------------------------------0---------

Algoritmik Çözüm yöntemini kullanarak ilk yaptığınız nedir Üstadlar ? Ben ilk önce pseudo code yazarım siz ? Sonrasında ister PBP,CCS, C yada Vb.net yada C# fark eder mi ? bundanrır ki arkdşlra "dil üzrnde fzl durmyn bnlr brr arç dyrm (burayı bilerek böyle yadzım çoğunluk anlamıştır. dil-iletişim aracıdır.)
merak edenler için http://tr.wikipedia.org/wiki/S%C3%B6zde_kod

z

#11
Alıntı yapılan: gerbay - 06 Ekim 2013, 20:52:13
Hayir, bunu asla bilemez...  örnegin bir degisken "memory mapped io" bölgesinde tanimli olabilir. Pci karti taktiniz sisteme, uygun bir base adresten itibaren yerleşti kart. Kartin registerlarini okuyacaksiniz, bunu derleyici asla bilemez. Hatta verdigim senaryoda hem volatile kullanmalisiniz hem de islemciye/isletim sistemine bu alani 'keşleme' demelisiniz. yani memory mapped io bölgelerinin keşlenmemesi de gerekir.

Volatile in optimize edilmemesi disinda bir özelliği daha var. Dereyici volatile tanimli degiskenler icin mümkün oldugunca atomik islem yapmaya çalisir.

Hocam bastan asagi kendimizin yazacagi kodlardan bahsediyorum.

Derleyici nasil bilir?

Adresleri Ram alani disindaki degiskenler volatile tanimli olmalidir. Heleki I/O port alaninda olanlarin alayi kafadan volatile yapilailir.

Interrupt rutinleri icinde kullanilan degiskenler ayni zamanda diger rutinlerde de kullaniliyorsa volatile degiskendir.

Bunlarin icinden volatile olmamasi gereken degiskenler cikabilir. Olsa ne olur ki? 

Mesela Ram alani icinde olmayan bos yerlerden birisine harici Ram takildi diyelim. Bu alanin bastan sona volatile olmasi gerekmez. Bunun da cozumu var. Kardesim volatile degiskenleri benim Ram alanindan sec denebilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Ram alani: Belli.
Haricten Map edilen Alan da tanimlanacak.

Bu alanlar Keil'deki gibi tanimlandiginda is bitiyor. Task ve Threadler icin bir sey diyemeyecegim ama bunlarin da C derleyici tarafindan anlasilacagi ipuclari (anahtar kelimeler ne bileyin Init Task vs) olmasi lazim.

Belki bu akillilik C derleyiciye değil de oncu derleyiciye devredilebilir. Keilde bile var bu ozellik. 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Simdi Ram alanina map edilen I/O alani vs deyince isler karisiyor detaylari bilmedigim icin fazla eselemek istemiyorum.

PCI vs ile calismadim ama hala sunu iddia ediyorum.

RTOS dahil isletim sistemi yapisi icermeyen klasik usulde yazilmis icinde bilincli sekilde volatile on eki kullanilmadan hatali yazilmis bir C programini oncu yorumlayicidan gecirerek surada surada surada kullandiginiz degiskenler volatile olmaliydi dedirtebilirim.

Bu o kadar da zor değil.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Interrupt rutinlerini diger rutinlerden ayirmak  ARM islemcilerde cok kolay degil ama imkansiz da degil (vektor tablosundan yola cikilabilir). Cevre birimlerini okuyup/yazan okuduklarini degiskene aktaran noktalar, bu degiskenden yeni verileri turetip bir baska degiskene aktaran noktalar volatile degiskenler icin hayati ipuclari olacaktir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com