Ôla pessoal! desde que começei aprender,
progamação tive essa duvida e o Google não respondeu ao pé da letra!
a final como são criadas as linguagens de progamação tipo qual
o proficional que trabalha no dessenvolvimento de novas linguagens?
da dor di cabeça so de pensar como aquilo tudo que nos escrevemos
viram um monte de, uns e zeros :?:
Cada linguagem de programação surgiu com um propósito específico, não conheço a história de todas elas. E o profissional que trabalha no desenvolvimento delas é qualquer um que consiga montar um compilador hehe
As linguagens são criadas por meio de uma disciplina, que se aprende numa faculdade de Ciência da Computação chamada de “compiladores”. Um compilador possui um analizador léxico, um semântico e um linker(Para código nativo).
O analisador lexico confere se as palavras chaves da linguagem foram digitadas corretamente, enquanto o semântico confere se a sentença, ou seja, o conjunto de regras está correto. Ao final desse trabalho, o compilador traduz essas instruções em assembly, e o linker cuida de ligar esse resultado as libs que você usou, gerando o programa.
Compiladores são desenvolvidos em centros de pesquisas de empresas como a Intel, a Borland, Microsoft etc…
O profissional que desenvolve compiladores são os Cientistas da Computação. Pode-se perceber que Sistemas de Informação e Ciência da Computação são coisas completamente diferentes.
interesante o pessoal do,
Silicon Valley deve trabalhar bastante…
Hoje em dia criar uma linguagem não é tão complicado, basta pegar o java e criar uma linguagem em cima do java, como JRuby, Jython, Groovy, Ioke
Tudo q vc precisa é procurar resolver um problema para ter uma linguagem.
[quote=Felagund]Hoje em dia criar uma linguagem não é tão complicado, basta pegar o java e criar uma linguagem em cima do java, como JRuby, Jython, Groovy, Ioke
Tudo q vc precisa é procurar resolver um problema para ter uma linguagem.[/quote]
Na verdade é sim, em termos. O compilador dessas que citou são completamente diferentes. O trabalho do compilador é traduzir regras e sentenças. Criar um programa que faça isso é complicado. No final eles geram bytecodes pra vm, mas o analizador lexico, e o semântico deles são muito diferentes. Cada um de acordo com a propria linguagem.
uma linguagem é feita basicamente primeiro projetando um dialeto ou seja os simbolos e palavras q serão usadas nos comandos… depois é feito um compilador onde tem 3 etapas: analise lexica que basicamente é um filtro que varre o codigo a procura de palavras e simbolos invalidas no dialeto, analise semantica: aqui importa a ordem e como serão formados as palavras, as regras da gramatica criada, como deve surgir os comandos, em que ordem as palavras ficarao para determinado: comando, declaração, etc… (esta é a parte mais complexa…) e a 3 etapa a otimização do codigo e geração de um bytecode onde os comandos serão simplismente traduzidos a uma linguagem de nivel mais baixo… como assembly, bytecode da VM, etc…
quem faz este trabalho geralmente é um cientista da computação…
não é facil fazer um compilador… envolve muita teoria e é algo que tem que ser muito bem planejado…
O stallman levou a vida dele fazendo o gcc. Mas fez praticamente sozinho.
[quote=juliocbq][quote=Felagund]Hoje em dia criar uma linguagem não é tão complicado, basta pegar o java e criar uma linguagem em cima do java, como JRuby, Jython, Groovy, Ioke
Tudo q vc precisa é procurar resolver um problema para ter uma linguagem.[/quote]
Na verdade é sim, em termos. O compilador dessas que citou são completamente diferentes. O trabalho do compilador é traduzir regras e sentenças. Criar um programa que faça isso é complicado. No final eles geram bytecodes pra vm, mas o analizador lexico, e o semântico deles são muito diferentes. Cada um de acordo com a propria linguagem.[/quote]
Eu não quis dizer q é facil criar, disse q é menos complicado que a algum tempo atraz
haha eu sempre tive uma dúvida parecida com essa:
“Como é que foi criada a 1º linguagem de programação?”
A primeira linguagem de programação foi o assembly. Traduzia coisas tipo:
load 110
store 12a2
Para:
145232423
12353242342
(Mais ou menos isso)
A segunda traduzia:
int i = 10;
Para
load 110
store 12a2
E por aí vai…
as linguagens de programação são criadas uma em cima da outra, para que , no final, tudo vire zero e um direto na máquina. Java, por exemplo, foi programado em C.
[]´s
Superdivertido esse conceito de uma linguagem ser criada com base na outra para que, no final da cadeia, tudo vire pulsos elétricos e as coisas simplesmente funcionem. Sinistro!
Acho que não são criadas por meio da disciplina não… Compiladores é a principal área de linguagens de programação, mas não é fazendo a matéria que um indivíduo vai sair fazendo linguagens por aí (não leve no sentido da palavra… só achei estranho dizer que é por meio da disciplina que se constrói um compilador e uma linguagem).
Eu vejo um compilador por 5 partes: tabela de símbolos, analisador léxico, sintático, semântico e o linker (e as partes de baixo nível). A ordem de complexidade ‘aumenta’ nessa ordem mesmo. Melhor, dá pra dizer que um compilador tem 2 partes: vanguarda e retaguarda. A vanguarda é a parte onde as análises são feitas. A retaguarda é onde acontecem as ‘traduções’ pra baixo nível.
A análise léxica varre o código buscando por caracteres estranhos e vai classificando os lexemas. Então existe uma tabela de símbolos (dados pertencentes à linguagem, como o que é um número, o que é uma palavra reservada e assim por diante - são regras (também chamados de padrões) que ditam o que é o que) que o léxico usa pra fazer as identificações. Por exemplo, o código public class Classe { }
seria processado da seguinte maneira: começa pela primeira letra do arquivo e vai ler até achar um espaço em branco, armazenando os caracteres lidos. Nesse caso, quando chegar no caracter branco, temos a palavra “public”. O analisador léxico vai na tabela de símbolos e percorre ela, vendo em qual ‘classe’ se encaixa o “public”. Ele vai encontrar “public” no classe de palavras reservadas. Então ele adiciona “public” na classe de palavras reservadas. A mesma coisa acontece com “class”.
Quando chegar em “Classe” ele vai procurar na tabela pela palavra “Classe” (em números, palavras reseradas, pontuações, etc) na tabela de símbolos, mas se ele não achar, vai caracterizar a “Classe” como um identificador (que é uma linha da tabela de símbolos). E assim por diante… Com base nisso, dá pra colorir o código no editor de texto (claro que deve ser bem mais otimizado que isso, mas seria essa a ideia).
A fase de análise sintática vai pegar o código e montar uma árvore. Nessa fase, os lexemas (já as palavras, e não mais símbolo por símbolo) são verificadas de acordo com um outro padrão (que é a linguagem), que diz o que deve vir depois do que. Por exemplo, quando você tenta compilar o código
public class Classe {
vai apresentar uma mensagem de “Error while parsing”. Alguns compiladores (não sei se Java é assim) dizem logo de cara “Erro sintático na linha x”, que quer dizer que alguma coisa no seu código não está de acordo com a gramática da linguagem. Essa gramática é a definição formal do que a linguagem tem (procure por Backus-Naur Form). A gramática do Java pode ser conferida neste link (com grafo sintático e BNF) ou na especificação da linguagem da Sun. O “parsing” na mensagem de erro quer dizer (digamos) ‘ato de parsear’. O cara que cuida dessa análise sintática é o parser. De uma procurada por isso que você vai ter uma boa ideia do que é e pra que serve direito.
A análise semântica vai cuidar do resto (exceto da parte de geração de código de baixo nível), inclusive da otimização de código. Essa parte da otimização não é transformar um algoritmo n² em log(n), mas sim eliminar variáveis que não são usadas e ‘limpar’ o código de uma maneira geral. Por exemplo, se você escreveu esse método public static String retornaAlgumaCoisa() {
String algumaCoisa = "Alguma Coisa";
return algumaCoisa;
algumaCoisa = "Esse código nunca vai ser executado.";
}
a análise semântica vai cuidar de tirar aquela atribuição depois do return pra você. Isso é um exemplo bem simples, claro, mas existe algumas coisas mais complexas, como atribuir a uma variável um determinado valor pra depois nem usar mais ele. Eu to quebrado, senão escrevia mais coisas pra você.
A parte de geração de código intermediário também pode ser feito na semântica. A parte de geração de baixo nível é bastante dependente da máquina e sistema operacional. Essa parte eu não cheguei a estudar muito a fundo, mas é bem interessante.
Qualquer um pode desenvolver uma linguagem de programação… Não precisa ter graduação ou coisa do tipo. O que precisa é ter muita boa vontade de estudar, ler, programar e publicar uns papers. Eu sei que é um caminho mais extenso do que entrar me projetos de pesquisa e mestrado, mas conta também.
Esqueci de falar… Na léxica, quando ele não consegue achar à que classe pertence uma palavra, ela vai pra classe de erro. Por exemplo, uma variável de nome -teste não pode (em Java), então ela vai pro erro. Então quem diz as regras (padrões) a serem seguidos é a especificação da linguagem (nessa parte léxica geralmente quem faz isso são as expressões regulares).
Digamos que existem ‘ferramentas’ pra cada parte da análise. Na léxica, expressões regulares são bastante utilizadas (juntamente com autômatos). Na sintática, os algoritmos de parser são ferramentas essenciais (LR(0), LR(1), SLR(0), LRLS(0), etc - um deles foi até desenvolvimento pelo senhor Knuth). Nas outras eu não consigo me lembrar… Tem o Flex (não da Adobe), que é uma ferramenta bem legal (e simples) de se trabalhar… Ela lida com a parte léxica do negócio. Existem alguns frameworks pra Java já prontos para a análise sintática, como o JavaCC. Então você não precisa criar uma coisa do 0 (a léxica é bem fácil, mas dependendo do algoritmo que você usar na sintática pode ficar um pouco complexo), pode ir atrás de coisas já prontas que vai facilitar umonte.
O que infelizmente não é notado no mercado de trabalho fazer Ciência da Computação no Brasil ou Sistemas você acaba caindo sempre no mesmo lugar…
Acho que não são criadas por meio da disciplina não… Compiladores é a principal área de linguagens de programação, mas não é fazendo a matéria que um indivíduo vai sair fazendo linguagens por aí (não leve no sentido da palavra… só achei estranho dizer que é por meio da disciplina que se constrói um compilador e uma linguagem).
Eu vejo um compilador por 5 partes: tabela de símbolos, analisador léxico, sintático, semântico e o linker (e as partes de baixo nível). A ordem de complexidade ‘aumenta’ nessa ordem mesmo. Melhor, dá pra dizer que um compilador tem 2 partes: vanguarda e retaguarda. A vanguarda é a parte onde as análises são feitas. A retaguarda é onde acontecem as ‘traduções’ pra baixo nível.
A análise léxica varre o código buscando por caracteres estranhos e vai classificando os lexemas. Então existe uma tabela de símbolos (dados pertencentes à linguagem, como o que é um número, o que é uma palavra reservada e assim por diante - são regras (também chamados de padrões) que ditam o que é o que) que o léxico usa pra fazer as identificações. Por exemplo, o código public class Classe { }
seria processado da seguinte maneira: começa pela primeira letra do arquivo e vai ler até achar um espaço em branco, armazenando os caracteres lidos. Nesse caso, quando chegar no caracter branco, temos a palavra “public”. O analisador léxico vai na tabela de símbolos e percorre ela, vendo em qual ‘classe’ se encaixa o “public”. Ele vai encontrar “public” no classe de palavras reservadas. Então ele adiciona “public” na classe de palavras reservadas. A mesma coisa acontece com “class”.
Quando chegar em “Classe” ele vai procurar na tabela pela palavra “Classe” (em números, palavras reseradas, pontuações, etc) na tabela de símbolos, mas se ele não achar, vai caracterizar a “Classe” como um identificador (que é uma linha da tabela de símbolos). E assim por diante… Com base nisso, dá pra colorir o código no editor de texto (claro que deve ser bem mais otimizado que isso, mas seria essa a ideia).
A fase de análise sintática vai pegar o código e montar uma árvore. Nessa fase, os lexemas (já as palavras, e não mais símbolo por símbolo) são verificadas de acordo com um outro padrão (que é a linguagem), que diz o que deve vir depois do que. Por exemplo, quando você tenta compilar o código
public class Classe {
vai apresentar uma mensagem de “Error while parsing”. Alguns compiladores (não sei se Java é assim) dizem logo de cara “Erro sintático na linha x”, que quer dizer que alguma coisa no seu código não está de acordo com a gramática da linguagem. Essa gramática é a definição formal do que a linguagem tem (procure por Backus-Naur Form). A gramática do Java pode ser conferida neste link (com grafo sintático e BNF) ou na especificação da linguagem da Sun. O “parsing” na mensagem de erro quer dizer (digamos) ‘ato de parsear’. O cara que cuida dessa análise sintática é o parser. De uma procurada por isso que você vai ter uma boa ideia do que é e pra que serve direito.
A análise semântica vai cuidar do resto (exceto da parte de geração de código de baixo nível), inclusive da otimização de código. Essa parte da otimização não é transformar um algoritmo n² em log(n), mas sim eliminar variáveis que não são usadas e ‘limpar’ o código de uma maneira geral. Por exemplo, se você escreveu esse método public static String retornaAlgumaCoisa() {
String algumaCoisa = "Alguma Coisa";
return algumaCoisa;
algumaCoisa = "Esse código nunca vai ser executado.";
}
a análise semântica vai cuidar de tirar aquela atribuição depois do return pra você. Isso é um exemplo bem simples, claro, mas existe algumas coisas mais complexas, como atribuir a uma variável um determinado valor pra depois nem usar mais ele. Eu to quebrado, senão escrevia mais coisas pra você.
A parte de geração de código intermediário também pode ser feito na semântica. A parte de geração de baixo nível é bastante dependente da máquina e sistema operacional. Essa parte eu não cheguei a estudar muito a fundo, mas é bem interessante.
Qualquer um pode desenvolver uma linguagem de programação… Não precisa ter graduação ou coisa do tipo. O que precisa é ter muita boa vontade de estudar, ler, programar e publicar uns papers. Eu sei que é um caminho mais extenso do que entrar me projetos de pesquisa e mestrado, mas conta também.
Esqueci de falar… Na léxica, quando ele não consegue achar à que classe pertence uma palavra, ela vai pra classe de erro. Por exemplo, uma variável de nome -teste não pode (em Java), então ela vai pro erro. Então quem diz as regras (padrões) a serem seguidos é a especificação da linguagem (nessa parte léxica geralmente quem faz isso são as expressões regulares).
Digamos que existem ‘ferramentas’ pra cada parte da análise. Na léxica, expressões regulares são bastante utilizadas (juntamente com autômatos). Na sintática, os algoritmos de parser são ferramentas essenciais (LR(0), LR(1), SLR(0), LRLS(0), etc - um deles foi até desenvolvimento pelo senhor Knuth). Nas outras eu não consigo me lembrar… Tem o Flex (não da Adobe), que é uma ferramenta bem legal (e simples) de se trabalhar… Ela lida com a parte léxica do negócio. Existem alguns frameworks pra Java já prontos para a análise sintática, como o JavaCC. Então você não precisa criar uma coisa do 0 (a léxica é bem fácil, mas dependendo do algoritmo que você usar na sintática pode ficar um pouco complexo), pode ir atrás de coisas já prontas que vai facilitar umonte.[/quote]
Opa meu amigo… tabela de símbolos se enquadra em analisador Léxico, pois ele apenas verifica se tal token está correto ou existe dentro da linguagem, incluíndo símbolos.
Acho que não são criadas por meio da disciplina não… Compiladores é a principal área de linguagens de programação, mas não é fazendo a matéria que um indivíduo vai sair fazendo linguagens por aí (não leve no sentido da palavra… só achei estranho dizer que é por meio da disciplina que se constrói um compilador e uma linguagem).
Eu vejo um compilador por 5 partes: tabela de símbolos, analisador léxico, sintático, semântico e o linker (e as partes de baixo nível). A ordem de complexidade ‘aumenta’ nessa ordem mesmo. Melhor, dá pra dizer que um compilador tem 2 partes: vanguarda e retaguarda. A vanguarda é a parte onde as análises são feitas. A retaguarda é onde acontecem as ‘traduções’ pra baixo nível.
A análise léxica varre o código buscando por caracteres estranhos e vai classificando os lexemas. Então existe uma tabela de símbolos (dados pertencentes à linguagem, como o que é um número, o que é uma palavra reservada e assim por diante - são regras (também chamados de padrões) que ditam o que é o que) que o léxico usa pra fazer as identificações. Por exemplo, o código public class Classe { }
seria processado da seguinte maneira: começa pela primeira letra do arquivo e vai ler até achar um espaço em branco, armazenando os caracteres lidos. Nesse caso, quando chegar no caracter branco, temos a palavra “public”. O analisador léxico vai na tabela de símbolos e percorre ela, vendo em qual ‘classe’ se encaixa o “public”. Ele vai encontrar “public” no classe de palavras reservadas. Então ele adiciona “public” na classe de palavras reservadas. A mesma coisa acontece com “class”.
Quando chegar em “Classe” ele vai procurar na tabela pela palavra “Classe” (em números, palavras reseradas, pontuações, etc) na tabela de símbolos, mas se ele não achar, vai caracterizar a “Classe” como um identificador (que é uma linha da tabela de símbolos). E assim por diante… Com base nisso, dá pra colorir o código no editor de texto (claro que deve ser bem mais otimizado que isso, mas seria essa a ideia).
A fase de análise sintática vai pegar o código e montar uma árvore. Nessa fase, os lexemas (já as palavras, e não mais símbolo por símbolo) são verificadas de acordo com um outro padrão (que é a linguagem), que diz o que deve vir depois do que. Por exemplo, quando você tenta compilar o código
public class Classe {
vai apresentar uma mensagem de “Error while parsing”. Alguns compiladores (não sei se Java é assim) dizem logo de cara “Erro sintático na linha x”, que quer dizer que alguma coisa no seu código não está de acordo com a gramática da linguagem. Essa gramática é a definição formal do que a linguagem tem (procure por Backus-Naur Form). A gramática do Java pode ser conferida neste link (com grafo sintático e BNF) ou na especificação da linguagem da Sun. O “parsing” na mensagem de erro quer dizer (digamos) ‘ato de parsear’. O cara que cuida dessa análise sintática é o parser. De uma procurada por isso que você vai ter uma boa ideia do que é e pra que serve direito.
A análise semântica vai cuidar do resto (exceto da parte de geração de código de baixo nível), inclusive da otimização de código. Essa parte da otimização não é transformar um algoritmo n² em log(n), mas sim eliminar variáveis que não são usadas e ‘limpar’ o código de uma maneira geral. Por exemplo, se você escreveu esse método public static String retornaAlgumaCoisa() {
String algumaCoisa = "Alguma Coisa";
return algumaCoisa;
algumaCoisa = "Esse código nunca vai ser executado.";
}
a análise semântica vai cuidar de tirar aquela atribuição depois do return pra você. Isso é um exemplo bem simples, claro, mas existe algumas coisas mais complexas, como atribuir a uma variável um determinado valor pra depois nem usar mais ele. Eu to quebrado, senão escrevia mais coisas pra você.
A parte de geração de código intermediário também pode ser feito na semântica. A parte de geração de baixo nível é bastante dependente da máquina e sistema operacional. Essa parte eu não cheguei a estudar muito a fundo, mas é bem interessante.
Qualquer um pode desenvolver uma linguagem de programação… Não precisa ter graduação ou coisa do tipo. O que precisa é ter muita boa vontade de estudar, ler, programar e publicar uns papers. Eu sei que é um caminho mais extenso do que entrar me projetos de pesquisa e mestrado, mas conta também.
Esqueci de falar… Na léxica, quando ele não consegue achar à que classe pertence uma palavra, ela vai pra classe de erro. Por exemplo, uma variável de nome -teste não pode (em Java), então ela vai pro erro. Então quem diz as regras (padrões) a serem seguidos é a especificação da linguagem (nessa parte léxica geralmente quem faz isso são as expressões regulares).
Digamos que existem ‘ferramentas’ pra cada parte da análise. Na léxica, expressões regulares são bastante utilizadas (juntamente com autômatos). Na sintática, os algoritmos de parser são ferramentas essenciais (LR(0), LR(1), SLR(0), LRLS(0), etc - um deles foi até desenvolvimento pelo senhor Knuth). Nas outras eu não consigo me lembrar… Tem o Flex (não da Adobe), que é uma ferramenta bem legal (e simples) de se trabalhar… Ela lida com a parte léxica do negócio. Existem alguns frameworks pra Java já prontos para a análise sintática, como o JavaCC. Então você não precisa criar uma coisa do 0 (a léxica é bem fácil, mas dependendo do algoritmo que você usar na sintática pode ficar um pouco complexo), pode ir atrás de coisas já prontas que vai facilitar umonte.[/quote]
O que eu quis dizer é que a disciplina de compiladores é essencial para quem desenvolve esse tipo de ferramenta.
As ferramentas mais usadas nesse meio são todas opensource. O Flex e o Bison, sendo esses portados para java também. JBison e JFlex.