Bir dil neden bloklar için açık işaretleyicilere göre girintiyi tercih etmeli?


11

Haskell'i öğreniyorum ve otomatik girinti aracı arıyordum. Fazla bakmadım ve Haskell'de (Python'da olduğu gibi) girintinin bir bloğu ifade ettiğini öğrendim. Sonuç olarak, C ailesindeki diğer dillerde olduğu gibi, {} (kıvırcık ayraçlar) veya begin endanahtar kelimeler gibi açık işaretleyiciler kullanan bir otomatik biçimlendirme aracı oluşturmanın imkansız olduğunu tahmin ediyorum .

Okunabilirliği için bir girintiyi uygulayan bir dili umursamıyorum, ancak hem girintiyi zorlama hem de açık bir işaretleyiciye sahip olmanın faydalarını anlayamıyorum, böylece otomatik araçlar, hangi bloğa ait olduğunu anlayabilsin.

Bir blok işaretleme girinti tercihi, böylece kod daha iyi görünüyor , o zaman hala avantajı anlamıyorum. Sekmelerin ve boşlukların farklı editörlerde ve farklı yazı tiplerinde (örneğin daha düzenli görünüme sahip tek renkli fontlar) farklı şekilde temsil edildiği göz önüne alındığında, programcının kodu düzgün bir şekilde sunmasını beklemek mümkün değildir. Geçerli metin düzenleyiciyi dikkate alabilecek bir araç, kodu doğru biçimlendirmek için çok daha uygun olacaktır.

Bir dil tasarımcısı neden açık blok işaretleyicilere göre girintiyi seçsin?


8
Cevap değil, ama Haskell beyaz alan hassasiyetini python'dan çok daha isteğe bağlı hale getiriyor . Çoğu şey için noktalı virgül kullanabilir ve isterseniz blokları süslü parantez içine alabilirsiniz. let x =1; y = 2; z = 3olduğu gibi tamamen geçerlidir do { putStrLn $ show x; putStrLn $ show y; putStrLn $ show z; }. Bunların aynı hatta olmaları gerekmez.
KChaloux

8
"otomatik biçimlendirme aracı oluşturmak imkansız" - aslında, girinti kuralları nedeniyle Python'da böyle bir otomatik biçimlendirme aracına gerek yoktur.
Doc Brown

13
Um, girinti artan olduğu açık bir blok işaretleyici.
Karl Bielefeldt

3
@ K.Gkinis: Bir dil tasarımı kararının ardındaki kesin motivasyonlar için en iyi kaynak dil tasarımcılarının kendisidir.
Robert Harvey

3
Bu soru aslında öznel değil. Bazı dil tasarımcılarının neden belirli bir sözdizimini seçtiğini sorar. Bu cevaplanabilir. Soru, hangi sözdiziminin en iyi olduğunu sorsaydı, öznel olurdu.
JacquesB

Yanıtlar:


13

Guido Von Rossum

Gönderen Guido Van Rossum röportajda tam metin görülebilir, books.google.com ile (vurgu benim):

Gruplandırma için girinti seçimi Python'da yeni bir kavram değildi; Bunu ABC'den miras aldım , ama aynı zamanda eski bir dil olan occam'da da meydana geldi. ABC yazarlarının fikri oklüzyondan mı, bağımsız olarak mı icat ettiğini, yoksa ortak bir ata olup olmadığını bilmiyorum. Tabii ki, diğer alanlarda yaptığım gibi ABC'nin öncülüğünü takip etmemeyi seçebilirdim (örn. ABC, dil anahtar sözcükleri ve prosedür adları için büyük harf kullandı, kopyalamadığım bir fikir), ancak özelliği oldukça beğendim ABC'yi kullanırken biraz, çünkü o zamanlar C kullanıcıları arasında yaygın olan belirli bir anlamsız tartışmayı ortadan kaldırmış gibi görünüyordu , kıvırcık parantezlerin nereye yerleştirileceği hakkında .

Von Rossum, ABC'den büyük ölçüde ilham aldı ve hepsini kopyalamak zorunda olmasa da, girinti kullanımı dini savaşlardan kaçınmak için yararlı olabileceğinden korundu.

Ayrıca okunabilir kodun gruplamayı belirtmek için gönüllü olarak girintiyi kullandığının farkındaydım ve girintinin kıvırcık parantez kullanarak sözdizimsel gruplama ile aynı fikirde olmadığı koddaki ince hatalarla karşılaştım - programcı ve yorumcular girintinin gruplandırmayla eşleştiğini varsaydılar. ve bu nedenle hatayı fark etmedim. Yine, uzun bir hata ayıklama oturumu değerli bir ders verdi.

Rossum ayrıca gruplama ve girinti arasındaki tutarsızlık nedeniyle hatalara tanık oldu ve görünüşe göre bu sadece kodu yapılandırmak için girinti dayanarak programlama hataları 1 daha güvenli olacaktır .

Donald E. Knuth ve Peter J. Landin

Referans verilen röportajda Guido, Don Knuth'un girinti kullanma fikrinden bahseder. Bu ayrıntılı olarak yeniden keşfedilen Knuth Girinti Alıntı tırnak, git Tablolar ile Programlama Yapısal . Knuth ayrıca Peter John Landin'in sonraki 700 programlama diline de atıfta bulunmaktadır (girinti ile ilgili Tartışma bölümüne bakın). Landin, başlangıç / bitiş blokları yerine girintili ilk dile benzeyen ISWIM'i tasarladı . Bu makaleler daha çok programların yapılandırılmasında girinti kullanılmasının uygulanabilirliği ile ilgilidir.


1. Bunun gerçekte , gerçekleşmesi gereken programlama hatalarını yakalamak ve düzeltmek için hem gruplama yapılarına hem de otomatik biçimlendirmeye sahip olmanın lehine bir argüman olduğunu düşünüyorum. Python'daki girintinizi batırırsanız, kodunuzu hata ayıklayan kişinin hangisinin doğru olduğunu tahmin etmesi gerekir:

if (test(x)):
  foo(x)
  bar(x)

Shall bardaima çağrılabilir veya sadece test başarılı olur?

Gruplama yapıları, kodunuzu otomatik olarak girintili hale getirdiğinizde bir hatayı tespit etmenize yardımcı olan bir fazlalık düzeyi ekler. C'de eşdeğer kod aşağıdaki gibi otomatik girintili olabilir:

if (test(x))
  foo(x);
bar(x);

Ben yönelik Eğer baraynı seviyede olmasını foootomatik girintilenmiş kod yapısına dayalı ardından, etrafı parantez ekleyerek sabitlenebilir şeylerin yanlış olduğunu görelim foove bar.

In Python: Mitler Girintileme hakkında , C bir sözde kötü bir örnek vardır:

/*  Warning:  bogus C code!  */

if (some condition)
        if (another condition)
                do_something(fancy);
else
        this_sucks(badluck);

Yukarıdaki durumla aynıdır, Emacs'ta tüm bloğu / işlevi vurgularım, Sekme tuşuna basarım ve daha sonra tüm kodlar yeniden girilir. İnsan girintisi ve kod yapısı arasındaki tutarsızlık bana bir şeyin kapalı olduğunu söyler (bu ve önceki yorum!).

Ayrıca, C'de girintinin kapalı olduğu ara kod sadece ana daldan geçmez, tüm stil kontrolleri GCC / Jenkins'in çığlık atmasına neden olur. Geçenlerde Python'da yukarıda anlatılanla benzer bir sorun yaşadım, bir girinti seviyesi tarafından yapılan bir açıklama ile. Bazen bir kapanış ayracı ötesine C kodu var, ama sonra Tab vurmak ve kod "yanlış" girintiler: bu hatayı görmek için bir şans daha.


3
"Dini savaşlardan kaçınmak için ..." Gerçek nedenin bu kadar önemsiz olduğuna şaşırdım.
Robert Harvey

1
@RobertHarvey: Bu ifadeye vurgu van Rossum tarafından değil, coredump tarafından yapılmıştır. Van Rossum alıntısını bağlam içinde okumanız birincil sebep değildir.
JacquesB

@JacquesB Cevabı düzenleyebilmem için lütfen teklifte hangi bağlamın eksik olduğunu söyleyin.
coredump

4
Ama size kişisel yorum almıyorum: Python'daki girinti batırırsanız, bir hata var. C'de parantezleri vidalarsanız, bir hata var. Otomatik girinti kullanıyorsanız, her iki dilde de tamamen aynıdır. Otomatik girintiyi kullanmazsanız, hata Python'da mümkün olmayan bir şekilde C'de gizlice gizlenebilir.
JacquesB

2
@JacquesB çünkü kapanış ayracı yazmak aktif olarak yaptığınız bir şeydir; yeterince girintisizlik yapmayı unutabileceğiniz bir şeydir. Tabii ki bir ayracı doğru zamanda kapatmayı unutabilirsiniz, ancak sonunda bunu yapmak ve düşünmek için başka bir şansınız olacak. Sanırım python yeni başlayanlar için iyi çalışıyor çünkü dikkati girintiye zorluyor.
marstato

7

Bu oldukça özneldir ve birçoğunun alev savaşının sebebidir. Ancak:

Aynı bilgileri iki farklı şekilde ifade ettiğiniz için blokları ve girintileri sınırlayan sembollere sahip olmak , KURU ilkesini ihlal eder . Otomatik girinti araçlarının varlığı olan belirti otomatik gereksiz bilgiler olduğunu girinti gösterileri oluşturabilir Yani, ve girinti ve semboller şu anlama gelir: Bu KURU ihlali olabilir kodunu yanıltıcı yol senkronizasyonu bozuluyor.

Python Tasarım ve Tarih SSS'si bunu açıkça belirtiyor:

Python neden ifadelerin gruplandırılması için girintiyi kullanıyor?

Guido van Rossum, gruplama için girinti kullanmanın son derece zarif olduğuna ve ortalama Python programının netliğine çok katkıda bulunduğuna inanıyor. Çoğu insan bir süre sonra bu özelliği sevmeyi öğrenir.

Başlangıç ​​/ bitiş parantezleri olmadığından, ayrıştırıcı ve insan okuyucu tarafından algılanan gruplama arasında bir anlaşmazlık olamaz.

Python için otomatik girinti aracı oluşturamayacağınız doğrudur, ancak bu iyi bir şeydir: Bu, sözdiziminde uzlaştırmak için otomatik araçlara ihtiyacınız olan fazlalıkların olmadığı anlamına gelir.

Sekmeler ve boşluklar Python'da meşru bir sorundur ve sekmeleri ve boşlukları (girinti için) asla aynı kod tabanında karıştırmamanız önerilir.

Python, (şimdi kullanılmayan) önceki dilde ABC'den gelen önemli girintiyi miras aldı. ABC, tasarımı yönlendirmek için kullanılabilirlik testini kullanan çok az programlama dilinden biridir . Bu yüzden sözdizimi hakkındaki tartışmalar genellikle öznel görüşlere ve kişisel tercihlere inerken, önemli girinti seçimi aslında daha sağlam bir temele sahiptir.


6
Çift girişli muhasebe DRY'yi de ihlal eder. Artıklık bazen bir özelliktir.
Mart'ta coredump

3
@coredump: Doğru, ama kasıtlı olarak tasarlanmış bir artıklık. Python da dahil olmak üzere çoğu programlama dili, kasıtlı olarak seçilen fazlalıklar içerir - örneğin, passotomatik olarak çıkartılabilen, ancak açık olmasını gerektiren anahtar kelime hataları keşfetmeye yardımcı olur. Hem başlangıç ​​/ bitiş sembollerine (derleyici için) hem de girintiye (insan okuyucu için) sahip olmanın yanlışlıkla fazlalığı, yakaladığından daha fazla hataya neden gibi görünmektedir. En azından bu van Rossum'un görüşü gibi görünüyor.
JacquesB

@coredump - Şimdi neden muhasebeci olmadığımı biliyorum.
JeffO

3
@coredump COBOL'leri PROCEDURE DIVISION.de mi özlüyorsunuz ? DATA DIVISIONBu yeni dilli dillerde sonların ve prosedürlerin nereden başladığını asla söyleyemem .
msw

2
@coredump: "girinti görmek aklımdakilerle çelişiyor hataları önlemek için yeterli" - tam olarak.
JacquesB

2

Dil tasarımcıları sözdizimsel açıdan önemli boşlukları seçerler çünkü yarı-kolonların ve parantezlerin kodu okurken gürültü eklediğine ve üretkenliğe zarar verdiğine inanırlar (veya en azından potansiyel kullanıcılarının inandığını düşünürler). Diğer bir yaygın neden, kötü / tutarsız kodlama stilinin okunabilirliğe zarar vermesidir - ortak bir girinti şemasını zorlayarak, dilin daha iyi okunabilirliği vardır. Otomatik biçimlendirme IDE'lerinin daha yaygın olması, ancak yine de uygulanabilmesi nedeniyle bu sonraki neden daha az önemlidir.


1
Neden noktalı virgül ve kıvırcık parantez gürültüsü düşününce görebiliyorum. Fakat 4/8/12 kez boşluk yazmak daha az verimli değil mi? Ve birini kaçırırsanız (görünmez oldukları için) başınız belada.
Monica

5
Bu nedenle boşluklar yerine sekmeler veya sekmeleri dört boşluklu bloklara nasıl dönüştüreceğinizi anlayan bir IDE kullanıyorsunuz.
Robert Harvey

@ K.Gkinis: Girintiler görünmez değil. Sadece çizgilerin sonundaki boşluk görünmez, ancak bu herhangi bir dilde önemli değildir. Sadece sekmeleri ve boşlukları karıştırırsanız sorun yaşarsınız. Öyleyse yapma.
JacquesB

@JacquesB: Girintinin görünürlüğü / görünmezliği ile ilgili sorun, bir insan olarak genellikle boşluklar ve bir sekme arasındaki farkı söyleyememenizdir, oysa bilgisayar bunu yapabilir ve sıklıkla yapar. Dolayısıyla, girinti görünürken, bilgisayarın girintiyi yorumlama şekli farklı olabilir. Asıl sorun bu: bilgisayar görünmez karakterlere insanlardan farklı davrandığında. İnsanlar girintiyi bir ekranda mesafe olarak ölçer, bilgisayarlar bunu gerçek karakter sayısı olarak ölçebilir. bu görünmez kısım.
Bryan Oakley

@BryanOakley: Evet, bu yüzden sekmeleri ve boşlukları girintiyle karıştırmamalısınız.
JacquesB
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.