Não é propriamente elegante ter um código com imensas linhas de código dividido por pseudo-secções indicadas com comentários, como por exemplo assim:
// ------------------------------------------ // ------------------------------------------ // ----- Rotinas para processar batatas ----- // ------------------------------------------ // ------------------------------------------ procedure Descascar(batata : TBatata); // ...
O código torna-se exponencialmente mais difícil de ler, especialmente quando pretendemos procurar determinadas funções ou procedimentos.
O Pascal oferece desde os seus primórdios um pequeno conjunto de métodos para modular o código e dividi-lo em várias secções bem distintas.
Uma técnica utilizada é a inclusão de código que esteja localizado noutros ficheiros. O compilador irá copiar o conteúdos desses ficheiros as is no código final. Para tal usa-se a compiler directive {$i ficheiro}
ou {$include ficheiro}
.
Por exemplo:
program inclusao; {$i funcoes.inc} var n : integer = 3; begin writeln(foo(n)); // ... end.
Isto indica ao compilador que deve incluir o conteúdo do ficheiro funcoes.inc
naquele local. Portanto, se o ficheiro funcoes.inc
contiver este conteúdo…
function foo(x : integer) : integer; begin foo := sqr(x) - 2; end;
… então o código inicial equivalerá a…
program inclusao; function foo(x : integer) : integer; begin foo := sqr(x) - 2; end; var n : integer = 3; begin writeln(foo(n)); // ... end.
Por conseguinte, o ficheiro a ser incluído não pode ser um código-fonte completo, ou seja, com as cláusulas program
ou unit
por exemplo. Se o ficheiro funcoes.inc
contivesse este conteúdo…
program funcoes; function foo(x : integer) : integer; begin foo := sqr(x) - 2; end. begin // ... end.
… então teríamos no código inicial…
program inclusao; program funcoes; function foo(x : integer) : integer; begin foo := sqr(x) - 2; end. begin // ... end. var n : integer = 3; begin writeln(foo(n)); // ... end.
Isto iria gerar um erro de compilação uma vez que há duas cláusulas program
, o que não faz sentido.
Os ficheiros de inclusão são, então, nada mais do que ficheiros com código "isolado" que, por si só, não são compiláveis e servem apenas como "depósitos" de código que podem ser incluídos.
Ao contrário dos ficheiros de inclusão, uma unit é uma biblioteca de código que é previamente compilada e pode ser utilizada por outro programa com recurso à cláusula uses
.
Ver artigo "Pascal - Módulos" da 34ª Edição da Revista PROGRAMAR.
Uma library é um outro tipo de biblioteca de código compilado com a diferença de não ser inserido no programa final. Em vez disso, o programa liga-se à biblioteca em runtime e assim acede às suas funções e procedimentos.
No Windows, a extensão habitual destas bibliotecas é *.dll. Ou seja, estamos perante dynamic-link libraries.