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

bocek

Alıntı YapCok yogun oldugum bir donemde sirf yazdiginiz bilgi okuyanlari yanlis yonlendirmesin diye cay molami bu is icin harcadim, bilmenizi istedim.
Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep olduğum için üzüldüm. Bence siz daha çok, 'hayır crash etmiyor' deyip size itiraz etmiş gibi olmama takılmışsınız ama gerek yoktu aslında. Böyle bir niyetim olamaz sizin karşınızda. Zahmet etmişsiniz ispata girişmekle.
Böyle kodların çok tehlikeli olduğunu, bir-iki yerde doğru çalışmasının her zaman doğru çalışacağı anlamına gelmediğini, genel kabul görmüş kuralların dışına çıkmamanın iyi olacağını belirtmeniz yeterli olurdu kanaatimce.  Tabii aslında bu uyarıyı benim yapmam gerekirdi ama goto'yu bu şekilde kullanmanın 'anlamsız' olduğunu söylemenin ve bu bilgilerin hiçbir işimize yaramayacağını belirtmenin yeterli olacağını düşünmüştüm.
Burayı okuyan herkesi bilgilendirdiğiniz için de ayrıca teşekkür ederim.
1 ya da 0. işte 'bit'ün mesele..

mufitsozen

Alıntı yapılan: bocek - 21 Ekim 2015, 00:32:22
Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep olduğum için üzüldüm. Bence siz daha çok, 'hayır crash etmiyor' deyip size itiraz etmiş gibi olmama takılmışsınız ama gerek yoktu aslında. Böyle bir niyetim olamaz sizin karşınızda. Zahmet etmişsiniz ispata girişmekle.
Böyle kodların çok tehlikeli olduğunu, bir-iki yerde doğru çalışmasının her zaman doğru çalışacağı anlamına gelmediğini, genel kabul görmüş kuralların dışına çıkmamanın iyi olacağını belirtmeniz yeterli olurdu kanaatimce.  Tabii aslında bu uyarıyı benim yapmam gerekirdi ama goto'yu bu şekilde kullanmanın 'anlamsız' olduğunu söylemenin ve bu bilgilerin hiçbir işimize yaramayacağını belirtmenin yeterli olacağını düşünmüştüm.
Burayı okuyan herkesi bilgilendirdiğiniz için de ayrıca teşekkür ederim.

Sizi cok hakli buldugumu belirtmeme izin verin.  Bazen yogun calismamin arasinda boyle seylere "kafayi takiyorum" yas ilerleyince boyle takintilar oluyor, soz sizin verdiginiz orneklere bir daha cevap yazmam, ve sizide "haksiz" cikartmaya calismam. Istediginiz sekilde yazmaya devam edebilirsiniz.

Size verdigim rahatsizliktan dolayi ozur dilerim.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

bocek

Haydaa neye niyet neye kısmet. Ne yazacağımı şaşırdım. Kusura bakmayın değerli zamanınızı boşa harcamanıza sebep oldum dedim, zahmet etmişsiniz dedim, teşekkür ederim dedim, size itiraz etmek gibi bir niyetim olamaz dedim ve hepsinde de samimiydim.
Neyse ben yatayım artık geç oldu.
1 ya da 0. işte 'bit'ün mesele..

z

Goto komutu pipe line mekanizmasını bozuyor bu yüzden kullanmayın diyenler için cevabım şu şekilde;

C kodlarınızda Goto komutu kullanmıyor olmanız üretilen hex kodda goto makine kodu kullanılmayacağı anlamına gelmiyor.  Asıl amaç C satırlarında değil makine kodları arasında goto komutu kullanmamaktır ve bu da sizin elinizde değildir.

Hex kodlarında goto ya da türevi komut olmayan program parçası yazmak zaten imkansız. (Not: İstisnası var)

Eğer programda goto ile dallanmak yerine  programda dallanılan kısımları parçalar her birini fonksiyon yaparım, böylece yeri geldikçe ilgili fonksiyon parçasını çağırırım diyorsanız burda yaptığınız Goto yerine Call komutu çağırmaktır ve Call komutu da Goto komutu gibi pipe line mekanizmasını sıfırlar.  Bu durumda goto kullanmayın tavsiyesi hızla alakalı olamaz.

Bir takım organizasyonların almış olduğu kararlar çerçevesinde eğer yazdığınız program parçalarında organizasyonun kurallarına uymayan satırlar varsa bu durumda programınız geçer not alamayacağından ürününüzü satışa sunabilmek için gerekli belgeleri de alamayacaksınız demektir.

Bu durumda istenen kurallara uygun kod yazmak zorundasınız. Bu kurallar arasında "goto kullanmayın" kuralı varsa kullanmayacaksınız. Bunun sorgusu olamaz.

Ben bu tartışmaya katılırken böyle bir organizasyonla bağımızın olmadığını varsayıyorum.

Goto takip etmeyi zorlaştırıyor anlaşılırlığı bozuyor diyenlere ise cevabım şu şekilde;

Goto komutuyla karşılaşıldığında o an çalışmakta olduğunuz satırı terkedersiniz ve goto ile uçacağınız ilgili etiketten itibaren kodu işlemeye devam edersiniz.

Bu kafanızı karıştırıyor ve anlamanızı güçleştiriyorsa kusura bakmayın mal mısınız demek geliyor içimden.

Sırf goto kullanmamak adına while yada for döngülerinin başlığında yada içinde ilave kontrollar eklemek gene döngü çıkışı ardından ilave kontroller eklemek
programa ilave kodların girmesi ve programın yavaşlaması demek.

Onlarca yüzlerce MHz de koşan işlemci var bunlar da söylenecek laf mı diyebilirsiniz.

Programcılık 2'ye ayrılır.

1. tip programcılıkda kodlara eklenmiş ilave bir kaç yüz tane fazladan makine kodu konuşmaya bile değmez.
2. tip programcılıkta y=A*B + C*D işlemini

Y=A*B
Z=C*D
Y=Y+Z işlemi yerine

y=A*B + C*D işlemini doğrudan yapabilecek CPU komutlarına ihtiyaç duyulan programlardır.

2. tip programlama ile ilginiz olmadığı sürece hız derdiniz falan olamaz.

Not: CM3 işlemcilerde içi çok çok çok kısa olan while yada for döngülerini goto çevrimsiz yazmak mümkün fakat maalesef while ve for döngülerimiz her zaman kısa değildir.

Hiz vs hiç bir şey düşünmeden goto komutu kullanmayacağım diye bir şartım olmadan hiç bir optimizasyon kaygısı taşımadan işimi görsün mantığı ile yazdığım
Delphi kodlarımı yayınlayacağım.

İçinde bolca goto var. Sizlerden ricam bu program parçasını gotolardan arındırmamız olacak.

Delphi ve C syntax olarak benzer diller. O yüzden uğraşmamazlık etmeyin.

C deki { Delphi' de begin
C deki } Delphi'de end

fazladan do to gibi ekleri de zaten anlayacaksınız hatta yok var sayabilirsiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

En son yazımın üstüne yeni  bir yazı gelmedi.

Acaba hem fikirmiyiz de gelmedi yoksa yazmak mı istemiyorsunuz?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bocek

Şurada akademik bir çalışma var (artık akademik örnek veriyorum yoksa kızıyorlar ;)

https://peerj.com/preprints/826v1.pdf

Özetin özeti:
50 yıl önce Dijkstra : "Hacı bu goto işi sakat gibi. Başımız ağrımasın sonra?".
Günümüzde bu makaleyi yazanlar: "Korkacak bir şey yok".
1 ya da 0. işte 'bit'ün mesele..

peko

@z Hocam,

Yazılım konusunda en önemli şeyin algoritma olduğunu bugün olduğu gibi yaklaşık 20 senedir savunmaktayım.

Ortada yapılacak bir iş var.

Bu iş'in kodu; yeri gelir prototip amaçlı üstünkörü, yeri gelir sadece çalışsın sonucu versin, yeri gelir platformlar arası çevrim olarak, yeri gelir performanslı çalışacak şekilde optimize edilerek defalarca yazılabilir/güncellenebilir.

Dolayısıyla; yapılmış bir yazılımı iyi kodlanmış, kötü kodlanmış diye ayırmamalıyız. Aksi halde hepimizin yazdığı ilk kod kötüdür. Yani herkes kötü kod yazmıştır.

Eğer istenilen sonucu vermiyorsa hatalı kodlanmış diyebiliriz.
Performans gerektiren yerde yeterli performansı sağlamıyorsa yine optimize edilmesi gerek yorumunu yapabiliriz. vb..

Ben emimin ki; Siz ihtiyacınız olan kodlamaları yaparken yukarıda saydığım şekillerde yada o an hangisi gerekliyse o şekilde yapmışsınızdır zaten..


Alıntı YapSizlerden ricam bu program parçasını gotolardan arındırmamız olacak.

a) Benim yazdığım bu kodları goto'suz yapamazsınız, bunu görün istiyorum.
b) Goto'lu yada goto'suz yazdığınızda bir fark olmadığını size göstermek istiyorum.
c) Ben bu kodları yazdım ama optimize edilmesi gerekiyor, bunun için kodları inceleyip goto'lardan arındıracak vakti olan bir gönüllü arıyorum.
d) Yapında göreyim!

:)

Hangisi hocam.?

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

z

4 seçenek de de değil.

Goto ile anlaşılırlık bozuluyor deniyor ya onun için örneği vermek istiyordum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

peko

Alıntı YapGoto ile anlaşılırlık bozuluyor

Yok Hocam olur mu öyle şey.. 

Yazılım pattern'leri, OOP vb.. bir çok yol, yordam, yöntem, editör vs var.. Yüz binlerce satır da yazsan arada kaybolmadan seyahat edebiliyoruz konforlu bir şekilde.

Sürçü lisan edilmiş diyelim..

Algoritma sağlıklı ve performanslı bir şekilde yerine getiriliyorsa, goto moto run diyip önümüze bakalım..
" Bazıları zeka'sını iş'i zorlaştırmak için, bazıları ise kolaylaştırmak için kullanır.. "

vsalma

MISRA da goto kullanilmamasi advisory.

Aciklamasi su sekilde:

Unconstrained use of goto [b]can[/b] lead to programs that are [b]unstructured[/b] and[b] extremely difficult to
understand.[/b]
In some cases a total ban on goto requires the introduction of flags to ensure correct control flow,
and it is possible that these flags may themselves be less transparent than the goto they replace.
Therefore, if this rule is not followed, the restricted use of goto is allowed where that use follows the
guidance in Rule 15.2 and Rule 15.3.


Ama asagidaki kurallari uygulamazsaniz bir deviation record yazip onaylatmaniz gerekiyor.

The goto statement shall jump to a label declared later in the same
function


Any label referenced by a goto statement shall be declared in the same
block, or in any block enclosing the goto statement


Kisisel fikirlerim su sekilde:
@z goto kullanacak sekilde tasarimi yapilmis fonksiyon goto suz hale getirilirse okunaksiz/daha uzun hale gelir dogal olarak. Burada onemli olan kodlama değil tasarim. 
Fonksiyonel diller kullanilirken goto ya gerek kalmayacak sekilde tasarimlar yapilir. Bazi istisnai durumlarda fayda saglasa da kullanimi tavsiye edilmez.

@z bu karmasikligi anlamayan kod yazmasin anlayisinin siniri yok bence. Baskasina bu sekilde makro kullanimi karmasik yapmaz, Baskasina gore apacik limitli rekursion un bir sakincasi yoktur. Kimisi function pointerda kafasi karisan zaten c yazmasin der. Bu isin sinirini nasil koyacagiz? Onemli olan hata riskini azaltmak.

200 satirlik fonksiyon ne kadar garipse, 20 satirlik kodda goto kullanmak ta bana gore o kadar garip. Tabi ben safety ve maintainability yonunden bakiyorum.
Birisi de cikar derki "fonksiyona bolmek bence yanlis performans acisindan" hakli derim. Ama bu uzun fonksiyon yazmayi dogru pratik yapmaz.

engerex

 Eskilerde sık kullanılan özellikle döngülerde kullanılan değişkenleri register olarak tanımlanması tavsiye edilirmiş. Şimdi ise güncel derleyiciler bunları kendileri hallettiği için gerek yok deniyor. goto komutunda hiç mi ilerleme olmadı?

trgtylcnky

Okuduğum bir yazıda (Python ile ne yapamam gibi bir soruya cevap) şuna benzer şeyler vardı: Eskiden işlemci gücü çok pahalıydı, insan gücü görece daha ucuzdu. Bu yüzden insan gücünden harcayıp az işlemci gücüyle çok iş yapmaya çok vakit ayrılırdı. Şimdi işlemci gücü inanılmaz arttı, insan gücü ise oldukça pahalı. Kodu optimize etmek için mühendise para vereceğine gidip daha güçlü bir işlemci alabilirsin. Bu yüzden Python gibi diller oldukça popüler.

Bana sorarsanız goto kullanmayın demelerinin en büyük amacı şu: programlama o kadar yaygınlaştı ki program yazmak için uzman olmak gerekmiyor. Dikkat ederseniz goto komutu içeren sorular acemi kullanıcılardan çok geliyor ve onlara cevap olarak "goto kullanma, for vs. kullan" deniyor. Programlama öğrenen kişilerin çok azı düşük işlem gücüyle çok iş yapmaya çalışacak. Bu kişiler de zaten bu tavsiyenin verileceği dönemi geçmiş oluyor.

Benim programlama tecrübem yok, onun için goto konusunda bir fikrim yok. Ama şunu söyleyeyim: z hocam siz Assembly kullanan adamsınız size goto komutunun karmaşık gelme ihtimali yok zaten.

z

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

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

muhittin_kaplan

deveye sormuşlar "nişimi seversin, yokuşu mu" diye
deve cevap vermiş, "düz yol nerenize battı ?"

c gibi fonksiyonların çağrıldığı hiyerarşik bir dilde neden goto ya ihtiyacım olsun ?, çok lazımsa kullan.