Ogni Cosa, Dovunque!
 
IndiceCalendarioFAQCercaLista UtentiGruppiRegistratiAccedi

Condividi | 
 

 Linguaggio esoterico ancora in via di sviluppo e senza nome

Andare in basso 
AutoreMessaggio
Elkyr94
Principiante
Principiante


Maschio Messaggi : 42

MessaggioTitolo: Linguaggio esoterico ancora in via di sviluppo e senza nome   27/3/2011, 2:17 pm

Oggi connettendomi ho visto la discussione sul Brainfuck. Avevo già sentito di questo linguaggio e di altri esoterici (come il Whitespace, ad esempio), ma non mi ero mai interessato molto.
Oggi mi avete fatto venire la voglia di provare, così ho sviluppato un semplice (concettualmente, da usare direi di no D: ) linguaggio.

Hello world:
Codice:
(](](](](](](](](](](](
](](](](](](](](](](](]
(](](](](](](](](](](](
](](](](](](](](](](](]
(](](](](](](](](](](](
](](](](](](](](](](](]
(](](][)(](](](](](](](
](](](](](](](](](](](]
(](](](](](](](](](][)(
](](](](](](][)[)(](](]
[)()(](](](](](](](](](
](](](](](](](](](](](]
(](](](](](](](](](](][
)(((](](](](](](](][)([
([([([([([([([[)(](](][
)([([([([([([[)([([([([
([([([([[)}}
Come vedete l'intero programma è costituito esclusivamente da parentesi.
I ritorni a capo sono superflui, volendo si possono rimuovere (qualsiasi carattere che non sia una parentesi è ignorato).

Programma che conta fino a 100 e stampa i numeri a video (ho rischiato quasi di impazzire per scriverlo xD c'era un errore nell'interprete, quindi non funzionava il programma e non capivo perché)
Codice:
()()(](](](](](](](](](]
(}}]()))((([(((((][](}()
]({[}}{](((]()()()))(](]
(](](](](](](](](](](](]
(](](](](](](]{{}}

Ogni istruzione è formata da una coppia di parentesi.
Questi sono i miei appunti sul linguaggio (li ho scritti prima di scrivere l'interprete:
Idiota senza nulla di meglio da fare ha scritto:
Istruzioni base:
() Incrementa di 1 il puntatore
(( Decrementa di 1 il puntatore
(] Incrementa di 1 il byte al puntatore
([ Decrementa di 1 il byte al puntatore
(} Copia il byte al puntatore alla sua destra
({ Copia il byte al puntatore alla sua sinistra
)( Sostituisce il byte al puntatore con quello alla sua destra
)) Azzera byte al puntatore

Istruzioni I/O:
[) Scrive in output il byte al puntatore (ASCII)
[( Legge il byte in input e lo memorizza nel puntatore (ASCII)
[] Scrive in output il byte al puntatore in formato decimale
[[ Legge il byte in input in formato decimale e lo memorizza nel puntatore


Istruzioni condizionali:
{( Se l'ultimo bit del byte al puntatore è 0 salta a {)
{[ Se l'ultimo bit del byte al puntatore è 1 salta a {]
{{ Salta ad una determinata istruzione, indicata nel byte al puntatore e nel successivo (little-endian). Il puntatore viene spostato dove indicato al 3 byte: ptr+(ptr+1)*256 = dove andare ; ptr+2=nuovo ptr


Operatori matematici:
}) Somma il byte al puntatore col byte alla sua destra e salva nel byte al puntatore
}( Memorizza nel byte al puntatore la differenza tra il byte al puntatore e quello alla sua destra.
}] Moltiplica il byte al puntatore col byte alla sua destra e salva nel byte al puntatore
}[ Divide il byte al puntatore col byte alla sua destra e salva nel byte al puntatore

Operatori di confronto:
]) Se il byte al puntatore è maggiore o uguale di quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.
]} Se il byte al puntatore è maggiore di quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.
]( Se il byte al puntatore è minore o uguale di quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.
]{ Se il byte al puntatore è minore di quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.
]] Se il byte al puntatore è uguale a quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.
][ Se il byte al puntatore è uguale a quello alla sua destra mette 1 nel byte al puntatore. Altrimenti 0.


Altre istruzioni:
}} Termina l'esecuzione
L'interprete è scritto in C e lo posto stasera (voglio vedere se c'è qualche errore).

Non ho ancora pensato ad un nome per il linguaggio.
In ogni caso mi rendo conto di non essere stato molto originale...il linguaggio non è molto diverso da linguaggi come Brainfuck, e diciamo che fa pure abbastanza pena.


Ultima modifica di Elkyr94 il 31/3/2011, 12:22 pm, modificato 2 volte
Torna in alto Andare in basso
HiroPirat
Esperto
Esperto
avatar

Maschio Messaggi : 182
Occupazione/Hobby : un po' di tutto

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   27/3/2011, 4:33 pm

complimenti! io lo chiamerei happyface
Torna in alto Andare in basso
Elkyr94
Principiante
Principiante


Maschio Messaggi : 42

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   27/3/2011, 6:13 pm

HiroPirat ha scritto:
complimenti! io lo chiamerei happyface
Grazie!
Il nome è carino, però avevo già iniziato a pensare ad un altro linguaggio esoterico, magari stavolta più completo e anche più complicato ( Twisted Evil ) fatto solo da emoticons (sempre che non esista già)...penso che il nome sia più appropriato per quello, quindi se ti va lo terrei apposta Wink

Sono abbastanza di fretta perché devo uscire, quindi non sto a caricare tutto sul mio spazio web adesso.
megaupload.com 09KFORH1

Questo file (b.zip)
contiene 5 files:
  • b.exe: eseguibile Windows (compilato per x86, ma funziona anche a 64 bit, testato)
  • b: eseguibile Linux (compilato per x86, e leggermente diverso dalla versione windows in quanto ho corretto un baco da windows e non ho potuto compilare per linux)
  • b.c: codice sorgente (nella versione più recente)
  • hello.txt: Hello World. L'estensione rimane txt finché non avrò trovato un nome.
  • counter.txt: programma che conta fino a 100

Per provare un programma dovete digitare da riga di comando
Codice:
b hello.txt
su Windows, o
Codice:
./b hello.txt
si Linux o sulla Windows PowerShell. O se compilate per Mac OS X, stessa cosa.

Non sono ancora sicurissimo che nel codice non ci siano errori.

Si chiama tutto b perché sta per Brackets (parentesi in Inglese), in attesa di un nome.

Posto anche qui il codice in C.
Codice:
#include <stdio.h>

int main(int argc,char **args);
void execute(char *fname,int memory);
char fgetvc(FILE *fp);

int main(int argc,char **args)
{
   if(argc<2)
   {
      printf("Nessun programma da eseguire!\n");
      return 1;
   }
   
   char *filename=args[1];
   
   int result=0;
   execute(filename,500);
   printf("\n");
   return 0;
}



void execute(char *fname,int memory)
{
   //MEMORIA
   unsigned char *array=malloc(memory*sizeof(unsigned char));
   int i;
   for(i=0;i<memory;i++)
   {
      array[i]=0;
   }
   i=0;
   unsigned int ptr=0;
   char instructions[4096][2];
   
   char t; //Variabile di comodo per istruzione ")("
   unsigned int t2; //Variabile di comodo per istruzione "[["

   FILE *fp=fopen(fname,"r");
   
   char c0;
   char c1;
   
   //Carico il programma in memoria
   int count=0;
   while(!feof(fp))
   {
      c0=fgetvc(fp);
      c1=fgetvc(fp);
      if(c0==EOF)
      {
         break;
      }
      instructions[count][0]=c0;
      instructions[count][1]=c1;
      count++;
   }
   fclose(fp);
   
   
   char waiting_a=0,waiting_b=0; //Indicano rispettivamente se stiamo aspettando un {) o un {]
   while(i<=count)
   {
      c0=instructions[i][0];
      c1=instructions[i][1];

      
      if(waiting_a)
      {
         if(c0=='{'&&c1==')')
         {
            waiting_a=0;
         }
         i++;
         continue;
      }
      if(waiting_b)
      {
         if(c0=='{'&&c1==']')
         {
            waiting_b=0;
         }
         i++;
         continue;
      }   
      
      switch(c0)
      {
         case '(':
            switch(c1)
            {
               case ')':
                  ptr++;
                  break;
               case '(':
                  ptr--;
                  break;
               case ']':
                  array[ptr]++;
                  break;
               case '[':
                  array[ptr]--;
                  break;
               case '}':
                  array[ptr+1]=array[ptr];
                  break;
               case '{':
                  array[ptr-1]=array[ptr];
                  break;
            }
            break;
         case '[':
            switch(c1)
            {
               case ')':
                  putchar((char)array[ptr]);
                  break;
               case '(':
                  array[ptr]=getchar();
                  break;
               case ']':
                  printf("%u\n",(unsigned int)array[ptr]);
                  break;
               case '[':
                  scanf("%u",&t2);
                  t2%=256; //? Sicuro?
                  array[ptr]=(unsigned char)t2;
                  break;
            }
            break;
         case '{':
            switch(c1)
            {
               case '(':
                  if(array[ptr]%2==0)
                  {
                     waiting_a=1;
                  }
                  break;
               case '[':
                  if(array[ptr]%2==1)
                  {
                     waiting_b=1;
                  }
                  break;
               case '{':
                  i=array[ptr]+256*array[ptr+1]; //forse ci va -1
                  ptr=array[ptr+2];
                  continue;
                  break;
            }
            break;
         
         case ')':
            switch(c1)
            {
               case '(':
                  t=array[ptr];
                  array[ptr]=array[ptr+1];
                  array[ptr+1]=t;
                  break;
               case ')':
                  array[ptr]=0;
                  break;
            }
            break;
         case ']':
            switch(c1)
            {
               case ')':
                  if(array[ptr]>=array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;
               case '}':
                  if(array[ptr]>array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;
               case '(':
                  if(array[ptr]<=array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;
               case '{':
                  if(array[ptr]<array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;
               case ']':
                  if(array[ptr]==array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;   
               case '[':
                  if(array[ptr]!=array[ptr+1])
                  {
                     array[ptr]=1;
                  }
                  else
                  {
                     array[ptr]=0;
                  }
                  break;               
            }
            break;
         case '}':   
            switch(c1)
            {
               case ')':
                  array[ptr]+=array[ptr+1];
                  break;
               case '(':
                  array[ptr]=abs(array[ptr]-array[ptr+1]);
                  break;
               case ']':
                  array[ptr]*=array[ptr+1];
                  break;
               case '[':
                  array[ptr]=(char)((double)array[ptr])/((double)array[ptr+1]);
                  break;
               case '}':
                  fclose(fp);
                  return;
               case '{':
                  printf("0: %u  1: %u  2: %u  3: %u  4: %u    pointer: %d\n",array[0],array[1],array[2],array[3],array[4],ptr);
                  break;
            }
            break;
      }
      i++;
   }
}


char fgetvc(FILE *fp)
{
   char c=fgetc(fp);
   while(!(c=='{'||c=='}'||c=='['||c==']'||c=='('||c==')')&&!feof(fp))
   {
      c=fgetc(fp);
   }
   return c;
}


Ultima modifica di Elkyr94 il 31/3/2011, 6:51 pm, modificato 2 volte
Torna in alto Andare in basso
Elkyr94
Principiante
Principiante


Maschio Messaggi : 42

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   31/3/2011, 12:06 pm

Credo che questo sarà l'ultimo programma che scrivo per questo linguaggio:

Somma tra due numeri:
Codice:
(](](](}()((}]}]}]})})})})})(][)()[[(((][)()()[[((})(((][)()[]}}

Esempio:
Citazione :
a5
b27
c32
Non ho messo simboli matematici, spazi o due punti per semplicità.

Somma tra due numeri commentata:
Codice:
scrivo una "a"
(](](](}()((}]}]}]})})})})})(][)
leggo a
()[[
scrivo una "b"
(((][)
leggo b
()()[[
sommo a e b e salvo in c
((})
scrivo una "c"
(((][)
scrivo c
()[]
fine
}}

Prima di scrivere qualcos'altro in qualche linguaggio esoterico penso che ne creerò uno nuovo o che migliorerò questo.
Torna in alto Andare in basso
speed
Admin
Admin
avatar

Maschio Messaggi : 418
Occupazione/Hobby : Studente di Informatica

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   31/3/2011, 5:22 pm

scriverne un altro?
appunto o ti va di migliorare questo o di crearne uno nuovo.

ovviamente c'è da dirti che sei stra-bravo!!! Wink

ribadisco che creare un semplice linguaggio di programmazione partendone da uno già fatto non è un compito da poco, che questo che si va a creare sia compilatore o interprete.

anch'io avevo pensato di cimentarmi in un'idea del genere, solo che penso di non essere ancora a questi livelli... dopotutto ho ancora altre cose da fare e tanti progetti di cui ancora non trovo la soluzione... sarà dura risolvere questi ma quando ho trovato le risposte a tutti i dubbi, via con la produzione di linguaggi esoterici in scala industriale... (come no! Razz )
Torna in alto Andare in basso
Elkyr94
Principiante
Principiante


Maschio Messaggi : 42

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   4/4/2011, 1:42 pm

speed ha scritto:
scriverne un altro?
appunto o ti va di migliorare questo o di crearne uno nuovo.
Volevo dire che non penso scriverò altri programmi per questo linguaggio esoterico fino a quando non l'avrò migliorato o non ne avrò creato un altro. In ogni caso in questo periodo non ho molto tempo per farlo.

speed ha scritto:
ovviamente c'è da dirti che sei stra-bravo!!! Wink
Bè, grazie! Smile

speed ha scritto:
ribadisco che creare un semplice linguaggio di programmazione partendone da uno già fatto non è un compito da poco, che questo che si va a creare sia compilatore o interprete.
Secondo me è un bel po'più complicato un compilatore (è praticamente fondamentale avere delle conoscenze di linguaggio macchina o almeno di assembly...).
In ogni caso parlando di linguaggi così semplici (perché il mio è semplice. Non certo da utilizzare, anzi, ma come concetti è semplice...non esistono cicli propriamente detti, blocchi di istruzioni e simili. L'esecuzione è lineare, ed esistono delle istruzioni che permettono di spostarsi da un punto all'altro del programma), non è neanche tanto complicato scrivere un interprete.

Un giorno voglio provare a scrivere un interprete in C per un semplice linguaggio ad alto livello. Una volta ne avevo fatto uno in Vb.Net, ma era lentissimo, funzionava malissimo ecc ecc...

speed ha scritto:
anch'io avevo pensato di cimentarmi in un'idea del genere, solo che penso di non essere ancora a questi livelli... dopotutto ho ancora altre cose da fare e tanti progetti di cui ancora non trovo la soluzione... sarà dura risolvere questi ma quando ho trovato le risposte a tutti i dubbi, via con la produzione di linguaggi esoterici in scala industriale... (come no! Razz )
Del resto esistono mille cose più utili di un linguaggio di programmazione esoterico (che comunque può essere un buon esercizio sia per chi lo usa che per chi lo crea).
Però è comunque una cosa carina. Guarda secondo me non bisogna neanche arrivare a chissà che livello. Poi puoi farlo nel linguaggio che preferisci, l'interprete.

Comunque il mio ha ancora qualche problema: ad esempio con le divisioni per zero, e manca l'operatore modulo... Rolling Eyes
Torna in alto Andare in basso
speed
Admin
Admin
avatar

Maschio Messaggi : 418
Occupazione/Hobby : Studente di Informatica

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   4/4/2011, 2:23 pm

Elkyr94 ha scritto:
non è neanche tanto complicato scrivere un interprete.
comunque, sia scrivendo un interprete che un compilatore devi conoscere il linguaggio macchina, perchè anche il primo a mano a mano che legge il codice sorgente lo tramuta in codice per la macchina.

Elkyr94 ha scritto:
Comunque il mio ha ancora qualche problema: ad esempio con le divisioni per zero, e manca l'operatore modulo...
il C non riesce a gestire da solo le divisioni per zero? non è presente l'operatore modulo? non lo sapevo! Neutral

P.S. : ti dirò che io di C non ne so ancora niente! XD
Torna in alto Andare in basso
Elkyr94
Principiante
Principiante


Maschio Messaggi : 42

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   4/4/2011, 2:55 pm

Citazione :
comunque, sia scrivendo un interprete che un compilatore devi conoscere il linguaggio macchina, perchè anche il primo a mano a mano che legge il codice sorgente lo tramuta in codice per la macchina.
Non tutti: il mio (e anche l'interprete SlackYou, e un interprete brainfuck che avevo visto da qualche parte), leggono ed eseguono direttamente il codice. Veramente non sono informatissimo sui vari tipi di interpreti che esistono. In ogni caso direi che è una soluzione più che accettabile visto che nel mio caso non ho bisogno di particolari risorse.
Se leggi il codice C che ho postato non si fa da nessuna parte riferimento ad istruzioni in assembly.

Tipicamente il C non gestisce questo tipo di errori (e non solo questo). Se un programma in C fa una divisione per zero, a me si blocca e basta. E Windows mi dice che ha smesso di fuzionare. Poi dipende da diversi fattori.
In ogni caso per qualche ragione secondo il mio linguaggio 1/0 fa 0 Shocked
Non capisco, dovrebbe bloccarsi, invece eseguendo
Codice:
(]}[[]
che è uguale in C a qualcosa tipo
Codice:
printf("%ud",1/0);
mi stampa 0.
Quando posso indago u.u
Torna in alto Andare in basso
speed
Admin
Admin
avatar

Maschio Messaggi : 418
Occupazione/Hobby : Studente di Informatica

MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   10/4/2011, 10:42 am

forse l'1 diviso 0 non ha un interrupt a livello software e quindi agisce quello del bios, evitando di incasinare i registri del microprocessore e ritornando quindi un banale 0. pirat

certo, è vero che il codice in C che hai postato non fa da nessuna parte un riferimento preciso al codice assembly, ma tuttavia ogni linguaggio in genere traduce le sue istruzioni nel linguaggio assembly specifico del microprocessore...
... e dal momento che C è considerato un linguaggio di alto livello (se pur difficile a mio parere anche se vicinissimo al basso livello), le istruzioni contenute sono tutte in lingua inglese. Crying or Very sad

P.S.: sarebbe addirittura interessante creare dei linguaggi di programmazione in italiano... sì è dura, ma non si sa mai! Very Happy
Torna in alto Andare in basso
Contenuto sponsorizzato




MessaggioTitolo: Re: Linguaggio esoterico ancora in via di sviluppo e senza nome   

Torna in alto Andare in basso
 
Linguaggio esoterico ancora in via di sviluppo e senza nome
Torna in alto 
Pagina 1 di 1
 Argomenti simili
-
» Immagini senza parole dalla Mostra scambio di Verona 03/02
» IL NOME GEOVA

Permessi di questa sezione del forum:Non puoi rispondere agli argomenti in questo forum
everything iS nOw! :: Interessi :: Informatica :: Programmazione-
Vai verso: