Her ifadenin anlamlı olduğu programlama dili


23

Tavsiyeye göre bunu Stack Overflow'tan tekrar gönderiyorum .

Son zamanlarda aşağıdaki konuyu düşünüyorum.

Standart bir "Merhaba dünya!" Kodunu düşünün. Program:

main()
{
    printf("Hello World");

}

Şimdi bu koddaki hemen hemen her değişiklik onu tamamen işe yaramaz hale getirecek, aslında hemen hemen her değişiklik kodun derlenmesini önleyecektir. Örneğin:

main(5
{
    printf("Hello World");

}

Şimdi asıl soruya. Mümkün olan her sembol kombinasyonunun - yani her ifadenin - anlamlı olduğu bir programlama dili var mı? Bir tür çözüm düşünmeye çalıştım ve iki tane buldum:

  1. Sınırlı sayıda değişken içeren postfix. Temel olarak, tüm değişkenler herhangi bir kod yazmadan önce tanımlanmıştır ve sadece bunlarla çalışmak zorundasınız. Teorik olarak, her biri diğerlerini besleyen birçok basit program zinciri oluşturarak, istediğiniz sayıda işlemi gerçekleştirebilirsiniz. Kod, postfix notasyonunda bir dizi karakter olarak yazılabilir;

  2. Değişkenlerin bir yığını ile "Postfix". Değişkenler bir yığında depolanır; her işlem üstten iki değişken alır ve sonucu onların yerine koyar. Program son işleme veya değişkene ulaştığında sona erer.

Şahsen ben her ikisinden de nefret ediyorum. Sadece sınırlı değiller, aynı zamanda inelegant. Daha çok geçici çözümler gibi gerçek çözümler bile değiller, temel olarak bazı işleri dış bir sürece “dışa vurmak”.

Bu sorunun nasıl çözüleceği hakkında başka fikri olan var mı?


48
Bir derleyici verildiğinde, aşağıdaki gibi çalışan yeni bir derleyici oluşturun: verilen kaynak , onu . Eğer onunla mutluysa ve bir çalıştırılabilir üretiyorsa, bu o kadardır, ama eğer şikayet ederse, çıktısını alan bir çalıştırılabilir çıktı üretir. derleyicisi her diziyi geçerli bir program olarak kabul eder. ' in Cı- Cı- Cı- C 'CCsCCCYou are a bimbo.C
Andrej Bauer

1
BF'in eşleşen [ ]komutlara ihtiyacı var (Wiki Sayfasına göre). Benim düşüncem CPU kodlarına bakmaktı. Fakat o zaman bile, bazı modeller bir sorun yaratabilir (örneğin, bir opcode 3 bit ise, ancak programınız sadece 2 bit'tir.) Büyük olasılıkla biraz ekstra 0 bit ile doldurmanın bu sorunu hariç "Her dize geçerli bir programdır" iddiasını karşılayacak tam bir opcode kümesi. Belki anlamsız ama yine de geçerli.
Ran G.

1
Donanımınızın 64k RAM'e sahip bir Z-80 CPU olmasını sağlayın. Sadece ASCII kodlu kaynak kodunu 64k hafızaya kopyalayan bir derleyici yazın (gerekirse keserek veya sıfır doldurma ile). Bu derleyici hiçbir zaman bir sözdizimi hatası vermez.
Ben Crowell

1
@RanG. Herhangi bir bit akımını işleyen ve verilen işlemci için geçerli bir nesne kodu biti olmasını düzelten bir 'derleyici', OP'lerin gereksinimlerini karşılayacağını düşünüyorum. X86 gibi karmaşık komut setlerine sahip sistemler için bile çok zor olmazdı. Yıllar önce rastgele baytların x86 programları olarak geçerliliği hakkında bir makale okudum ve x86'nın aslında yazarların beklenenden çok daha güçlü olduğunu buldu.
otakucode

2
Başka koşullar olmadan bu soru sıkıcıdır: Andrej'nin yorumu ve David'in cevabı "önemsiz" cevaplar verir. İstediğini daha kesin bir şekilde tespit etmek zorundasın.
Raphael

Yanıtlar:


31

Codewar'ların ardındaki derleme dili olan Redcode açıkça çok az sayıda durma talimatına sahip olacak şekilde yazılmıştır, çünkü kodun son vermeden önce sık sık karıştırılması ve ne kadar fazla durması gerekiyorsa, oyun o kadar az ilginçtir.

Uygulamada bu kadar az dil görüyorsunuz, çünkü sadece bir programın çalışmasını istemiyoruz, istediğimiz şekilde çalışmasını istiyoruz. Bir yazım hatası yapabilir ve programın çalışma şeklini değiştirirseniz, beklenen orijinal davranışa veya hayal kırıklığı içinde kalan programcılara kabul edilebilir bir şekilde yakın olmalıdır.

Resmi dillerden ziyade, doğal dilleri kullanmak gibi bazı şeylerde öncelik vardır, ancak resmi dillerin kullanımıyla karşılaştırırken geniş bir alan dediğim şey bu değildir. Bu tür programlama dilleriyle ilgileniyorsanız, doğal dil işleme topluluğu aradığım yer.

Bakabileceğiniz başka bir alan da genetiktir. Sadece geçersiz olan oldukça az sayıda genetik sekans vardır. Çoğaltmalar üzerinde çok etkili olmayan pek çok kişi, ancak çok az sayıda geçersiz olanlar.


1
Genetik iyi bir örnek gibi görünmüyor. Geçerli veya geçersiz olarak, sadece çoğaltma hakkında mı konuşuyorsunuz? Elbette her dize, mümkün olan tek öğretimin bulunduğu bir dil için geçerli bir program olacaktır replicate this string. Turing Complete'in hiçbir yerinde olmadığı için gerçekten anlamlı bir programlama dili değil.
tel

2
@tel: Cort muhtemelen replikasyon yerine mRNA ile protein sentezinden bahsediyor. Hemen hemen her türlü genetik sekans kopyalanabilir ve daha sonra protein sentez makinesine konabilir: çıkan proteinin, yapıldığı zaman tarafından zaten parçalanmadığı kadar stabil olup olmadığı ve eğer varsa organizma, başka bir konudur ...
Steve Jessop

3
Genetik kod, kendini yeniden üretecek bir kod değildir. Bu (genellikle) bir protein için bir koddur. Protein yararlı olup olmadığı genellikle farklı bir sorudur. Tabii ki daha da ilginçleşiyor. Genetik bir dizilimdeki bazı "kod" bitleri, "birkaç satır daha aşağıya doğru kodlanan - bazen onu görmezden gelmelisin" satırları boyunca bir talimat gibi olur. Her türlü serin "program" vardır, hücreler ve virüsler birbirleriyle savaşırlar.
Joel

TECO başka bir gerçek dünya örneğidir.
cjm

1
@cjm vay. "Bir API, her şeyi eklemeyi bitirdiğinizde değil, her şeyi çıkarmayı tamamladığınızda biter." TECO değilseniz, o zaman anlam atamak için karakter bittiğinde bitirdiniz.
Cort Ammon - Monica,

16

Evrensel bir Turing makinesi fikri, böyle bir "programlama dili" kullanır: Turing makinelerinin, örneğin ikili olarak temsil edilen doğal sayılar olarak kodlanması, her doğal sayının bir Turing makinesini, yani programı ifade etmesi. Bu dilde, her sıfıra ve sıfıra ait bir programdır.

Bazı numaraların geçersiz programları kodlayabileceğinden endişeleniyorsanız, bu aşağıdaki gibi yan adımlarla atılabilir. Tüm dizeleri programlama dilinizin karakter kümesinde (örneğin Java), sözcük dizini içinde, uzunluğu bir, sonra iki, sonra üç olan dizelerle başlayarak yazdığınızı hayal edin. stand geçerli bir Java programı listede dize inci. Yeni programlama dilinde, programlar sadece doğal sayılardır ve her doğal sayı geçerli bir programdır.nnn

Her dizenin bir program olduğu ezoterik programlama dilleri de olduğundan eminim; ancak, sadece bunların bir listesini soruyorsanız, sorunuzun konu dışı olduğunu düşünüyorum.


13

Bir programlama dilini genişleterek, her ifadenin bir anlam ifade etmesi her zaman mümkün, ancak ilginç değil. Örneğin, orijinal dilin reddettiği herhangi bir ifadeye sadece "hiçbir şey yapma" anlamını atayabilirsiniz.

Her ifadenin “uygulayabileceğiniz” şekilde bir anlam ifade ettiği bir programlama dili tasarlamak özellikle yararlı değildir. İyi bir programlama dili sadece bir maymunun klavyede yazıp geçerli bir program yazabileceği bir dil değil, bir programcının yazmayı düşündüğü programı kolayca yazabileceği bir dildir. Geçerli programlar yazmak, programlamanın zor kısmı değildir: Zor kısım, kendisinden bekleneni gerçekleştiren bir program yazmaktır. Açıkça yanlış programların reddedilmesi bu açıdan çok yararlıdır.

Bununla başa çıkmanın başka bir yolu da, eğer varsa her giriş için hangi derleme zamanı, yükleme zamanı veya çalışma zamanı hatası oluşması gerektiğini de dahil olmak üzere tüm olası girişlerin anlamını tam olarak tanımlamaktır. Başka bir deyişle, “ Syntax error at line 42standart hata akışına yazdırdıktan sonra programı iptal etme ”, dilin tanımlanmış anlambiliminin bir parçasıdır. Her ifade, tanımlanmış bir anlamı olduğu için “anlamlıdır”. Bu yararlı bir anlam mı? Belki de - sonuçta, eğer program açıkça yanlış ise, reddetmek faydalı olacaktır.


12

Check out zerre 0 ların ve (boş bir dizinin dahil) 1'ler her sekans geçerli bir programdır kombinatoriyel mantığa dayalı bir Turing-tam bir dil.


2
Bu bir bilgisayar bilimi cevabı değil.
Raphael

2
@Abdulrhman İkili dizgeler ve doğal sayılar arasında bir önyükleme tanımlamak için yalındır. Böylece, istediğiniz herhangi bir programı doğal bir sayı olarak kodlayabilirsiniz.
CodesInChaos 23:15

7
@Raphael Lütfen cevabınızı geliştirin veya önerinizi geliştirin, eleştirinize zemin hazırlarsanız, onu geliştirmek için mutlu olurum.
Petr Pudlák

+1, doğal sayılara dayanan kurgusal bir programlama dili için benzer bir cevap verecektim ama bu aynı. AFAIK, bu özelliğe sahip olan bir programlama (pratik kullanımda) yoktur, ancak bir rakam sadece sayılar kullanarak yapılandırabilir, diyelim ki, her bir kombinasyonun bir anlamı olduğu (işleçlerin yanı sıra işleçler gibi davran) Bu anahtar
Nikos M.

8

Güzel bir örnek boşluktur . Uygun dilde, operatörlerin herhangi bir kombinasyonu geçerlidir. Operatörler boşluk, sekme ve yeni satır (özellikle "\ n"). Diğer tüm karakterler yorum olarak kabul edilir .

Bu cevap ve aslında sorunuz (tüm web sayfasının yanı sıra) geçerli boşluk programlarının örnekleridir (özellikle ilginç bir şey yapmasalar da).


Bunu sadece beynimdeki cevabımı gönderdikten sonra düşünüyordum (seninki doğru olduğundan daha iyi), ama merak ediyorum - boş bir program hala bir program mı? (yani, bu üç karakter tüm dosya akışında eksikse). - Mesela arabam araba yapan her şeyi kaçırıyorsa, yine de araba olur mu?
BrainSlugs83 23:15

Bu bir bilgisayar bilimi cevabı değil. (Ayrıca, "her boşluk dizesi"! = "Her dizge".)
Raphael

2
@Raphael: Ancak her olası dize (boşluk içermeyenleri de içeren) geçerli boşluk programlarıdır - boşluk içermeyen herhangi bir karakterin boşluk programlama dilinde sadece yorumlar olduğunu unutmayın
slebetman 23:15

2
@slebetman Parantez yorumumu gerçekten de yorumluyordun. Eşleştirilmemiş döngü belirteçlerinden bahsediyordum. Boşluktaki bazı benzer sorunlar şunlar olabilir: Bir önceki çağrı olmadan geri dönüş işe yarar mı? (olarak kodlanmış [LF][Tab][LF]) Boş bir yığın açarsanız ne olur? Tanımsız bir etikete atlarsanız ne olur? Çift etiketleri tanımlarsanız ne olur?
CodesInChaos

7

Birçok posterin verdiği fikre, böyle bir dilin "işe yaramaz" olacağına değinmek istiyorum. Belki de insanların belirli bir görevi çözme niyetiyle el yazması yararsızdır. Bununla birlikte, programlama dilleri için çoğunluk kullanım durumu olmasına rağmen, kesinlikle tek kullanım durumu bu değildir. Bu dilin yararlı olduğu yerlerde birçok kullanım durumu akla geliyor ve bu dilleri bu örnekler için inceleyebiliriz.

(Yerine söz konusu programın dönüşüm: Öncelikle genetiğe Cort Ammon kinaye üzerinde nokta )için 5) bir olarak görülebilir mutasyon . Bu tür bir manipülasyon, evrimsel hesaplama alanında yaygındır ; Özellikle genetik algoritmalar üzerinde bu tür dönüşümleri gerçekleştirmek dizeleri ederken, genetik programlama dönüşümleri programlara . Her iki durumda da, genellikle her olasılığa anlam vermek istiyoruz, çünkü bu en kompakt arama alanını üretecektir.

Genetik algoritmalar , dizgiler için bir çeşit değerlendirme işlevine dayanır ; Değerlendirme işlevimiz olarak bir programlama dili yorumlayıcısı kullanırsak, o zaman tüm olası dizgelere anlam veren bir programlama dilinin yararlı olduğu bir senaryoya sahibiz. Genetik programlamada, değerlendirme işlevimizin bir programlama dili yorumlayıcısı olduğu varsayılmaktadır, ancak programlarımız için çeşitli gösterimler seçebiliriz ; örneğin, birçok sistem soyut sözdizimi ağaçlarında çalışır. Eğer gösterimlerimizde dizeleri seçersek, genetik algoritmalarla aynı senaryoyu kurtarabiliriz.

Her dizgenin geçerli bir program olmasını isteyebileceğimiz bir başka durum da programları sıralamaktır . Bu, CodesInChaos tarafından belirtilen itirazla ilgilidir, ancak birkaç nedenden dolayı Doğal sayılar yerine karakter dizileri üzerinde çalışmayı tercih edebiliriz:

  • Dilde bir yapı varsa, örneğin. Alt dizgilere anlam atayabiliriz, bu Doğal sayıları çevirirken bu kaybolabilir. Bu durumda, tüm programı bir sayı olarak göstermek yerine, yerel olarak alt dizeleri aktarabilmek ve dönüştürmek için dizeleri kullanmayı tercih edebiliriz. Bu, her bir bitin ayrı bir anlamı olduğunda, bitsel işlemleri aritmetik ifadeler yerine int üzerinde kullanmayı tercih edebileceğimize benzer. Bu temelde evrim senaryosunun bir genellemesidir.
  • Talep üzerine programlar üretmek isteyebiliriz; örneğin, tamamen belirlenmemiş bir programın çalıştırılmasına başlayabiliriz ve komut göstericisine ulaştığında / eğer tek tek komutları (örneğin karakterleri) üretebiliriz (örneğin rastgele). Bu, programın bir Turing makine bandı olduğu algoritmik bilgi teorisinde yaygındır ve amaç, rasgele oluşturulan programların davranışını karakterize etmektir. Örneğin, rasgele bir diziden önce Solomonoff'u, rastgele bir bantı olan evrensel bir Turing makinesinin bu dizgiyi çıkarması olasılığı olarak formüle edebiliriz.

Örnek diller açısından, birçok evrimsel hesaplama sistemi, Push ailesi gibi yığın dillerine dayanmaktadır . Bunlar, isteğe bağlı belirteç akışlarına izin verme eğilimindedir (bireysel karakterler olarak temsil edebiliriz). Bazen (BrainSlugs83'ün Brainfuck örneğinde olduğu gibi) parantezleri dengelemeyle ilgili kısıtlamalar vardır; Ancak biz bu ilgili olabilir kendini sınırlayan programların gibi bir dize ki, [bir geçerli olmayabilir programı , ama bu olan geçerli bir programdır önek . Eğer stdin'den kaynak kodunu okuyan bir derleyici / tercüman hayal edersek , böyle bir dizgiyi reddetmez[ , devam etmeden önce daha fazla girdi bekler.

İkili Birleştirici Mantık ve İkili Lambda Matematik gibi diller, algoritmik bilgi teorisi üzerine doğrudan işsiz kalmıştır; dan http://tromp.github.io/cl/cl.html

Minimalist evrensel bir bilgisayarın bu tasarımı, bireysel nesnelerin rastlantısallığını inceleyen Kolmogorov Karmaşıklığı'nın somut bir tanımını ortaya koyma arzum ile motive oldu.


2

Gerçek programlama dilleri, bilgisayarlara değil insanlara anlam kazandırmaktır . 'Şov programında dolaşan neredeyse rastgele karıştırılmış harflerle dolu eğlenceli metinler olduğu için insanlar, manyaklaşmayı açıkça fark etmeden bile saçma sapan şeyleri okuyabilir ve anlamlandırabilir. Metinlerde yazım hataları ve diğer bu tür hataları bulmanın ne kadar zor olduğunu bir düşünün.

İstediğiniz gibi bir programlama dili, insanların ne okumak istediklerini anlamalarını sağlar, yazılanları değil. Çok fazla belirsizliğin bulunmadığı sınırlı sayıda yasal bildirimin olduğu dillerde hata ayıklama yapmak zaten yeterlidir. İyi diller , örneğin aktarılan semboller veya yazım hataları nedeniyle olası yorumları azaltır . Doğal diller de aynı sebepten dolayı fazlalıklarından dolayı ünlüdür.


0

In Brainfuck Programlama Dili , neredeyse her türlü ikili ifadesi bir program olarak yorumlanabilir. - Yani, tamamen iyi bir programa girebilir, içine bir sürü çöp yazabilirsiniz ve yine de sorunsuz bir şekilde derlenebilir / yorumlanabilir olur.

( Düzenleme: Açma ve kapama köşeli parantezleri eşleştirmeniz gerekir, ancak aksi halde yukarıdaki doğrudur.)

Bu iki basit yöntemle bunu başarır:

  1. Anladığı komutların tümü bir bayt'tır (BF'de örneğin hepsi tek ASCII karakterleridir *).

  2. Anlamadığı tüm karakterler yorum olarak atar.

Programlama dili Turing tamamlandı (başka bir dilin yapabileceği her şeyi yapabilir).

*: Görünüşe göre, tüm BF komutları tek bir ASCII baytı değil - yani parantezler eşleşmelidir - öyle ki, o dil oradaki ilk kriterleri karşılamıyor. - Fakat her iki kriteri de karşılayan herhangi bir dil OP'nin istediği şeyi yerine getirecektir.


2
Bu sadece soruyu cevaplamakla kalmaz, aynı zamanda bir bilgisayar bilimi yanıtı değildir.
Raphael

1
Dilleri mantıklı bir şekilde ele almak için dili yeniden tanımlayabilirsiniz. örneğin, programın başlangıcına yeterince açma braketi yerleştirerek ve programın sonunda dengeyi sağlamak için braketleri kapatarak. Programları gerçekte programı yeniden yazmadan varmış gibi işleyen bir tercüman yazmak oldukça kolaydır. Elbette bir açılış dirsekli bir beyin fırtınası programına başlamak oldukça işe yaramaz, çünkü eşleşen kapanış dirseğine kadar her şeyi görmezden geliyor.
CodesInChaos

1
@Raphael, OP’ün sorusu “Her olası sembol kombinasyonunun - yani her ifadenin - anlamlı geldiği bir programlama dili var mı?” - Cevabım "evet, işte yaklaşan bir örnek ve işte arkasındaki teori ." - OP’nin gereksinimlerini karşılayacak bir dil sınıfı için kesin kurallar koymak dışında , burada bilime ne kadar yer kaldığından emin değilim . Burada tam olarak görmeyi umduğunuz şeyin bir örneğini veya linkini verebilir misiniz? -- Teşekkür ederim.
BrainSlugs83

2
David ve Gilles bilgisayar bilimlerine cevap verirler. İlkeleri keşfediyorlar ve sadece "X bunu yapıyor (neredeyse)" demiyorlar. Cevaplarını okursanız, ikinci formun cevaplarının da oldukça sıkıcı olduğunu öğreneceksiniz. Bu senin hatan değil, fakat OP'nin - sorusu (bir bilgisayar bilimi sorusu olarak) sıkıcı; yanlış bir karmaşıklık hissi var.
Raphael

Bir kimse kolayca BF'yi "düzeltebilir", böylece herhangi bir dize kabul edilebilirdi: ]kaynağın sonunda tüm eşleşmemiş eşleşecek kadar eşleştirilecek kadar karakterin ve eşleşmemiş eşleşecek eşleşecek [kadar [başlangıçta varmış gibi davranırsınız ]. Anlambilimleri [ve ]kolayca bu onları eşdeğer hale getirmek için değiştirilebilir. (eşleşen varsa mesela ]o zaman [veri işaretçisi bayt sıfırsa sadece yürütme durur. ]Sadece benzer bir durumda programın başına atlar.) Ortaya çıkan dil tam Turing olacağını ve herhangi bir dize kabul ederim.
Nathaniel,
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.