Programlama dillerinde birinci / ikinci / üçüncü sınıf değerleri için matematik temeli nedir?


19

Katma

İlgili iki soru buldum

/math//q/1759680/1281

/programming//a/2582804/156458


Programlama dillerinde, Michael Scott'ın Programlama Dili Edimbiliminden

Genel olarak, bir programlama dilindeki bir değerin, parametre olarak geçirilebiliyorsa, bir altyordamdan döndürülebilirse veya bir değişkene atanmışsa, birinci sınıf durumuna sahip olduğu söylenir . Tamsayılar ve karakterler gibi basit türler çoğu programlama dilinde birinci sınıf değerlerdir. Aksine, bir “ikinci sınıf” değeri parametre olarak geçirilebilir, ancak alt programdan döndürülemez veya bir değişkene atanamaz ve “üçüncü sınıf” değeri parametre olarak iletilemez.

Etiketler çoğu programlama dilinde üçüncü sınıf değerlerdir, ancak Algol'daki ikinci sınıf değerlerdir. Alt rutinler en fazla varyasyonu gösterir. Tüm fonksiyonel programlama dillerinde ve çoğu komut dosyası dillerinde birinci sınıf değerlerdir. Ayrıca C # 'da birinci sınıf değerlerdir ve bazı kısıtlamalarla Fortran, Modula-2 ve -3, Ada 95, C ve C ++ dahil olmak üzere diğer bazı zorunlu dillerde de vardır. 11 Diğer birçok zorunlu dilde ikinci sınıf değerler ve Ada 83'te üçüncü sınıf değerlerdir.

  1. Programlama dillerinde birinci / ikinci / üçüncü sınıf değerleri için matematik temeli nedir?

    Terminoloji bana birinci / ikinci dereceden mantığı hatırlatıyor, ama bunlar birbirleriyle ilişkili mi?

  2. Bana öyle geliyor ki aralarındaki fark, bir değerin hangi özel durumda kullanılabileceğidir

    • parametre olarak geçti,
    • bir alt programdan döndürülen veya
    • değişkene atanır.

    Belirli vakalar neden önemliyken, diğer vakalardan bahsedilmiyor?

Teşekkürler.


23
Değerleri birinci / ikinci sınıfa ayırmak, dilleri paradigma olarak sınıflandırmak kadar sonuç vermez. Sonuçta, resmi karıştıran belirsiz genellemeler var. Programlama dillerini anlamak için doğru yaklaşım bu değildir. Önemli olan dilin sözdizimini, statik ve dinamiğini anlamak, ancak bir yorumda girmek için çok büyük
gardenhead

3
Kenara: PL / I birinci sınıf olarak etiketlere örnek olabilir. PL / I'de etikete yazılan değişkenleri bildirebilir, onlara kod konumları atayabilir ve onları ekleyebilirsiniz. Bunları parametre olarak da aktarabilir ve hatta bunların dizilerini oluşturabilirsiniz.
Theraot

@Theraot: Belki de kendimle çıkıyorum ama FORTRAN'da atanmış ve hesaplanmış GOTO'larla uğraşmak zorunda kalan tek kişi ben miyim? Ve hayır, @ $% yazmadım! kod, ben yeniden mühendislik sıkışmış.
jamesqf

@jamesqf FORTRAN ve COBOL'daki etiketlere atadığımı biliyorum, hayır, bunu kullanmadım. Etiketleri nasıl sınıflandıracağından emin değilim. Yine de okuduğum şey için (kılavuzlarım var) PL / I bunun ötesine geçiyor ve etiketlerin orada birinci sınıf olduğuna inanıyorum.
Theraot

Yanıtlar:


45

Hiç yok ve oldukça keyfi.

Tek yararlı ayrım birinci sınıf ve diğerleri arasındadır. "Diğer" köşeli parantez içindeki her durumun her durumda kendine özgü kuralları vardır ve hepsini bir araya getirmek çok yararlı değildir. "Birinci sınıf", "kurallara bakmak zorunda değilsiniz" anlamına gelir ve "diğer", "kuralları öğrenmek zorundasınız" dır.

Örneğin C ++ 'da bireysel işlevler vatansız oldukları sürece birinci sınıf değerlerdir. Aşırı yük setleri değil lambdalar. C # işlevlerinde genellikle birinci sınıf değerler vardır, ancak her durumda olmalarını engelleyen tür çıkarımıyla uğraşırken ortaya çıkan bazı garip durumlar vardır.


10
+1, Programlama Dili Pragmatiği gibi , çok sayıda dilde çok sayıda yapıyı karşılaştıran ve benzerlikleri, farklılıkları ve sonuçları derinlemesine analiz eden bir kitap bağlamında, bu tür stenoların yararlı olabileceğini düşünüyorum. (Sadece başkalarının "ikinci el" ve "üçüncü el" i spesifik şeyler olarak
anlamasını beklemeyin

(Uh, burada "ikinci el" ve "üçüncü el" ile elbette "ikinci sınıf" ve "üçüncü sınıf" anlamına gelir. :-P)
ruakh

3
İkinci el işlevlerle ticaret yapmak istiyorsanız, bunu işlevlerin birinci sınıf vatandaş olduğu bir dilde yapsanız iyi olur. ^^
5gon12eder

@ 5gon12eder: "ikinci el işlevler", üçüncü taraf kütüphanelerden çağırdıklarınız değil mi?
jamesqf

11

DeadMG'ye katılıyorum, önemli ayrım birinci sınıf ve "diğer her şey" arasında. Bununla birlikte, farkı sınıflandırmanın daha tanıdık bir yolu vardır.

Birinci sınıf değerler veridir, diğerleri koddur. (kabaca konuşursak: İstisnalar olduğundan eminim. Ama bu gerçek dünya dilleri için gerçekten iyi bir yaklaşım.)

Bazı dillerde kodu veri olarak değerlendirebilirsiniz. İşlevsel diller bununla ünlüdür: bazıları programın kodunu çalışırken değiştirmenize izin verir ( genetik programlamanın temeli ).

C ve C ++ gibi diller işlevlerin adresini almanıza izin verir: bunları değiştiremeseniz de, işlevleri diğer işlevlere parametre olarak iletebilirsiniz. C ++ ayrıca fraktörlerin sözdizimsel şekerine de sahiptir . Buradaki fikir, yüzeyde, bir işlev gibi davranan ve veriymiş gibi etrafa aktarılabilen bütün bir nesne yaratmaktır. Aksi takdirde, daha düşük bir sınıf değeri olan birinci sınıf bir değer olarak değerlendirilebilir.

Matematiksel olarak, bence en iyi yol bir programın AST'sini düşünmektir . Tipik olarak, her belirteç, diğer türlerle uyumlu olan veya olmayan belirli bir türe sahiptir. C ++ 'da l-değeri, r-değeri ve diğer tüm değer türleri karışıklığını düşünün . Ardından, anahtar sözcükleri, işlev olan sembolleri vb. Ekleyin. Bunlardan bazıları dile bağlı olarak birinci, ikinci veya üçüncü sınıf değerleri olabilir.

Belki akademik bir ortam dışında, değer sınıfını bilmenin o kadar önemli olduğunu bilmiyorum. Gerçek dünyada, bilmeniz gereken önemli şey, kodu veri gibi nasıl ele geçirebileceğinizdir: functors, lambdas / closures, fonksiyon işaretçileri, vb.


2
Kod olmayan, birinci sınıf olmayan bir değere örnek: Lua, ...vararg işlev parametrelerini belirtmek için kullanılan özel bir "değişkene" sahiptir . Birçok ifadede, bir değer listesi ( print(...)ya da gibi local args = {...}) gibi kullanabilirsiniz, ancak onunla yapamayacağınız bazı şeyler vardır, örneğin bir kapanışta ( function(...) return function() return ... end end).
Albay Otuz İki

8

Denotational Semantics , değerlerin ve değişkenlerin bir programlama dilinde nasıl çalıştığını tanımlamak için matematiksel bir temel sağlar. Bilgisayar Bilimi Derecemde o kadar iyi açıklanmıştı ki, Anlamsal Semantik sınavında en yüksek notu aldım, sonra çoğunu unuttum ve 20 yıllık bir hayatta bir programcı olarak kullanmaya hiç ihtiyaç duymadım.

İyi tanımlanmış bir matematik temeli kullanmayı ya da “birinci sınıf durum” gibi gayri resmi terminolojiyi kullanabilirsiniz. Kursun Scott'ın Programlama Dili Pragmatiği'ni temel alması durumunda daha fazla şey öğrenmiş olacaktım, ancak resmi matematik programlama dili tasarımında doktora yapacak biri için gerekli.

Çoğu programlama dili için spesifikasyonu okursanız, karşıt anlamsal anlambilim eksikliği olduğunu fark edeceksiniz, ancak en iyi tasarlanmış diller takımda dil tasarımını programlama konusunda uzman birisine sahipti, bu nedenle anlamsal anlambilimi iyi anlıyor.

Michearl Scott, resmi matematikle bir ilişkisi olan gayri resmi terminolojiyi kullanırken, konuyu çoğu programcının yararlanabileceği bir şekilde sunar. Onun terminolojisi diğer insanlar tarafından kullanılmaz, bu yüzden iletişim için yararlı değildir, ancak ilk kez yeni bir programlama dili gördüğünüzde sormanız gereken sorulara iyi bir temel sağlar.

Michael L. Scott'ın Computer Sci'da önde gelen bir araştırmacı olduğunu unutmayın, bu yüzden resmi matematiği kullanarak anlayacak ve çok mutlu olacaklar, ancak en iyi araştırmacılar gibi, araştırmanın geri kalanımıza uygulanmasını açıklayabiliyor.


Teşekkürler. Sınıfınızda hangi kitaplar kullanıldı? Şimdi hangi kitapları öneriyorsun? Kendim öğrenen biriyim
Tim

@Tim, 20 yıl önce dersimi yaptım! Michearl Scott'ın kitabının en iyilerinden biri olduğunu ve doktora düzeyinde araştırma yapmadıkça ihtiyacınız olandan daha fazlasını kapsayacağını umuyorum.
Ian

3

Hayır, "birinci sınıf" ve "birinci dereceden" kelimelerde "ilk" kelimesi farklı şeyler ifade eder.

Fakat evet, "birinci sınıf" ve "birinci dereceden" kavramları birbiriyle ilişkilidir. Her ikisi de, bir dilin dili tanımlayabileceği kavramların da soyutlanabileceğini sınıflandırmakla ilgilidir.

Bir dilin olağan soyutlama mekanizmaları bu kavram üzerinde soyutlanabilirse, kavram birinci sınıftır .

Örneğin, Java programlama dili tamsayıları tanımlayabilir ve tamsayılar üzerinde soyutlama için tüm olağan mekanizmaları (bunları yöntem parametreleri olarak kabul etme, işlev sonucu olarak döndürme, veri yapılarında saklama, ...) tamsayılar için çalışır.

Bir kavram kendi üzerinde soyutlamak için kullanılamıyorsa birinci derecedir.

Örneğin, yine Java'da, bazı şeyleri soyutlamak için yöntemler kullanabiliriz. Ancak yöntemler üzerinde soyutlamak için yöntemleri kullanamayız çünkü bir yöntem adı method parametresi olarak geçirilemez. Bu, bir nesnenin özelliğine bir dize olarak erişmek için dizgi gösterimini kullanabileceğiniz ve dizeler üzerinden soyutlayabileceğiniz JavaScript'te farklıdır.

Bir kavramdır ikinci dereceden kendisi birinci dereceden kullanımları üzerinde soyut için kullanılır, ancak bitmedi ikinci dereceden kullandığı edilebilirse.

Örneğin, Java'da türler üzerinde soyutlamak için (olduğu gibi class Foo<T> { public List<T> content; }) Generics'i kullanabilirsiniz . Ancak, jenerikleri (olduğu gibi class Bar<T> { public T<Int> content; }) Generics üzerinden soyutlamak için kullanamazsınız . Bu Scala'da farklı.

Bir kavram üçüncü derecedir bu kendini fazla birinci dereceden özet ve ikinci dereceden kullanımlar için kullanılır, fakat fazla ikinci dereceden kullanımları edilmesi mümkün bulunmaktadır.

Ve bunun gibi.

Son olarak, bir kavram üst düzeydir kendisi soyut üzerinde keyfi kullanımlara kullanılıp kullanılamayacağını.

Özet: Eğer bir soyutlama özelliği birinci sınıf ise, aynı zamanda daha üst düzeydir. Ve eğer bir soyutlama özelliği birinci derecedense, birinci sınıf olamaz.


1
Sen edebilirsiniz yapmak List<List>olsa da, Java. Belki bu kısımla ne demek istediğini açıklayabilirsin?
Polygnome

1
İyi bir nokta. Yani: class Foo<A> { A<Int> ... }. Yani, genel bir sınıf olarak genel bir tür parametresi kullanmak istiyorum. Ardından Foo<List>örneğini olurdu A<Int>için List<Int>. Java'da bu mümkün değildir. Bunu daha sonra cevapta düzenlemeye çalışacağım.
Toxaris

Gerçekten, bu mümkün değil.
Polygnome

Şimdi yanıltıcı List<List>örneği değiştirdim . Soruna dikkat çektiğiniz için teşekkürler, @Polygnome.
Toxaris

@Toxaris Bence bu sadece kendi oluşturduğunuz kendine özgü terminoloji. Bir 'kavram' birinci dereceden veya ikinci dereceden değil, mantıklı bir niceliktir.
Miles Rout

2

Programlama dillerinde birinci / ikinci / üçüncü sınıf değerleri için matematik temeli nedir?

Hiçbiri farkında değilim.

Terminoloji bana birinci / ikinci dereceden mantığı hatırlatıyor, ama bunlar birbirleriyle ilişkili mi?

Pek sayılmaz.

Bir programlama dili elemanının "sınıfı" sorusuna düşünmeden sadece steno yoludur benim dil dilek kullanıcı programlı manipüle etmeye mu ne şeyler ? Örneğin, C #, değerleri işlemek için zengin bir işlem kümesi, türleri işlemek için daha az zengin bir yol kümesi ve etiketleri işleyen hiçbir işlem sunmaz .

Ancak burada bir bağlantı olduğu sezginiz tamamen yanlış yerleştirilmemiştir. Birinci dereceden mantıktan prosedürel programlamaya ve yüksek dereceli mantığtan işlevsel programlamaya kadar bir benzeşim vardır. Birinci derece mantık, değerlerin mantıksal manipülasyonu ile ilgilidir; prosedürel programlama, değerlerin programlı manipülasyonu ile ilgilidir. Yüksek mertebeden mantık mantıksal manipülasyon hakkındadır mantık ifadeleri , fonksiyonel programlama programlı manipülasyon hakkındadır fonksiyonları .

Belirli vakalar neden önemliyken, diğer vakalardan bahsedilmiyor?

Yazardan kesin bir cevap istemeniz gerekir.

Ben bu "sınıf" nosyonuna çok fazla asılmazdım. Resmi olarak tanımlanmış bir şey değil. Dil tasarımcılarının programla ne tür şeyleri manipüle edebileceği hakkında konuşmak için kullandığı bir kısayol.


2

Bu bağlamda “birinci sınıf değer” programlama dili teorisinde standart terminolojidir. Birinci sınıf bir değer, dilde normal değerler olarak işlenebilen, çalışma zamanında hesaplanabilen bir şeydir. Tabii ki, bu dil için bir anlambilim tanımlayana kadar totolojik bir tanımdır ve sonra anlambilimin bir değer olarak tanımladığı her şey bir değerdir. Kavramın amacı, sadece dolaylı olarak erişilmenin aksine, neyin doğrudan manipüle edilebileceğini belirlemektir.

Örneğin, hemen hemen her programlama dilinde, sınırlı boyutlu makine tamsayıları (örn. 8 bit tamsayılar veya 32 bit tamsayılar veya 64 bit tamsayılar, vb.) Birinci sınıf değerlerdir. Bunları değişkenlerde saklayabilir, aktarabilir ve işlevlere vb. Döndürebilirsiniz. Çoğu dilde ancak montaj ve C gibi düşük düzeyli dillerde değil, dizeler birinci sınıf değerlerdir - ancak C'de, yalnızca siz değilsiniz. dizelere işaretçiler alın. C'de, dizeler ve diziler birinci sınıf değerler değildir: örneğin bir işleve bir dizi geçiremezsiniz, dizi değişkenine bir dizi atayamazsınız. C de, işlevler birinci sınıf değerler değildir ikisinden biri: bir değişkeni bir işlevde saklayamazsınız, sadece bir işlevin işaretçisi olabilir. Buna karşılık, dizeler ve işlevler çoğu üst düzey programlama dilinde birinci sınıf değerlerdir: bunları bir dizede vb. Saklayabilirsiniz.

Derlenecek şekilde tasarlanmış birçok programlama dilinde birinci sınıf olmayan bir kavram örneği türlerdir. C veya Java gibi bir dilde, türler derleme zamanında yaşar, dil yapılarını kullanarak bunları değiştiremezsiniz. (Java ayrıca sınıflara dayalı dinamik bir tip sistemine sahiptir; sınıflar yansıma yoluyla birinci sınıf değerlerdir.) Bunun aksine, Python gibi bir dilin typeargümanının türünü temsil eden bir değer döndüren bir işlevi vardır.

Standart terminolojide “birinci sınıf değer” in olumsuzlanması “birinci sınıf değer değildir”. “İkinci sınıf değer” terimi yaygın olarak kullanılmaz ve “üçüncü sınıf değer” daha da az kullanılır. Onları bu kitabın dışında görmeyi beklemeyin. “İkinci” yi “parametre olarak geçirilebilir” ve “üçüncü” yi “parametre olarak geçirilemez” olarak tanımlamanın kesinlikle bir temeli yoktur, anlamlı olarak numaralandırılabilecek şeylerin ölçeği yoktur. Çok az sayıda dil, işlevlere parametre olarak iletilebilen değerler ile değişkenlere atanabilecek değerler arasında bir fark yaratır, bu nedenle bu kavram için bir ad tanımlamak yararlı değildir.

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.