Bir programlama dilini çözümleme


10

In SICP yazarlar durumda ( Bölüm 1.1 programlama dilleri üç temel "mekanizmalar" olduğunu):

  • dilin ilgilendiği en basit varlıkları temsil eden ilkel ifadeler

  • bileşik elemanların daha basit olanlardan oluşturulduğu kombinasyon araçları

  • bileşik öğelerin birim olarak adlandırılabileceği ve manipüle edilebileceği soyutlama araçları

Bir anaakım programlama dilini (örneğin Java) bu öğeler veya mekanizmalar açısından nasıl analiz edebilirim?


Daha önce Genişletilmiş Backus-Naur Formu, EBNF veya Backus-Naur Formu, BNF'ye baktınız mı ? Bu üç kavrama benzer bir dilbilgisini parçalayabilir, ancak niyetlerinizin ne olduğundan emin değilim, bu yüzden yardımcı olup olmayacağını bilmiyorum.
21'de Jetti

@Jetti - evet, var ve hayır, ilgilendiğim şey bu değil. Programlama dillerinin anlambilimini (soru: aslında aradığım kelime?) Analiz etmek istiyorum yazılı formları (sözdizimi).

Yanıtlar:


1

İlkel ifadeler, kombinasyon araçları ve soyutlama araçları arasındaki ayrım, programlama dillerini modellerken faydalıdır. Bunun dilin kendine özgü bir özelliği olmadığını unutmayın: herhangi bir dil tanımına işaret edemezsiniz ve “bu özellik açık bir şekilde ilkel bir ifade, bu özellik açık bir şekilde bir kombinasyon aracıdır” diyemezsiniz. Bu ayrım modelin bir özelliğidir ve karmaşık modeller sınıflandırmaya karşı koyabilir.

Bu üç kavramın ders kitabı örneği , tam olarak bunlardan birine sahip olan lambda hesabıdır :

  • Değişkenler x , y ,… sadece ilkel ifadelerdir.
  • Fonksiyon uygulaması MN kombinasyonun tek yoludur.
  • Lambda soyutlama λx.M soyutlamanın tek yoludur.

Daha fazla özelliğe sahip dillere ulaştığınızda, modelleme daha belirsiz hale gelebilir. Genel olarak, ilkel bir ifade, ilkel bileşenlere ayıramayacağınız ya da ayıramayacağınız bir ifadedir. Ama bu atom gibi : bilim ilerleyene kadar ilkel. Örneğin, değişkenlerin isimler yerine sayıları kullandıkları ( de Bruijn indeksleri ) varyant varyantı vardır ; bu, bilgisayar kanıtları için lambda terimlerini modellerken özellikle kullanışlıdır; ve bilgisayar kanıtlarında, tamsayılar kurucu parçalara ayrılmıştır . Yani bu modellerde, değişkenler sonuçta ilkel ifadeler değildir.

Java'da (tipik bir model), ilkel ifadeler öncelikle sabitler ve değişkenlerdir. Kombinasyon araçları çok sayıda operatörü içerir; daha kesin bir ifadeyle, “katkı maddesi ifadesi” iki yarık (sol taraf ve sağ taraf) ya da her ikisini de, eğer üç yarık (iki yanı artı operatör) ile kombinasyon için bir araç bir + B ve A - B bu isim altında (bu durumda operatörler +ve -kendi başlarına ilkel yapılar olurlar). Kombinasyonun başka araçlar talimat dizileri içerir I ; J , döngü yapılarınıwhile (…) {…}, ve bunun gibi. Sonra değişken kombinasyonları, işlev tanımları, sınıf tanımları ve benzeri gibi yapıların her ikisinin de kombinasyon araçları (parametre adlarını ve türlerini, gövdeleri, başlatıcıları,…) ve soyutlama araçlarını (yeniden kullanım için adları tanımladıkları için) birleştirir. Aslında soyutlama araçlarının da kombinasyon araçları olduğu oldukça yaygındır: bir ismi tanımıyla birleştirirler.


Güzel cevap; mücadele ettiğim problemlere sahipsiniz - ilkel, kombinasyon, vb. arasındaki belirsiz ayrım

"Değişken" ile tam olarak ne demek istiyorsun? Bunlar bir isim olduğu için soyutlama aracı olarak tanımlanamaz mı?
morbidCode

@morbidCode Değişken kavramı karmaşık bir kavramdır ve kelimenin lambda hesabı ve Java'da farklı ama ilgili bir anlamı vardır. Bir değişken belirtilmemiş bir değere karşılık geldiğinden “soyutlama” olarak kabul edilebilir. Bununla birlikte, bu bir soyutlama aracı değildir : referans oluşturmaz, sadece mevcut soyutlamayı kullanmanın bir yoludur. Bir lambda soyutlaması, bir kod bloğunu manipüle edilebilen bir nesne olarak kullanmanın bir yolunu oluşturur.
Gilles 'SO- şeytan olmayı bırak'

4

Kaba bıçak:

İfadeler sadece; Java'da bir ifade oluşturan şey. Bunun ifadeleri içerecek şekilde genişleyip genişlemeyeceğini bilmiyorum.

Kombinasyonlar bileşik ifadeleri, (değişkenler ?,) ifadeleri, yöntemleri, sınıf mekanizmasını ve paketleri içerir. Modüller de dilde olduklarında.

Java'da soyutlamanın en basit yolu bir sınıftır: sınıf dışında hiçbir şey olmayabilir. Belki de soyutlamanın "katmanları" vardır: statik bir yöntem, bir örnek yönteminden daha basittir, çünkü bir örnek gerektirmez.

Jenerikler ek bir soyutlama (ve hayal kırıklığı) katmanı sunar.


@MattFenwick Bir ifade tek bir ilkelden oluşabilir, ilkel ve diğer varlıkların birleşimleri bileşik bir ifade yapar (yine de bir ifade değil, bir ifade).
Dave Newton

@MattFenwick ben bir ekspresyon demiyorum değilim olup , ilkel Bir ekspresyon, yalnızca tek bir ilkel oluşabilir diyorum. Bir String'in, ilkel bir dize ile oluşturduğu referans arasında ayrım yapmak istemediğiniz sürece, dilin sözdizimsel şeker sağlaması nedeniyle ilkel olması mümkün değildir. + Diyorum, çünkü hiçbir şekilde davranılamaz.
Dave Newton

Kenara gelince: Java'nın jenerik ilaçların uygulanmasında bir sorun var mı?
Steven Evers

2

İşte benim temel kategorizasyon. LISP ile paralellik kurmaya çalışıyorum.

İlkel ifadeler

  • Tüm ilkel değerler, değişmez değerleri kullanarak gösterebileceğiniz şeyler (sayılar, booleans, ...)

LISP'de paralel : atomlar, sayılar ve listeler.

Kombinasyon Araçları ( Bileşik veri yapılarını oluşturma yolları)

  • Diziler
  • Nesneler / yapılar.

LISP'de paralel : Eksileri hücreleri, listeleri

Soyutlama Araçları

  • Tüm kontrol akışı sözdizimi (eğer, iken)
  • Tüm yerleşik operatörler ( +, -, *, /, ...)
  • Tüm işlevler (bu kategoride sınıfları ve yöntemleri içerir)

LISP'de paralel : Fonksiyonlar, sözdizimsel şeker gibi let,define


Güzel cevap! Yine de, bazı kontrol akışı yapılarının kombinasyon araçlarına sığacağını düşünüyordum. LISP ile güzel paralellikler, bu çok yardımcı olur.

Pek değil. Diziler ve nesneler farklı bir düzeyde oynatılır, dilin kendisinin değil, veri sunumunun bir parçasıdır. Dizi başlatıcıları dilin bir parçasıdır ve bir kombinasyon aracıdır. Operatörler ve kontrol akışı yapıları soyutlama aracı değildir, çünkü yeniden kullanım için hiçbir şeyi “saklamazlar”. Soyutlama araçları, genellikle bu isim altında gelecekte yeniden kullanılmak üzere bir işletmeye bir isim verir.
Gilles 'SO- kötü olmayı bırak'

0

Bir programlama dili genellikle sözdizimi ve semantiği ile tanımlanır . Bunların her ikisi de dil standartlarında tanımlanacaktır.

Sözdizimi, geçerli bir programın nasıl yazılacağını açıklar ve anlambilim, geçerli programın ne anlama geldiğini tanımlar.

Durumlarınızda sözdizimi size ilkellerinizin ne olduğunu, onları nasıl birleştirdiğinizi ve onları nasıl soyutladığınızı söyleyecektir. Anlambilim size kombinasyonların ve soyutlamaların ne anlama geldiğini söyleyecektir.

Örneğin, sözdizimi geçerli bir fordöngü nasıl yazılacağını size söyleyecektir . Anlambilim, for döngüsünün ne yaptığını size söyleyecektir.

Gerçekten bir programlama dilini analiz etmeye başlamak istiyorsanız, standardın bir kopyasını alın ve orada ne olduğunu görün. Java'ya girmeden önce C gibi basit bir dille gerçekten başlarım. Kitabın geri kalanını da okurdum. Programlama dillerinin neden bu şekilde çalıştığını öğrenmek, derleyici uygulamasam bile beni daha iyi bir programcı yaptı.


1
Bir dakika ne? "Java içine girmeden önce C gibi basit." Beni "C gibi basit" te kaybettin.
corsiKa

Matt, sanırım o zaman ne yaptığını gerçekten anlamıyorum. Alıntıladığınız kitap, yazarların açıkça sözdizimi ve anlambilim olarak adlandırıp adlandırmadıklarından her ikisini de anlatıyor.
mpdonadio

Aslında "sözdizimi", atomların oluşturulduğu dillerdeki "en basit" şeyleri tam olarak tanımlar.
Ira Baxter

Sözdizimi, geçerli bir programın ne olduğunu tam olarak yakalamaz. Örneğin, sözdizimsel olarak doğru bir program tür denetiminde başarısız olabilir. Deyimi yürüten AC programı, x = ++x;tipik bir derleyici tarafından kabul edilse bile geçerli değildir.
Gilles 'SO- kötü olmayı bırak'

0

Doğru olup olmadığını bilmiyorum, ama bölünmeyi anlama şeklim şu şekildedir:

ilkel ifadeler , Bunlar, >>, +, *, /, int, boolean, değişkenler, yöntemler vb.

kombinasyon araçları, Bu tartışmalı olabilir, ya + ve sonuç gibi şeyler, ya da kalıtım ve kompozisyon gibi daha gelişmiş fikirler hakkında konuşmak ve bunu yapmak için yöntemler. Enjeksiyon, yeni operatör, uzatma vb.

soyutlama araçları, Bu, değişkenleri ve yöntemleri adlandırmak için kullanılan sözdiziminin yanı sıra arabirimler, sınıflar, statik sınıflar, aşırı yükleme yöntemleri vb.

Ancak, kitaptan daha fazla bilgi vermeniz mümkün, bu yüzden orada ne demek olduğunu tam olarak biliyoruz.


Kitap ücretsiz çevrimiçi; OP'de bir bağlantı verilir. Ben de aynı şekilde hissettim means of combination- tam olarak orada ne olduğunu bulmak zor. Güzel cevap olsa.

Yine de kombinasyonlar ve soyutlamalar hakkında hangi bölümleri konuştuğunu biliyor musunuz?
Bob
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.