Conversão De Códigos Ada Para C/c++ 28.05.16 21:47
Olá a todos :)
Ada, uma linguagem de programação OO, muito poderosa por sinal, mas muito pouco conhecida, então, neste artigo, vou mostrar como converter seus códigos de C/C++ para ada, e de Ada para C/C++. Mas antes, eu vou fazer uma introdução a linguagem, para que você possa conhecer um pouco da linguagem e de sua sintaxe :)
Obs: Apenas irei mostrar as principais formas de converter o código, assim, não irei apresentar algumas formas de conversão.
Sendo assim, eu vou separar este artigo em 4 partes:
{0.0} -- Informações importantes.
{1.0} -- Introdução a linguagem de programação Ada.
{2.0} -- Conceitos básicos da conversão.
{3.0} -- Exemplo.
>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<
{0.0} Informações importantes
OS: Ubuntu 11.04
Compilador Ada: gnat
Compilador C & C++: gcc & g++
{1.0} Introdução a linguagem de programação Ada
"Ada é uma Linguagem de programação estruturada, de tipagem estática, é uma linguagem imperativa, orientada a objetos e é uma linguagem de alto nível."
Estrutura basica de um programa em Ada
-- declarações das bibliotecas
procedure nome_do_programa is
-- variaveis
begin
-- corpo do programa
end nome_do_programa;
Para deixar mais claro a estrutura do programa, segue um exemplo de um simples Olá mundo em Ada...
with Ada.Text_IO; use Ada.Text_IO;
procedure main is
begin
put_line("Ola mundo");
end main;
O comando put_line, pertence a biblioteca, Text_IO, o uso do comando "use", não é estritamente necessário, como você pode ver neste exemplo:
with Ada.Text_IO;
procedure main is
begin
Ada.Text_IO.put_line("Ola mundo");
end main;
Ao contrário de C, que tem uma função principal(main), qualquer procedimento sem parâmetros pode ser uma rotina "main". O processo assim designado é escolhido no momento da ligação(linkagem).
Exemplo do comentário feito acima:
Crie um arquivo chamado ola.adb, neste arquivo escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
procedure ola is
begin
put("Ola");
end ola;
Salve, e crie um arquivo chamado nome.adb, neste novo arquivo, escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
with ola;
procedure nome is
nome : string(1 .. 50);
n : natural;
begin
put_line("Qual eh o seu nome ?");
get_line(nome, n);
ola;
put_line(", " & nome(1 .. n) & ". :)");
end nome;
Salve, e vamos compilar :)
Para compilar, vá no diretório onde você salvou os arquivos, pelo terminal e digite o seguinte comando:
gnatmake nome.adb
Após a compilação, teste o seu novo programa:
./nome
Qual eh o seu nome ?
Alexandre
Ola, Alexandre. :)
Para terminar está parte do artigo, vamos implementar mais alguns arquivos e funções no nosso programa, para apresentar mais alguns conceitos como
if
,
elsif
, vamos primeiramente implementar a função para perguntar a nossa idade:
Crie um arquivo chamado idade.adb, neste arquivo, escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
function idade(nome : string; n : natural) return Integer is
age : integer;
begin
put_line(nome(nome'first .. n) & ", qual eh a sua idade ?");
get(age);
return age;
end idade;
e no arquivo nome, adicione as seguintes linhas, nos seus respectivos lugares:
with idade;
[code]age : integer;
age := idade(nome, n);
Assim então, o código do arquivo nome, fica da seguinte forma:
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
procedure nome is
nome : string(1 .. 50);
n : natural;
age : integer;
begin
put_line("Qual eh o seu nome ?");
get_line(nome, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & nome(1 .. n) & ". :)");
age := idade(nome, n);
end nome;
para compilar, use a mesma linha de comando...
Agora, vamos criar uma função, para verificar se você está bem ou mal, de saúde, para isso, crie um arquivo chamado estado.adb:
with Ada.Text_IO; use Ada.Text_IO;
function estado(nome : string; n : natural) return String is
es : string(1 .. 3); -- es = estado da saude;
begin
put_line(nome(nome'first .. n) & ", como você está se sentindo [bem/mal] ?");
get(es);
return es;
end estado;
e no arquivo nome.adb, escreva as seguintes modificações:
with estado;
--
es : string (1 .. 3);
--
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
código do arquivo nome.adb
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
with estado;
procedure nome is
name : string(1 .. 50);
n : natural;
age : integer;
es : string (1 .. 3);
begin
put_line("Qual eh o seu nome ?");
get_line(name, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & name(1 .. n) & ". :)");
age := idade(name, n);
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
end nome;
{2.0} Conceitos básicos da conversão
Uma das primeiras coisas que precisamos saber sobre a diferença entre as linguagens, são os operadores, para isso, veja a seguinte tabela:
Ada, uma linguagem de programação OO, muito poderosa por sinal, mas muito pouco conhecida, então, neste artigo, vou mostrar como converter seus códigos de C/C++ para ada, e de Ada para C/C++. Mas antes, eu vou fazer uma introdução a linguagem, para que você possa conhecer um pouco da linguagem e de sua sintaxe :)
Obs: Apenas irei mostrar as principais formas de converter o código, assim, não irei apresentar algumas formas de conversão.
Sendo assim, eu vou separar este artigo em 4 partes:
{0.0} -- Informações importantes.
{1.0} -- Introdução a linguagem de programação Ada.
{2.0} -- Conceitos básicos da conversão.
{3.0} -- Exemplo.
>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<
{0.0} Informações importantes
OS: Ubuntu 11.04
Compilador Ada: gnat
Compilador C & C++: gcc & g++
{1.0} Introdução a linguagem de programação Ada
"Ada é uma Linguagem de programação estruturada, de tipagem estática, é uma linguagem imperativa, orientada a objetos e é uma linguagem de alto nível."
Estrutura basica de um programa em Ada
-- declarações das bibliotecas
procedure nome_do_programa is
-- variaveis
begin
-- corpo do programa
end nome_do_programa;
Para deixar mais claro a estrutura do programa, segue um exemplo de um simples Olá mundo em Ada...
with Ada.Text_IO; use Ada.Text_IO;
procedure main is
begin
put_line("Ola mundo");
end main;
O comando put_line, pertence a biblioteca, Text_IO, o uso do comando "use", não é estritamente necessário, como você pode ver neste exemplo:
with Ada.Text_IO;
procedure main is
begin
Ada.Text_IO.put_line("Ola mundo");
end main;
Ao contrário de C, que tem uma função principal(main), qualquer procedimento sem parâmetros pode ser uma rotina "main". O processo assim designado é escolhido no momento da ligação(linkagem).
Exemplo do comentário feito acima:
Crie um arquivo chamado ola.adb, neste arquivo escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
procedure ola is
begin
put("Ola");
end ola;
Salve, e crie um arquivo chamado nome.adb, neste novo arquivo, escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
with ola;
procedure nome is
nome : string(1 .. 50);
n : natural;
begin
put_line("Qual eh o seu nome ?");
get_line(nome, n);
ola;
put_line(", " & nome(1 .. n) & ". :)");
end nome;
Salve, e vamos compilar :)
Para compilar, vá no diretório onde você salvou os arquivos, pelo terminal e digite o seguinte comando:
gnatmake nome.adb
Após a compilação, teste o seu novo programa:
./nome
Qual eh o seu nome ?
Alexandre
Ola, Alexandre. :)
Para terminar está parte do artigo, vamos implementar mais alguns arquivos e funções no nosso programa, para apresentar mais alguns conceitos como
if
,
elsif
, vamos primeiramente implementar a função para perguntar a nossa idade:
Crie um arquivo chamado idade.adb, neste arquivo, escreva o seguinte código:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
function idade(nome : string; n : natural) return Integer is
age : integer;
begin
put_line(nome(nome'first .. n) & ", qual eh a sua idade ?");
get(age);
return age;
end idade;
e no arquivo nome, adicione as seguintes linhas, nos seus respectivos lugares:
with idade;
[code]age : integer;
age := idade(nome, n);
Assim então, o código do arquivo nome, fica da seguinte forma:
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
procedure nome is
nome : string(1 .. 50);
n : natural;
age : integer;
begin
put_line("Qual eh o seu nome ?");
get_line(nome, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & nome(1 .. n) & ". :)");
age := idade(nome, n);
end nome;
para compilar, use a mesma linha de comando...
Agora, vamos criar uma função, para verificar se você está bem ou mal, de saúde, para isso, crie um arquivo chamado estado.adb:
with Ada.Text_IO; use Ada.Text_IO;
function estado(nome : string; n : natural) return String is
es : string(1 .. 3); -- es = estado da saude;
begin
put_line(nome(nome'first .. n) & ", como você está se sentindo [bem/mal] ?");
get(es);
return es;
end estado;
e no arquivo nome.adb, escreva as seguintes modificações:
with estado;
--
es : string (1 .. 3);
--
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
código do arquivo nome.adb
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
with estado;
procedure nome is
name : string(1 .. 50);
n : natural;
age : integer;
es : string (1 .. 3);
begin
put_line("Qual eh o seu nome ?");
get_line(name, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & name(1 .. n) & ". :)");
age := idade(name, n);
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
end nome;
{2.0} Conceitos básicos da conversão
Uma das primeiras coisas que precisamos saber sobre a diferença entre as linguagens, são os operadores, para isso, veja a seguinte tabela:
{2.1} Tipos
A conversão de variáveis do C/C++ para ada, ou de ada para C/C++, é relativamente simples:
C/C++
int a;
int i, j, k;
int b, c = 10;
int d = 1;
Ada
a : Integer;
i, j, k : Integer;
b, c : Integer := 10;
d : Integer := 1;
{2.2} Declaração de new types e subtypes
C/C++
typedef int INT;
INT i;
int j;
i=j; // funcionara perfeitamente, o compilador não ira detectar isso como um erro
Ada
type INT is new integer;
i : INT;
j : integer;
a := b; -- O Compilador ira detectar isso como um erro
A palavra-chave importante é new, o que realmente resume a forma como Ada está tratando essa linha, ele pode ser lido como "um novo tipo INT foi criado a partir do tipo inteiro", enquanto que a linha C pode ser interpretada como "um novo nome INT foi introduzida como um sinônimo para int ".
Esta tipagem forte pode ser um problema, e assim por Ada também oferece um recurso para reduzir a distância entre o novo tipo e o seu parente, considere o seguinte código:
Ada
subtype INT is Integer;
i : INT;
j : Integer;
i := j; -- O compilador não vai considerar isso errado.
{2.3} C/C++ statements para Ada
{2.3.0} IF
C/C++
if (expressão)
{
statement
}
else if (expressão)
{
statement
}
else
{
statement
}
Ada
package Our_List is
type List_Rep is private;
function Create return List_Rep;
private
type List_Rep is
record
-- código
end record;
end Our_List;
{3.0} Exemplo
O código que será usado como exemplo de conversão será o código criado no começo do artigo:
Obs: a conversão será feita para C++.
caso você tenha deletado ele, ai vai ele novamente:
ola.adb
with Ada.Text_IO; use Ada.Text_IO;
procedure ola is
begin
put("Ola");
end ola;
nome.adb
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
with estado;
procedure nome is
name : string(1 .. 50);
n : natural;
age : integer;
es : string (1 .. 3);
begin
put_line("Qual eh o seu nome ?");
get_line(name, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & name(1 .. n) & ". :)");
age := idade(name, n);
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
end nome;
idade.adb
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
function idade(nome : string; n : natural) return Integer is
age : integer;
begin
put_line(nome(nome'first .. n) & ", qual eh a sua idade ?");
get(age);
return age;
end idade;
estado.adb
with Ada.Text_IO; use Ada.Text_IO;
function estado(nome : string; n : natural) return String is
es : string(1 .. 3); -- es = estado da saude;
begin
put_line(nome(nome'first .. n) & ", como você está se sentindo [bem/mal] ?");
get(es);
return es;
end estado;
Para converter esse arquivo para C/C++, você primeiramente precisa conhecer alguns comandos do C/C++, tais como printf(), getchar(), cin, cout ...
Bom, então, para converter esse arquivo, vamos começar pelo começo, ou seja, pelo arquivo ola.adb
C/C++ { arquivo: ola.cpp }
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
void ola()
{
cout << "Ola";
}
bom, como o código em C/C++, não se interage como o código em Ada, a gente vai ter que criar uma header, e nessa header tera as principais informações a serem trocadas entre os arquivos:
Então, crie uma header chamada comum.h
e nesse arquivo, já adicione a função ola:
// comum.h
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] COMUM_H_
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] COMUM_H_
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] <iostream>
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] <string>
using namespace std;
void ola();
int idade(char *nome);
string estado(char *nome);
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
agora, vamos criar o main do projeto, que no vaso será o arquivo nome, mas no projeto em C/C++ ele vai receber o nome de main.c
então, crie o arquivo main.cpp, e escreva o seguinte código:
// main.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
int main(void)
{
char name[50];
string es;
int age;
cout << "Qual é o seu nome ?" << endl;
cin.get(name, 50);
ola();
cout << ", " << name << ", :-)" << endl;
age = idade(name);
es = estado(name);
if(es == "bem")
cout << "Que bom!!!" << endl;
else if(es == "mal")
cout << "Procure um médico" << endl;
else
cout << "Não conheço esse estado de saúde!!!!" << endl;
return 0;
}
// idade.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
int idade(char *nome)
{
int age;
cout << nome << ", qual eh a sua idade ?" << endl;
cin >> age;
return age;
}
// estado.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
string estado(char *nome)
{
string es;
cout << nome << ", como você está se sentindo [bem/mal] ?" << endl;
cin >> es;
return es;
Créditos :
A conversão de variáveis do C/C++ para ada, ou de ada para C/C++, é relativamente simples:
C/C++
int a;
int i, j, k;
int b, c = 10;
int d = 1;
Ada
a : Integer;
i, j, k : Integer;
b, c : Integer := 10;
d : Integer := 1;
{2.2} Declaração de new types e subtypes
C/C++
typedef int INT;
INT i;
int j;
i=j; // funcionara perfeitamente, o compilador não ira detectar isso como um erro
Ada
type INT is new integer;
i : INT;
j : integer;
a := b; -- O Compilador ira detectar isso como um erro
A palavra-chave importante é new, o que realmente resume a forma como Ada está tratando essa linha, ele pode ser lido como "um novo tipo INT foi criado a partir do tipo inteiro", enquanto que a linha C pode ser interpretada como "um novo nome INT foi introduzida como um sinônimo para int ".
Esta tipagem forte pode ser um problema, e assim por Ada também oferece um recurso para reduzir a distância entre o novo tipo e o seu parente, considere o seguinte código:
Ada
subtype INT is Integer;
i : INT;
j : Integer;
i := j; -- O compilador não vai considerar isso errado.
{2.3} C/C++ statements para Ada
{2.3.0} IF
C/C++
if (expressão)
{
statement
}
else if (expressão)
{
statement
}
else
{
statement
}
Ada
package Our_List is
type List_Rep is private;
function Create return List_Rep;
private
type List_Rep is
record
-- código
end record;
end Our_List;
{3.0} Exemplo
O código que será usado como exemplo de conversão será o código criado no começo do artigo:
Obs: a conversão será feita para C++.
caso você tenha deletado ele, ai vai ele novamente:
ola.adb
with Ada.Text_IO; use Ada.Text_IO;
procedure ola is
begin
put("Ola");
end ola;
nome.adb
with Ada.Text_IO; use Ada.Text_IO;
with ola;
with idade;
with estado;
procedure nome is
name : string(1 .. 50);
n : natural;
age : integer;
es : string (1 .. 3);
begin
put_line("Qual eh o seu nome ?");
get_line(name, n);
ola; -- chama a procedure do arquivo ola
put_line(", " & name(1 .. n) & ". :)");
age := idade(name, n);
es := estado(name, n);
if es = "bem" then
put_line("Que bom!!!");
elsif es = "mal" then
put_line(":-(");
put_line("Procure um médico");
else
put_line("Não conheço esse estado de saúde!!!!");
end if;
end nome;
idade.adb
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
function idade(nome : string; n : natural) return Integer is
age : integer;
begin
put_line(nome(nome'first .. n) & ", qual eh a sua idade ?");
get(age);
return age;
end idade;
estado.adb
with Ada.Text_IO; use Ada.Text_IO;
function estado(nome : string; n : natural) return String is
es : string(1 .. 3); -- es = estado da saude;
begin
put_line(nome(nome'first .. n) & ", como você está se sentindo [bem/mal] ?");
get(es);
return es;
end estado;
Para converter esse arquivo para C/C++, você primeiramente precisa conhecer alguns comandos do C/C++, tais como printf(), getchar(), cin, cout ...
Bom, então, para converter esse arquivo, vamos começar pelo começo, ou seja, pelo arquivo ola.adb
C/C++ { arquivo: ola.cpp }
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
void ola()
{
cout << "Ola";
}
bom, como o código em C/C++, não se interage como o código em Ada, a gente vai ter que criar uma header, e nessa header tera as principais informações a serem trocadas entre os arquivos:
Então, crie uma header chamada comum.h
e nesse arquivo, já adicione a função ola:
// comum.h
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] COMUM_H_
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] COMUM_H_
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] <iostream>
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] <string>
using namespace std;
void ola();
int idade(char *nome);
string estado(char *nome);
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]
agora, vamos criar o main do projeto, que no vaso será o arquivo nome, mas no projeto em C/C++ ele vai receber o nome de main.c
então, crie o arquivo main.cpp, e escreva o seguinte código:
// main.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
int main(void)
{
char name[50];
string es;
int age;
cout << "Qual é o seu nome ?" << endl;
cin.get(name, 50);
ola();
cout << ", " << name << ", :-)" << endl;
age = idade(name);
es = estado(name);
if(es == "bem")
cout << "Que bom!!!" << endl;
else if(es == "mal")
cout << "Procure um médico" << endl;
else
cout << "Não conheço esse estado de saúde!!!!" << endl;
return 0;
}
// idade.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
int idade(char *nome)
{
int age;
cout << nome << ", qual eh a sua idade ?" << endl;
cin >> age;
return age;
}
// estado.cpp
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link] "comum.h"
string estado(char *nome)
{
string es;
cout << nome << ", como você está se sentindo [bem/mal] ?" << endl;
cin >> es;
return es;
Créditos :
Bencz (Testar)
Hashy ( desenvolver & Divulgar)