Özel olarak ifade gücü neye işaret eder?


34

Etkileyici Gücü Vikipedi tarafından şöyle tanımlanır:

.. bu dilde temsil edilebilecek ve iletilebilecek fikirlerin genişliği.

"Fikirler" , makineyle iletişim kurabileceğimiz şeylere (işlemler, yapılar, algoritmalar vb.) Atıfta bulunuyor mu? Yoksa diliyle diğer insanlara yakalanıp iletilebilecek “insan” kavramlarını mı ifade ediyor?

Etkileyici güç nasıl değerlendirilir ve ölçülür?

Örneğin, JavaScript gibi bir dil aldıysak ve değişken gibi değişken isimlere garip bir kısıtlama koyarsak, değişken gibi bir alt çizgi önceliğinin 8 basamaklı bir sayı olması gerekir, eşleştirme/^_[0-9]{8}$/ , anlamlı gücünü kaybeder miyiz?

Yoksa bu sadece saçma ve sinir bozucu olur mu?


Netleşmeştirmek:

Etkileyici güç , dilin özünde olan genel fikirlerle ölçülür :

  • tamsayılar ve dizeler
  • döngüler
  • şartlılar

Veya dilin temsil edebileceği belirli , benzersiz fikirlerin sayısı :

  • 1, 2 ... 2 ^ 32 arasındaki tamsayılar
  • "tilki ne diyor?" ve "ne pah pah pah pah pah pow"
  • Her biri için kurbağa içinde kurbağa benim toplama
  • eğer kurbağa olduğunu yeşil falan sonra bir şey yapmak

3
Bir programı belirli bir kapsamda en fazla 100 milyon değişkenle sınırlandırmanın, ifade özgürlüğüne bir miktar sınır getirdiği belirtilmelidir. Örneğin, Firefox'u uygulamayı imkansız hale getirebilir. ;-)
R. ..

1
Bu "programlama dillerini" etiketlerken, programlama dillerinin etkileyici gücü tartışılabilecek tek tür bilgisayar dili olmadığını unutmayın. Aslında, bağlantı verdiğiniz sayfa, ilk örnek olarak Web Ontoloji Dili'ne sahiptir.
Jon Hanna

Yanıtlar:


39

Anlatım üzerine dönüm noktası makalesi Matthias Felleisen (1991) tarafından Programlama Dillerinin Anlatım Gücü Üzerinedir . Dil ifadesinin matematiksel olarak titiz bir tanımını içerir.

Sezgisel olarak, eğer A dilinde yazılabilecek her program B dilinde sadece yerel dönüşümlerle de yazılabilir , ancak B dilinde yazılmış ve A dillerinde kendi genel yapılarını değiştirmeden yazamayan bazı programlar vardır (yani, yalnızca sadece yerel dönüşümler), o zaman B dili A diline göre daha etkileyicidir .

Bu tanımda biri güzel özelliği bu programlar varsa dillerin çiftleri olduğu ihtimalini itiraf olmasıdır X olarak ifade edilemez Y ve programlarda Y ifade edilemez X ve böylece dil farklıdır, ancak hiçbiri dil diğerinden daha anlamlı. Bu, gerçek dünyadaki tecrübemize dayanarak, bazı şeylerde iyi, bazı şeylerde iyi olan bazı diller olduğu ve genellikle diğerinden daha iyi olmayan bazı diller olduğunu gösterir.


Öyleyse, (kağıda henüz bakmamış olmanın) ifadesi, kaynak okuyucuların aksine , makineye ne ifade edebileceğinizi ifade ediyor mu? Donanıma ne yapmanız gerektiğini söyleyebileceğiniz bir ölçü mü? Kaç tane "insan" fikrinin kodda saklanabileceği veya iletişim kurabileceğinin bir ölçüsü değil mi? ... Belki başka bir soru sormam gerekiyor; Fakat durum buysa, konuştuğumuz “işlevsellikten” ne kadar farklı?
svidgen

Belki de OP’deki örneğim kötü. Her ikisi de dizileri olan A ve B dillerini göz önünde bulundurun; fakat, A dilinin de yapıları vardır. Her iki dilde Pointde 2B dizileri kullanan bir diziyi temsil edebilirim . Ancak, A'nınPoint daha insan tarafından okunabilir bir kavram olarak ifade etmeme izin verme avantajı vardır . Mı bir daha etkileyici?
svidgen

@svidgen Tüm Turing-complete dilleri hesaplama açısından eşdeğer olduğundan, yazılabilecek olası programlar kümesi teorik olarak hepsi için aynıdır. Yukarıdaki tanım gereğince, B dili ile yazılmış bir programın A'ya sığması için yeniden düzenlenmesi gerekiyorsa, B dili A'dan daha etkileyicidir. (Yalnızca sözdizimi satırını satır satır değiştirmek değil, yeni sınıflar, döngüler vb. kullanımları lambda'lar, o Java 7 programı map, filterbirinci sınıf türleri / yöntem / fonksiyonları, belki bazı evalyalnız metaclass büyü veya dinamik olarak oluşturulan türleri vb let
marczellm

@ marczellm öyleyse, etkileyiciliğin ifade ettiği "fikirler", dil kendileri midir? Örneğin, şartlı bir fikir mi? Bir döngü bir fikirdir? Dizi? Numara? Vb.?
svidgen

1
@ Jörg Cevabınıza bir örnek verebilir misiniz? Bu sevimli bir tanım, ancak soruyu cevaplamak için pek bir şey yapmıyor.
svidgen

10

Etkileyici Gücü Vikipedi tarafından şöyle tanımlanır:

Bu sayfaya tekrar okuyalım. Dikkat edilmesi gereken ilk şeylerden biri, "programlama dili" değil "dil" yazmasıdır ve örneklerinin çoğu programlama dili değildir, örneğin verilen ilk örnek, her ikisi de ontoloji olan OWL2 EL ve OWL2 RL'nin karşılaştırılmasıdır. duujjil.

Biri kavramı programlama dillerine uygulayabilir, fakat aynı zamanda kalıp eşleşen dilleri, işaretleme dillerini, sorgu dillerini, görsel stil sayfası dillerini, düzenli ifadeleri (ve başvurdukları tüm normal dilleri) vb. Hatta çoğu zaman gayrı resmi olarak yapılan, ancak doğal dil işleme ile ilgili sorunları göz önüne alındığında daha ciddi olan İngilizce gibi doğal dillerin ifade gücüne bile değinilebilir.

"Fikirler", makineyle iletişim kurabileceğimiz şeylere (işlemler, yapılar, algoritmalar vb.) Atıfta bulunuyor mu? Yoksa diliyle diğer insanlara yakalanıp iletilebilecek “insan” kavramlarını mı ifade ediyor?

Bu dilde neyin ifade edilebileceğini, tamamen kendi başına bir şey olarak kabul eder.

Örneğin, (örneklerim boyunca javascript'i kullanacağım, çünkü sorunuzun bildiğiniz dillerden biri olduğunu gösteriyor) javascript ifadesini göz önünde bulundurur:

var x = 3 + 4;

Bu, 3 ve 4 değerlerinin toplamının hesaplandığını ve xverilen ad alanı kapsamındaki bir etiketle ilişkilendirilen değerin temsil edildiğini gösterir .

Dünyadaki tüm bilgisayarları yok edip bu kodu bir kağıda yazarsak, javascriptte de yine aynı anlama geldiğini; böyle bir kodu hiçbir şey üzerinde çalıştıramazdık, ancak dilin soyut tanımı hala konuşabileceğimiz bir şey.

Bu sinsi görünebilir, ancak dillerin gerçekte, gerçek bilgisayarları düşünmeden soyutlanabilecek sebepler olması oldukça önemlidir. Birincisi, pratikte henüz pratik olmayan bilgisayar dillerinin teorik noktaları hakkında düşünen insanlar, bizi bugün bulunduğumuz yere getiren şeylerden biri; Bilgisayarlar bilgisayar bilimlerine ihtiyaç duyar, ancak bilgisayar bilimleri bilgisayarlara ihtiyaç duymaz, sadece bir hesaplama fikridir.

Elbette, gerçek dünyadaki bilgisayarları kullanıyoruz ve bu günlerde teorik olarak tartışan birkaç uzman yerine, pratikte kullanan pek çok insan var. Bağlandığınız sayfa diyor ki:

Etkileyici güç terimi çeşitli anlamlarla kullanılabilir. Bu dilde anlaşılabilir fikirlerin bir ölçüsü olabilir:

  • kolaylığı ne olursa olsun (teorik anlatım)

  • kısa ve kolayca (pratik anlatım)

İlk anlam, dillerin biçimsel tanımları ve biçimsel dil teorisi, matematiksel mantık ve süreç cebiri gibi anlamlarıyla ilgilenen matematik ve mantık alanlarında egemendir.

Gayrı resmi tartışmalarda, terim genellikle ikinci anlama veya her ikisine de atıfta bulunur. Programlama dilleri tartışılırken genellikle durum budur. Terimin bu gayri resmi kullanımının resmileştirilmesi için çaba gösterilmiştir.

Terimin bu iki kullanımından, ilkinin pratik etkisi, yalnızca bilgisayara aktarılabilecekler ile ilgilidir .

İkincisi, hem okuma hem de yazmadaki insan anlayışı ile daha fazla ilgilidir, ancak bunun derecesi, gayrı resmidir ve bu nedenle katı bir şekilde tanımlanmadıklarından kullanımlar arasında çok fazla farklılık gösterir.

Örneğin, JavaScript gibi bir dil aldıysak ve değişken gibi değişken isimlere garip bir kısıtlama koyarsak, değişken gibi bir alt çizgi önceliğinin 8 basamaklı bir sayı olması gerekir, eşleştirme /^_[0-9]{8}$/, anlamlı gücünü kaybeder miyiz?

Resmi tanım gereğince, anlamlı bir güç kaybetmedik: 100.000.000 değişkenle sınırlıyız, ancak gerçekten ihtiyaç duymamız halinde yeni oluşturulan isim alanı içinde daha fazla değişken tutacak nesneler oluşturarak bunun üstesinden gelebiliriz. Bugün javascript ile yazılmış herhangi bir program bu yeni formda yeniden yazılabildiği için eşit derecede açıklayıcıdırlar.

Gayri resmi tanım gereği, bazılarını kaybettik, ancak ne kadar gayrı resmi olduğumuza bağlı, ne kadar değişken olacağına bağlı, çünkü yine bir gayri resmi kullanım için "kural" ın ne olduğunu söyleyemezsiniz. Küçük bir miktar kaybettik diyebiliriz, çünkü aynı isim alanında 100.000.000'den fazla değişkene sahip programlar basit bir değiştirmenin ötesinde yeniden yazılmalıdır. Yine daha gayrı resmi bir kullanım, bu tür değişken olmayan isimlerin insani kapsamlı üzerindeki zihinsel etkisine atıfta bulunacaktır.

Ayrıca, insanların , dilin kesinlikle bir parçası olmayan şeyleri gayrı resmi olarak değerlendireceklerini belirtmek de önemlidir. Javascript’teki yaratılışından bugüne kadar olan değişiklikleri düşünün.

En resmi tanım gereği, etkileyicilikte oldukça bir değişiklik oldu; sonuçta, başlamak için Turing tamamlandı.

Daha resmi olmayan bir tanımla, dizi manipülasyonu, istisnaların ele alınması ve (belki de en önemlisi) düzenli ifadelerin dahil edilmesi gibi bazı şeylerde çok daha anlamlı hale geldi. Bunlar, daha önce javascript'te yapılamayan hiçbir şeyi yapmazlar, ancak genellikle birkaç satırda bir şeyler yapabilirler ve daha sonra javascript1'de yazmak için kilobaytlık kod alan ve daha uzun süre çalışacak olan bir sonraki işlem süresi.

Yine çok daha resmi olmayan bir tanımla, javascript’in tarayıcılarda ilk kez kullandığı değişiklik (form girişlerinin değerlerini değiştirebilme document.write, sayfa ilk kez ayrıştırılırken ve yeni bir yere taşınırken veya tarihe geçmiş veya geri gider) başka bir şey yok) bugün (sunucu çağrılarından elde edilen veriler de dahil olmak üzere sayfadaki herhangi bir şeyi değiştirebilme kabiliyeti) kesinlikle büyüktür, ancak çoğu javascript ile değil, nesne modelleri ve API'lerle ilgili olsa da dil yerine kullanılabilir (örneğin, IE'deki vbscript, bu değişikliklerden eşit oranda yararlanmıştır).

Aklıma göre, bu son kullanım gerçekten doğru olmayacak kadar gayrı resmidir, ancak gayri resmi tanımlardaki sorun budur.

Biçimsel tanımla, gerçekten hiç daha etkileyici hale gelmedi.


2
"bilgisayarların bilgisayar bilimlerine ihtiyacı var, ancak bilgisayar bilimlerinin bilgisayarlara ihtiyacı yok" Bu hoşuma gitti
chbaker0

Değişken adlandırma kısıtlamasıyla ilgili olarak, dilin fikirleri temsil etme becerisiyle ilgisi olmayan dış fikirlere (şeyler için ana dil adları) gönderme yeteneği var mı? ... Belki de sorunun köküne daha fazlası: Sözünü ettiğimiz fikirler sadece genel dil yapılarını ifade ediyor mu? Örneğin toplama, çıkarma, olumsuzlama, diziler, sınıflar vb. Dil ile ifade edebileceğimiz belirli fikirlerin aksine ? Örneğin, dizi olarak adlandırılan fishiesÇeşidiFish .
svidgen

Daha fazla açıklama için düzenlememi görebilirsiniz. ... Her ikisini dediğiniz gibi sesler (düzenlememe atıfta bulunarak); ancak birinci listenin "resmi" ve ikinci listenin "gayrı resmi" olduğunu. Eğer durum buysa, konuşmada niteliksizce nasıl kullanıldığına dair bir norm var mı? Ya da ... sadece açıklama isteyebilirsiniz mi?
svidgen

4

Değişken isimlendirme kurallarının gerçekten "ifade" ile kastedilenleri yakaladığını sanmıyorum. Ben "ifade" nin daha temel şeylere atıfta bulunduğunu düşünüyorum. Örneğin Linq'den önce C # ile Linq arasında C # düşünün. Linq'in eklenmesinden sonra, SQL benzeri sorguları doğrudan C # içine yazmak mümkün oldu. Bu, önceki alternatiflerden çok daha zarif, örneğin SQL'i string değişmezlerine koymak ve ardından sunucuya aktarmak veya "for" kullanarak bir koleksiyon üzerinde yineleme yapmak.

Bir başka güzel örnek prototip tabanlı miras alan diller olabilir. Bu dillerde, çalışma zamanında bir örneğe veya hatta bir sınıfa ("sınıfın adı ne olursa olsun ...") yeni yöntemler eklemek mümkündür. Bunu gerçekten C ++ veya C # ile yapamazsınız. Prototip tabanlı dillere kıyasla bu derecede etkileyiciliğe sahip değiller. (C #, uzatma yöntemleri kavramına sahiptir ve bunlara kesinlikle etkileyici olduğu söylenebilir.)


0

Wikipedia makalesinde belirtildiği gibi, ifade gücü, dilde ifade edilebilecek program kümesini ifade eder. Bir "programlama dili" olarak düşündüğünüz her şey (JavaScript, LISP, C #, Perl, vb.) Esasen tamamlanmıştır, yani "hesaplanabilir" olduğu söylenen her şeyi ifade edebilecekleri anlamına gelir.

Ancak, düzenli ifadelerin normal programlama dili kadar anlamlı olmadığı açıkça anlaşılmalıdır. Ayrıca, kabuk joker karakterleri normal ifadelerden biraz daha az anlamlıdır.

Ortak tablo ifadelerine sahip bir SQL sürümü, CTE'ler başka türlü SQL'de ifade etmek imkansız olan özyinelemeli sorguları temsil etmenize izin verdiği için bir sürümden daha etkileyicidir.


0

Etkileyici gücü anlamanın daha basit ve daha yalındır bir yolu var, ancak önce dillerle ne demek istediğimizi belirlememiz gerekiyor. Dilleri inceleyen iki disiplin vardır: dil bilimi ve otomatlar. Her ikisi de dilin birleştirme kullanılarak bazı sonlu alfabelerden oluşan bir sözcük kümesi (sonlu diziler) olduğu konusunda hemfikirdir. Tipik olarak, ilginç diller (ilginç olarak, yararlı bir şekilde yorumlayabildiğimiz dilleri kastediyorum) aynı zamanda, hangi kelimelerin dilde olduğunu ve hangilerinin olmadığını yöneten bir dizi kurala da sahiptir. Etkileyiciliğin ancak yorum olduğunda var olabileceğini unutmayın.

Yorumlama yoluyla, bir dilde bir kelime verilen bir fonksiyonun bazı nesnelerden bir nesneyi seçtiği bir fonksiyonun varlığını kastediyorum.

Yine de "kelime" kullanarak yanıltmayın. Bir Java programı, Java dilinde bir kelimedir (boşluklarla ayrılmış birden çok karakter dizesi içeren birden fazla dosyayı kapsayabilir).

Bu kadar karmaşık olan bu modern dilleri kullanmak gibi karmaşık dilleri kullanmak, göreceli olarak basit olan bu kavramla başa çıkmak için verimsiz olurdu, bu yüzden bunun yerine matematiksel formülleri kullanmak isterdim.

  • A dilini tam sayı eklemeyi içeren tüm formüller olarak tanımlayalım.

  • B dilini tam sayı çarpımını içeren tüm formüllerin dili olarak tanımlayalım.

Her iki durumda da kimlik unsurunun kullanılmasına izin vermeyiz. Bu nedenle, A dili "1 + 1", "1 + 2", "1 + 3", "2 + 3" gibi kelimeler içerir. B dili "2 * 2", "2 * 3", "2 * 4", "3 * 4" ve benzeri sözcükleri içerir. Ayrıca, ilgili sembollere "*" ve "+" (tamsayı toplama ve tamsayı çarpma) komutlarını kullanırız. Yani, "1 + 1" in yorumu 2'dir ve "2 * 2" in yorumu 4'tür.

Şimdi A dilinin B diline göre kesinlikle daha anlamlı olduğunu gözlemleyin, çünkü tamsayılarda çarpımın tekrarlı toplama olarak kullanılabileceği doğrudur, ancak toplamada çarpımı genel olarak çarpma olarak göstermenin bir yolu yoktur.


Özetlemek gerekirse: A dilinin yorumlama işlevleri ortak etki alanını paylaştığında B diline göre daha anlamlı olduğu söylenebilir, ancak B'nin yorumlama işlevinin görüntüsünün A'nın yorumlama işlevinin görüntüsünün uygun bir alt kümesi olduğu söylenebilir.


-1

TLDR: Bir özellik eksikse ancak başka şekillerde ifade edilebilirse, ifade eksikliği değildir. Aklınıza bir algoritma düşünebilir veya hatta bir dilde uygulayabiliyorsanız, ancak başka bir dil bir şekilde algoritmayı uygulamanızı imkansız kılacak şekilde yapılandırılmıştır.

Değişken isimlendirme kısıtlamaları etkileyiciliği azaltmaz (biri artık tüm algoritmaları ifade edemeyen ve değişkenler diziler + dizinler gibi bir şeyle sahte hale getiremeyecek kadar az isim olmadıkça).

İfade gücü eksikliği Basit bir örnek şudur: Sen zorunda do_homeworkve bring_down_trash. Bu kolayca kodla yazılır:

do_homework();
bring_down_trash();

Bu çözüm oldukça basit görünüyor ama aslında do_homeworkve bring_down_trashsırasız durumda, biri de yazabilir:

bring_down_trash();
do_homework();

Bu aynı derecede kesin değildir çünkü bir emri yerine getirmek niyetinde olmadığımızı ifade etmemektedir. Ayrıca konu kullanmak istemiyoruz. Böyle bir şey söylemek istiyoruz:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

Bildiğim kadarıyla bu herhangi bir programlama dilinde ifade etmek imkansız çok zor.

Beni uçsuz bırakan bir örnek, Java'da bir dizi nesneye sahip olmanın imkansız olmasıdır. Nesnelere bir işaretçi dizisi oluşturabilirsiniz, ancak bu aynı bellek düzenine sahip değildir (verimlilik).

Başka bir cevaptan örnek almak : C ++, bir sınıfa veya örneğe yöntem eklemeyi desteklemez . Bu doğrudur, ancak C ++ 'ın etkililiğini sınırlamaz.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

Bu, örnekler ve sınıf için istediğiniz sayıda üye işlevi ekleyebileceğiniz, kaldırabileceğiniz ve çağırabileceğiniz bir sınıftır. Teknik olarak C ++ muhtemelen bu özelliği destekleyen bu dilleri programlamadan daha etkileyicidir çünkü C ++ 'da işlevleri nasıl saklayacağınızı seçebilirsiniz (vector vs array vs forward_list).

* Bazı dillerin bir özellik olarak ifade eksikliği vardır. Genellikle sonsuz döngüler yazmayı imkansız hale getirirler. Bu, durma problemini çözülebilir hale getirebilir ve doğruluğun otomatik olarak kanıtlanmasını sağlar.


2
Bunun doğru olmadığından oldukça eminim - en azından benim anladığım gibi değil. Ham ikiliyi diske yazmak , saçma olan bu tanımla ifade edilir.
Telastyn,

1
@Telastyn Neden bu saçma? Tabii ki sadece diske ham ikili yazmak anlamlı değildir, fakat bunu yapabilen bir dilden daha ifade edicidir, diğeri ise eşitdir.
nwp

Bilgisayarınıza ham bit yazmak için bir donanım arabirimi kullanarak "dili" demek, bilgisayarın yapabileceği her şeyi yapabileceği için en etkileyici dilin bir örneğidir. Eksik olan herhangi bir özelliği başka şekillerde de ifade edebilir. Sizin tanımınıza göre, bunun ifade edici bir dil olduğunu saçma buluyorum .
Telastyn,

@Telastyn Neden bu en etkileyici dil olsun? Okuma verilerini ifade edemez veya herhangi bir şeyi hesaplayamaz veya grafik ya da ipucu gösteremez. Yalnızca belleğe ve diske bit yazabilen bir dilin o kadar az etkileyiciliği vardır ki, bunun bir kullanımı olduğunu sorguladım.
nwp

1
"Tipik olarak sonsuz döngüler yazmayı imkansız hale getirirler. Bu, durma problemini çözülebilir hale getirebilir" - Eğer sonsuz bir döngüye sahip değilseniz, tanımı gereği, programınızın durması gerekir.
Patrick Collins,
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.