apendice-pratica-compilacao.asc 4.27 KB
Newer Older
1
2
3
4
[[pratica_compilacao]]
[appendix]
== Usando os Softwares Básicos

5
6
:cap: tradutor

7
8
9
10
11
12
13
14
15
16
A ferramenta `cc` é um ambiente completo para a compilação, montagem e 
ligação dos programas de usuário desenvolvidos na linguagem C. Nesta 
prática iremos identificar cada passo no processo de transformar um código de 
alto nível (Linguagem C) em um arquivo binário executável.

NOTE: O `cc` é um compilador da GNU utilizado principalmente no sistem operacional 
Linux ou de tipo Unix. Para executá-lo você precisa abrir um terminal e 
escrever os comandos indicados nesta prática. Você já deve conhecê-lo da 
disciplina 'Introdução a Programação'.

17
NOTE: Lembre-se de que os códigos fontes do livro estão disponíveis para download e 
18
as intruções de como baixá-los estão em <<sec_codigo_fonte>>.
19
20
21
22

Passo 1:: Escreva em qualquer editor de texto os seguintes textos e salve com o 
nome sugerido para cada arquivo:
+
23
24
25
26
27
28
--

:srcfile: teste.h
.Código fonte
{gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}]

29
[source, c]
30
31
32
33
34
35
36
37
----
include::code/{cap}/{srcfile}[]
----

:srcfile: teste.c
.Código fonte
{gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}]

38
[source, c]
39
40
41
----
include::code/{cap}/{srcfile}[]
----
42

43
44
45
46
47
48
49
50
:srcfile: main.c
.Código fonte
{gitrepo}/blob/{edition}/livro/capitulos/code/{cap}/{srcfile}[code/{cap}/{srcfile}]

[source, c]
----
include::code/{cap}/{srcfile}[]
----
51

52
--
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

Passo 2:: Usar o Compilador do `cc`. Ele irá processar cada arquivo .c e gerar 
um arquivo .s com o código Assembly respectivo. 
+
_______________
Linguagem Fonte: Linguagem C

Linguagem Alvo: Assembly
_______________
+
Comando:::: `cc -S main.c teste.c`

Passo 3:: Usar o montador da aplicação `cc`. Ele irá processar cada arquivo .s 
e gerar um arquivo .o com o código objeto respectivo.
+
_______________
Linguagem Fonte: Assembly

Linguagem Alvo: Código Objeto
_______________
+
Comando:::: `cc -c main.s teste.s`
+
Os passos 2 e 3 geralmente são realizados juntos, para isso basta realizar o 
seguinte comando: `cc -c main.c teste.c` . Gerando assim um arquivo com Código 
Objeto (.o) para cada arquivo .c, pulando o código assembly (código 
intermediário).

Passo 4:: Usar o ligador do `cc`. Ele irá processar todos os arquivos .o e 
ligá-los em um único arquivo binário executável.
+
_______________
Linguagem Fonte: Código Objeto

Linguagem Alvo: Código Binário (Executável)
_______________
+
Comando:::: `cc main.o teste.o -o exec`
+
92
93
NOTE: `exec` foi o nome dado ao arquivo executável que será gerado pelo ligador do `cc`, 
logo, você pode escolher qualquer outro nome.
94
95
96
97
98
99
100

Passo 5:: Executar o Código Executável. No linux, para carregar um código 
executável e colocá-lo em execução basta seguir o seguinte comando:
+
Comando::::  `./exec`

 
101
102
Passo 6:: Modificar o código do arquivo `teste.c`. O propósito desta
edição é demonstrar o processo de ligação (<<sec_ligacao>>).
103
104
105
106
107
108
109
110
111
112
113
114
+
.Editar a implementação da função subtrai.
_______________________
Trocar: `return op1 - op2;`

Por: `return op1 + op2;`
_______________________
+
[NOTE]
===============
O conteúdo do arquivo `teste.c` ficará igual a:

115
:srcfile: teste_moficado.c
116
[source, c]
117
118
119
----
include::code/{cap}/{srcfile}[]
----
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

===============

Passo 7:: Compilar apenas o arquivo teste.c
Comando:::: `cc -c teste.c`

Passo 8:: Ligar os códigos objetos novamente.
Comando:::: `cc main.o teste.o -o exec`

Passo 9:: Executar o novo Código Executável. Observar a diferença das 
execuções.
Comando:::: ./exec

IMPORTANT: Podemos observar a utilidade do software ligador, pois após o *Passo 6* 
não há necessidade de recompilar todos os códigos fonte, apenas o 
arquivo `teste.c`, gerando assim um novo arquivo objeto `teste.o` que será ligado 
ao arquivo `main.o` (arquivo não modificado) formando o novo código 
executável `exec`.

[TIP]
===============
Você pode assistir esta prática no seguinte vídeo:

.Prática de softwares básicos: http://youtu.be/dVL3XQFNY8o
ifdef::livro-pdf[]
["qrcode", size=10, scaledwidth="30%"]
-------------------------
http://youtu.be/dVL3XQFNY8o
-------------------------
endif::livro-pdf[]
ifdef::livro-html[]
+++
<?dbhtml-include href="videos/pratica-softwares-basicos.html"?>
+++
endif::livro-html[]

===============



// Sempre terminar o arquivo com uma nova linha.