RESUMO DA DISCUSSÃO SOBRE LINGUAGENS DE PROGRAMAÇÃO DO DIA 26 DE OUTUBRO DE 2006

Documentos relacionados
Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Verificação de Tipo. Unions. Verificação de tipo estática. Verificação de tipo dinâmica

FACULDADE BATISTA MINEIRA - CST Banco de Dados Estruturas de Dados - Variáveis

Algoritmos II prof. Daniel Oliveira

Capítulo 7. Expressões e Sentenças de Atribuição

Programação científica C++

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

Paradigmas de Linguagens

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Conceitos de Linguagens de Programação - Características. Paavo Soeiro

Classes e Objetos. Sintaxe de classe em Java

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

Paradigmas de Programação

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

EXPRESSÕES BOOLEANAS. Ex: boolean b = false; // declara uma variável do tipo boolean e atribui false

Programação Estruturada

Tipos. O Conceito de Tipo

1/50. Conceitos Básicos. Programa Básico

Introdução à Linguagem C++

Tipos Primitivos, estruturas de iteração e decisão.

Análise de Programação

Conceitos básicos de programação

4. Constantes. Constantes pré-definidas

Linguagens de Programação. Tipos. Carlos Bazilio

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Operadores e Expressões: bit-a-bit e especiais

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Básicas. Aula Tópico 2

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

7 Operadores e Expressões

Linguagens de Programação Aula 8

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

3. Linguagem de Programação C

Programação Aplicada à Engenharia

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Linguagem Java - Introdução

Paradigmas de Linguagens de Programação. Tipos de Dados Abstratos

Ambientação com a Sintaxe de Java: parte 1

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Expressões e Instruções de Atribuição. George Darmiton da Cunha Cavalcanti

Programação em C++: Introdução

Linguagens de Programação. Marco A L Barbosa

Fundamentos de Programação

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

Expressões e sentença de atribuição

Introdução à Ciência da Computação. Prof. Dr. Rogério Vargas

Gabriel Giorisatto De Angelo Luiz Otávio Gerhardt Fernandes

Programação Orientada a Objetos para Redes de Computadores

Linguagem C Operadores

Java Básico. Carga Horária: 32 horas. Pré-requisito: Lógica de Programação; JAVA. Conteúdo Programático

Programação Orientada a Objetos para Redes de Computadores. Arrays. Arrays

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

C com introdução a OO

02. [Sebesta, 2000] Quais são as vantagens e as desvantagens dos tipos de dados decimais?

Implementação da programação modular I

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Paradigmas de Linguagens de Programação. Tipos de Dados

Linguagem C Operadora

C Operadores e Expressões

Paradigmas de Linguagens de Programação. Nomes, Vinculações, Verificação de Tipos e Escopos

Programação Orientada a Objetos

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Linguagens de Programação Conceitos e Técnicas. Amarrações

Aula 4 - Operadores. Prof. Laura Silva de Assis. Engenharia de Computação 2 o Período

Nomes, Amarração, Verificação de Tipos, e Escopo

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

CIT Aula 02 Variáveis e Estruturas de desvio condicional. Autor: Max Rodrigues Marques Carga Horária: 2 h 22/07/15 1

Métodos Computacionais

Introdução. Paradigmas de Linguagens. Introdução. Tipos de Dados Primitivos. Prof. Ms. Luiz Alberto Contato:

Conceitos de Linguagens de Programação

Capítulo 5. Nomes, Vinculações e Escopos

Algoritmos e Programação

Gabriel Santa Clara Ucelli

Polimorfismo. O que é polimorfismo?

Algoritmos e Estruturas de Dados I

Linguagem de Programação III

Linguagens de Programação Conceitos e Técnicas. Valores e Tipos de Dados Prof. Tiago Alves de Oliveira

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Algoritmos: tipos de dados, variáveis e expressões

Programação por Objectos. Java

Módulo Lógica Programação com aplicações em Java. Projeto khouse Profissionalizante Profª Larissa Brandão

Linguagem C Princípios Básicos (parte 1)

Palavras Reservadas da Linguagem Java

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Valores e Tipos de Dados Prof. Hudson Costa

Programação com Acesso a BD. Programação com OO Acesso em Java

Linguagem de Programação I. Aula 06 Linguagem C: Tipos de Dados

4.1- Aritméticos + soma - subtração * multiplicação / divisão % módulo (resto da divisão de inteiros ).

SCC-120 INTRODUÇÃO À CIÊNCIA DA COMPUTAÇÃO

Puca Huachi Vaz Penna

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Introdução à Computação MAC0110

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Programação Estruturada Aula - Tipos, Constantes, Variáveis e Identificadores

Transcrição:

Universidade Federal do Rio Grande do Sul Instituto de Informática Bacharelado em Ciência da Computação Disciplina de Modelos de Linguagens de Programação Profa. Dra. Érika Cota RESUMO DA DISCUSSÃO SOBRE LINGUAGENS DE PROGRAMAÇÃO DO DIA 26 DE OUTUBRO DE 2006 Carlos Eduardo Ramisch Flávio Brun Francieli Zanon Boito Márcio Rocha Zacarias Sandra Kniphoff Santos

1. Aspectos sobre o C++: TIPOS DA LINGUAGEM: C++ possui os seguintes tipos primitivos de linguagem: char - 8 ou mais bytes - Usado para armazenar caracteres ASCII ou números inteiros entre 0 e +127. signed char - Equivalente a char, com alcance -127 a +127. unsigned char - Equivalente a char, com alcance 0 a 255. short - 16 ou mais bytes - Usado para armazenar números inteiros entre -32767 e +32767. Os seguintes tipos são equivalentes a short: short int, signed short, signed short int. unsigned short - Equivalente a short, porém no caso do modificador unsigned, a cobertura vai de 0 a +65535. Equivalente a unsigned short int. int - 16 ou mais bytes - Representa geralmente o tamanho da palavra de máquina. Equivale a signed ou signed int. Armazena inteiros na faixa de -32767 a +32767. unsigned int - Armazena inteiros, como int, porém a cobertura é de 0 a +65535. long - 32 ou mais bytes, armazena inteiros entre -2147483647 e 2147483647. Possui os seguintes nomes equivalentes: long int, signed long, signed long int. unsigned long - O modificador unsigned muda a cobertura do long para o intervalo de 0 a +4294967295. bool - Tamanho depende da implementação, pode armazenar os valores true (verdadeiro) e false (falso). Representa uma escolha booleana (este tipo é uma extensão do C, e não um tipo legado. Isto significa que a linguagem C não possui o tipo primitivo bool.) wchar_t - Tamanho depende da implementação, pode armazenar caracteres grandes (que ocupam mais de um byte, ou seja, não ASCII). Não se recomenda operações inteiras com esse tipo. float - 8 bytes ou mais. Usado para representar números reais com poucos bytes. Não é

necessariamente implementado como precisão simples da IEEE. Não pode ser modificado pela palavra unsigned. double - É geralmente maior que um float, é o tipo de ponto flutuante mais freqüentemente usado. Também não pode ser unsigned. long double - Como double, porém geralmente maior. Os tipos estruturados disponíveis para o programador C++ são os seguintes: struct - É equivalente a um registro com tipos heterogêneos. O tamanho de uma struct é maior ou igual à soma dos tamanhos de seus membros. Recomenda-se usar classes ao invés de registros quando o tipo declarado tiver muitos membros. class - Tipo usado para implementar orientação a objetos, é semelhante a uma struct porém possui métodos (funções membro) de acesso aos dados (nas struct apenas é possível declarar ponteiros para funções mas nenhuma proteção é garantida). Numa classe, os dados podem ser protegidos. union - Tipo que pode guardar objetos de tipos diferentes em uma mesma variável. Dessa forma, durante a execução, não é possível verificar o tipo de uma union, o que acaba enfraquecendo o sistema de tipos da linguagem. Structs, classes e unions são ditos tipos agregados. enum - Enum é um tipo especial, implementado como inteiro, que representa uma enumeração de valores com uma ordem implícita. São úteis para aumentar a abstração e legibilidade do código. typedef - Palavra-chave para definir um sinônimo para um tipo. template - Tipo que permite a implementação de polimorfismo paramétrico. Um template permite que se construa estruturas de dados independentes do tipo contido. ponteiro (*) - Um ponteiro nada mais é que um apontador para uma área de memória. Quando se define o ponteiro, deve-se também definir o tipo da área apontada por ele. A área de memória pode ser tanto uma variável quanto uma função. referência (&) - Uma referência é implementada como um ponteiro, porém não exige derreferenciação. Com uma referência, é mais difícil de se criar ponteiros oscilantes e ponteiros inválidos. array ([n]) - Um array é um vetor com n elementos do mesmo tipo. Para se inicializar um array, coloca-se o tipo do elemento seguido de colchetes, e entre os colchetes o número inteiro que representa o tamanho do mesmo. Arrays em C++ têm o índice inicial 0. Arrays e ponteiros só são compatíveis em situações especiais.

função (id(param)) - Uma função pode ser definida como um tipo porque pode ser apontada e armazenada em uma variável. Funções serão discutidas mais adiante. ponteiro para membro (::*) - Um ponteiro para um membro é exatamente um apontador para um membro de um tipo agregado. Sobre esses tipos, podem ser usadas diversas operações, que são descritas abaixo através de uma listagem de operadores. As operaçõs estão listadas em ordem decrescente de precedência: :: - Operação de resolução de escopo. Permitida apenas para tipos agregados. Não é associativa. ++ e -- - Operação que incrementa ou decrementa variável depois que ela foi avaliada. Todas as variáveis de tipo primitivo. () - Chamada de função com parâmetros. Somente para funções. [] - Acesso ao índice de uma array. Somente para arrays.. - Seleção de membro de tipo agregado. Somente para tipos agregados. -> Seleção de membro de apontador para tipo agregado, derreferenciando o apontador de tipo agregado antes de acessar o membro. Somente para ponteiros para tipos agregados. ++ e -- - Operação que incrementa ou decrementa variável antes de ela ser avaliada. Todas as variáveis de tipo primitivo. + e - Mais e menos unários. Indicam o sinal de uma variável de tipo básico.! e ~ - Negação lógica e bit-a-bit, respectivamente. Somente tipos primitivos. (tipo) - Conversão explícita de tipo (Cast). Pode ser usada para qualquer tipo. * - Derreferenciação de conteúdo de ponteiro. Aplica-se a ponteiros. & - Referenciação de uma variável. Aplica-se a todos os tipos. sizeof - Retorna o número de bytes ocupados por uma variável. Aplica-se a todos os tipos. new - Aloca uma área de memória para uma variável. Aplica-se para todos os tipos, exceto funções. delete - Destrói um ponteiro, desalocando a área de memória por ele ocupada.

.* e ->* - Acesso a ponteiro para membro de tipo agregado. *, / e % - Multiplicação, divisão e módulo para tipos primitivos. + e - - Adição e subtração para tipos primitivos. >> e << - Operação de deslocamento bit-a-bit. Tipos permitidos: primitivos. <, <=, > e >= - Operador de comparação, retorna tipo booleano. Aplicável para tipos primitivos. ==,!= - Comparação de igualdade e diferença entre tipos primitivos. & - Conjunção bit-a-bit. Tipos primitivos. ^ - Ou exclusivo bit-a-bit. Tipos primitivos. - Disjunção bit-a-bit. Tipos primitivos. && - Conjunção lógica. Aplicável a tipos primitivos. - Disjunção lógica. Aplicável a tipos primitivos. c?t:f - Condicional ternário, c deve ser de tipo primitivo. = - Atribuição. Aplicável a todos os tipos. += e -= - Atribuição do left value somado/subtraído da explessão. Aplicável a tipos primitivos. %=, *= e /= - Atribuição do left value módulo/vezes/dividido pela explessão. Aplicável a tipos primitivos. <<= e >>= - Atribuição do left value deslocado bit a bit pela explessão. Aplicável a tipos primitivos. &=, ^= e = - Atribuição do left value and/xor/or bit a bit com a explessão. Aplicável a tipos primitivos. Os únicos operadores que não podem ser sobrecarregados por polimorfismo ad-hoc (ou seja, sobrecarga de operadores) são sizeof, o condicional ternário e a resolução de escopo. Os operadores de pós incremento, chamada de função, índice de array, seleção de membro, operaçõs aritméticas, lógicas e de bits binárias e comparações booleanas possuem associatividade da esquerda para a direita.

Já o condicional ternário, as atribuições, o pré-incremento, os sinais unários, a negação lógica e de bit, o derreferenciador e referenciador, os operadores de tamanho, alocação e desalocação possuem associatividade da direita para a esquerda. O modelo de alocação de variáveis do C++ é por valor. Quando se passa um parâmetro para uma função, sua alteração não é refletida no exterior. No caso dos ponteiros, a área de memória por ele apontada pode ser modificada, mas não seu valor. Apenas tipos referência são passados por referência no modelo de C++. A atribuição em C++ de tipos primitivos é feita por cópia, ou seja, é "deep". Para tipos estruturados, a cópia é feita por referência, ou seja, ela é "shallow". Da mesma forma para a igualdade. A tipagem do C++ é estática, ou seja, é necessário declarar os tipos das variáveis no código, não havendo sistema de inferência de tipos. A verificação de tipos é feita em tempo de compilação. A tipagem do C++ é fraca. Em primeiro lugar, é importante relembrar o conceito de tipagem fraca e forte. Uma linguagem fracamente tipada é aquela na qual nem todo erro de tipo pode ser detectado. No caso do C++, o problema é explícito nas unions. Um acesso a membro de uma union pode ser feito através dos vários tipos declarados na mesma. Dessa forma, é impossível verificar se um dado do tipo t1 está sendo acessado como do tipo t2 se a union permitir ambos os tipos. Além disso, o C++ oferece coerção automática de tipos primitivos em que o tipo de destino é maior ou igual ao de origem (pois o contrário resulta em perda de informação). Essa coerção permite que um caractere seja acessado como um inteiro, por exemplo, e esse erro de tipo também não pode ser detectado. Apesar disso, essa é uma escolha da linguagem para flexibilizar a programação, abrindo mão da segurança. Como dito anteriormente, C++ possui tanto conversão explícita quanto coerção. A conversão explícita se dá por meio do chamado "cast", em que o tipo de destino é posto entre parênteses. Para classes, o cast pode ser feito de diversas maneiras. O cast dinâmico é usado para ponteiros e referências de classes derivadas para as suas bases. O cast estático realiza a conversão em ambos os sentidos, seja de base para derivada, seja da derivada para a base. O cast de reinterpetação muda o tipo de uma área de dados apontada por um ponteiro. Por fim, o cast constante muda o modificador const de uma variável. Uma variável que pode ser alterada se torna constante por meio desse cast. A coerção é feita entre tipos básicos, desde que não haja perda de informação por arredondamento (como dito anteriormente). O arredondamento explícito é feito por meio de cast. Entre tipos estruturados, a coerção entre ponteiros e arrays também é feita automaticamente na passagem de parâmetros e no acesso a indices de arrays. A linguagem C++, como dito anteriormente, não possui inferência de tipos. As

questões de equivalência de tipos são baseadas no modelo de equivalência por nome. Duas estruturas são equivalentes se tiverem os mesmos membros na mesma ordem e com os mesmos nomes. Tipos sinônimos são equivalentes. A equivalência de estrutura é usada de maneira limitada apenas para tipos anônimos. Quanto à compatibilidade, os tipos básicos são compatíveis quando obedecem às regras de coerção definidas acima. Os tipos estruturados são compatíveis com os seus subtipos, isto é, classes base são compatíveis com as suas derivadas. O C++ possui todos os tipos de polimorfismo. O polimorfismo ad-hoc pode ser implementado na forma de sobrecarga de operadores e funções. A sobrecarga dos mesmos permite que se declare identificadores iguais com parâmetros de tipos diferentes, com semânticas diferentes associadas. Os operadores que podem ser sobrecarregados já foram citados. O polimorfismo paramétrico está presente na forma de templates. Num template (ou gabarito), pode-se definir uma estrutura que trabalhe sobre um tipo genérico. Dessa forma, o tipo que essa estrutura manipula pode ser substituído por qualquer outro que seja necessário. Na implementação, uma cópia é criada para cada um dos usos do template. O polimorfismo dinâmico está presente em C++ porque ele é orientado a objetos. Um exemplo é que, em C++, quando uma classe base implementa uma função e a classe filha implementa a mesma função, o compilador resolve o conflito buscando a implementação da classe pai mais acima. Quando se quer que ele use a função da classe derivada, usa-se a palavra-chave virtual antes da função. Quando se quer obrigar uma classe derivada a implementar uma função virtual, elimina-se o corpo da função na classe base, colocando-se um "=0" ao final da declaração. Quanto à abstração, o C++ possui as classes, que permitem que se "esconda" os dados através dos modificadores public, protected e private. Eles possuem a mesma semântica que nas demais linguagens de programação OO. Esses modificadores em classes permitem um grande encapsulamento dos dados (melhor que o dos registros, por exemplo) e aumenta o grau de abstração. Quanto à modularidade, o C++ não oferece pacotes, como o Java, por exemplo, mas oferece o conceito de funções "amigas" (palavra-chave friend). Uma função amiga é uma função privada que só pode ser acessada externamente por determinadas classes. Dessa forma, o conjunto das classes amigas acaba formando um "pacote", aumentando a odularidade. O conceito de funções amigas é mais flexível que os pacotes, pois permite maior acoplamento. Por outro lado, o aumento do acoplamento pode acabar prejudicando a modularidade no sentido de que modificações em um módulo afetam mais os demais módulos do que num sistema fracamente acoplado. Por esse motivo, é recomendável não abusar das funções amigas, mantendo pacotes logicamente acoplados e separando os pacotes logicamente independentes. Os tipos abstratos de dados do C++ são as classes. O suporte a OO do C++ é

proveniente do seu suporte a TADs, do suporte à ligação dinâmica e também da herança. A herança é o conceito pelo qual uma classe derivada herda propriedades da classe base. Dessa forma, ela não precisa redeclarar os membros da base, podendo-se fazer um melhor reuso de código. Herança também é uma ferramenta fundamental na modularização do C++. 2. Resumo geral sobre as demais linguagens apresentadas SMALLTALK: Todas as coisas são objetos, logo não há tipos primitivos. Os tipos estruturados e abstratos são representados pelas classes. Atribuição e comparação é por padrão deep, no entanto, há a opção de o usuário optar por shallow. As operações permitidas sobre os dados (objetos) são as pré-definidas em sua classe. Possui tipagem dinâmina e fraca, e a conversão entre tipos muitas vezes é feita de forma implícita. Os polimorfismo possível na linguagem é o ad-hoc. Não é permitido o paramétrico e o dinâmico o grupo não soube responder. Seus Tipos Abstratos de Dados são as classes e seus atributos são privados. RUBY: Da mesma forma que no Smalltalk, não há tipos primitivos, pois tudo é objeto. Possui uma classe Array pré-definida. As operações permitidas para os tipos também são as pré-definidas em suas classes. Permite redefinição de operados. Possui tipagem dinâmica e forte. Variáveis por modelo de referência e atribuição e comparação shallow. A linguagem realiza sobrecarga em tempo de execução, a inferência de tipos é estática e possui suporte para abstração, possuindo encapsulamento privado e as TADs sendo as classes. A linguagem emula Herança múltipla, copiando o método desejado dos múltiplos pais para dentro da nova classe. VHDL: Os tipos primitivos são os escalares. Possui ainda tipos compostos (array, record, etc), enumeração, arquivos, subtipos (de tipos definidos pelo usuário. Para esse tipo não é necessária conversão explícita). Signals podem ser declarados, mas não é considerado um tipo, mesmo porque um signal deve ter um tipo entre os demais já citados. Registros podem receber listas de parâmetros (contanto que na ordem e tipo corretos). Arrays podem ser operados logicamente, mas apenas se forem do mesmo tipo. Todas as conversões entre tipos são feitas explicitamente, através de casting. Modelo de variáveis por valor. Realiza coerção de tipos próximos, desde que possível (ex.: Real p/ inteiro), possui 4 níveis de abstração e não foi comentado sobre a possibilidade de polimorfismos.

VERILOG: Seu tipo primitivo é o signal. De resto, possui todos os mesmos tipos que o VHDL, mas não define variáveis numéricas reais, apenas inteiras. As operações permitidas são as básicas sobre inteiros, vetores, bits. As mais comuns são as lógicas. Modelo de variáveis por valor, no entanto existe uma extensão que utiliza o modelo por referência. Possui mecanismos de sobrecarga de operadores, não possui tipos abstratos de dados, tem uma abstração própria e uma alta modularidade, sendo definida como Tudo é módulo. CLIPPER: Possui apenas tipos primitivos e arrays. Além da string, que possui tamanho fixo, existe o tipo memo, que é uma string de tamanho maior. Como o seu propósito é acesso a banco de dados, não faz sentido permitir criação de tipos definidos pelo usuário. É fortemente e dinamicamente tipada. Todas as conversões devem ser feitas de forma explícita. OBJECT PASCAL: Possui tipos primitivos (caracter, inteiros, reais, booleanos, etc) e estruturados (classe, set, registro, arquivo, array,...). Atribuição e comparação são implementadas deep para tipos primitivos, porém shallow para ponteiros. Possui tipagem e inferência estática e forte. Realiza coerção apenas entre tipos compatíveis, todas as demais conversões devem ser feitas de forma explícita, através de funções de conversão. Modelo de variáveis por valor para tipos primitivos e por referência para ponteiros. Possui suporte para todo tipo de abstração, as classes e também templates, atributos e métodos podem ser private ou public e possui herança múltipla. PERL: Seus tipos são escalares, vetores e vetores associativos. Possui tipagem dinâmica e fraca. Gerenciamento de tipos e conversões automáticos, fazendo com que erros de tipo sejam quase que inexistentes. Possui um fraco suporte à orientação a objetos. Possui apenas o polimorfismo paramétrico e alta modularidade, contando também com mecanismos para Herança Múltipla. Abstração de pacotes, não possui palavras chaves para definir visibilidade (public, static, private...). SCHEME: Seus tipos primitivos são inteiro, caracter, booleano e ponto-flutuante. Seu tipo estruturado é a lista estruturada. Permite algumas operações sobre listas, como obter o primeiro elemento, o último, testar se é vazia, etc. Atribuição e comparação shallow. Possui tipagem dinâmica e forte. Não possui suporte para abstração e nada foi dito a respeito de polimorfismos.

FORTRAN: Tipos primitivos número, caracter, real, etc. Possui várias operações sobre arrays e possui ponteiros a partir do Fortran 90. A partir do fortran 2003, sua última versão, começou a ter suporte para orientação a objetos (TADs, modularidade...) e também polimorfismo (não sabem qual) e tipagem dinâmica. 3. Questões sobre C++ levantadas durante o debate: A coerção automática de tipos primitivos enfraquece a tipagem da linguagem? Um exemplo da situação descrita seria uma variável do tipo char ser acessada como um inteiro. Nesse caso, não é gerado erro nem em tempo de execução nem compilação, o que caracteriza uma linguagem fracamente tipada. Isso é uma escolha da linguagem para flexibilizar a programação, logo é tida como premissa que se o programador usou coerção de tipos, ele sabe o que está fazendo. Porém, é claro que isso diminui a segurança da linguagem. Na bibliografia, os autores divergem quanto à essa questão, enquanto alguns afirmam que, por ser uma escolha da linguagem, ela não pode ser considerada fracamente tipada, outros pensam o contrário. As operações sobre os tipos das linguagens são definidas nas classes, pelo programador, ou pré-definidas pela linguagem? As operações são todas pré-definidas pela linguagem, mas algumas podem ser sobrecarregadas pelas funções membro (métodos). O que for definido dentro da classe não pode ser considerada como operação e sim como uma declaração de função. A inicialização de uma variável pode ser feita em qualquer lugar do código? Sim, tanto a declaração quanto a inicialização podem ser feitas em qualquer lugar do código, uma das características que aumentam a flexibilidade de C++. Umas das inovação do C++ com relação ao C é a possibilidade de declarar e inicializar variáveis dentro do cabeçalho de um laço for. A linguagem permite polimorfismo dinâmico? Como foi explicado anteriormente, C++ suporta polimorfismo dinâmico, que é uma característica de todas as linguagens orientadas a objetos. Polimorfismo dinâmico é aquele no qual uma classe derivada implementa o mesmo método que a sua classe de origem, com os mesmos parâmetros. O compilador de C++ resolve polimorfismo dinâmico assumindo como padrão a implementação da classe pai. Para possibilitar que o método usado esteja na classe filha, usa-se o método virtual.

REFERÊNCIAS: C++ - Wikipedia, the free encyclopedia. Disponível em: http://en.wikipedia.org/wiki/c%2b%2b#philosophy C++ Programming/Data Types Reference - Wikibooks, collection of open-content textbooks. Disponível em: http://en.wikibooks.org/wiki/c%2b%2b_programming/data_types_reference Operators in C and C++ - Wikipedia, the free encyclopedia. Disponível em: http://en.wikipedia.org/wiki/operators_in_c_and_c%2b%2b Type Casting. Disponível em: http://www.cplusplus.com/doc/tutorial/typecasting.html