Hashy Hashy  • 28.05.16 21:47

Conversão De Códigos Ada Para C/c++ Empty 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:



Conversão De Códigos Ada Para C/c++ 110go68






{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 :
Bencz (Testar)
Hashy ( desenvolver & Divulgar)

Koop Koop  • 04.01.17 15:39

Conversão De Códigos Ada Para C/c++ Empty Re: Conversão De Códigos Ada Para C/c++ 04.01.17 15:39

[aviso] [Tens de ter uma conta e sessão iniciada para poderes visualizar este link] [/aviso]
Permissões neste sub-fórum
Não podes responder a tópicos

BH Servers

Recomendamos a BH Servers com proteção DDOS gratuita em Cloud Server de alta performance. Entrega imediata.