Forum: Diğer Konular RSS
BrainFuck
Ezoterik Programlama Dili
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: BrainFuck
Merhaba,

Fazla söze gerek yok, ismi yeter ama şu viki maddesinde kendisi hakkında Türkçe bilgi alabilirsiniz...:)

Ayrıca hemen şu js yorumlayıcısıyla, aşağıdaki sonsuza giden kodu deneyebilirsiniz:
(Debugger ile denemenizi ve Run to Breakpoint ile devam etmenizi öneririm)

++++++++++>>+>>+
[
    [
        +++++[<++++++++>-]<.
        >++++++[<-------->-]
        +<<<
    ]<.>>>>
    [
        -<[<+>>+<-]
        <[>+<-[>+<-[>+<-[>+<-[>+<-
            [>+<-[>+<-[>+<-[>+<-.
            [>[-]>>+>>[-]+<<<<<-
            [>+<-]]]]]]]]]]]
        >>[<<+>>-]
        +>>>
    ]<<<
]
Daniel B. Cristofani (cristofd@hevanet.com)
Kodun dilediğiniz yerine diyez(#~breakpoint) işareti koyunca orada durur  ve adım adım devam edebilirsiniz. Küçüktür (<~sola kayma) işaretinin soluna veya ekrana çıktı veren nokta (.) işareti sağına koymanızı öneririm...

Ezoterik bir dil olan BF, dosyalarının uzantıları kısaca .b veya karışıklık olmaması için .bf şeklinde adlandırılabiliyor. Basit bir şekilde C'ye dönüştürmek de mümkün:
/*
 * BF2C
 * Copyright (C) 2003 Thomas Cort
 * Code edited by Salih Dincer (2012.02.29)
 * Version:       1.0 -> 1.1b
 * Date:          2003-03-18
 * Description:   Converts Brainfuck source to C source
 * License:       GPL
 * Download:      http://web.archive.org/web/20031030035801/http://www.brainfuck.ca/BF2C.c
 * Developer:     Thomas Cort <tom@brainfuck.ca>
 * Interfaces:    Command Line
 */
 
#include<stdio.h>
 
int main(int argc, char **argv) {
  int pc,               /* program counter            */
      prog_len = 0;     /* length of program          */
  int c[32768];          /* storage space for the code */
  
  FILE *stream, *fopen();
  
  /* Open stream file */
  stream = fopen(argv[1], "r");
    
  /* read the file and store it in c[] */
  for (pc = 0; pc < 32768 && (c[pc] = getc(stream)) != EOF; pc++) prog_len++;
 
  /* Close stream file */
  fclose(stream);
 
  /* print the beginning of the program */
  printf("// %s convert...\n", argv[1]);
  printf("\n\nint main() {\nint m[255], x;\n");
  printf("for(x = 0; x < 255; x++) m[x] = 0;\nx=0;\n");
 
  /* visit every element that has part of the bf program in it */
  for(pc = 0; pc < prog_len; pc++) switch (c[pc]) {
    case 43: printf("m[x]++;\n");break;         // '+' increment current memory
    case 45: printf("m[x]--;\n");break;         // '-' decrement current memory
    case 62: printf("x++;\n");break;            // '>' increment pointer
    case 60: printf("x--;\n");break;            // '<' decrement pointer
    case 91: printf("while(m[x]!=0) {\n");break;// '[' if pointer is nonzero
    case 93: printf("}\n");break;               // ']' end loop
    case 46: printf("putchar(m[x]);\n");break;  // '.' output a character
    case 44: printf("m[x] = getchar();\n");     // ',' accept one byte of input
  }
  printf("}\n");  
  return 0;
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Turing Computation
Tekrar Merhaba...:)

Yukarıdaki dönüştürücüyü, D diline (yine D kodu üretecek şekilde) çevirmeye çalıştım ama putchar()'ın karşılığını bulamadım. Zaten D'ye çevirmek basit ama yine C kodu üretecek şekilde anlamsız olacaktı. Acaba _getc, _putc benzeri komutlarımız var mı?

Bu kafa zorlayan (!) programlama dilini biraz inceledim de diğer ezoterik diller nasıl bilmiyorum ama ASCII kod tablosu üzerinde gezinen bir Turing makinesinden (-bknz. Turing Computation) farksızmış. Örneğin geleneksel Merhaba Dünya BF kodunu inceleyelim. En basit haliyle C'ye aşağıdaki gibi çevrilebilir. Tabi işin için getchar() ve while() girince, (sanırım) neredeyse aklınıza gelebilecek her türlü yazılım yazılabilir gibi görünüyor. Kuramsal açıdan belleği arttırmakta mümkün olduğuna göre belki en fazla çok adımlı yavaş bir kodunuz olur. İlginç değil mi?
// helloworld.bf convert...
 
int m[255], x = 0;
 
void seekMem (int _x, int _m) {
    x += _x;
    m[x] += _m;
}
 
int main() {
    // Initialize...
    seekMem(0, 10);
    while(m[x] != 0) {
        seekMem(1, 7);
        seekMem(1, 10);
        seekMem(1, 3);
        seekMem(1, 1);
        seekMem(-4, -1);
    }
    // Printing...
    seekMem(1, 2);
    putchar(m[x])// print 'H'
    seekMem(1, 1);
    putchar(m[x])// print 'e'
    seekMem(0, 7);
    putchar(m[x])// print 'l'
    putchar(m[x])// print 'l'
    seekMem(0, 3);
    putchar(m[x])// print 'o'
    seekMem(1, 2);
    putchar(m[x])// print ' ' (space)
    seekMem(-2, 15);
    putchar(m[x])// print 'W'
    seekMem(1, 0);
    putchar(m[x])// print 'o'
    seekMem(0, 3);
    putchar(m[x])// print 'r'
    seekMem(0, -6);
    putchar(m[x])// print 'l'
    seekMem(0, -8);
    putchar(m[x])// print 'd'
    seekMem(1, 1);
    putchar(m[x])// print '!'
    seekMem(1, 0);
    putchar(m[x])// print \n
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-02-29, 07:22.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
He he! :) Bunlardan çok var. Aklıma gelen başka birisi de Whitespace dili. Yalnızca boşluk ve tab karakterlerinden oluşuyor:

  http://en.wikipedia.org/wiki/Whitespace_(programming_langu…

Bir de goto'nun tersi olan comefrom'u kullanan diller var:

  http://en.wikipedia.org/wiki/COMEFROM

Program akışını başka bir yere yönlendirmiyor da, başka bir yerden buraya çekiyor. (?) :)

Ali
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Vayy, Whitespace de çok seksi görünüyor. Aslında bir de BF2.0 varmış ve tıpkı karekod (QR code) gibi renkli kutular var. Hatta WS'yi görünce aklıma geldi. Belki bu yöntem ile basit karekodlar için yoğun içerikli uygulama (yazılım) gömülebilir.

Tamam, her türlü veri temsil edilebiliyor da belki atıştırmalık değil faydalı bir uygulama mümkündür; ne dersin? Gerçi ticari getirisi yoksa bunların hepsi boş şeyler olsa gerek...:)
"Ali Çehreli":
Bir de goto'nun tersi olan comefrom'u kullanan diller var:

  http://en.wikipedia.org/wiki/COMEFROM

Program akışını başka bir yere yönlendirmiyor da, başka bir yerden buraya çekiyor. (?) :)
Bir yaşıma daha girdim! İnsanların aklı nelere çalışıyormuş... 8-(

Ayrıca şurada ezoterik dillerin (WS dahil) resmi sitelerine yönlendirme var: http://esco.sourceforge.net/?page=elang

Orada en alttaki Befunge-93 sanki diğerlerinden ayrılıyor! Hatta 1998'de yeni sürümüyle (-bknz. Funge-98 Final Specification) çok iyi bir hale getirilmiş:
      Befunge-93                32-bit Befunge-98
      ==========                =================
   0      x     79                      |-2,147,483,648
  0+-------------+                      |
   |                                    |    x
   |                               -----+-----
  y|                  -2,147,483,648    |    2,147,483,647
   |                                    |
   |                                   y|2,147,483,647
 24+


Yine de BrainFuck (bundan sonra Befunge ile karışmaması için kısaltmayacağım!) basitliğini ve desteği iyimiş:
http://esoteric.sange.fi/brainfuck/

Salih Dinçer:
Yukarıdaki dönüştürücüyü, D diline (yine D kodu üretecek şekilde) çevirmeye çalıştım ama putchar()'ın karşılığını bulamadım. Zaten D'ye çevirmek basit ama yine C kodu üretecek şekilde anlamsız olacaktı. Acaba _getc, _putc benzeri komutlarımız var mı?

D dilinde, putchar()'ın tam karşılığı ne olabilir?

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-02-29, 09:27.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
D dilinde, putchar()'ın tam karşılığı ne olabilir?

Yine std.stdio.write:

    write(c);

Ali
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bunu denedim maalesef rakamlar çıkıyor...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
c'nin türü tamsayı ise tamsayı çıkar. Şöyle olur:

    write(cast(dchar)(c));

Eğer kesinlikle ASCII olduğunu biliyorsan:

    write(cast(char)(c));

Ali
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
cast() kullanmak aklıma gelmemişti, teşekkürler...

İşin ilginci char türünde bir dizi işlenmesine rağmen ekrana abidik gubidik karakterli (-bknz. aşağıdaki ilk iki satır) anlamsız şeyler çıkıyordu. Aslında D'nin bunu ilklediğine güvendiğim için sorunun başka yerde olduğunu düşünmüştüm. Kendim ilklediğimde ise sorun düzeldi (-bknz. diğer iki satır) ama fazla kod kullanmak içime sinmedi...:)
  @    Z    a    a    d   �    O    d    g    a    Y
 64,  90,  97,  97, 100,  28,  79, 100, 103,  97,  89,  29,   8
 72, 101, 108, 108, 111,  32,  87, 111, 114, 108, 100,  33,  10
  H    e    l    l    o         W    o    r    l    d    !


Ben de bahsettiğim gibi sorunu şu şekilde çözmek yerine:
// helloworld.bf convert...
import std.stdio;
 
char[255] m;
int x = 0;
: : :
void main() {
    // Initialize...
    for(x=0; x<255; x++) m[x] = 0;
    x = 0;
    : : :
.
int üzerinden hesaplatıp char türünde yazdırdım...
int[255] m;
    : : :
    writeln(cast(char)m[x]);
Özetle, cast() çok çok iyi bir yardımcı! Sanki D dili de C# gibi (herhalde CLR mimarisı üzerine inşaa edildiğinden olsa gerek!) önerdiği her yerde tür dönüşümü (C#!da Convert.To...) kullanmak zorundasınız! Bu C#'da bazen işkence haline alıyor ama D'de gerektiğinde kullanabilme serbestli çok hoş. HuffmanCode'da da işime çok yaramıştı.

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj 3 defa değişti; son değiştiren: Salih Dinçer; zaman: 2012-02-29, 21:10.
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Aslında D'nin bunu ilklediğine güvendiğim için

D, karakterleri yasal olmayan bir karakter değeri ile ilkler. Tablodaki "İlk Değeri" sütununda her karakter türü için farklı:

  http://ddili.org/ders/d/temel_turler.html

char[255] m;
// ...
    // Initialize...
    for (x=0; x<255; x++) m[x] = 0;

Daha kısa olarak: ;)

    char[255] m = '\0';

Özetle, cast() çok çok iyi bir yardımcı!

Öyle bir aracımızın olması güzel ama her kullandığımızda gerçekten gerekip gerekmediğine bakmalıyız.

Ali
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Çehreli:
Daha kısa olarak: ;)

    char[255] m = '\0';
Teşekkürler Ali Hocam, bunu da hatırlattığın çok iyi oldu; unutmuşum... :rolleyes:

Ancak yasal olmayan değeri bilmiyordum. Demek ki kullandığımız değişken türüne göre, her zaman 0 ile ilkleneceği aklımıza gelmemesi gerekiyor...:)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:17:15 (UTC -08:00)