Desafio - Compilador (Inventem uma liguagem)

Started by KTachyon, May 04, 2006, 03:44:16 AM

Previous topic - Next topic

KTachyon

Queria propor um projecto aki ao ppl para a criação de uma linguagem de programação. Podem dar ideias para a linguagem e sugerir alterações.

A primeira fase é inventar uma linguagem de programação para depois se poder criar o compilador. De preferência uma linguagem simples que apenas funciona em linha de comandos. Mais tarde pode-se melhorar a linguagem e aumentar o âmbito para janelas e gráficos, mas deixemos isto para mais tarde se a linguagem se for desenvolvendo.

Depois de inventada a linguagem, irei utilizar as ferramentas open source para a criação de um pseudo-compilador (que converte o código gerado para, por exemplo, C). As ferramentas são as seguintes:

Lex ou Flex
Yacc ou Bison
CC ou GCC

Para quem quiser ajudar no desenvolvimento do código, estas ferramentas são standard na maioria das distros de Linux, BSDs e em Mac OS X (com os Developer Tools). No Windows, existem umas quantas ferramentas que se podem sacar da net (www.google.com  ), no entanto não aconselho a utilização do Windows para programação (sucks).


Seria interessante a criação de uma linguagem de programação que tivesse piada e/ou que facilitasse a programação nessa linguagem.

Como é óbvio, existem algumas restrições ao desenvolvimento do projecto, como o facto de provávelmente todos os membros que queiram ajudar tenham outras actividades que ocupam uma certa quantidade de tempo, de forma a que se o projecto for muito lento a ser desenvolvido, penso k será normal.



Finalmente, vou tentar manter actualizada uma lista de participantes no projecto, quer sejam programadores ou apenas ppl que dá a sua contribuição para a linguagem e até (futuramente) designers para um logo da linguagem,...




Sugestões de base para a linguagem:
- Podiamos por exemplo criar uma linguagem associada ao forum dando origem a uma linguagem de programação do WebTuga, trazendo mais contribuição para o forum e publicando a linguagem em locais de prestígio.
- Podiamos fazer com que a linguagem de base fosse em português, ou k fosse cómica e/ou de fácil utilização.

Força nisso.




Equipa:

Desenvolvimento:
- KhAoTiK TaChYoN

Contribuição:
- kingless
- cenourinha
- LycosMan
- Pedrolopes
- revx
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

kingless

Ja tens alguma ideia sobre como vai ou pode ser o codigo da linguagem ?

lycosman

Eu alinho apesar de não fazer ideia de como se cria uma linguagem... Mas pra isso (pós n00bs nisto da criação de linguagens) podiamos criar um canal de IRC ou utilizar o do Webtuga (se o Tio Cenouras deixar claro) mas por acaso é uma ideia interessante... E se piuder ajudar contem comigo...
Hooray for chainsaws :3


Teotónio Ricardo

Tambem não faço ideia como fazer uma linguagem, mas poderiamos fazer uma linguagem simples, em que tivesse a sintaxe em Português!

Quanto ao canal, foi criar, mas primeiro temos de decidir o nome do projecto.

KTachyon

Basicamente, depois de termos a linguagem definida é apenas preciso criar um aceitador para a linguagem (utilizando o Lex e o Yacc, e depois criar a estruturas para os comandos da linguagem, as tabelas de símbolos, que contêm os nomes das variáveis utilizadas, as stacks, que contêm o espaço da memória k onde se colocam os valores das variáveis, e depois a transformação do código para C (para o Pseudo-compilador).

Depois do pseudo-compilador apenas é necessário correr um assemblador pelo código.

É de interesse inicial k a linguagem possa ter condicionais (ifs, k podiam ser Se xxx então, ou kk coisa parecida), definição de variáveis, funções, ciclos (faz ... até xxx),...
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

Teotónio Ricardo

Isso poderia ser uma linguagem adaptada a ensino, visto ser parecida com o pascal!
Basico!

kingless

tava a pensar o seguinte:


@webtuga = "portal";

 

se (@webtuga ig portal):

mostrar("Webtuga é um portal");

ou se (@webtuga dif portal):

mostrar("Webtuga não é um portal");

se;


@  -> variaveis.
ig  -> igual
dif -> diferente
mostrar -> como se fosse echo ou print.
se (): -> mesmo que if
ou se -> mesmo que else if
se; -> fechar se

LOOOL  : beer :

KTachyon

É uma ideia, mas não gosto muito do \\'ig\\'. Penso k podemos não permitir atribuições dentro dos \\'se\\', ou seja, um \\'=\\' fora de um \\'se\\' (ou kk outra instrução k permita comparação) é uma atribuição, caso contrário seria uma comparação.

Outra coisa é utilizar apenas caracteres dentro dos 127 caracteres ASCII para comandos, pois eu já fiz algumas experiências com analise de linguagens utilizando o Flex, e reparei k ele não gosta muito. Mais tarde talvez valha a pena um pekeno esforço para poder acertar esses pormenores, mas por enkuanto podemos simplificar as coisas para conseguir um compilador funcional.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

_K-D-E_

Well, ora aki está um optimo projecto!!!!!
Eu ALinho!!!
Podem contar com muito trabalho e ajuda da minha parte, embora seja noob no desenvolvimento d linguagens, kero aprender o mais rapido possível e ajudar-vos com este grande projecto!!!

Fikem bem

KTachyon

Ok. K tal utilizar-mos o esquema do C, mas de uma maneira mais legível?

Por exemplo:

if teste {
//...
}
else {
//...
}

Quando há parametros condicionais, ciclos for,... temos { e } para indicar k está tudo dentro no mesmo bloco. Na nossa linguagem, podiamos pensar em utilizar, por exemplo:

Se teste,
.
Senão,
//...
.

Ou seja, utilizaria-mos o . para indicar o fim de um bloco e a , para significar o seu início.

Outra kestão é ter em conta k os caracteres invisíveis (espaços e returns) não são contabilizados na linguagem, de modo a k poderiamos escrever perfeitamente:

Se o_teste_correu_bem, mostra(\\"K bem.\\"). Senão, mostra(\\"Estás na lama.\\").
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

Teotónio Ricardo


kingless

KhAoTiK_TaChYoN gostei da tua ideia!!  

Quando começamos a programar a linguagem ??  Estamos a espera de ti KhAoTiK_TaChYoN!!

revx

nao seria melhor \\'outro\\' em vez de \\'senão\\' ?

Já podias explicar como pretendes criar a linguagem ? (e o interpretador para puder instalar no pc) isso nao ficou muito claro...  : bom trabalho :
Carpe Ad Infinitum

_K-D-E_

yah temos k nos reunir pa falar sobre o projecto!!!
Eu ja adicionei o KhAoTiK_TaChYoN no msn, kem kiser, adicione no msn fisgazi@hotmail.com pa falar sobre este ganda projecto!!!

Fikem bem

malaquias_

[/align:21f41a222b]

KTachyon

QuoteKhAoTiK_TaChYoN gostei da tua ideia!!  

Quando começamos a programar a linguagem ??  Estamos a espera de ti KhAoTiK_TaChYoN!!

Ainda faltam acertar um pormenores:
- Como fazemos as funções
- Como passamos argumentos para as funções
- Como definimos as funções
- Tipos (inteiros, reais, strings,...)
- Definir a sensibilidade do código (se a para a linguagem SE = se = Se = sE ou se definimos como sendo coisas diferentes).
- ...

Depois, o início da programação, penso k vai ser relativamente lento para dar tempo para o ppl perceber em k ponto está.


Quotenao seria melhor \\'outro\\' em vez de \\'senão\\' ?

Penso k o \\'Senão\\' é mais adekuado, pk basicamente um \\'else\\' é um \\'senão\\'. Assim até dá para programar quase como se estivessemos a escrever em português. O problema é só o ã, k é capaz de dar uns problemas no Lex, mas se não der para o \\'senão\\' de início, axo k o \\'senao\\' serve perfeitamente.


QuoteJá podias explicar como pretendes criar a linguagem ? (e o interpretador para puder instalar no pc) isso nao ficou muito claro...  : bom trabalho :

A fase inicial é quase na totalidade feita em Lex e Yacc, que vão analizar akilo que lhe é dado. Por exemplo, o ficheiro escrito em Lex e Yacc, depois de compilado irá poder receber o código k nós keremos compilar e verifica se está bem escrito. Imagina k kerias escrever Se x = 0, (...), mas em vez disso escreves Sr x = 0, (...), a parte feita em Lex e Yacc não aceita o Sr, logo a compilação é abortada e dá a mensagem de erro.

Só mm no fim de tudo é k o programa vai compilar alguma coisa, pk até lá, apenas vai identificar erros, aceitando ou não o código.


Quanto às ferramentas, para os sistemas *nix (que tenham já o material para programação, k é standard em kuase todas as distros) já têm o lex e o yacc pela linha de comandos.

Para Windows, existe uma ferramenta aki, que serve de Lex e Yacc (embora nunca a tenha utilizado), e é necessário um compilador de C. O mais conhecido penso k é o Borland, mas existem outros como o Miracle C Compiler e MinGW, entre outros.
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

kingless

E quando é que vamos acertar  os pormenores ?

KTachyon

Definição de funções:

Define area_rect com largura, comprimento:

resultado = largura * comprimento

Retorna resultado.

(Retorna ou Devolve?)


Chamada de funções:

area = area_rect com 2, 4
ou

area = area_rect:2, 4
ou

area = [area_rect 2 4]

Isto é no caso de uma linguagem sem tipos definidos (ou seja, uma variável pode ser kk coisa... depois pode dar bode, lol - é possível prevenir isto sem ter k definir tipos, por isso continua a ser uma ideia). Um problema aqui é, como fazemos para separar duas expressões:

resultado = largura * comprimento

Retorna resultado.

Podemos assumir que há um return entre cada expressão, mas eu não gosto dessa abordagem. Prefiro k o código possa ser escrito sequencialmente. Talvez um ; ou mesmo uma , penso k não traz problemas:

resultado = largura * comprimento,

Retorna resultado.

Aki o . significa o final da definição da função, tal como significa o fim de um Se.


Podemos assumir que não há lookahead, ou seja, uma função tem k ser definida (e criada, coisa k aki está a ser feita em conjunto) antes de ser utilizada. E basicamente o código é todo escritode seguida sem nada de especial pelo meio.



Agora, ideias para o formato dos comentários? Utilizamos o conhecido // do C e do Java? Ou o ; do Lisp? Ou outra coisa kk?
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

KTachyon

Variáveis:

Pensei na ideia do kingless em utilizar o @ antes do nome das variáveis, num estilo semelhante ao do PHP, mas penso que não é realmente necessário. Podemos libertar as variáveis de sinais extra, embora um sinal como o @ pudesse facilitar a análise do código. Como preferem?
My Q4 estimate: Macs: 5.89M; iPods: 4.19M; iPhones: 30.0M; iPads: 18.05M; Revenue: 37.00B; EPS: 9.50
AAPL Q3 result: Macs: 4.02M; iPods: 6.80M; iPhones: 26.0M; iPads: 17.04M; Revenue: 35.02B; EPS: 9.32

kingless

Esta linguagem vai servir para criar o que ?