Neden birçok programlama dilinde ifadeler noktalı virgüllerle sonlandırılıyor?


130

Farklı bir simge yerine noktalı virgülün satır sonlandırıcı olarak seçilmesinin bir nedeni var mı?

Bu kararın arkasındaki tarihi bilmek istiyorum ve cevapların gelecekteki kararları etkileyebilecek içgörülere yol açacağını umuyorum.


6
Erlang ve prolog dolu durak kullanın.
Dave Clarke

13
Kaç tane programlama dili biliyorsun merak ediyorum. Noktalı virgül kullanmayan birçok dil var.
knivil

50
Bahse girerim ki cevabın "noktalı virgülün ASCII değeri, 80 karakterlik bir delikli kartta son karakter olarak kullanıldığında özellikle dayanıklı olduğu" gibi bir sonuç olarak ortaya çıkacaktır.
Ryan Thompson,

22
Sorunuz yeterince ileri gitmiyor. Asıl soru, “neden herhangi bir sembol?”
Konrad Rudolph

5
Çünkü qwerty klavyenin giriş satırında mı?
Wim

Yanıtlar:


132

İngilizce’de noktalı virgül, ifadeler listesindeki öğeleri ayırmak için kullanılır, örneğin

Üç adam gördü: Yeni Zelanda'dan gelen Jamie; John, sütçü oğlu; ve George, bir tür adam.

Programlama sırasında birkaç ifadeyi ayırıyor ve tam bir durak kullanmak ondalık basamak için kolayca karıştırılabilir. Noktalı virgül kullanmak, normal İngilizce noktalama işaretine yakın kalırken, ayrı ayrı program deyimlerini ayırmanın kolay bir yöntemini sağlar.

Eklemek için düzenleme
Belleğin pahalı olduğu ilk günlerde, yavaş işlemeler ve ilk programlama dilleri tasarlandığında, programı işleme için ayrı ifadelere ayırma ihtiyacı vardı. Bazı diller, her ifadenin satır üzerine yerleştirilmesini zorunlu tuttu, böylece satırbaşının ifadesi sınırlayıcı olarak davranabildi. Diğer diller, metin düzeninde daha özgür bir biçime izin verdi ve bu nedenle belirli bir sınırlayıcı karakter gerektiriyordu. Bu karakter noktalı virgül olarak seçildi, büyük olasılıkla İngilizce'deki kullanımına benzerlikten dolayı (bu bir varsayım olmalı; o zamanlar orada değildim) ve diğer noktalama işaretleriyle bir çelişki yaratmadı. matematiksel veya diğer sözdizimsel amaçlar için gerekli olan işaret ve semboller.

Yeniden
düzenleyin Bazı sonlandırıcı karakterlere duyulan ihtiyaç, dil metnini ayrıştırma gereksinimlerine geri döner. İlk derleyiciler, montaj dilinde veya bazı durumlarda doğrudan el yapımı ikili makine talimatlarında yazılmıştır. İfadenin sonunu tanımlayan ve işlenmekte olan metin yığınını sınırlayan özel bir karaktere sahip olmak işlemeyi çok daha kolaylaştırır. Yukarıda söylediğim gibi, diğer diller taşıma iadesini veya desteklerini kullandı. Algol, Pascal, Ada, BCPL, B, C, PL / M ve diğer dil aileleri noktalı virgül kullanmaktadır. Bu özel karakteri ilk kullanan kişi olarak, tarihte hatırlamak için yeterince geriye gitmiyorum. Seçimi ve benimsenmesi,

  • Kullanımı normal İngilizce noktalama işaretlerinde kullanımı yansıtır.
  • Diğer karakterler (örneğin tam durak) zaten ortak bir kullanıma sahip oldukları için kafa karıştırıcı olabilir (tam durak, aynı zamanda ondalık nokta olarak da kullanılır).
  • Görünen bir noktalama karakteri serbest biçimli kod düzenine izin verir.
  • Benzer bir sınırlayıcı karakterini türev veya daha sonraki dillerde kullanmak, önceki dili kullanan tüm programcılar tarafından kazanılan aşinalıktan yararlanır.

Son bir not olarak, bu cevapları ve yorumları harcayarak, bu şekilde kullanılan ilk dili tasarlarken bir ifadeyi sonlandırmak için noktalı virgül kullanmaya karar vermekten daha fazla zaman geçtiğini düşünüyorum.


19
Tamamen doğru değil. Yarı kolon, cümleleri bloklara ayırır: her blok çalışan bir cümle olmalıdır, ancak iki kolon arasında kuvvetli bir bağlantı olduğunu göstermek için yarı kolonu kullanırız. Bir virgül ve tam bir durak arasındaki bu yarım yoldur, bu yüzden gerçekten durma noktasıdır, ancak bir cümleyi diğerine bağlar. Yukarıdaki cümle şöyle olacaktır: "Üç adam gördü; Jamie: Yeni Zelanda'dan gelenler John: sütçü oğlu ve George: bir tür adam." Yarı-kolonu kullanmanızın yerine virgül konulabilir. Konu bit ama öz esas olarak aynıdır; ifadeleri parçalar.
alex.p 13.03.2012

40
@ alex.p aslında bir noktalı virgülün kabul edilebilir bir kullanımı, bir cümlenin kafa karıştırmasına neden olacak şekilde virgül yerine geçer, bu da bunu doğru yapar.
Ryathal

13
Noktalı virgüllerle ilgili kritik bilgiler: theoatmeal.com/comics/semicolon
Ed James

7
@ alex.p: Görünen o ki, Ian'ın kullanımının yanlış olduğunu söylüyorsun, ancak noktalı virgül kullanım şeklimizin açıklamasının eksik olduğunu söylüyorsun. Onun yanlış olduğunu söylüyorsanız, o zaman yanlışsınız demektir. Yarı-kolon kullanması tamamen gelenekseldir ve verdiğiniz örnekten daha yaygın olduğunu tahmin ediyorum. Basitçe ayrıntılı bir açıklama yapmadığını söylüyorsanız, neden bahsetmeye değer olduğunu bile bilmiyorum.
iconoclast

17
@Ian "bu bir varsayım olmalı, o zamanlar orada değildim" Orada bir noktalı virgül kullanabilmek için mükemmel bir fırsatı kaçırdın :)
Travis Christian

70

Birçok dil, C'den sonra modellenen ( B - thanks @Crollster'dan sonra modellenen) sözdizimini kullanır . Yorumlarda görülebileceği gibi, bu tür dillerden oluşan uzun bir zincir var ... B, ALGOL tarafından ;ayırıcı olarak kullanılmasından önce gelen PL / I'den ilham aldı .

C'de ifade sonlandırıcısı olduğundan ;, bu diller buna uygundur.

Neden C de bir ifade sonlandırıcısı olarak seçildi - muhtemelen "birbirine bağlı ifadeleri belirtmek için" ingilizce kullanımı nedeniyle .

C, karakter setleri için sınırlı miktarda belleğin olduğu bir zamanda PDP-11'de de icat edildi, bu nedenle dillerin mucitleri bu sınırlamalar içinde çalışmak zorunda kaldı.


8
C selefi 'B' tarafından kullanılan noktalı virgül kullanma konvansiyonunu daha yeni takip etti
Crollster

8
B selefi 'PL / I' tarafından kullanılan noktalı virgül kullanma konvansiyonunu yeni takip etti :)
Skomski

15
@Skomski - Hangisi neyi takip etti? Bu son kaplumbağanın içeri girmesini bekliyorum;)
Oded

26
1; Hadi millet, hepimiz çok etkili ALGOL'ü unuttuk mu? Bahsettiğiniz her şeyden önce deyim ayırıcı olarak noktalı virgüllere sahipti. (Fikri başka bir yerden aldı mı bilmiyorum)
hugomg

13
@Oded - Sanırım tamamen Kaplumbağa olduğunu göreceksiniz . * 8 ')
Mark Booth,

54

FORTRAN taşıyıcı ifadelerini tanımlamaya geri döndürdü. COBOL kullanılan süre. LISP hiçbir şey kullanmadı, her şeyin parantezine dayandı. ALGOL ifadeleri ayırmak için noktalı virgül kullanan ilk dildir. PASCAL, ALGOL liderliğini takip etti ve ifadeleri ayırmak için noktalı virgül kullandı.

PL / İfadeleri sonlandırmak için noktalı virgül kullandım. Arada fark var ve kolayca PASCAL'da görülüyor. Ada, ALGOL'den ziyade PL / I'in liderliğini bu kalemden takip etti.

İfade ayırıcı veya sonlandırıcı olarak noktalı virgül, bilgisayar bilimleri topluluğu tarafından yararlı bir gösterim olarak hızlı bir şekilde kabul edildi ve bildiğim kadarıyla, her sonraki blok yapılı dil, ALGOL’un öncülüğünü izledi ve bildirimleri ayırmak veya sonlandırmak için noktalı virgül kullandı.

Ben BCPL hem noktalı virgül kullanılan yıllar önce söylendi VE deyimi ayırıcılar / sonlandırıcı olarak satırbaşı ama dilini kendim kullanılmış ve bu doğrulayamıyorum asla. Bir noktada, taşıma iadesinin beyanları ayırmak ya da sonlandırmak için kullanımı BCPL soyundan geliyor. BCPL, B'ye, B'ye, C'ye, C'ye, C ++, Java, D'ye ve PASCAL ve Ada'dan çok daha az iyi düşünülmüş şeylere ev sahipliği yaptı.


2
Noktalı virgül veya newline kullanımının son zamanlarda yeniden ortaya çıktığını belirtmek gerekir. Javascript, Lua, Go ve Haskell, eğer burada sözdizimsel olarak geçerliyse, newline'da örtük noktalı virgül vardır. Ve tabii ki ayırıcı olarak newline'ı koruyan bazı diller. Shell ve Python aklıma geldi.
Jan Hudec

2
" PASCAL ve Ada'dan çok daha az iyi düşünülmüş " için +1
Aditya

2
Algol 60'ın bir öncüsü olan Algol 58, noktalı virgül kullandı. O sırada, bir dilin yayın formu ile asıl girdi formu arasında genellikle ayrım yapıldığını unutmayın; çünkü girdi cihazları oldukça sınırlıydı: sadece büyük harf, vb. diğer dillerin sayısı.
Dan Halbert

5
@kevincline: Boeing 777'nin ortak kullanımda olduğunu düşünür müsünüz? Bu uçağa uçan aviyonik yazılımın her satırı Ada'da yazılmıştır.
John R. Strohm,

2
@kevincline Skype: Delphi'de yazılmıştır (Pascal.) Microsoft, edindikten sonra bunu değiştirmeye çalıştı ancak başarılı bir şekilde taşıyamıyorlardı, bu yüzden şimdi Delphi lisansları alıyorlar. Hiç ABD'de televizyon izledin mi? İstasyon muhtemelen Delphi'de yazılmış WideOrbit tarafından yazılım üzerinde çalışmaktadır; Onlar büyük bir farkla pazar lideri. Hiç tema parkına gittin mi? Bilet sisteminin Delphi'ye yazılmış olması iyi bir şans. Pascal her yerde; bu sadece rakiplerinin öğrenmemesi için birçok insanın sessiz kalmaya çalıştığı güçlü rekabet avantajını sağlamasıdır.
Mason Wheeler

14

Neden başka bir sembol yok?

Birkaç dil başka semboller kullanmıştır - örneğin BASIC'in eski versiyonlarında bir örnek olarak bir sütun kullanılmıştır.

Ancak birkaç istisna gözardı edildiğinde, iki temel sebep olduğunu düşünüyorum. Birincisi, sadece net olmayan bir şey aradığınızdır. Tipik bir ayrıştırıcıda, geçerli ifadeyi ayrıştırmaya devam edemeyeceğiniz yeterince ciddi bir hatayla karşılaşırsanız, normalde ayrıştırıcıyı deyim sonlandırıcısına atlayarak ve ayrıştırıcıyı yeniden başlatıp yeniden başlatarak eşitlemeye geri dönmeye çalışırsınız. bir sonraki ifadenin başlangıcı. Bunun için, normalde kodun başka hiçbir yerinde oluşmayacak bir şey istersiniz ve noktalı virgül ekli küçük anlamlara sahip bir simge olur, bu yüzden bu amaca adamak oldukça kolaydır.

İkinci sebep ise biraz benzerdir, ancak kodu okuyan / kullanan insanlara yöneliktir. Yine, kullandığınız asıl sembolün pek önemi olmadığı gerçeğine geri dönersiniz. Okuyucunuzun, okuyucunuzun belirli bir amaç için ne zaman ve mümkünse görmeye alışkın olduğu sembolünü kullanmaya başlamasından kazanmanın önemli bir avantajı vardır. Bu, C'nin mükemmel bir sözdizimi olduğu ve diğer her şeyin slavice takip etmesi gerektiği anlamına gelmez, ancak bu, yeterince belirgin bir dilin çok fazla kazandığı (ve çok az kaybedeceği) bu sözdizimi tarzına aşina olduğu anlamına gelir. kabaca aynı sözdizimi olabilir.

Bunun neredeyse başka bir program tasarlamaya çok benzeyeceğini not ediyorum. Bir tür pencere kullanan bir program yazarsam, sadece hedef platformların yerel özelliklerini kullanmaya çalışırım. Vurgulanan kararların çoğu büyük ölçüde keyfi olacak ve herhangi bir önemli işlevsellik kaybı olmadan farklı bir şekilde yapılabilir - ancak eşit derecede, işlevsellikten önemli bir kazanç elde etmeden eşit şekilde değiştirmek, kullanıcıları işe yarar bir şey elde etmeden şaşırtıyor. Aynı temel ilkeler "bir dilde ifadeleri ne sonlandırmalı (veya ayırmalı")? "bir kaydırma çubuğu neye benzemelidir" veya "bir ağaç kontrolü nasıl çalışmalı?" Tüm bu durumlarda, karar çoğunlukla keyfidir ve tek biçimlilik kendi başına önemli bir fayda sağlar.

Aynı şeyin birçok dilde gerçekleştiğini de eklerdim, sadece çoğumuzun alışkın olduğu şekillerde programlama yapmadan önce pek az insan bunu düşünür. Neden herkes toplama yapmak için "+" ya da çıkartmayı göstermek için "-" kullanıyor? Çünkü sembolün şekli çok önemli değil, ancak her sembol için aynı anlamı uygulamayı kabul eden herkes çok önemli.


Çok iyi noktalar (+1), "çoğunlukla keyfi" kısmına tam olarak katılamıyorum. Bence kesinlikle daha sezgisel olan bazı şeyler ve daha az sezgisel olan bazı şeyler var. Windows'un pencereleri kapatmak için bir X kullanması durumunda, üzerine çizdiği önceden var olan bazı (belki de sadece belli belirsiz bağlantılı) sembolizm vardır. Ve OS X'in renk kullanımında kesin olarak çizdiği güçlü bir sembolizm var. (M $ Windows’un X’i X Windows’tan çaldığını, çünkü ne kullanıldığını hatırlamadığım için görmezden geliyorum.)
iconoclast

3
@Brandon: GUI tasarımının tüm bölümlerinin keyfi olduğunu söylemek istemedim - belki de "en" yerine "biraz" demeliydim . "Pencereyi kapat" simgesi için belirli bir şekil tanımlayan X olmazdı - bu, bireysel bir pencere yöneticisine kadar olacaktı.
Jerry Coffin,

Hatırladığım kadarıyla, orijinal Dartmouth BASIC ifadelerini sonlandırmak için yalnızca satır başı kullandı (yani, satır başına bir ifade). Ben bir satırda birden çok ifadeyi, sütunlarla ayrılmış, THINK bir Microsoft uzantısı oldu.
John R. Strohm

7

Noktalı virgül başlangıçta Algol 60'ta sonlandırıcı değil, deyim ayırıcı olarak önerildi .

Algol 60'tan önce, var olan tek üst seviye programlama dili, her bir ifadenin ayrı bir satırda olmasını gerektiren Fortran'dı. Do-döngüler gibi çoklu satırlara yayılan ifadeler tuhaflık olarak kabul edildi ve “açıklama blokları” olarak kabul edildi.

Algol 60 tasarımcıları ifadelerin hiyerarşik bir yapıya ihtiyaç duyduğunu (eğer öyleyse, döngüler, vaka ifadeleri vb.) Ve birbirlerinin içine yerleştirilebileceklerini anladılar. Dolayısıyla, her bir ifadenin ayrı bir çizgide oturması fikri artık bir anlam ifade etmiyordu. S1 formundaki ifadelerin sıralı bileşimi; S2; ...; Sn isteğe kapalı içinde başlayacak - braketleri çağrıldı bileşik ifadeleri ve Algol 60. öngördüğü ifadelerin hiyerarşik yapısına uyacak Yani, burada, noktalı virgül açıkça bir ifadedir ayırıcı değil, bir sonlandırıcı.

Bu uygulamada sorunlara yol açtı. Algol 60 ayrıca, hiçbir şey yazmadan ifade edilen "boş bir ifadeye" sahiptir. Yani, bir yazma "olabilir başlayacak S1; ucunu " o S1 sonlandırılıyor sanki noktalı virgül görünür. Fakat Algol 60 derleyicisi gerçekten S1 ile takip eden görünmez bir boş ifade arasında bir ayırıcı olarak nitelendirdi. Bu incelikler pratik programcılar için biraz fazlaydı. Assembly ve Fortran gibi dil odaklı dillere alışkın olduklarından, gerçekten bir noktalı virgül ifadeleri için bir sonlandırıcı olarak düşündüler. Programlar yazıldığında, genellikle noktalı virgül ifadelerin sonuna yerleştirildi, şöyle:

    a [i]: = 0;
    i: = i + 1

ve noktalı virgül ilk ifade için gerçekten bir sonlandırıcı gibi görünüyordu. Programcılar noktalı virgül sonlandırıcı olarak değerlendirirse, bunun gibi bir ifade bir sözdizimi hatası verir:

    eğer> 0 ise
      a [i]: = 0;
    Başka
      a [i]: = 1;

çünkü noktalı virgül "if" yi sonlandırır ve böylece "else" sarkar hale gelir. Programcıların kafası tamamen karıştı.

Bu nedenle, IBM'in çizgi odaklı Fortran'ın halefi olan PL / I, noktalı virgül ayırıcıdan ziyade bir deyim sonlandırıcı yapmaya karar verdi . Programcılar bu seçimden memnun kaldılar. Programlama dillerinin çoğu da buna uyuyordu. (Pascal eğilime direndi, ancak halefi Ada ondan vazgeçti.)

[Not eklendi: Vikipedi programlama dilleri karşılaştırmasıyla ilgili Wikipedia makalesinde, noktalı virgülün çeşitli programlama dillerinde nasıl işlendiğini özetleyen hoş bir tablo vardır.]


6

Bu oldukça saf tahmin işidir, ancak ASCII değerleriyle sınırlandırılmış standart bir QWERTY klavyeye bakmak, sonlandırma / ayırma işleminin doğal karakterleri olacaktır.!?,:; ve araba iadeleri. Bunlardan!?: birden fazla anahtar almak için derhal diskalifiye edilmeli ve bildirimin sonlandırılması çok yaygın bir şey olacaktır. Dönemler diskalifiye olur, çünkü ilk bilgisayarların sınırlı alanlarına sahip bir sonlandırıcı olması için onları gereksiz yere karmaşık hale getiren ondalık noktalarla kolayca karıştırılırlar. Satırların iadesi, kod satırları ekrandaki tek bir satırda gösterilenden daha uzun olma potansiyeline sahip olduktan sonra diskalifiye olur, böylece satırların yatay olarak kaydırılması gerektiğinde bir programın okunması daha zor olur. veya bir sonraki satırda tekrar karmaşıklık kazandıran bir devamı oluşturmak için ek karakterler istemek. bu yaprakları ve; seçeneklerin, bunlara göre yazılı olarak çok daha sık kullanıldığı; bu nedenle, noktalı virgül seçildiği için yazması daha kolay, daha az kafa karıştırıcı çünkü sınırlı bir anlamı olan ve bir karaktere daha az karmaşık olan bir karaktere anlam katıyor çünkü özel durumlarda kullanımı gerçekten mevcut değil.

Noktalı virgül seçildi, çünkü tembellik ve sadeliğe dayalı en iyi karakterdi.


Burada iyi bir noktaya; "En iyi karakter tembellik ve basitlik dayanıyordu çünkü ... noktalı virgül kazandı" Ben sadece yeniden kelime gibi bir şeye (kanıtlaması zor olan) "seçilmiş" olur
sivrisineği

2
Zorlukla. Açıklama sonlandırıcı / ayırıcı olarak noktalı virgül, ALCOL'de (1958), ASCII'den önce başladı (çalışma 1960'da başladı, ilk sürüm 1963, büyük sürüm 1967, en son 1986'da başladı).
John R. Strohm

@ JohnR.Strohm peki bu bana haber, ama bütün bunlar benim için çok eski tarihler
Ryathal

6
Bu harika bir teori, ancak gerçek şu ki, tuş vuruşlarının 70'lerde modern klavye girişi görünene kadar noktalı virgül için bir kaydırma tuşu kullanması gerekiyordu. (Wiki makalesinin alt kısmında birkaç güzel fotoğraf var: en.wikipedia.org/wiki/Keypunch ) Büyük olasılıkla, aynı zamanda özellikle popüler olan doğal İngilizce dili kurallarına dayanıyor. (LISP hariç, 50'lerin sonundaki bütün dilleri içerir: ALGOL, FORTRAN, COBOL ve SQL.)
SilverbackNet

@SilverbackNet, bu yüzden "saf tahmin çalışması" muhtemelen burada bir cevabın temeli olmamalıdır.
user1717828

6

Bu büyük ölçüde keyfi bir seçim. Bazı diller başka seçimler yaptı. COBOL ifadesini .karakteriyle sonlandırır . FORTRAN, BASIC ve Python genellikle ifadeleri yeni satırlarla sonlandırır (çok satırlı ifadeler için özel sözdizimi ile). Ve Lisp ifadelerini parantez içinde alıyor.

Temel sebep ;, bir ifade ayırıcı / sonlandırıcı olarak çok popüler olması, günümüzün popüler dillerinin çoğunun , bu sözleşmeyi kullanan ALGOL'e dayanmasıdır .

farklı bir sembol yerine?

Başka hangi sembolü seçebilirsin?

ASCII karakterleri # $ @ [] ^ _ `{|} ~ ISO 646 gibi erken karakter kodlamalarında her zaman mevcut değildi .

Karakterler ()*+-/<=>genellikle matematiksel operatörler olarak kullanılır ve deyim sonlandırıcılar olarak kullanılırsa ayrıştırma belirsizlikleri oluşturur.

product = a * b *  // If '*' were a statement terminator,
c * d *            // Are there two factors, or four?

Benzer sorunlar için de geçerli olacak 've "tipik dize sınırlayıcı olarak kullanıldıkları; ,tipik olarak, fonksiyon argümanlarını ayırmak için kullanılır ve .tipik olarak bir ondalık nokta (veya benzeri yapılarda bir sınırlayıcı olarak some_struct.some_field) olarak kullanılır.

O ayrılıyor !%&:;?.

Seçmek !veya ?muhtemelen teknik zorluklara neden olmaz, ancak İngilizce anlamları programa yanlış bir ruh hali verir.

print(x)?  # Yes, you should.
           # It's an IMPERATIVE language; stop questioning my commands.
print(x)!  # OK!  You don't have to shout!

Bu &, açıklama ayırıcı olarak daha mantıklı bir seçim olacaktır (sonlandırıcı değil), çünkü

do_thing_a() &
do_thing_b()

şey A'yı yapmak için bir komut olarak okunabilir ve daha sonra bir ile bir şey B. Ama en dilleri yapmak &operatör bir mantıksal veya Bitwise olarak kullanmak VE yerine.

%İşareti gibi tablolara karışıklığa neden olabilir interest_rate = 2.99%(değişkeni açardı 2.99yerine beklenen ait 0.0299). Tabii ki, iyi bilinen matematiksel anlam, %C'nin geri kalan operatör olarak kullanılmasını durdurmadı.

Böylece bu bırakır :ve ;.

: mantıklı bir seçimdir ve gerçekten de BASIC'in çoğu lehçesinde satır içi deyim ayırıcı olarak kullanılmaktadır.

Ama ;yanında İngilizce gramer var; cümleleri bir cümle içinde ayırmak için kullanılabilir.


3

Başlık sorunuzu yanıtlamaya çalışmak yerine, örtük sorunuza odaklanmanın daha iyi olacağını düşünüyorum:

Bu kararın arkasındaki tarihi bilmek istiyorum ve cevapların, programlama dillerinin tasarımında ve uygulanmasında gelecekteki kararları etkileyebilecek içgörülere yol açacağını umuyorum.

Dil tasarımını ve uygulama tarihçesini programlama hakkında daha fazla bilgi edinmek ve bu süreçle ilgili daha fazla bilgi edinmek istiyorsanız , Programlama Dilleri Tarihi Konferanslarının başlatılması çok iyi bir yerdir. (Bence, yargılama işlemlerine erişebilmek için bir ACM üyeliğine ihtiyacınız olacak.)

Neden birçok programlama dilinde ifadeler noktalı virgüllerle sonlandırılıyor? Farklı bir simge yerine noktalı virgülün satır sonlandırıcı olarak seçilmesinin bir nedeni var mı?

Başlık sorunuzu HOPL işlemlerini okuyarak cevaplamak isteyebileceğiniz bir örnek soru olarak ele alarak, aşağıdaki noktayı sunmak isterim: yeni bir programlama dili tasarlayan insanlar genellikle bunu bildiklerini düşündükleri için yaparlar Bir şekilde kırılmış / eksik. Yeni dilleri bir yandan bu eksikliği gidermek için tasarlandı. Öte yandan, dil tasarımcıları tasarım öğelerini iyi olduklarını düşündükleri diğer dillerden de kopyalayacaklar veya sorun yaşamadıklarını değiştirmeyeceklerdir.

Özellikle son kısmı önemlidir: yerine şimdiye kadar ilk sonlandırıcı olarak noktalı virgül kullanmayı bir ve neden olduğu programlama dili öğrenmek çalışmakla muhtemelen vermedi dillere bakarak daha öğrenecektir ki kopyalanan diğer programlama dilleri bir sürü değil kopyalamak o. Smalltalk Simula ilham bir sürü alırken Örneğin, o yaptı değilsözdizimini ve özellikle de noktalı virgüllerini deyim sonlandırıcılar olarak kullanmasını kopyalayın. Sonlandırıcıları (gerçekten ayırıcılar) tamamen durdu ve noktalı virgül başka bir şey için kullandı. Tersine, bir deyim sonlandırıcısı olarak noktalı virgül kullanan ilk dilin, bundan önce gelen dillerde kullanılandan bunu değiştirmek için bir nedeni olabilir. Ayrıca, bir deyim sonlandırıcısının bütün kavramını tanıtan ilk dil olması (veya başka dillerden bağımsız olarak yapılmış olması) ve noktalı virgülün zamanla kaybedilmiş bir nedenden dolayı kullanılması da mümkündür. (İkincisi buradaki durum olduğundan şüpheliyim, çünkü diğer cevap verenlerin hiçbiri noktalı virgülün neden iyi bir seçim olduğu konusunda uyarlanmış önerilerde bulunmak yerine noktalı virgül tanıtan kişiden bir alıntı bulamadı.) puan, Dil tasarımcılarının neden kopyaladıklarını / sakladıklarını değil, bir şeyleri değiştirdiklerini inceleyerek daha fazla şey öğreneceğinizi düşünüyorum. İnsanlar genellikle istedikleri şeyleri değiştirdiklerinde veya değişikliği açıklamak zorunda kaldıklarında, bunları kopyalarken veya aynı tutarken aynı şeyi yapmazlar çünkü “neden değiştirelim? Sadece bu şekilde yapılır! ”


2

Görünürlük hakkında.

Erken açıklama ayırıcılar '.' COBOL ve yeni hatta olduğu gibi FORTRAN'da araba dönüşü.

CR, bir ifadenin birkaç satır üzerinden akışını zorlaştırdığı için sınırlandırdığını kanıtladı.

Tam durma daha ilginç bir soruna neden oldu. İngilizce metni okuduğunuzda, beyniniz tüm durakları bilinçaltı bir seviyede işler, bir cümlenin bittiğinin ve nefes almak için duraklayabileceğinizin farkındasınız ama gerçekten farketmezsiniz. bu sinyal verdi. Ayrıca birçok yazı tipinde '.' bazen tek bir piksel olarak işlenen en küçük olası karakterdir. Eksik veya fazla süreler, COBOL programlarında hataların en yaygın nedeni haline geldi.

Öyleyse erken hatalardan öğrenme ALGOL, bir ifadenin birkaç satır üzerinden akmasına izin veren ve insan okuyucular tarafından kolayca görülebilen ve kolayca fark edilebilen bir ifadeyi seçer. Yarı-kolon, ortak İngilizcede bilinçaltı olarak işlem görmeyecek kadar büyük ve sıradışıdır.


1

Benim seçildiğimi anlıyordum çünkü bir satır başı / yeni satır dışında açık bir sonlandırıcıya ihtiyaç vardı. 80 sütunlu ekranların günlerinde, aslında birden fazla satır boyunca tek bir kod sarması satırının olması, deyim sonlandırıcısı için \ r veya \ n kullanılmasının işe yaramayacağı kadar yaygındı.

Noktalı virgüller, mantıklı / matematiksel ifadelerde kullanılmadıkları için uygun. Bu nedenle, ifadelerin gerçek içeriği ile hiçbir ölçüde çelişmezler.


Şahsen, noktalı virgül kullanımının, çizgilerin 80 karakterin altında kalması için stil gereksinimleriyle birlikte kullanılmaya devam etmesinin açıkça aptalca ve anakronistik olduğunu düşünüyorum. Python gibi diller, anlaşılması kolay, kısa ve öz kodları yazmadan kolayca yazabileceğinizi gösterdi. Ayrıca, 80 karakterden daha uzun çizgilerle ilgili sorunlarınız varsa, daha büyük bir monitöre ihtiyacınız vardır.


3
Karanlık çağlarda, "80-kolon ekran" yoktu. 80 sütunlu delikli kartlar vardı ve farklı sayıda sütuna sahip yazıcılar vardı. (Yaklaşık 130 civarında kişi yaygındı.) FORTRAN kartın sonunda ifadeleri sonlandırdı, ancak devam eden kartların ifadeye devam etmesine izin verdi. Devam eden kartlar, kartın 6. sütununda zımbalanan bir karakter ile işaretlendi. (Herhangi bir karakter işe yarar. Yerel sözleşmeye bağlı olarak, tipik olarak bir + işaretini veya tek bir rakamı, birden fazla devam kartı için sayılan rakamları
görürsünüz

1
Python gibi bir dil, C'nin ilk günlerinde var olan bilgisayarlar için olanaksız olurdu. Bir deyim sonlandırma karakterinin kullanılması ayrıştırmayı kolaylaştırır ve onlarca yıl önce derleyicilerin bellek ve CPU yükünü azaltmak çok önemliydi. Özellikle ikinci kez CPU zamanı ödediğiniz bilgisayarlarda.
Gigatron

@Gigatron - Bir ifade sonlandırmak için python'un üst düzey yönlerinden hiçbirine değil, sadece satır başı kullanımına değiniyordum .
Sahte İsim

1
@ Gigatron, LISP'ye ve özellikle de IBM 704'teki ilk tarihine göz atmak isteyebilirsiniz. Eskilerin taş bıçaklar ve ayılarla çalışsalar bile, neler yapabileceğini görünce şaşırabilirsiniz.
John R. Strohm

1
@Gigatron: FORTRAN aynı bilgisayarlarda çalıştı ve ifadeleri ayırmak için yeni satırlar kullandı (çok satırlı ifadeler için özel sözdizimi ile).
dan04, 13.03.2012

0

İşte iki soru: ALGOL neden noktalı virgül aldı ve neden diğer dillerin peşinden gitti.

İlk soru zaten burada birçok yönden cevaplandı.

İkincisi olarak, ALGOL algoritmaları yazmak için bir sahte kod dili olarak çok yaygın bir şekilde kullanılmıştır . Böylece, noktalı virgül kısa sürede farklı dillerdeki kullanıcılar için doğal hale geldi. Doğal olarak daha genç diller için alındı.


0

Yanılıyor olabilirim, ancak bunun çoğu montajcıda bir yorum başlatmak için noktalı virgül kullandığı, genellikle bir talimattan sonra verilen bir şey olduğunu düşünüyorum. ;Bir yorumdan sonraki her şey bir yorumdu ve artık talimatın bir parçası değildi.

O zaman bir tercümana yazarken talimatları sonlandırmanız gerekir. Kısa talimatlar (örneğin matematiksel ifadeler) basitçe Enter tuşuna basılarak tercümana ifadenin hesaplanmaya hazır olduğunu ve bir sonuç ürettiğini söyleyerek sonlandırılabilir. Ancak bazen bir komut talimat için çoklu kod satırı girmek isterdi, bu yüzden bunu başarmanın bir yolu, sadece Enter tuşuna bağlı olmak yerine komutun sonlandırıcısı olarak bazı özel karakterleri kullanmaktı. Bu şekilde, kullanıcı bir kerede daha fazla kod satırı girebilir, çünkü Enter henüz tercümana göndermedi. Tercüman, sonlandırıcı karakteri Enter ile girilen bir satırda bulduğu zaman, sonunda çalıştırır ve sonucunu hesaplar.

Şimdi bu iki şeyi bir araya getirin ve noktalı virgül sonlandırıcı karakter için bariz bir seçenek olarak görünüyor: talimat bölümünün nerede bittiğini ve yorum bölümünün nerede başladığını söyler; ifadenin tüm satırları şimdiye kadar arabelleğe alındı ​​ve uyguladı, çünkü komut yeni sona erdi, şimdi bir yorum yapıyoruz (en azından bu satırın sonuna kadar, çünkü bir sonraki satır kodda başlayacak) Yeni bir ifade / talimat başlatarak tekrar modu).

Bu, elbette, onu öğretim sonlandırıcısı olarak yeniden kullanma fikriyle gelen insanların yorumları için kullanılan bir noktalı virgül olduğunu varsayar. Başka bir karaktere sahip olsaydık, farklı bir komut sonlandırıcıyla sonuçlanabilirdik.

Inb4: Hayır, bu tarihsel bir hesap değil. Bunun noktalı virgüllerin hayata geçirilmesinin asıl yolu olduğuna dair hiçbir kanıt yok. Sadece bunun olabileceğini hayal ettim.


-1

Çoğu dilde yarı-kolon kullanılmıştır, çünkü zaten bu amaç için kullanılıyordu ve değişimin bir anlamı yoktu.

Ve bu seçimi yapan ilk dilleri göz önünde bulundurarak, alternatiflerin ne olduğunu düşünmeniz gerekir. Bir dil tasarlarken, ihtiyaç duyulan karakterlerin kullanılabilir olmasını istersiniz ve şu anda karakter kümeleri 6 bit üzerinde, genellikle bazı desenler ayrılmış, genellikle bazı karakterler kesin olarak tanımlanmamış olarak kodlanmıştır (bunun daha sonra tekrarlanması için, ISO-646'nın ulusal varyantları - ABD varyantı, ASCII adı altında iyi bilinir; bunlar "gibi" ortak "karakterler için kodları yeniden kullanır [, #veya $etkiyi, sadece yarısı kadar kod pozisyonunun olduğu bir bağlamda görür. mevcut olanlar ve bunların yarısından fazlasını saklayan harfler ve rakamlar).

Muhtemelen sezgisel olarak deyim ayırıcı olarak kullanılabilecek başka bir karakter yoktu ( .muhtemelen zaten bu kriterler için tek ciddi rekabetçiydi) ve ayrıştırma ve lexing teorisinin hala hazırlandığı bir zamanda lexing veya ayrıştırma zorlukları getirmeden ( .şimdiki zaman) Gerçek sayıdaki kullanımı nedeniyle söz konusu değil).


-1

Noktalı virgül kullanmanın başka bir nedeni de, istemediğimiz veya daha sık kullanmadığımız karakterlerden biri olmasıdır.

Değişken adı veya bir şey olarak daha sık kullandığımızı ve noktalı virgül bir anahtar kelime veya operatör olarak kullanılmışsa, derleyici için bir sembol çatışması olacağını, bu nedenle olmayan bir sembol kullanmanın önemli olduğunu varsayalım. kodlamada sıklıkla kullanılır.

C tarzı programlama dillerinin popüler hale getirdiğine ve yeni programlama dillerinin yazarlarının tekerleği yeniden icat etmek istemediklerine ve şimdiye kadar kullanmaya devam ettiklerini düşünüyorum.

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.