C de neden "goto komutunu kullanmayın" diyorlar ? Ve yazılımcılık tavsiyeleriniz

Başlatan RaMu, 17 Mayıs 2013, 23:33:16

RaMu

Bu sıralar biraz yoğun olduğum için forumu takip edemiyorum,
yazılan mesajları yeni gördüm,
içerisinde gerçekten duymak istediğim bilgiler var,
bubble sort ile quick sort, recursif, Microsoft Press'den "Code Complete" kitabinin 17.3 bolumu ... vb.
bu konuları uygun bir zamanda araştırıp aradığım cevaplar bunlarda mı gizliymiş bakacağım.
Teknik tartışmaya devam edilirse hoşuma gider, veya bu konunun veya benzerlerinin ele alındığı kaynaklara yönlendirilirse güzel olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ErsinErce

goto kullanmayın denir çünkü pipeline'ı sıfırlar, pipeline'ı tekrar doldurmak için zaman harcanır ve programı okurken zorlaştırır

bu konu daha önce forumda anlatıldı. detaylar için forumda veya google da aratma yapabilirsiniz.

z

Laf olsun diye goto kullanilmamalidir.  Goto komutu pipeline bufferi siler ve islemci buffer dolana dek yavas kosar.

Goto kullanma goto ile gidecegin kismi fonksiyon yap onerisi bu durumda ise yaramaz cunku Call komutu da Goto gibi pipeline bufferi sifirlar.

Goto kullanmadan program yazsanizda derleyici gerekiyorsa makine dilindeki Goto komutu kullanilacaktir.

Goto kafa karistirir, programin okunurlugunu zorlastirir iddiasina da cok sicak bakmiyorum.
Eger goto komutu ile kafalar karisiyorsa, kisa kod yazma ugruna yapilan sadelesmis kod parcalari daha fazla kafa karistirir.

Debug asamasinda rahatlamak istiyorsan olabildigince cok fonksiyon yaz.

Bu optimum makine kodlarindan cok uzak kod uretimine neden olsa da, herhangi bir problemle karsilastiginda amiral batti oyunundaki gibi basit mantik yurutumu ile kolayca sorunu yakalarsin.

Goto programin debug edilmesini zorlastirir. Neden zorlastirir onu anlatmak icin uzun yazi yazmak lazim.
Debug asamasinda rahatlamak istiyorsan olabildigince cok fonksiyonyaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

Eski makinalar geldi aklıma, yanlış biliyor olabilirim hani şu bant kasetli sistemler veya
kağıt üzerine delikler şeklinde yazılı programları işleten makinaları diyorum,
bunlarda goto kullanmak ne derece mümkündü veya call, program memory de dolaşılabiliyor muydu?
Bence hayır, günümüz mikrodenetleyicileride prog memory e ulaşırken kısmen zorluk yaşıyor anlaşılan,
pipeline konusunu net bilmiyorum ama asm den karşılaştığım kadarı ve z hocam sizin anlattığınız
mikrodenetleyici çalışma prensibi, şu mikroişlemci ram program memory basit bir md yapımı gibi konusundan anladığım kadarıyla bilgim var pipeline konusunda,
önemli problem pipeline diyorsanız tamam,
aslında benim sorumda yetersiz,
bir programdan ne bekleriz,
hız - güç harcama, güvenilirlik veya program kolay yazılsın md. kaynaklarını sömürsün,
vs. programın amacına ve kullanım alanına, yazımına göre herhalde soru değişik
cevaplar alabilir.
  Benim gibi şuanda c kullanarak profesyonel programlar yazmayan biri için goto kullanıp kullanmamak keskin bir çizgi, kesinlikle kullanma gibi bir durum oluşturmuyor anlaşılan,
yinede gelecekte bu işi sürdürmek niyetinde olduğum için goto kullanmamam gerektiği sonucunu çıkarıyorum.
 
  Asmde her zaman debug yapardım, ccs c ,le kod yazıyorum şuanda ve neredeyse hiç program vasıtasıyla debug yapmadan, sürekli gözle takip ediyorum programı, bunun temel sebebi derleyicinin debug işlemini doğru düzgün kullanamamam,
hatta bu sebeple ccs c de yazdığım programı mplab ile açıp mplab üzerinden debug yaptım birkaç defa, insan alıştığı platforma güveniyor haliyle :)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

delikli band ve teypden program yukleyen makinelerde elbette goto vardi. program teyp vs den okunup rama aktariliyor ve ramda gotolar cirit atiyor.

makine dilinde Goto olmayan MCU olamaz. illaki program counter uzerinde islem yapan komuta ihtiyac var. Bunun en basit haline GOTO demisler.

Sen goto kullanmayacagim diye kendini sartlama. Once kotu kodlamayi becer sonra sonra ustalasirsin.

haaa unutmadan, kodlarinda bir tane bile goto kullanmadim diye usta oldum sanma.

Efsane bunlar.


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

RaMu

Hocam ağzına sağlık çok güzel söyledin.

Ben delikli banddan program işletiyor diye biliyordum,
ram e aktardığını hiç düşünmemitim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Cengiz Turk

Goto komutu kullanmak ölümü beraberinde getirir gibi yazan arkadaşlara bende katılamayacağım çünkü compile esnasında zaten goto kavramları oluşuyor programcı istediği kadar goto dan kaçınsın sonuçta compiler a da nasıl çevireceğini biz gösterecek değiliz. Bu nedenle zorda kalındığında goto kullanmaktan yanayım bu güne kadar sorun yaşamadım. Optimum kodmu üretiyorum gibi şizofrenilere girmeden söylemek isterimki limitli miktarda goto kullanan bir programcıya amatör denmez

robomaster

Bir ilave yapayım, örnek kod olmadan açıklamaya çalışayım.

Daha önce @z söylemiş, ne kadar çok fonksiyon  yazarsanız kodu takip etmek ve debug iileminde kolaylık yaşarsınız.

Genelde GOTO kullanımı iyi değildir. Şu hususta GOTO kullanımı iyidir.
Eğer bir fonksiyon içerisinde birden fazla return noktanız varsa iş o zaman karışacaktır. O zaman o fonksiyon içerisinde birden fazla return noktasını goto ile tek bir nokta (label) yönlendirmek ve o noktadan tek bir return ile dönmek, kod takibi ve özellikle debug işlerinizi kolaylaştıracaktır.

berat23

bu bakış açısı ile ilgili. eğer yazdım, gömdüm çalışsın yeter bakış açısıyla yazarsanız goto kuyllanıp kullanmamanız önemli değil. ama geliştirme aşamasında güvenirlik önemliyse, bir standarta bağlıysanız ve kodun okunabilirliğini ve bakımkolaylığını arttırmak istiyorsanız goto kullanımı mantıksızdır.

ayrıca safety critical programming'te multiple return kullanımı da yasaktır(okunabilirlik). bu yüzden multiple return içinde goto kullanmak aslında bir hikaye vardır, tam ona örnek oluyor(uzun hikaye, içinde kurban, hz. isa falan olan)

mehmet

C 'de "goto" optimize edilmeden
direkt asm koduna çevrilmez mi?
Page değiştiren bir kod içersinde
karışıklığa sebep olmaz mı bu durum?
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

robomaster

Alıntı yapılan: berat23 - 13 Aralık 2014, 12:30:48
bu bakış açısı ile ilgili. eğer yazdım, gömdüm çalışsın yeter bakış açısıyla yazarsanız goto kuyllanıp kullanmamanız önemli değil. ama geliştirme aşamasında güvenirlik önemliyse, bir standarta bağlıysanız ve kodun okunabilirliğini ve bakımkolaylığını arttırmak istiyorsanız goto kullanımı mantıksızdır.

ayrıca safety critical programming'te multiple return kullanımı da yasaktır(okunabilirlik). bu yüzden multiple return içinde goto kullanmak aslında bir hikaye vardır, tam ona örnek oluyor(uzun hikaye, içinde kurban, hz. isa falan olan)


Dostum orjinalden okumanı tavsiye ederim ...
http://www.cprogramming.com/tutorial/goto.html

Tesla.25

Diğer yorumları okumadım ama şunu söylemek istiyorum:

BASIC dilinde 1-2 ay program yazın. Sonra neden goto kullanmamanız gerektiğini anlarsınız.:D

RaMu

KONU hortlamış ama problem değil,
bu sayede bende bu güne kadar c ile uğraşırken nedenini anladım.
Söylenenlerin belkide hepsi doğru denebilir,
c ile program yazdıkça bende goto kullanmanın
yarardan çok zarar getirdiği kanısına vardım,
nedenleri aynen yukarıdaki mesajlar,
bence goto kullanıyorsan c kullanmanın anlamı yok.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

denizfeneri34

sıft hiç bir şey bilmediğim halde, ve hiç bir şey bilmeyen birinin düşüncesini merak ediyorsanız, düşüncem bunlardır ve bu sebepten üye oldum

Tüm yazılanlar, gerekse tercüme ederek, gerekse defalarca anlamaya çalışarak okudum
Ben proğramlama ya yeni başladım , ve en sağlıklı cevabı vereceğimi düşünüyorum

goto deyimini daha proğramlama bilmeden ne olduğunu biliyordum,ve ilk öğrendiğim şey bu deyimi nasıl kullanacağımı
aklımdaki bir çok projeyi, acemi olduğum halde bu deyimi kullanarak çok sayıda yazılım yaptım
ve şuna kanat getirdim;

goto deyimi işin kolay yanı ve bir o kadar eğlenceli; )
işin aslını öğrendikçe ve kendimi geliştirmek için bu deyimi olabildiğimce en az kullanmam gerektiği anladım


bunu kısa olarak şöyle örnek verebilirim,

bir postacı düşünün..
'a sokağına git ,13 numaraydaki evin ziline bas, postayı ver veya al sonra geri dön'
ama postacının elinde çok sayıda posta varsa, işi kısaltmak için en kolay yol için başka  artarnatiflere baş vurulması gerekmektedir

sonuçta her ne şekilde olursa olsun bizim postacı o adrese uğrayıp o postayı sahibine verecektir, Amaç en kısa yoldan ;)   teşekkür ederim.

peko

" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "