Befunge - Befunge

Befunge
GeliştiriciChris Pressey
İlk ortaya çıktı1993 (1993)
İnternet sitesikedinin gözü.tc/ düğüm/ Befunge-93.html
Tarafından etkilenmiş
İleri, YANLIŞ

Befunge bir yığın tabanlı, yansıtıcı, ezoterik programlama dili. Programların iki boyutlu bir ızgarada düzenlenmesi açısından geleneksel dillerden farklıdır. "Ok" talimatları, kontrol akışını sola, sağa, yukarı veya aşağıya yönlendirir ve döngüler, bir döngüde kontrol akışını göndererek oluşturulur. "Arasında bir geçiş" olarak tanımlanmıştır. İleri ve Lemmings ".[1]

Layık bir arkadaş INTERCAL; doğrusal kontrol akışının gündelik sınırlamasından kaçan ve egzotik topolojilerle birden çok boyutta uçan program sayaçlarını kucaklayan bir bilgisayar dili ailesi.

Tarih

Dil başlangıçta tarafından oluşturuldu Chris Pressey[3] 1993'te Amiga için, derlemesi mümkün olduğu kadar zor bir dil tasarlama girişimi olarak. Unutmayın ki p komut sağlar kendi kendini değiştiren kod. Bununla birlikte, bir dizi derleyiciler sonradan yazılmıştır. Orijinal "Befunge-93" spesifikasyonuna yönelik bir dizi uzantı da mevcuttur, en önemlisi, konsepti rastgele bir boyut sayısına genişleten ve aynı alanda aynı anda çalışan birden çok talimat işaretçisi ile çok iş parçacıklı olabilen Funge-98. Befunge uzantıları ve varyantları denir Fungeoidler ya da sadece Mantarlar.

Befunge-93 özelliği, her geçerli programı dikey olarak 25 komutla yatay olarak 80 komutluk bir ızgarayla sınırlar. Bu sınırları aşan program yürütme "etrafını sarar" ızgaranın diğer tarafında karşılık gelen bir noktaya; bir Befunge programı bu şekilde topolojik olarak eşdeğer simit. Bir Befunge-93 programı yalnızca tek bir yığına sahip olabileceğinden ve depolama dizisi sınırlı olduğundan, Befunge-93 dili Turing tamamlandı (ancak, Befunge-93'ün sınırsız yığın kelime boyutuyla Turing Complete olduğu gösterilmiştir).[4] Daha sonraki Funge-98 spesifikasyonu şunları sağlar: Turing bütünlüğü programdaki boyut kısıtlamalarını kaldırarak; Funge-98 komut işaretçisinin hareketi, sabit bir sınırda dolaşmak yerine, yaratıcısı Chris Lahey'den sonra "Lahey-uzay" olarak adlandırılan bir modeli izler. Bu modelde ızgara, sarmalamaya göre sonlu boyutlu bir simit gibi davranırken, yine de sonsuza kadar genişlemesine izin verir.

Derleme

Belirtildiği gibi, Befunge'nin tasarım amacı, derlemesi zor bir dil yaratmaktı. Bu, kendi kendini değiştiren kod ('p' talimatı oyun alanına yeni talimatlar yazabilir) ve çok boyutlu bir oyun alanı (aynı talimat dört farklı yönde yürütülebilir) uygulanmasıyla denendi.

Yine de, bu engeller bir dereceye kadar aşılmış ve Befunge derleyicileri uygun teknikler kullanılarak yazılmıştır.

Standart Befunge-93 dağıtım kullanımlarına dahil olan bef2c derleyicisi dişli kod: her talimat bir C kod parçacığında derlenir ve kontrol, tıpkı bir Befunge yorumlayıcısında olduğu gibi (yani, koşullu olarak bir 'yön' kaydının değerine göre) parçacıklar arasında akar. Bu, iyi bir tercümana göre önemli bir avantaj sağlamaz. Bef2c derleyicisinin ne 'p' ne de dize modunu işlemediğinden doğru olmadığını, ancak bunu yapmanın imkansız olmayacağına dikkat edin (C dili bunun için pek uygun olmayabilir).

Betty derleyici örneğin, olası her düz komut satırını bir alt program olarak ele alır ve bir 'p' komutu bu alt programı değiştirirse, o alt program yeniden derlenir. Bu ilginç bir varyasyondur tam zamanında derleme ve bir yorumlayıcıya göre çok daha iyi bir avantajla sonuçlanır, çünkü birçok talimat 'yön' kaydında müdahale kararları vermeden yerel kodda yürütülebilir.

Örnek Befunge-93 kodu

Kontrol akışını değiştirmek için okları kullanma tekniği aşağıdaki rastgele sayı üreteci programında gösterilmektedir. Befunge komut işaretçisi sol üst köşede başlar ve yeniden yönlendirilmezse sağa doğru hareket eder. Etrafındaki okları takip ederek ? talimatlar, işaretçi bir rakama ulaşana kadar komut işaretçisini rastgele kardinal yönlerde gönderir ve onu yığına iter. Ardından oklar, . Yığından basamak çıkarmak ve işaretçiyi ilk yönlü rasgele dağıtıcıya döndürmek için. Yok @ Bu programı sonlandırmak için, 1'den 9'a kadar sonsuz bir rastgele sayı akışı üretir.

 v >>>>> v  12345  ^?^ > ? ?^  v? v  6789  >>>> v ^    .<

Aşağıdaki kod, klasik bir örnektir. "Selam Dünya!" program. Önce "olleH" harfleri istifin üzerine itilir. ASCII sayılar. Bunlar daha sonra yığından çıkarılır LIFO "Merhaba" vermek için metin karakterleri olarak sipariş ve çıktı. Bir boşluk, ASCII'de metin olarak çıktılanmadan önce 4 ve 8'in çarpılmasıyla oluşturulan 32 numaralı karakterdir. Kalan kod daha sonra "Dünya!" benzer şekilde, ardından ASCII karakter 10 (a satır besleme karakter, çıktı imlecini yeni bir satıra taşıma).

>              vv  ,,,,,"Merhaba"<>48*,          vv,,,,,,"Dünya!"<>25*,@

Aşağıdaki kod biraz daha karmaşık bir versiyondur. ASCII karakteri 10 (a satır besleme karakteri) yığına ekler ve ardından yığına "! dlrow, olleH" iter. Tekrar, LIFO sıralama, "H" nin artık yığının en üstünde olduğu ve ilk yazdırılan, "e" nin ikinci olduğu anlamına gelir ve bu böyle devam eder. Karakterleri yazdırmak için program bir döngü ilk önce yığındaki en yüksek değeri çoğaltan (yani şimdi yığın " n! dlrow, olleHH "). Sonra" _ "işlemi yinelenen değeri açacak ve sıfırsa sağa, aksi takdirde sola gidecektir. (Bu, boş bir yığın açarken" 0 döndüren "uyumlu bir yorumlayıcı olduğunu varsayar.) sola gider, açılır ve en üst değeri bir ASCII karakter. Daha sonra bir sonraki karakteri çoğaltır ve "_" testine geri döner, yığının geri kalanını boşalana kadar yazdırmaya devam eder ve böylece bir sonraki değer 0 olur, bu noktada "@" programı bitirir.

 >25*"! dlrow, olleH":v                  v:,_@                  >  ^

Befunge-93 talimat listesi

0-9Bu sayıyı yığının üzerine itin
+Ekleme: Pop a ve b, sonra it a+b
-Çıkarma: Pop a ve b, sonra it b-a
*Çarpma: Pop a ve b, sonra it a*b
/Tamsayı bölümü: Pop a ve b, sonra it b/a, 0'a yuvarlanır.
%Modulo: Pop a ve b, ardından tamsayı bölümünün kalanını itin b/a.
!Mantıksal NOT: Bir değer girin. Değer sıfırsa 1'e basın; aksi takdirde sıfırı itin.
`Şundan büyük: Pop a ve b, sonra eğer 1'e basın b>aaksi takdirde sıfır.
>Sağa hareket etmeye başlayın
<Sola hareket etmeye başlayın
^Yukarı hareket etmeye başlayın
vAşağı hareket etmeye başlayın
?Rastgele bir ana yönde hareket etmeye başlayın
_Bir değer girin; değer = 0 ise sağa, aksi takdirde sola hareket et
|Bir değer girin; değer = 0 ise aşağı, aksi takdirde yukarı taşı
"Dize modunu başlat: her karakterin ASCII değerini bir sonrakine kadar itin "
:Yığının üstünde yinelenen değer
\Yığının en üstünde iki değeri değiştirin
$Yığından değeri yükseltin ve atın
.Pop değeri ve bir tamsayı ve ardından bir boşluk olarak çıktı
,Pop değeri ve ASCII karakteri olarak çıktı
#Köprü: Sonraki hücreyi atla
pBir "koy" çağrısı (daha sonra kullanmak üzere bir değeri saklamanın bir yolu). Pop y, x, ve v, sonra da karakteri değiştirin (x,y) programda ASCII değerine sahip karaktere v
gBir "alma" çağrısı (depodaki verileri almanın bir yolu). Pop y ve x, ardından programda o konumda karakterin ASCII değerini itin
&Kullanıcıdan bir numara isteyin ve itin
~Kullanıcıdan bir karakter isteyin ve ASCII değerini itin
@Programı sonlandır
(Uzay)İşlem yok. Hiç birşey yapmıyor

Çoğu tek boyutlu programlama dilleri arasında bazı sözdizimsel ayrımlar gerekir. yorum metni ve kaynak kodu - bu ayrım kadar önemsiz olsa da Beyinsiz kümede olmayan herhangi bir karakterin +-[]<>,. bir yorumdur. Gibi diller Lisp ve Python dizeleri değerlerin kullanılmadığı bağlamlarda yorumlar olarak ele alın. Benzer şekilde, Befunge'de yorum sözdizimi yoktur: belgeleri koda gömmek için, programcı basitçe kontrol akışını yönlendirir etrafında "yorum" alanı, böylece o alandaki metin asla çalıştırılmaz.

Ayrıca bakınız

Referanslar

  1. ^ "Befunge SSS v.4". 1997-11-04. Arşivlenen orijinal 2001-04-17 tarihinde. Alındı 2014-01-23.
  2. ^ Raymond, Eric (2003-12-29). "Jargon Dosyası 4.4.7". Jargon Dosyası Metin Arşivi. Arşivlenen orijinal 2016-01-05 tarihinde. Alındı 2012-01-16.
  3. ^ Ais523 (2008-12-18). "Chris Pressey". Esolang. Alındı 2014-01-23.
  4. ^ Oerjan (2014-01-18). "Konuşma: Befunge". Esolang. Alındı 2014-01-23.

Dış bağlantılar