Glossário de EDA Flashcards
Consolidar a terminologia básica da programação e dos algoritmos (156 cards)
abstracção
abstraction
Processo mental que consiste em escolher ou isolar um aspecto determinado de um estado de coisas relativamente complexo, a fim de simplificar a sua avaliação ou classificação, ou para permitir a comunicação do mesmo. [Antônio Houaiss et al., Dicionário Houaiss da Língua Portuguesa, 1.ª reimpressão com alterações, Objetiva, Rio de Janeiro, 2004.] A abstracção é um conceito fundamental em informática. Muitos dos artefactos das linguagens de programação têm como objectivo possibilitar a modularização e o encapsulamento, que são ferramentas essenciais para facilitar a abstracção.
algoritmo
algorithm
- Uma sequência pormenorizada de acções a executar para realizar alguma tarefa [Foldoc]. 2. Uma sequência finita de instruções bem definidas e não ambíguas, cada uma das quais pode ser executada mecanicamente num período de tempo finito e com uma quantidade de esforço finita [Wikipédia]. 3. Um conjunto finito de regras que fornece uma sequência de operações para resolver um tipo específico de problema e que tem as seguintes características: finitude, definitude, entradas, saídas e eficácia [Donald Knuth, The Art of Computer Programming, Volume 1: Fundamental Algorithms, 2.ª edição, Addison-Wesley, Reading, Massachusetts, E.U.A., 1973]. (Nota: Donald Knuth é uma das maiores figuras da ciência da computação.)
ciclo
* controlado por contador
* controlado por guarda
ciclo infinito
* controlado por colecção
loop
count-controlled loop
condition-controlled loop
infinite loop
collection-controlled loop
Um ciclo é uma sequência de instruções que é especificada uma única vez para ser executada várias vezes sucessivamente. O código dentro do ciclo (o seu passo ou a sua acção) é executado um determinado número de vezes (ciclos controlados por contador), uma vez para cada membro de uma colecção de itens (ciclos controlados por colecção), até que uma dada condição (a sua guarda) se verifique (ciclos controlados por guarda) ou indefinidamente (ciclos infinitos). [Wikipédia] Cada ciclo consiste usualmente num conjunto de instruções que o precede, a inicialização, numa guarda implícita ou explícita, que controla a duração do ciclo, sendo avaliada a cada passo do ciclo, e num passo, que é executado repetidamente e que pode normalmente ser decomposto numa acção e num progresso. Em ciclos controlados por contador e em ciclos controlados por colecção é típico que a guarda e o progresso sejam implícitos e que a inicialização se relacione apenas com a acção a realizar, e não com o progresso do ciclo. Usualmente os ciclos têm uma variável de controlo. Esta variável está envolvida no progresso do ciclo.
As instruções iterativas do C (o while
, o do-while
e o for
) suportam directamente apenas ciclos controlados por guarda. No entanto, qualquer tipo de ciclo pode ser escrito à custa dessas instruções (aliás, bastaria apenas uma delas para se poder escrever qualquer tipo de ciclo).
Exemplo de ciclo controlado por guarda em C:
exemplo de ciclo controlado por guarda para calcular numero de dígitos
Exemplo de ciclo controlado por contador em C:
exemplo de ciclo controlado por contador para calcular factorial
Exemplo de ciclo infinito em C:
exemplo de ciclo controlado infinito para obter do utilizador valor cumprindo condição
Exemplo de ciclo controlado por colecção em C:
exemplo de ciclo controlado por colecção para somar os itens de uma lista
código
código fonte
code
source code
O nome genérico código (ou código fonte) aplica-se a qualquer troço de programa escrito numa qualquer linguagem de programação legível por humanos.
expressão
expression
Uma expressão numa linguagem de programação é uma combinação explícita de valores, constantes, operadores e funções que é interpretada de acordo com as regras de precedência e associatividade particulares dessa linguagem, resultando num valor calculado. A este processo, tal como no caso das expressões matemáticas, chama-se cálculo. O valor pode ser de vários tipos, por exemplo, um valor numérico, uma cadeia de caracteres ou um valor booleano. Por exemplo, 2 + 3 é uma expressão cujo valor calculado é 5. Uma variável é também uma expressão, uma vez que denota um valor em memória. Assim, se x for uma variável, então x será também uma expressão, tal como x + 2. Um exemplo de uma expressão relacional é 4 ≠ 4, cujo valor é falso. Uma função, embora isso se considere uma má prática, pode ter efeitos laterais, coisa que também pode acontecer com alguns operadores (e.g., =, += ou ++, no C e nas linguagens dele derivadas). O cálculo do valor de uma expressão pode, por isso, em alguns casos, alterar o estado do programa. [Wikipédia] (Nota: Em Snap!, uma expressão consiste sempre na invocação de um repórter, passando-lhe os respectivos argumentos, que são também eles expressões.)
Exemplo de uma expressão em C:
> factorial(3 + 2) //
uma expressão
fluxo de controlo
control flow
O fluxo de controlo consiste na sequência exacta das instruções que são executadas por um programa. Imagine uma linha a unir as instruções que vão sendo executadas num programa. Quando passar por uma instrução de selecção, a linha seguirá apenas por um dos seus ramos. Quando atinguir um ciclo, a linha dará um determinado número de voltas. Quando uma rotina for invocada, a linha ligar-se-á à primeira instrução dessa rotina. Quando a rotina retornar, a linha retornará ao percurso que estava a percorrer antes da invocação da rotina. Essa linha representa um dado fluxo de controlo. O fluxo de controlo ao longo de um programa é tipicamente diferente consoante as circunstâncias que influenciam a sua execução (respostas do utilizador, conteúdos de ficheiros lidos pelo programa, etc.).
função
function
Um dos tipos de rotina. As funções têm como objectivo calcular e devolver um ou vários valores. As funções não têm, ou não devem ter, efeitos laterais, i.e., não devem agir sobre o mundo que as circunda. Quando as funções não têm efeitos laterais, também se dizem funções puras. Quando as funções devolvem valores booleanos recebem o nome de predicados. Quando as funções devolvem valores booleanos, chamam-se também predicados.
Em C, a palavra «função» é usada no sentido de rotina. Para evitar ambiguidades, sempre que pretendermos referir-nos ao mecanismo do C que suporta a noção de rotina usaremos a expressão «função C».
Exemplo de uma função em C:
int factorial(int n) { if (n == 0) return 1; return n * factorial_of(n - 1); }
Exemplo de um predicado (e por isso também uma função) em C:
int is_odd(int n) { return n % 2 != 0; }
instrução de controlo de fluxo
control flow statement
Uma instrução de controlo de fluxo é um tipo específico de instrução que permite controlar o fluxo de controlo de um programa. As instruções de condicionais, as instruções de selecção e os vários tipos de instruções iterativas são instruções de controlo de fluxo.
Em C existem diversas instruções de controlo de fluxo:
- A instrução condicional:
> if (guarda) instrução
- A instrução de selecção:
> if (guarda) instrução1 else instrução2
- A instrução de comutação:
> switch (expressão) { case valor1: instruções1 break; case valor2: instruções2 break; ... case valorn: instruçõesn break; default: instruções break; }
- O ciclo
while
:
> while (guarda) passo
- O ciclo
do-while
:
> do passo while (guarda);
- O ciclo
for
:
> for (inicialização; guarda; progresso) acção
- As instruções de retorno (
return
), quebra (break
), continuação (continue
) e salto incondicional (goto
, não usar!).
instrução iterativa
instrução de iteração
iteration statement
Uma instrução iterativa é um tipo específico de instrução de controlo de fluxo que permite construir ciclos de uma forma estruturada. Há vários tipos possíveis de instruções iterativas. Por exemplo:
- repete [o passo] [n] vezes
- até que 〈a guarda〉, repete [o passo]
- enquanto 〈a guarda〉, repete [o passo]
- repete [o passo] até que 〈a guarda〉
- repete [o passo] enquanto 〈a guarda〉
- repete [o passo] para sempre
- para (i) de (o início] a (o fim), repete [a acção]
- para cada (o item) em [a lista], repete [a acção]
linguagem
* de programação
language
programming *
Uma linguagem de programação é uma linguagem artificial concebida para comunicar instruções a uma máquina, em particular a um computador. As linguagens de programação podem ser usadas para criar programas que controlam o comportamento de uma máquina e/ou para exprimir algoritmos com precisão. [Wikipédia]
Ver:
parâmetro
parameter
formal argument
passagem de argumentos
argument passing
Acto ou efeito de usar os valores dos argumentos para inicializar os correspondentes parâmetros quando ocorre uma invocação de uma rotina e a sua subsequente execução. A forma mais comum de passar argumentos a uma rotina é a passagem de argumentos por valor.
O Snap! usa passagem de argumentos por valor:
procedimento
procedure
Um dos tipos de rotina. Os procedimentos agem sobre o estado do mundo os rodeia, podendo alterá-lo. O objectivo de um procedimento é tipicamente que essas alterações ocorram. A essas alterações é usual chamar-se efeitos laterais, mesmo quando a sua ocorrência é a razão de ser do procedimento. [c2.com]
Em C, a palavra «função» é usada no sentido de rotina. Para evitar ambiguidades, sempre que pretendermos referir-nos ao mecanismo do C que suporta a noção de rotina usaremos a expressão «função C».
Exemplo de um procedimento em C:
void swap(int a[], int i, int j) { const int original_a_i = a[i]; a[i] = a[j]; a[j] = original_a_i;
}
programa
* de computador
program
computer *
Um programa de computador (ou simplesmente programa ou aplicação) é uma sequência de instruções concebida para desempenhar uma dada tarefa com um computador. Um computador requer um programa para funcionar, executando tipicamente as instruções do programa num processador central. Um programa pode ter uma forma executável, que o computador usa directamente para executar as instruções, e uma forma legível por humanos, a partir da qual a forma executável pode ser obtida por tradução (conhecida por compilação). A forma legível por humanos está tipicamente escrita numa linguagem de programação de alto nível. A forma executável directamente pelo computador está expressa em linguagem máquina. Há linguagens de programação de alto nível concebidas para serem interpretadas. Ou seja, os programas expressos nessas linguagens não se destinam a serem compilados, mas sim a serem interpretados por um outro programa, que os executa. O código fonte de um programa é muitas vezes escrito por programadores. As linguagens de programação podem classificar-se como suportando um ou mais paradigmas de programação, sendo que três dos principais paradigmas são a programação imperativa, a programação funcional e a programação declarativa. [Wikipédia] (Nota: Ao contrário do que é feito na Wikipédia, consideramos que programação declarativa e programação lógica expressam o mesmo conceito e que a programação funcional não é uma forma de programação declarativa. Estas definições não são consensuais. Ver, por exemplo, [Allen B. Tucker e Robert E. Noonan, Programming Languages: Principles and Paradigms, segunda edição, McGraw-Hill, Boston, 2007].)
programação
* de computadores
programming
computer *
A programação de computadores ou simplesmente programação é o processo de concepção, escrita, teste, depuração e manutenção do código fonte de programas de computador. O código fonte é escrito usando uma ou mais linguagens de programação (tais como o Java, o C++, o C#, o Ruby ou o Python). O objectivo da programação é a criação de um conjunto de instruções que são usadas pelos computadores para desempenhar operações específicas ou para apresentarem comportamentos desejados. O processo de escrita de código fonte requer muitas vezes perícia em muitos diferentes assuntos, incluindo conhecimento do domínio de aplicação, de algoritmos especializados e de lógica formal. Até que ponto a escrita de programas é uma forma de arte, um ofício ou uma disciplina da engenharia continua a ser debatido. Em geral, considera-se boa programação uma aplicação equilibrada dessas três práticas com o objectivo de produzir um solução de software eficiente e passível de evolução. [Wikipédia]
programação imperativa
imperative programming
A programação imperativa é o mais antigo dos paradigmas de programação, fundando-se no modelo clássico de computação de «von Neumann-Eckert». Neste modelo, o programa e as suas variáveis são armazenados em conjunto, e o programa contém uma sequência de instruções que efectuam cálculos, atribuem valores a variáveis, lêem entradas, produzem saídas ou direccionam o fluxo do controlo para outro local na sequência de instruções. A abstracção procedimental (na forma de procedimentos, ou melhor, de rotinas) é um elemento essencial da programação procedimental, um dos paradigmas de programação incluído na programação imperativa. As sequências de instruções, as instruções iterativas e as instruções condicionais e de selecção são elementos essenciais da programação estruturada, outro dos paradigmas de programação incluído na programação imperativa. [Allen B. Tucker e Robert E. Noonan, Programming Languages: Principles and Paradigms, segunda edição, McGraw-Hill, Boston, 2007] A programação orientada por objectos também pode ser considerada com um dos paradigmas de programação incluído na programação imperativa, embora o seu modelo assente na visão do programa como uma colecção de objectos que interagem entre si, enviando mensagens (i.e., invocando operações) uns aos outros e agindo de acordo com as mensagens recebidas (executando os métodos correspondentes às operações invocadas), assim alterando possivelmente o seu estado [idem].
Abaixo ilustram-se os três principais paradigmas de programação através de implementações do algoritmo de Euclides para o obtenção do máximo divisor comum de dois números em Prolog, Scheme e Java («gcd» é a abreviatura de «greatest common divisor»).
Prolog (programação lógica):
> gcd(X, 0, X):- !. gcd(0, X, X):- !. gcd(X, Y, D):- X > Y, !, Z is X mod Y, gcd(Y, Z, D). gcd(X, Y, D):- Z is Y mod X, gcd(X, Z, D).
Scheme (programação funcional):
> (define (gcd a b) (if (= b 0) a (gcd b (modulo a b))))
Java (programação imperativa):
> public static int gcd(int a,
` int b) { while (b > 0) { int c = a % b; a = b; b = c; } return a; }`
programação procedimental
procedural programming
A programação procedimental é um paradigma de programação que deriva da programação estruturada, incluindo-a, e assenta no conceito da invocação de procedimentos, ou melhor, de rotinas. As rotinas, também conhecidas por subrotinas (e a que, quando associadas a uma classe ou objecto na programação orientada por objectos, também se chama métodos), contêm simplesmente uma sequência de instruções (incluindo possivelmente instruções de controlo de fluxo) a executar para atingir um objectivo definido, dado um conjunto de parâmetros de entrada. As rotinas podem ser invocadas em qualquer ponto da execução de um programa, inclusivamente dentro de outras rotinas ou mesmo dentro da própria rotina invocada. Algumas linguagens de programação seguindo o paradigma da programação procedimental são o Fortran, o Basic, o C ou o Pascal. [Wikipédia] A programação procedimental enfatiza a abstracção procedimental, que permite ao programador, enquanto cliente de uma rotina, preocupar-se apenas com a interface entre a rotina e o seu resultado computacional, ignorando os pormenores da sua implementação. [Allen B. Tucker e Robert E. Noonan, Programming Languages: Principles and Paradigms, segunda edição, McGraw-Hill, Boston, 2007] Ou seja, a programação procedimental encoraja simultaneamente o encapsulamento, e por isso uma forma simples do princípio da ocultação de informação, e a modularização, no sentido em que as rotinas podem ser consideradas como módulos reutilizáveis a partir dos quais se constrói o programa. (Nota 1: Considera-se uma boa prática da programação procedimental que uma rotina tenha um único objectivo bem definido. Nota 2: A programação orientada por objectos inclui a programação procedimental. Nota 3: A programação por contrato pode em parte ser vista como uma formalização da programação procedimental em que as interfaces das rotinas passam a ter associados contratos estabelecidos entre os seus produtores e os seus clientes.)
rotina
subrotina
routine
subroutine
O nome genérico dado às funções (incluindo os predicados) e aos procedimentos é rotina (ou subrotina). As rotinas são uma das unidades de modularização em programação. Uma rotina abstrai uma acção ou uma computação. Uma rotina expõe uma interface e encapsula uma implementação. A interface consiste no nome da rotina, bem como no número e tipo dos seus argumentos e dos valores que devolve. A sua implementação consiste na declaração dos seus parâmetros, que recebem em cada invocação o valor dos argumentos que são passados à rotina, e no seu corpo, ou seja, na sequência de instruções que realizam a acção pretendida ou que calculam o valor a devolver. As rotinas têm associados contratos, que por vezes não são tornados explícitos. (Nota: A distinção feita aqui entre rotina, procedimento e função não é consensual.)
Em C, a palavra «função» é usada no sentido de rotina. Para evitar ambiguidades, sempre que pretendermos referir-nos ao mecanismo do C que suporta a noção de rotina usaremos a expressão «função C».
Seguem-se alguns exemplos de rotinas em C.
Uma função em C:
int factorial(int n) { if (n == 0) return 1; return n * factorial_of(n - 1); }
Um predicado (e por isso também uma função) em C:
int is_odd(int n) { return n % 2 != 0; }
Um procedimento em C:
void swap(int a[], int i, int j) { const int original_a_i = a[i]; a[i] = a[j]; a[j] = original_a_i;
}
variável
variable
Na programação de computadores, uma variável é uma localização na memória associada a um nome simbólico (um identificador) que contém uma quantidade ou uma informação (um valor) conhecida ou desconhecida. O nome da variável é a forma usual de referenciar o valor armazenado. A separação entre nome e conteúdo permite a utilização do nome de forma independente da informação exacta que representa. O identificador presente no código fonte pode ser associado a um valor durante o tempo de execução, o que significa que o valor da variável pode variar durante a execução do programa. As variáveis em programação podem não corresponder directamente ao conceito de variável em matemática. O valor de uma variável computacional não é necessariamente parte de uma equação ou fórmula, como na matemática. Na computação, uma variável pode ser usada num processo repetitivo: pode-se atribuir-lhe um valor num local, usá-la noutro local, atribuir-lhe depois um novo valor e usá-la outra vez da mesma forma que anteriormente (ver iteração). As variáveis computacionais têm frequentemente nomes longos, de modo a torná-las descritivas daquilo que armazenam. Pelo contrário, as variáveis matemáticas tendem a ter nomes breves, com apenas uma ou duas letras (por um lado, tais nomes tornavam mais rápida a sua manipulação e transcrição; por outro lado, o grau de abstracção das variáveis é usualmente muito maior em matemática do que na programação, pelo que a utilização de nomes mais longos não estaria associada a uma maior facilidade de compreensão pelo leitor, ao contrário do que acontece na programação). [Wikipédia] Há vários tipos de variáveis computacionais: as variáveis globais, em geral desaconselháveis, disponíveis em todos os pontos de um programa, as variáveis de instância (ou variáveis de objecto), que fazem parte do estado privado de um objecto (ou seja, da sua implementação) e que, por vezes, correspondem directamente a atributos desse objecto; as variáveis locais, cujo âmbito se restringe tipicamente a uma rotina; e os parâmetros de rotinas, que funcionam como variáveis locais, embora com a particularidade de serem inicializadas à custa dos valores dos argumentos correspondentes. (Nota: Em Snap! chama-se variáveis de objecto ou, por vezes, variáveis de actor, às variáveis de instância e chama-se variáveis de guião às variáveis locais.)
acção2
action2
A parte do passo de um ciclo na qual se realiza a acção parcial que cada passo do ciclo deve realizar para que o ciclo atinja o seu objectivo uma vez terminado. Usualmente a acção precede o progresso. A acção tem como objectivo principal garantir que o ciclo atinge o seu objectivo assim que termine.
argumento
argument
actual argument
Um argumento é uma expressão usada na invocação de uma rotina e cujo valor é usado para inicializar o parâmetro correspondente. Também se dá o nome argumento ao valor dessa expressão. Diz-se que os argumentos são passados à rotina aquando da sua invocação. (Nota: No Snap! os argumentos são os blocos colocados nas ranhuras ou forquilhas de outros blocos.)
Exemplos de invocações simples em Snap!:
atribuição
assignment
cápsula
capsula
Pode-se usar o termo cápsula para caracterizar um tipo particular de módulo que suporta o encapsulamento, expondo uma interface aos seus clientes e ocultando e restringindo o acesso à sua implementação.
contrato
contract
Compromisso estabelecido entre o produtor de um módulo (tipicamente uma rotina ou bloco) e os seus clientes. Os contratos estabelecem (a) a forma de utilização, (b) as condições a cumprir pelo cliente, ou seja, as pré-condições, e (c) as pós-condições, ou seja, as condições que o produtor garante que serão cumpridas desde que o cliente cumpra a sua parte do contrato.
Por exemplo, um bloco Snap! para o cálculo da raiz quadrada (a) chama-se (√ (x)) e invoca-se colocando o valor, i.e., o argumento, cuja raiz quadrada se pretende obter na única ranhura disponível no bloco, (b) [pré-condição] não pode ser invocado senão com argumentos não negativos e (c) [pós-condição] reporta um valor que, quando multiplicado por si mesmo, está suficientemente próximo do valor do argumento, i.e, tem um erro relativo inferior a 1e-15.