Pascal (linguagem de programação) - Pascal (programming language)

Pascal
LagrangePAS.png
Paradigma
Família Wirth Pascal
Projetado por Niklaus Wirth
Apareceu pela primeira vez 1970 ; 51 anos atrás (1970)
Disciplina de digitação
Alcance Lexical
Extensões de nome de arquivo .pp, .pas,.inc
Implementações principais
Dialetos
Influenciado por
Influenciado

Pascal é uma linguagem de programação imperativa e procedural , projetada por Niklaus Wirth como uma linguagem pequena e eficiente destinada a encorajar boas práticas de programação usando programação estruturada e estruturação de dados . O nome é uma homenagem ao matemático, filósofo e físico francês Blaise Pascal .

Baseado no livro de Wirth Algorithms + Data Structures = Programs , Pascal foi desenvolvido no padrão da linguagem ALGOL 60 . Wirth foi envolvido no processo para melhorar a linguagem como parte dos ALGOL X esforços e propôs uma versão chamada ALGOL W . Isso não foi aceito e o processo ALGOL X paralisou. Em 1968, Wirth decidiu abandonar o processo ALGOL X e melhorar ainda mais o ALGOL W, lançando-o como Pascal em 1970.

Além dos escalares e matrizes do ALGOL , Pascal permitiu definir tipos de dados complexos e construir estruturas de dados dinâmicas e recursivas, como listas , árvores e gráficos . Pascal tem tipificação forte em todos os objetos, o que significa que um tipo de dados não pode ser convertido ou interpretado como outro sem conversões explícitas. Ao contrário do C (e da maioria das linguagens da família C ), o Pascal permite definições de procedimentos aninhados em qualquer nível de profundidade e também permite a maioria dos tipos de definições e declarações dentro de sub-rotinas (procedimentos e funções). Um programa é, portanto, sintaticamente semelhante a um único procedimento ou função. Isso é semelhante à estrutura de bloco do ALGOL 60, mas restrito a instruções de bloco arbitrárias para apenas procedimentos e funções.

Pascal teve muito sucesso na década de 1970, principalmente no crescente mercado de minicomputadores . Compiladores também estavam disponíveis para muitos microcomputadores quando o campo surgiu no final dos anos 1970. Foi amplamente usada como linguagem de ensino em cursos de programação de nível universitário na década de 1980 e também em ambientes de produção para escrever software comercial durante o mesmo período. Ele foi substituído pela linguagem de programação C durante o final dos anos 1980 e início dos 1990, à medida que os sistemas baseados em UNIX se tornaram populares, especialmente com o lançamento do C ++ .

Um derivado chamado Object Pascal projetado para programação orientada a objetos foi desenvolvido em 1985. Ele foi usado pela Apple Computer e Borland no final dos anos 1980 e posteriormente desenvolvido em Delphi na plataforma Microsoft Windows . Extensões aos conceitos Pascal deram origem às linguagens Modula-2 e Oberon .

História

Esforços anteriores

Muito da história do design de linguagem de computador durante os anos 1960 pode ser rastreada até a linguagem ALGOL 60 . ALGOL foi desenvolvido durante a década de 1950 com o objetivo explícito de ser capaz de descrever algoritmos claramente. Ele incluiu uma série de recursos para programação estruturada que permanecem comuns nas linguagens até hoje.

Pouco depois de sua introdução, em 1962 Wirth começou a trabalhar em sua dissertação com Helmut Weber sobre a linguagem de programação de Euler . Euler foi baseado na sintaxe do ALGOL e em muitos conceitos, mas não foi um derivado. Seu objetivo principal era adicionar listas e tipos dinâmicos, permitindo que fosse usado em funções semelhantes ao Lisp . A linguagem foi publicada em 1965.

Nessa época, uma série de problemas no ALGOL foram identificados, principalmente a falta de um sistema de string padronizado . O grupo encarregado de manter a linguagem havia iniciado o processo do ALGOL X para identificar melhorias, convocando submissões. Wirth e Tony Hoare enviaram um conjunto conservador de modificações para adicionar strings e limpar parte da sintaxe. Estes foram considerados demasiado pequena para valer a pena usar como o novo ALGOL padrão, então Wirth escreveu um compilador para a linguagem, que ficou chamado ALGOL W .

Os esforços do ALGOL X continuariam para escolher uma linguagem muito mais complexa, ALGOL 68 . A complexidade dessa linguagem levava a uma dificuldade considerável na produção de compiladores de alto desempenho e não era amplamente usada na indústria. Isso deixou uma abertura para idiomas mais novos.

Pascal

Pascal foi influenciado pelos esforços do ALGOL W, com os objetivos explícitos de produzir uma linguagem que fosse eficiente tanto no compilador quanto em tempo de execução, permitindo o desenvolvimento de programas bem estruturados e sendo útil para o ensino de programação estruturada aos alunos . Uma geração de alunos usou Pascal como uma linguagem introdutória nos cursos de graduação.

Um dos primeiros sucessos da linguagem foi a introdução do UCSD Pascal , uma versão que rodava em um sistema operacional customizado que podia ser portado para diferentes plataformas. Uma plataforma importante foi o Apple II , onde foi amplamente utilizado. Isso fez com que Pascal se tornasse a principal linguagem de alto nível usada para desenvolvimento no Apple Lisa e, posteriormente, no Macintosh . Partes do sistema operacional Macintosh original foram traduzidas manualmente para a linguagem assembly Motorola 68000 a partir do código-fonte Pascal .

O sistema de composição TeX de Donald E. Knuth foi escrito em WEB , o sistema de programação literário original , baseado no DEC PDP-10 Pascal. Aplicativos comerciais de sucesso como Adobe Photoshop foram escritos em Macintosh Programmer's Workshop Pascal, enquanto aplicativos como Total Commander , Skype e Macromedia Captivate foram escritos em Delphi ( Object Pascal ). A Apollo Computer usou Pascal como linguagem de programação de sistemas para seus sistemas operacionais a partir de 1980.

Variantes do Pascal também têm sido usadas para tudo, desde projetos de pesquisa até jogos de PC e sistemas embarcados . Existem compiladores Pascal mais novos que são amplamente usados.

Object Pascal

Durante o trabalho no Lisa, Larry Tesler começou a se corresponder com Wirth sobre a ideia de adicionar extensões orientadas a objetos à linguagem. Isso levou inicialmente ao Clascal , lançado em 1983. À medida que o programa Lisa desaparecia e era substituído pelo Macintosh, uma nova versão foi criada, denominada Object Pascal . Isso foi introduzido no Mac em 1985 como parte da estrutura de aplicativos MacApp e se tornou a principal linguagem de desenvolvimento da Apple no início dos anos 1990.

As extensões Object Pascal foram adicionadas ao Turbo Pascal com o lançamento da versão 5.5 em 1989. Ao longo dos anos, Object Pascal se tornou a base do sistema Delphi para Microsoft Windows , que ainda é usado para desenvolver aplicativos Windows e pode compilar código para outros sistemas. Free Pascal é uma alternativa de plataforma cruzada de código aberto com seu próprio IDE gráfico chamado Lazarus .

Implementações

Compiladores Pascal anteriores

O primeiro compilador Pascal foi projetado em Zurique para a família de computadores mainframe da série CDC 6000 . Niklaus Wirth relata que uma primeira tentativa de implementá-lo no FORTRAN 66 em 1969 não teve sucesso devido à inadequação do FORTRAN 66 para expressar estruturas de dados complexas. A segunda tentativa foi implementada em uma linguagem semelhante ao C (Scallop de Max Engeli) e então traduzida à mão (por R. Schild) para o próprio Pascal para fixação de botas. Estava operacional em meados de 1970. Muitos compiladores Pascal desde então têm se auto-hospedados de forma semelhante , ou seja, o compilador é escrito em Pascal, e o compilador geralmente é capaz de se recompilar quando novos recursos são adicionados à linguagem, ou quando o compilador deve ser portado para um novo ambiente. O compilador GNU Pascal é uma exceção notável, sendo escrito em C.

A primeira conversão bem-sucedida do compilador CDC Pascal para outro mainframe foi concluída por Welsh e Quinn na Queen's University of Belfast (QUB) em 1972. O alvo era a série 1900 International Computers Limited (ICL) . Este compilador, por sua vez, era o pai do compilador Pascal para o minicomputador Multum de Sistemas de Computação de Informação (ICS) . A porta Multum foi desenvolvida - visando a utilização do Pascal como linguagem de programação de sistemas - por Findlay, Cupples, Cavouras e Davis, trabalhando no Departamento de Ciência da Computação da Universidade de Glasgow . Pensa-se que Multum Pascal, que foi concluído no verão de 1973, pode ter sido a primeira implementação de 16 bits.

Um compilador completamente novo foi concluído por Welsh et al. no QUB em 1977. Ele ofereceu um recurso de diagnóstico no idioma de origem (incorporando perfis, rastreamento e despejos post-mortem formatados com reconhecimento de tipo) que foi implementado por Findlay e Watt na Universidade de Glasgow. Esta implementação foi portada em 1980 para a série ICL 2900 por uma equipe baseada na Universidade de Southampton e na Universidade de Glasgow. A Implementação do Modelo Pascal Padrão também foi baseada neste compilador, tendo sido adaptado, por Welsh e Hay na Universidade de Manchester em 1984, para verificar rigorosamente a conformidade com o Padrão BSI 6192 / ISO 7185 e para gerar código para uma máquina abstrata portátil.

O primeiro compilador Pascal escrito na América do Norte foi construído na Universidade de Illinois sob Donald B. Gillies para o PDP-11 e gerou código de máquina nativo.

O sistema Pascal-P

Para propagar a linguagem rapidamente, um kit de portabilidade do compilador foi criado em Zurique que incluía um compilador que gerava o chamado código-p para uma máquina de pilha virtual , ou seja, um código que se presta a uma interpretação razoavelmente eficiente, junto com um interpretador para esse código - o sistema Pascal-P . Os compiladores do sistema P foram nomeados Pascal-P1, Pascal-P2, Pascal-P3 e Pascal-P4. Pascal-P1 foi a primeira versão e Pascal-P4 foi a última a vir de Zurique. A versão denominada Pascal-P1 foi cunhada posteriormente para as muitas fontes diferentes de Pascal-P que existiam. O compilador foi redesenhado para melhorar a portabilidade e lançado como Pascal-P2. Este código foi posteriormente aprimorado para se tornar Pascal-P3, com um código intermediário compatível com versões anteriores de Pascal-P2, e Pascal-P4, que não era compatível com versões anteriores.

O compilador-interpretador Pascal-P4 ainda pode ser executado e compilado em sistemas compatíveis com Pascal original. No entanto, ele aceita apenas um subconjunto da linguagem Pascal.

Pascal-P5, criado fora do grupo Zürich, aceita a linguagem Pascal completa e inclui compatibilidade ISO 7185.

UCSD Pascal ramificou Pascal-P2, onde Kenneth Bowles o usou para criar o UCSD p-System interpretativo . Foi um dos três sistemas operacionais disponíveis no lançamento do IBM Personal Computer original . UCSD Pascal usava um código intermediário baseado em valores de byte e, portanto, foi um dos primeiros compiladores de bytecode . Pascal-P1 a Pascal-P4 não era, mas sim baseado no comprimento de palavra de 60 bits do CDC 6600.

Um compilador baseado no compilador Pascal-P5, que criava arquivos de objetos binários nativos , foi lançado para o computador mainframe IBM System / 370 pela Australian Atomic Energy Commission ; foi denominado AAEC Pascal 8000 Compiler após a abreviatura do nome da comissão.

Object Pascal e Turbo Pascal

A Apple Computer criou seu próprio Lisa Pascal para o Lisa Workshop em 1982 e portou o compilador para o Apple Macintosh e MPW em 1985. Em 1985, Larry Tesler , em consulta com Niklaus Wirth, definiu Object Pascal e essas extensões foram incorporadas no Lisa Compiladores Pascal e Mac Pascal.

Na década de 1980, Anders Hejlsberg escreveu o compilador Blue Label Pascal para o Nascom -2. Uma reimplementação deste compilador para o IBM PC foi comercializada sob os nomes Compas Pascal e PolyPascal antes de ser adquirida pela Borland e renomeada Turbo Pascal .

O Turbo Pascal se tornou extremamente popular, graças a uma estratégia de preços agressiva, tendo um dos primeiros IDEs de tela inteira e tempo de resposta muito rápido (apenas alguns segundos para compilar, vincular e executar). Ele foi escrito e totalmente otimizado em linguagem assembly , tornando-o menor e mais rápido do que a maioria dos concorrentes.

Em 1986, Anders portou o Turbo Pascal para o Macintosh e incorporou as extensões Object Pascal da Apple ao Turbo Pascal. Essas extensões foram então adicionadas de volta à versão para PC do Turbo Pascal para a versão 5.5. Ao mesmo tempo, a Microsoft também implementou o compilador Object Pascal. O Turbo Pascal 5.5 teve uma grande influência na comunidade Pascal, que começou a se concentrar principalmente no IBM PC no final dos anos 1980. Muitos entusiastas do PC em busca de um substituto estruturado para o BASIC usaram este produto. Ele também começou a ser adotado por desenvolvedores profissionais. Na mesma época, vários conceitos foram importados de C para permitir que os programadores Pascal usassem a interface de programação de aplicativos (API) baseada em C do Microsoft Windows diretamente. Estas extensões incluídas terminação nula cordas , aritmética ponteiro , ponteiros de função , um endereço-de operador, e inseguras typecasts .

Turbo Pascal e outros derivados com estruturas de unidades ou módulos são linguagens de programação modulares . No entanto, ele não fornece um conceito de módulo aninhado ou importação e exportação qualificadas de símbolos específicos.

Outras variantes

Super Pascal é uma variante que adiciona rótulos não numéricos, uma instrução de retorno e expressões como nomes de tipos.

TMT Pascal foi o primeiro compilador compatível com a Borland para modo protegido do DOS de 32 bits , OS / 2 e sistemas operacionais Win32 . A linguagem TMT Pascal foi a primeira a permitir a sobrecarga de funções e operadores .

As universidades de Wisconsin-Madison, Zürich , Karlsruhe e Wuppertal desenvolveram os compiladores Pascal-SC e Pascal-XSC ( Extensões para Computação Científica ), destinados à programação de cálculos numéricos. O desenvolvimento para Pascal-SC começou em 1978 com suporte para ISO 7185 Pascal nível 0, mas o suporte de nível 2 foi adicionado em um estágio posterior. Pascal-SC originalmente tinha como alvo o processador Z80 , mas foi reescrito posteriormente para DOS ( x86 ) e 68000 . Pascal-XSC foi, em vários momentos, portado para sistemas operacionais Unix (Linux, SunOS , HP-UX , AIX ) e Microsoft / IBM (DOS com EMX , OS / 2, Windows ). Ele opera gerando código-fonte C intermediário que é então compilado em um executável nativo. Algumas das extensões de linguagem Pascal-SC foram adotadas pelo GNU Pascal .

Pascal Sol foi projetado por volta de 1983 por uma equipe francesa para implementar um sistema semelhante ao Unix chamado Sol. Era Pascal nível 1 padrão (com limites de array parametrizados), mas a definição permitia palavras-chave alternativas e identificadores predefinidos em francês e a linguagem incluía algumas extensões para facilitar a programação do sistema (por exemplo, um equivalente a lseek). A equipe Sol mais tarde mudou para o projeto ChorusOS para criar um sistema operacional distribuído.

IP Pascal foi uma implementação da linguagem de programação Pascal usando Micropolis DOS, mas foi movido rapidamente para CP / M-80 rodando no Z80. Ele foi movido para os tipos de máquina 80386 em 1994 e existe hoje como implementações Windows / XP e Linux. Em 2008, o sistema foi levado a um novo nível e a linguagem resultante foi denominada "Pascaline" (em homenagem à calculadora de Pascal ). Inclui objetos, controles de namespace , matrizes dinâmicas e muitas outras extensões e geralmente apresenta a mesma funcionalidade e proteção de tipo que o C # . É a única implementação que também é compatível com a implementação Pascal original, que é padronizada como ISO 7185.

Construções de linguagem

Pascal, na sua forma original, é puramente linguagem procedural e inclui a matriz tradicional de ALGOL estruturas de controle -como com palavras reservadas, como if, then, else, while, for, e case, variando em uma única palavra ou uma begin- endbloco de declarações. Pascal também tem construções de estruturação de dados não incluídas nos tipos ALGOL 60 originais , como registros , variantes, ponteiros , enumerações e conjuntos e ponteiros de procedimento. Tais construções foram em parte herdadas ou inspiradas do Simula 67, ALGOL 68 , do próprio ALGOL W de Niklaus Wirth e sugestões de CAR Hoare .

Os programas Pascal começam com a program palavra - chave com uma lista de descritores de arquivos externos como parâmetros (não é necessário no Turbo Pascal etc.); em seguida, segue o bloco principal entre colchetes pelas palavras begin- endchave e . Os pontos-e-vírgulas separam as instruções e o ponto final (ou seja, um ponto) finaliza todo o programa (ou unidade ). As letras maiúsculas e minúsculas são ignoradas na fonte Pascal.

Aqui está um exemplo do código-fonte em uso para um simples "Hello, World!" programa :

program HelloWorld(output);
begin
    Write('Hello, World!')
    {No ";" is required after the last statement of a block -
        adding one adds a "null statement" to the program, which is ignored by the compiler.}
end.

Tipos de dados

Um tipo em Pascal, e em várias outras linguagens de programação populares, define uma variável de tal forma que define um intervalo de valores que a variável é capaz de armazenar, e também define um conjunto de operações que podem ser realizadas em variáveis ​​desse tipo. Os tipos predefinidos são:

Tipo de dados Tipo de valores que a variável é capaz de armazenar
inteiro números inteiros (inteiros)
real Números de ponto flutuante
boleano os valores True ou False
Caracteres um único caractere de um conjunto de caracteres ordenado
definir equivalente a uma matriz compactada de valores booleanos
variedade um grupo contável de qualquer um dos tipos de dados anteriores
fragmento uma sequência ou "string" de caracteres (strings não faziam parte do idioma original; era possível criar uma "matriz de char" e acessar os caracteres individuais como uma matriz, mas referenciá-los diretamente como uma string não era possível até dialetos posteriores de Pascal adicionou esta funcionalidade.)

O intervalo de valores permitidos para cada um (exceto booleano) é definido pela implementação. Funções são fornecidas para algumas conversões de dados. Para a conversão de realpara integer, as seguintes funções estão disponíveis: round(que arredonda para inteiro usando o arredondamento do banco ) e trunc(arredonda para zero).

O programador tem a liberdade de definir outros tipos de dados comumente usados ​​(por exemplo, byte, string, etc.) em termos de tipos predefinidos usando o recurso de declaração de tipo do Pascal, por exemplo

type
    byte        = 0..255;
    signed_byte = -128..127;
    string      = packed array[1..255] of char;

(Tipos frequentemente usados, como byte e string, já estão definidos em muitas implementações.)

Tipos Subrange

Subintervalos de qualquer tipo de dados ordinal (qualquer tipo simples, exceto real) também podem ser feitos:

var
    x : 1..10;
    y : 'a'..'z';

Definir tipos

Em contraste com outras linguagens de programação de sua época, Pascal suporta um tipo de conjunto:

var
    Set1 : set of 1..10;
    Set2 : set of 'a'..'z';

Um conjunto é um conceito fundamental para a matemática moderna e pode ser usado em muitos algoritmos. Esse recurso é útil e pode ser mais rápido do que uma construção equivalente em uma linguagem que não oferece suporte a conjuntos. Por exemplo, para muitos compiladores Pascal:

if i in [5..10] then ...

executa mais rápido do que:

if (i > 4) and (i < 11) then ...

Conjuntos de valores não contíguos podem ser particularmente úteis, em termos de desempenho e legibilidade:

if i in [0..3, 7, 9, 12..15] then ...

Para esses exemplos, que envolvem conjuntos em pequenos domínios, o desempenho aprimorado é geralmente obtido pelo compilador que representa variáveis ​​de conjunto como vetores de bits . Os operadores de conjunto podem então ser implementados de forma eficiente como operações de código de máquina bit a bit.

Tipos de união

Em Pascal, existem duas maneiras de criar sindicatos. Uma é a forma padrão por meio de um registro variante. O segundo é um meio não padronizado de declarar uma variável como absoluta, o que significa que ela é colocada no mesmo local da memória que outra variável ou em um endereço absoluto. Embora todos os compiladores Pascal suportem registros de variantes, apenas alguns suportam variáveis ​​absolutas.

Para os fins deste exemplo, os seguintes são todos os tipos de inteiros: um byte tem 8 bits, uma palavra tem 16 bits e um inteiro tem 32 bits.

O exemplo a seguir mostra a forma absoluta não padrão:

VAR
    A: Integer;
    B: Array[1..4] of Byte absolute A;
    C: Integer absolute 0;

No primeiro exemplo, cada um dos elementos da matriz B mapeia para um dos bytes específicos da variável A. No segundo exemplo, a variável C é atribuída ao endereço de máquina exato 0.

No exemplo a seguir, um registro possui variantes, algumas das quais compartilham o mesmo local que outras:

TYPE
     TSystemTime = record
       Year, Month, DayOfWeek, Day : word;
       Hour, Minute, Second, MilliSecond: word;
     end;  
     TPerson = RECORD
        FirstName, Lastname: String;
        Birthdate: TSystemTime;
        Case isPregnant: Boolean of 
           true: (DateDue:TSystemTime);
           false: (isPlanningPregnancy: Boolean);
        END;

Declarações de tipo

Os tipos podem ser definidos a partir de outros tipos usando declarações de tipo:

type
    x = integer;
    y = x;
...

Além disso, tipos complexos podem ser construídos a partir de tipos simples:

type
    a = array[1..10] of integer;
    b = record
        x : integer;
        y : char  {extra semicolon not strictly required}
    end;
    c = file of a;

Tipo de arquivo

Conforme mostrado no exemplo acima, os arquivos Pascal são sequências de componentes. Cada arquivo tem uma variável de buffer que é denotada por f ^ . Os procedimentos get (para leitura) e put (para escrita) movem a variável buffer para o próximo elemento. Read é introduzido de forma que read (f, x) seja igual a x: = f ^; get (f); . A escrita é introduzida de forma que write (f, x) seja igual a f ^: = x; colocar (f); O tipo texté predefinido como arquivo de char. Embora a variável buffer pudesse ser usada para inspecionar o próximo caractere a ser usado (verifique se há um dígito antes de ler um inteiro), isso leva a sérios problemas com programas interativos nas primeiras implementações, mas foi resolvido posteriormente com o "I / O preguiçoso" conceito.

Em Jensen & Wirth Pascal, as strings são representadas como matrizes compactadas de caracteres; eles, portanto, têm comprimento fixo e geralmente são preenchidos com espaço.

Tipos de ponteiro

Pascal suporta o uso de ponteiros :

type
    pNode = ^Node;
    Node  = record
        a : integer;
        b : char;
        c : pNode  
    end;
var
    NodePtr : pNode;
    IntPtr  : ^integer;

Aqui, a variável NodePtr é um ponteiro para o tipo de dados Node , um registro. Os ponteiros podem ser usados ​​antes de serem declarados. Esta é uma declaração de encaminhamento , uma exceção à regra de que as coisas devem ser declaradas antes de serem usadas.

Para criar um novo registro e atribuir o valor 10 e caráter A para os campos de um e b no registro, e para inicializar o ponteiro c ao ponteiro nulo ( "NIL" em Pascal), as demonstrações seria:

New(NodePtr);
...
NodePtr^.a := 10;
NodePtr^.b := 'A';
NodePtr^.c := NIL;
...

Isso também pode ser feito usando a withinstrução da seguinte maneira:

New(NodePtr);
...
with NodePtr^ do
begin
    a := 10;
    b := 'A';
    c := NIL
end;
...

Dentro do escopo da instrução with , aeb referem-se aos subcampos do ponteiro de registro NodePtr e não ao Nó de registro ou ao tipo de ponteiro pNode.

Listas vinculadas , pilhas e filas podem ser criadas incluindo um campo de tipo de ponteiro (c) no registro.

Ao contrário de muitas linguagens que apresentam ponteiros, Pascal só permite que os ponteiros façam referência a variáveis ​​criadas dinamicamente que são anônimas e não permite que façam referência a variáveis ​​estáticas ou locais padrão. Os ponteiros também devem ter um tipo associado, e um ponteiro para um tipo não é compatível com um ponteiro para outro tipo (por exemplo, um ponteiro para um char não é compatível com um ponteiro para um inteiro). Isso ajuda a eliminar os problemas de segurança tipo inerentes com outras implementações do ponteiro, particularmente aqueles usados para PL / I ou C . Ele também remove alguns riscos causados ​​por ponteiros pendurados , mas a capacidade de desalocar dinamicamente o espaço referenciado usando a função dispor (que tem o mesmo efeito que a função de biblioteca livre encontrada em C ) significa que o risco de ponteiros pendurados não foi totalmente eliminado como aconteceu em linguagens como Java e C #, que fornecem coleta de lixo automática (mas que não eliminam inteiramente o problema relacionado de vazamentos de memória ).

Algumas dessas restrições podem ser levantadas em dialetos mais recentes.

Estruturas de controle

Pascal é uma linguagem de programação estruturada , o que significa que o fluxo de controle é estruturado em instruções padrão , geralmente sem comandos ' goto '.

while a <> b do  WriteLn('Waiting');

if a > b then WriteLn('Condition met')   {no semicolon allowed before else}
    else WriteLn('Condition not met');

for i := 1 to 10 do  {no semicolon here as it would detach the next statement}
    WriteLn('Iteration: ', i);

repeat
    a := a + 1
until a = 10;

case i of
    0 : Write('zero');
    1 : Write('one');
    2 : Write('two');
    3,4,5,6,7,8,9,10: Write('?')
end;

Procedimentos e funções

Pascal estrutura programas em procedimentos e funções. Geralmente, um procedimento é usado para seus efeitos colaterais, enquanto uma função é usada para seu valor de retorno.

program Printing;

var i : integer;

procedure PrintAnInteger(j : integer);
begin
    ...
end;

function triple(const x: integer): integer;
begin
	triple := x * 3;
end;

begin { main program }
    ...
    PrintAnInteger(i);
    PrintAnInteger(triple(i));
end.

Os procedimentos e funções podem ser aninhados em qualquer profundidade, e a construção do 'programa' é o bloco lógico mais externo.

Por padrão, os parâmetros são passados ​​por valor. Se 'var' precede o nome de um parâmetro, ele é passado por referência.

Cada procedimento ou função pode ter suas próprias declarações de rótulos goto, constantes, tipos, variáveis ​​e outros procedimentos e funções, que devem estar todos nessa ordem. Esse requisito de pedido foi originalmente planejado para permitir a compilação eficiente de uma única passagem . No entanto, em alguns dialetos (como o Delphi ), o requisito de ordem estrita das seções de declaração foi relaxado.

Ponto e vírgula como separadores de declaração

Pascal adotou muitos recursos de sintaxe de linguagem da linguagem ALGOL , incluindo o uso de um ponto-e-vírgula como separador de instrução. Isso está em contraste com outras linguagens, como PL / I e C , que usam o ponto-e-vírgula como um terminador de instrução. Nenhum ponto-e-vírgula é necessário antes da endpalavra - chave de uma declaração de tipo de registro, um bloco ou uma instrução de caso ; antes da untilpalavra - chave de uma instrução de repetição; e antes da elsepalavra - chave de uma instrução if .

A presença de um ponto-e-vírgula extra não era permitida nas versões anteriores de Pascal. No entanto, a adição de declarações vazias semelhantes a ALGOL no Relatório Revisado de 1973 e alterações posteriores na linguagem na ISO 7185: 1983 agora permitem ponto-e-vírgulas opcionais na maioria desses casos. Um ponto-e-vírgula ainda não é permitido imediatamente antes da elsepalavra - chave em uma instrução if , porque elsesegue uma única instrução, não uma seqüência de instruções. No caso de ifs aninhados, um ponto-e-vírgula não pode ser usado para evitar o problema de else pendente (onde o if interno não tem um else, mas o if externo tem) encerrando putativamente o if aninhado com um ponto-e-vírgula - ao invés disso, termina ambos se cláusulas. Em vez disso, um bloco begin... explícito enddeve ser usado.

Recursos

Compiladores e intérpretes

Vários compiladores e interpretadores Pascal estão disponíveis para uso geral:

  • Delphi é o principal produto de desenvolvimento rápido de aplicativos (RAD) da Embarcadero (anteriormente Borland / CodeGear) . Ele usa a linguagem Object Pascal (denominada 'Delphi' pela Borland), descendente do Pascal, para criar aplicativos para Windows , macOS , iOS e Android . O suporte .NET que existia de D8 a D2005, D2006 e D2007 foi encerrado e substituído por uma nova linguagem (Prism, que é rebatizada de Oxygene, veja abaixo) que não é totalmente compatível com versões anteriores. Nos últimos anos, suporte Unicode e genéricos foram adicionados (D2009, D2010, Delphi XE).
  • Free Pascal é um compilador multiplataforma escrito em Object Pascal (e é auto-hospedado ). O objetivo é fornecer um compilador conveniente e poderoso, capaz de compilar aplicativos legados e ser o meio para desenvolver novos. Ele é distribuído sob a GNU General Public License (GNU GPL), enquanto os pacotes e a biblioteca de tempo de execução vêm sob uma GNU Lesser General Public License (GNU LGPL) modificada . Além dos modos de compatibilidade para Turbo Pascal , Delphi e Mac Pascal, ele tem seus próprios modos procedurais e de sintaxe orientada a objetos com suporte para recursos estendidos, como sobrecarga de operador . Suporta muitas plataformas e sistemas operacionais. As versões atuais também apresentam um modo ISO.
  • Turbo51 é um compilador Pascal gratuito para a família de microcontroladores Intel 8051 , com  sintaxe Turbo Pascal 7.
  • Oxygene (anteriormente denominado Chrome ) é um compilador Object Pascal para as plataformas .NET e Mono . Ele foi criado e vendido pela RemObjects Software, e vendido por um tempo pela Embarcadero como o compilador backend do Prism .
  • Kylix era descendente do Delphi , com suporte para o sistema operacional Linux e uma biblioteca de objetos aprimorada. Não é mais compatível. Compilador e IDE já estão disponíveis para uso não comercial.
  • GNU Pascal Compiler (GPC) é o compilador Pascal da GNU Compiler Collection (GCC). O compilador é escrito em C, a biblioteca de tempo de execução principalmente em Pascal. Distribuído sob a GNU General Public License , ele roda em muitas plataformas e sistemas operacionais. Ele suporta as linguagens padrão ANSI / ISO e tem suporte parcial ao dialeto Turbo Pascal. Uma das omissões mais dolorosas é a ausência de um tipo de string 100% compatível com Turbo Pascal (curto). O suporte para Borland Delphi e outras variantes de linguagem é bastante limitado. No entanto, existe algum suporte para Mac-pascal.
  • O Virtual Pascal foi criado por Vitaly Miryanov em 1995 como um compilador OS / 2 nativo compatível com a sintaxe Borland Pascal. Depois, foi desenvolvido comercialmente pela fPrint, adicionando suporte para Win32 e, em 2000, tornou-se freeware. Hoje ele pode compilar para Win32, OS / 2 e Linux, e é compatível principalmente com Borland Pascal e Delphi. O desenvolvimento foi cancelado em 4 de abril de 2005.
  • Compilador P4, a base para muitos compiladores Pascal-implementados-em-Pascal subsequentes. Ele implementa um subconjunto de Pascal completo.
  • O compilador P5 é uma adaptação ISO 7185 (Pascal completo) do P4.
  • Smart Mobile Studio é um compilador Pascal para HTML5 / Javascript
  • Turbo Pascal foi o compilador Pascal dominante para PCs durante os anos 1980 e início dos anos 1990, popular por causa de suas extensões poderosas e tempos de compilação extremamente curtos. Turbo Pascal foi escrito de forma compacta e pode compilar, executar e depurar tudo da memória sem acessar o disco. Os drives de disquete lentos eram comuns para os programadores da época, aumentando ainda mais a vantagem de velocidade do Turbo Pascal. Atualmente, versões anteriores do Turbo Pascal (até 5.5) estão disponíveis para download gratuito no site da Borland.
  • IP Pascal implementa a linguagem "Pascaline" (em homenagem à calculadora de Pascal ), que é um Pascal altamente estendido compatível com Pascal original de acordo com a ISO 7185. Possui módulos com controle de namespace, incluindo módulos de tarefas paralelas com semáforos, objetos, matrizes dinâmicas de qualquer dimensões que são alocadas em tempo de execução, sobrecargas, substituições e muitas outras extensões. O IP Pascal possui uma biblioteca de portabilidade incorporada que é personalizada sob medida para a linguagem Pascal. Por exemplo, um aplicativo de saída de texto padrão do Pascal original de 1970 pode ser recompilado para funcionar em uma janela e até mesmo ter construções gráficas adicionadas.
  • Pascal-XT foi criado pela Siemens para seus sistemas operacionais de mainframe BS2000 e SINIX .
  • PocketStudio é um compilador de subconjunto Pascal e ferramenta RAD para processadores Palm OS e MC68xxx com algumas de suas próprias extensões para auxiliar na interface com a API do Palm OS. Ele se assemelha ao Delphi e ao Lazarus com um designer de forma visual, um inspetor de objetos e um editor de código-fonte .
  • MIDletPascal - Um compilador Pascal e IDE que gera bytecode Java pequeno e rápido projetado especificamente para criar software para celulares.
  • Vector Pascal é uma linguagem para conjuntos de instruções SIMD , como o MMX e o AMD 3d Now, com suporte para todos os processadores Intel e AMD e o PlayStation 2 Emotion Engine da Sony.
  • Morfik Pascal permite o desenvolvimento de aplicações Web inteiramente escritas em Object Pascal (servidor e navegador).
  • WDSibyl - Visual Development Environment e compilador Pascal para Win32 e OS / 2.
  • PP Compiler, um compilador para Palm OS que roda diretamente no computador de mão.
  • O compilador Pascal do CDC 6000 é o código-fonte do primeiro compilador Pascal (CDC 6000).
  • Pascal-S
  • AmigaPascal é um compilador Pascal gratuito para o computador Amiga.
  • VSI Pascal (originalmente VAX Pascal) é um compilador compatível com o padrão ISO Pascal para o sistema operacional OpenVMS .
  • Stony Brook Pascal + era um compilador otimizador de 16 bits (mais tarde, 32 bits) para DOS e OS / 2, comercializado como um substituto direto do Turbo Pascal, mas produzia código que era executado pelo menos duas vezes mais rápido.

IDEs

Bibliotecas

  • Biblioteca WOL para criar aplicações GUI com o Free Pascal Compiler.

Padrões

ISO / IEC 7185: 1990 Pascal

Em 1983, a linguagem foi padronizada no padrão internacional IEC / ISO 7185 e vários padrões locais específicos de cada país, incluindo o ANSI / IEEE770X3.97-1983 americano e o ISO 7185: 1983. Esses dois padrões diferiam apenas no fato de que o padrão ISO incluía uma extensão de "nível 1" para matrizes em conformidade (uma matriz em que os limites da matriz não são conhecidos até o tempo de execução), onde ANSI não permitia essa extensão para o original (Wirth versão) idioma. Em 1989, a ISO 7185 foi revisada (ISO 7185: 1990) para corrigir vários erros e ambigüidades encontrados no documento original.

A ISO 7185 foi declarada como um esclarecimento da linguagem Wirth de 1974, conforme detalhado no Manual do Usuário e no Relatório [Jensen e Wirth], mas também foi notável por adicionar "Parâmetros de Matriz em Conformidade" como um nível 1 do padrão, sendo o nível 0 Pascal sem matrizes em conformidade. Este acréscimo foi feito a pedido de CAR Hoare e com a aprovação de Niklaus Wirth. A causa precipitante foi que Hoare queria criar uma versão Pascal da (NAG) Numerical Algorithms Library , que havia sido originalmente escrita em FORTRAN, e descobriu que não era possível fazer isso sem uma extensão que permitisse parâmetros de array de tamanhos variados . Considerações semelhantes motivaram a inclusão na ISO 7185 da facilidade para especificar os tipos de parâmetros de parâmetros procedimentais e funcionais.

O próprio Niklaus Wirth se referiu à linguagem de 1974 como "o padrão", por exemplo, para diferenciá-la dos recursos específicos da máquina do compilador CDC 6000 . Esta linguagem foi documentada no Relatório Pascal , a segunda parte do "Manual e relatório do usuário Pascal".

Nas grandes máquinas (mainframes e minicomputadores) em que Pascal se originou, os padrões eram geralmente seguidos. No IBM PC , eles não eram. Em PCs IBM, os padrões Borland Turbo Pascal e Delphi têm o maior número de usuários. Portanto, normalmente é importante entender se uma implementação específica corresponde à linguagem Pascal original ou a um dialeto Borland dela.

As versões da linguagem para IBM PC começaram a diferir com o advento do UCSD Pascal, uma implementação interpretada que apresentava várias extensões da linguagem, junto com várias omissões e alterações. Muitos recursos da linguagem UCSD sobrevivem hoje, inclusive no dialeto da Borland.

ISO / IEC 10206: 1990 Extended Pascal

Em 1990, um padrão Pascal estendido foi criado como ISO / IEC 10206, que é idêntico em conteúdo técnico ao IEEE / ANSI 770X3.160-1989. A partir de 2019, o suporte para Pascal estendido no Compilador FreePascal está planejado.

Variações

A versão de Pascal de Niklaus Wirth em Zurique foi lançada fora da ETH em duas formas básicas: a fonte do compilador CDC 6000 e um kit de portabilidade chamado Pascal-P system. O compilador Pascal-P omitiu vários recursos da linguagem completa que não eram necessários para inicializar o compilador. Por exemplo, procedimentos e funções usados ​​como parâmetros, registros de variantes não discriminados, empacotamento, descarte, gotos interprocedurais e outros recursos do compilador completo foram omitidos.

UCSD Pascal , sob o professor Kenneth Bowles , foi baseado no kit Pascal-P2 e, conseqüentemente, compartilhou várias das restrições da linguagem Pascal-P. UCSD Pascal foi posteriormente adotado como Apple Pascal, e continuou em várias versões lá. Embora UCSD Pascal realmente tenha expandido o subconjunto Pascal no kit Pascal-P adicionando de volta construções Pascal padrão, ainda não era uma instalação padrão completa de Pascal.

No início dos anos 1990, Alan Burns e Geoff Davies desenvolveram Pascal-FC, uma extensão para Pl / 0 (do livro de Niklaus Algorithms + Data Structures = Programs ). Vários construtos foram adicionados para usar Pascal-FC como uma ferramenta de ensino para Programação Simultânea (como semáforos, monitores, canais, invocação remota e recursos). Para ser capaz de demonstrar a simultaneidade, a saída do compilador (uma espécie de código P ) pode então ser executada em uma máquina virtual. Esta máquina virtual não apenas simulou um ambiente normal - justo, mas também pode simular condições extremas (modo injusto).

Compiladores Pascal semelhantes à Borland

O Turbo Pascal da Borland , escrito por Anders Hejlsberg , foi escrito em linguagem assembly independente do UCSD e dos compiladores de Zurique. No entanto, ele adotou muito do mesmo subconjunto e extensões do compilador UCSD. Isso provavelmente ocorre porque o sistema UCSD era o sistema Pascal mais comum adequado para o desenvolvimento de aplicativos nos sistemas microprocessados ​​com recursos limitados disponíveis naquela época.

O retráctil Turbo Pascal versão 3 e encarnações posteriores, inclusive da Borland Object Pascal e Delphi e não Borland quase compatíveis tornou-se popular com os programadores, incluindo os autores de shareware, e assim a biblioteca GANHOS de código Pascal possui uma grande quantidade de código escrito com tal versões como Delphi em mente.

Produtos de software ( compiladores e IDE / Rapid Application Development (RAD)) nesta categoria:

  • Turbo Pascal - "TURBO.EXE" até a versão 7, e Turbo Pascal para Windows ("TPW") e Turbo Pascal para Macintosh .
  • Borland Pascal 7 - Uma versão profissional da linha Turbo Pascal voltada para DOS e Windows.
  • Object Pascal - uma extensão da linguagem Pascal que foi desenvolvida na Apple Computer por uma equipe liderada por Larry Tesler em consulta com Niklaus Wirth , o inventor do Pascal; seus recursos foram adicionados ao Turbo Pascal da Borland para Macintosh e, em 1989, ao Turbo Pascal 5.5 para DOS.
  • Delphi - Object Pascal é essencialmente sua linguagem subjacente.
  • Compilador Pascal Livre (FPC) - O Pascal Livre adotou o dialeto padrão de fato dos programadores Pascal, Borland Pascal e, mais tarde, Delphi. Freepascal também suporta ambos os padrões ISO.
  • PascalABC.NET - uma linguagem de programação Pascal de nova geração, incluindo compilador e IDE.
  • Borland Kylix é um compilador e IDE anteriormente vendido pela Borland, mas posteriormente descontinuado. É uma versão Linux do ambiente de desenvolvimento de software Borland Delphi e C ++ Builder .
  • Lazarus - semelhante ao Kylix em função, é um IDE visual multi-plataforma gratuito para RAD usando o compilador Free Pascal, que suporta dialetos de Object Pascal em vários graus.
  • Virtual Pascal - VP2 / 1 é um compilador Pascal de 32 bits totalmente compatível com Borland Pascal e Borland Delphi para OS / 2 e Windows 32 (com uma versão Linux "a caminho").
  • Sybil é um IDE e compilador de código aberto semelhante ao Delphi; as implementações incluem:
    • WDSibyl para Microsoft Windows e OS / 2 , um ambiente comercial compatível com Borland Pascal lançado por uma empresa chamada Speedsoft que mais tarde foi desenvolvido em um ambiente de desenvolvimento rápido de aplicativos (RAD) semelhante a Delphi chamado Sybil e então aberto sob a GPL quando a empresa fechou baixa;
    • Open Sybil, que é um projeto em andamento, uma ferramenta de código aberto para OS / 2 e eCS que foi originalmente baseada nas fontes WDsybl Sibyl Portable Component Classes (SPCC) e Sibyl Visual Development Tool (SVDE) da Speedsoft, mas agora seu núcleo é IBM System Object Model (SOM), WPS e OpenDoc .

Lista de padrões relacionados

  • ISO 8651-2: 1988 Sistemas de processamento de informação - Computação gráfica - Ligações de linguagem Graphical Kernel System (GKS) - Parte 2: Pascal

Recepção

Pascal gerou uma ampla variedade de respostas na comunidade de computação, tanto críticas quanto complementares.

Críticas iniciais

Embora muito populares nos anos 1980 e no início dos anos 1990, as implementações de Pascal que seguiram de perto a definição inicial de Wirth da linguagem foram amplamente criticadas como inadequadas para uso fora do ensino. Brian Kernighan , que popularizou a linguagem C , esboçou suas críticas mais notáveis ​​a Pascal já em 1981 em seu artigo "Por que Pascal não é minha linguagem de programação favorita". O problema mais sério que Kernighan descreveu foi que os tamanhos de array e comprimento de string faziam parte do tipo, então não era possível escrever uma função que aceitaria arrays de comprimento variável ou mesmo strings como parâmetros. Isso inviabilizou a escrita, por exemplo, de uma biblioteca de classificação. Kernighan também criticou a ordem imprevisível de avaliação das expressões booleanas, o suporte pobre da biblioteca e a falta de variáveis ​​estáticas , e levantou uma série de questões menores. Além disso, ele afirmou que a linguagem não fornecia nenhuma construção simples para "escapar" (ignorar conscientemente e à força) das restrições e limitações. Reclamações mais gerais de outras fontes observaram que o escopo das declarações não foi claramente definido na definição do idioma original, o que às vezes teve sérias consequências ao usar declarações de encaminhamento para definir tipos de ponteiro, ou quando as declarações de registro levaram à recursão mútua , ou quando um identificador pode ou pode não ter sido usado em uma lista de enumeração. Outra dificuldade era que, assim como o ALGOL 60 , a linguagem não permitia procedimentos ou funções passadas como parâmetros para predefinir o tipo esperado de seus parâmetros.

Apesar das críticas iniciais, Pascal continuou a evoluir, e a maioria dos pontos de Kernighan não se aplica às versões da linguagem que foram aprimoradas para serem adequadas ao desenvolvimento de produtos comerciais, como o Turbo Pascal da Borland . Como Kernighan previu em seu artigo, a maioria das extensões para corrigir esses problemas eram incompatíveis de compilador para compilador. Desde o início dos anos 1990, entretanto, a maioria das variedades parece condensada em duas categorias: ISO e semelhante à Borland. Pascal estendido aborda muitas dessas primeiras críticas. Ele suporta strings de comprimento variável, inicialização de variável, compilação separada, operadores booleanos de curto-circuito e otherwisecláusulas default ( ) para instruções case.

Veja também

Referências

Leitura adicional

  • Niklaus Wirth: The Programming Language Pascal . 35–63, Acta Informatica, Volume 1, 1971.
  • CAR Hoare: "Notas sobre estruturação de dados". Em O.-J. Dahl, EW Dijkstra e CAR Hoare, editores, Structured Programming , páginas 83–174. Academic Press, 1972.
  • CAR Hoare, Niklaus Wirth: Uma definição axiomática da linguagem de programação Pascal . 335–355, Acta Informatica, Volume 2, 1973.
  • Kathleen Jensen e Niklaus Wirth: Pascal - Manual do Usuário e Relatório . Springer-Verlag, 1974, 1985, 1991, ISBN  0-387-97649-3 e ISBN  3-540-97649-3 .
  • Niklaus Wirth: Algoritmos + Estruturas de Dados = Programas . Prentice-Hall, 1975, ISBN  0-13-022418-9 .
  • Niklaus Wirth: Uma avaliação da linguagem de programação Pascal . 23–30 ACM SIGPLAN Notices Volume 10, Issue 6, June 1975.
  • N. Wirth e AI Wasserman, ed: Programming Language Design . IEEE Computer Society Press, 1980
  • DW Barron (Ed.): Pascal - A linguagem e sua implementação . John Wiley 1981, ISBN  0-471-27835-1
  • Peter Grogono: Programming in Pascal , Revised Edition, Addison-Wesley, 1980
  • Richard S. Forsyth: Pascal em Work and Play , Chapman e Hall, 1982
  • N. Wirth, M. Broy, ed, e E. Denert, ed: Pascal and its Successors in Software Pioneers: Contributions to Software Engineering. Springer-Verlag, 2002, ISBN  3-540-43081-4
  • N. Wirth: Lembranças sobre o desenvolvimento de Pascal . Avisos ACM SIGPLAN, Volume 28, No 3, março de 1993.