Historia
Python foi concebido no final de
19895 6 por
Guido van Rossum no Instituto de Pesquisa Nacional para Matemática e Ciência da Computação (CWI), nos
Países Baixos, como um sucessor da
ABC capaz de
tratar exceções e prover interface com o
sistema operacional Amoeba7 através de
scripts. Também da CWI, a linguagem ABC era mais produtiva que
C, ainda que com o custo do desempenho em
tempo de execução.
Mas ela não possuía funcionalidades importantes para a interação com o
sistema operacional, uma necessidade do grupo. Um dos focos primordiais
de Python era aumentar a produtividade do programador.
6
Em
1991, Guido publicou o código (nomeado versão 0.9.0) no grupo de discussão
alt.sources.
1 Nessa versão já estavam presentes
classes com
herança, tratamento de exceções,
funções e os
tipos de dado nativos
list
,
dict
,
str
, e assim por diante. Também estava presente nessa versão um sistema de módulos emprestado do
Modula-3. O modelo de exceções também lembrava muito o do Modula-3, com a adição da opção
else
clause.
7 Em
1994
foi formado o principal fórum de discussão do Python, comp.lang.python,
um marco para o crescimento da base de usuários da linguagem.
A versão 1.0 foi lançada em janeiro de 1994. Novas funcionalidades incluíam ferramentas para
programação funcional como
lambda
,
map
,
filter
e
reduce
. A última versão enquanto Guido estava na CWI foi o Python 1.2. Em
1995, ele continuou o trabalho no CNRI em
Reston,
Estados Unidos,
de onde lançou diversas versões. Na versão 1.4 a linguagem ganhou
parâmetros nomeados (a capacidade de passar parâmetro pelo nome e não
pela posição na lista de parâmetros) e suporte nativo a
números complexos, assim como uma forma de
encapsulamento.
8
Ainda na CNRI, Guido lançou a iniciativa
Computer Programming for Everybody (CP4E; literalmente, "Programação de Computadores para Todos"), que visava tornar a
programação mais acessível, um projeto financiado pela
DARPA.
9 Atualmente o CP4E encontra-se inativo.
Em
2000, o time de desenvolvimento da linguagem se mudou para a BeOpen a fim de formar o time
PythonLabs.
A CNRI pediu que a versão 1.6 fosse lançada, para marcar o fim de
desenvolvimento da linguagem naquele local. O único lançamento na BeOpen
foi o Python 2.0, e após o lançamento o grupo de desenvolvedores da
PythonLabs agrupou-se na
Digital Creations.
Python 2.0 implementou
list comprehension, uma relevante funcionalidade de linguagens funcionais como
SETL e
Haskell.
A sintaxe da linguagem para essa construção é bastante similar a de
Haskell, exceto pela preferência do Haskell por caracteres de pontuação e
da preferência do python por
palavras reservadas alfabéticas. Essa versão 2.0 também introduziu um sistema
coletor de lixo capaz de identificar e tratar ciclos de referências.
10
Já o 1.6 incluiu uma licença CNRI substancialmente mais longa que a
licença CWI que estavam usando nas versões anteriores. Entre outras
mudanças, essa licença incluía uma cláusula atestando que a licença era
governada pelas leis da
Virgínia. A
Free Software Foundation alegou que isso era incompatível com a
GNU GPL.
Tanto BeOpen quanto CNRI e FSF negociaram uma mudança na licença livre
do Python que o tornaria compatível com a GPL. Python 1.6.1 é idêntico
ao 1.6.0, exceto por pequenas correções de falhas e uma licença nova,
compatível com a GPL.
11
Python 2.1 era parecido com as versões 1.6.1 e 2.0. Sua licença foi
renomeada para Python Software Foundation License. Todo código,
documentação e especificação desde o lançamento da
versão alfa da 2.1 é propriedade da
Python Software Foundation (PSF), uma
organização sem fins lucrativos fundada em 2001, um modelo tal qual da
Apache Software Foundation.
11
O lançamento incluiu a mudança na especificação para suportar escopo
aninhado, assim como outras linguagens com escopo estático.
12 Esta funcionalidade estava desativada por padrão, e somente foi requerida na versão 2.2.
Uma grande inovação da versão 2.2 foi a unificação dos tipos Python (escritos em
C)
e classes (escritas em Python) em somente uma hierarquia. Isto tornou o
modelo de objetos do Python consistentemente orientado a objeto.
13 Também foi adicionado
generator, inspirado em
Icon.
14
O incremento da biblioteca padrão e as escolhas sintáticas foram fortemente influenciadas por
Java em alguns casos: o pacote
logging
15 introduzido na versão 2.3,
16 o
analisador sintático SAX, introduzido na versão 2.0 e a sintaxe de decoradores que usa
@
,
17 adicionadas na versão 2.4.
18
Em
1 de outubro de
2008 foi lançada a versão 2.6, já visando a transição para a versão 3.0 da linguagem. Entre outras modificações, foram incluídas
bibliotecas para
multiprocessamento,
JSON e
E/S, além de uma nova forma de formatação de
cadeias de caracteres.
19
Atualmente a linguagem é usada em diversas áreas, como
servidores de aplicação e
computação gráfica. Está disponível como
linguagem de script em aplicações como
OpenOffice (Python UNO Bridge),
Blender e pode ser utilizada em
procedimentos armazenados no
sistema gerenciador de banco de dados PostgreSQL (PL/Python).
A terceira versão da linguagem foi lançada em dezembro de 2008,
20 chamada Python 3.0 ou Python 3000. Com noticiado desde antes de seu lançamento,
21
houve quebra de compatibilidade com a família 2.x para corrigir falhas
que foram descobertas neste padrão, e para limpar os excessos das
versões anteriores.
6 A primeira
versão alfa foi lançada em
31 de agosto de
2007, a segunda em
7 de dezembro do mesmo ano.
Mudanças da versão incluem a alteração da
palavra reservada print
,
que passa a ser uma função, tornando mais fácil a utilização de uma
versão alternativa da rotina. Em Python 2.6, isso já está disponível ao
adicionar o código
from __future__ import print_function
.
22 Também, a mudança para
Unicode de todas as
cadeias de caracteres.
Filosofia
Parte da cultura da linguagem gira ao redor de
The Zen of Python, um poema que faz parte do documento "PEP 20 (The Zen of Python)",
23 escrito pelo
programador em Python de longa data
Tim Peters, descrevendo sumariamente a filosofia do Python. Pode-se vê-lo através de um
easter egg do Python pelo comando:
Características
Construções
Construções de Python incluem:
estrutura de seleção (
if
,
else
,
elif
);
estrutura de repetição (
for, while
), que itera por um container, capturando cada elemento em uma variável local dada; construção de
classes (
class
); construção de
subrotinas (
def
); construção de escopo (
with
), como por exemplo para
adquirir um recurso.
Tipos de dado
A tipagem de Python é forte, pois os valores e objetos têm tipos bem definidos e não sofrem coerções como em
C ou
Perl. São disponibilizados diversos
tipos de dados nativos:
Tipo de dado |
Descrição |
Exemplo da sintaxe |
str , unicode |
Uma cadeia de caracteres imutável |
'Wikipedia' , u'Wikipedia' |
list |
Lista heterogênea mutável |
[4.0, 'string', True] |
tuple |
Tupla imutável |
(4.0, 'string', True) |
set , frozenset |
Conjunto não ordenado, não contém elementos duplicados |
set([4.0, 'string', True])
frozenset([4.0, 'string', True]) |
dict |
conjunto associativo |
{'key1': 1.0, 'key2': False} |
int |
Número de precisão fixa, é transparentemente convertido para long caso não caiba em um int. |
42
2147483648L |
float |
Ponto flutuante |
3.1415927 |
complex |
Número complexo |
3+2j |
bool |
Booleano |
True ou False |
Python também permite a definição dos tipos de dados próprios, através de
classes. Instâncias são construídas invocando a classe (
FooClass()
), e as classes são instância da classe
type
, o que permite
metaprogramação e
reflexão.
Métodos são definidos como funções anexadas à classe, e a sintaxe
instância.método(argumento)
é um atalho para
Classe.método(instância, argumento)
. Os métodos devem referenciar explicitamente a referência para o objeto incluindo o parâmetro
self
como o primeiro argumento do método.
24
Antes da versão 3.0, Python possuía dois tipos de classes:
"old-style" e "new-style". Classes old-style foram eliminadas no Python
3.0, e todas são new-style. Em versões entre 2.2 e 3.0, ambos tipos de
classes podiam ser usadas. A sintaxe de ambos estilos é a mesma, a
diferença acaba sendo de onde objeto da classe é herdado, direta ou
indiretamente (todas classes new-style herdam de object e são instancias
de type). As classes new-styles nada mais são que tipos definidos pelo
usuário.
Palavras reservadas
O Python 2.5.2 define as seguintes 31
palavras reservadas:
25
and del from not while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try
Operadores
Os operadores básicos de comparação como
==
,
<
,
>=
,
entre outros são usados em todos os tipos de dados, como números,
cadeias de texto, listas e mapeamentos. Comparações em cadeia como
a < b < c
possuem o mesmo significado básico que na matemática: os termos são
comparadas na ordem. É garantido que o processamento da expressão lógica
irá terminar tão cedo o veredito é claro, o princípio da avaliação
mínima. Usando a expressão anterior, se
a < b
é falso,
c
não é avaliado.
Quanto aos operadores lógicos, até Python 2.2 não havia o tipo de
dado booleano. Em todas as versões da linguagem os operadores lógicos
tratam
""
,
0
,
None
,
0.0
,
[]
e
{}
como falso, enquanto o restante é tratado como verdadeiro de modo geral. Na versão 2.2.1 as constantes
True
e
False
foram adicionadas (subclasses de 1 e 0 respectivamente). A comparação binária retorna uma das duas constantes acima.
Os operadores booleanos
and
e
or
também seguem a avaliação mínima. Por exemplo,
y == 0 or x/y > 100
nunca lançará a exceção de divisão por zero.
Interpretador interativo
O interpretador interativo é uma característica diferencial da
linguagem, porque há a possibilidade de testar o código de um programa e
receber o resultado em tempo real, antes de iniciar a
compilação ou incluí-las nos programas. Por exemplo:
>>> 1+1
2
>>>
>>> a = 1+1
>>> print a
2
>>> print(a)
2
>>>
Nota: A partir da versão 3.0, o comando
print
passou a ser uma função, sendo obrigatório o uso de parênteses.
26
Análise léxica
No segundo capítulo do
Manual de Referência da Linguagem Python é citado que a
análise léxica é uma análise do interpretador em si, os programas são lidos por um
analisador sintático que divide o código em
tokens.
Todo programa é dividido em linhas lógicas que são separadas pelo
token NEWLINE ou
NOVA LINHA, as linhas físicas são trechos de código divididos pelo caractere
ENTER. Linhas lógicas não podem ultrapassar linhas físicas com exceção de junção de linhas, por exemplo:
if resultado > 2 and \
1 <= 5 and \
2 < 5:
print ('Resultado: %f' % d)
ou
MESES_DO_ANO = ['janeiro', 'fevereiro', 'março',
'abril', 'maio', 'junho',
'julho', 'agosto', 'setembro',
'outubro', 'novembro', 'dezembro']
Para a delimitação de blocos de códigos os delimitadores são colocados em uma
pilha e diferenciados por sua
indentação.
Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os
anteriores na pilha. Para cada começo de linha, o nível de indentação é
comparado com o valor do topo da pilha. Se o número da linha for igual
ao topo da pilha, a pilha não é alterada. Se o valor for maior a pilha
recebe o nível de indentação da linha e o nome
INDENT (empilhamento) se o nível de indentação for menor, então é desempilhado até chegar a um nível de indentação recebendo o nome
DEDENT (desempilhamento) e se não encontrar nenhum valor é gerado um erro de indentação.
Abaixo um exemplo de permutação, retirado do capítulo 2.1 sobre
Estrutura de linhas na Análise léxica do Manual de Referência da
linguagem (
Language Reference Manual):
def perm(l): NOVA LINHA
INDENT if len(l) <= 1: NOVA LINHA
INDENT return[1] NOVA LINHA
DEDENT r = [ ] NOVA LINHA
for i in range(len(l)): NOVA LINHA
INDENT s = l[:i] + l[i+1:] NOVA LINHA
p = perm(s) NOVA LINHA
DEDENT for x in p: NOVA LINHA
INDENT r.append(l[i:i+1]+x) NOVA LINHA
DEDENT return r
Indentação
Python foi desenvolvido para ser uma linguagem de fácil leitura, com
um visual agradável, frequentemente usando palavras e não pontuações
como em outras linguagens. Para a separação de blocos de código, a
linguagem usa espaços em branco e
indentação ao invés de delimitadores visuais como chaves (C, Java) ou palavras (
BASIC,
Fortran,
Pascal).
Diferente de linguagens com delimitadores visuais de blocos, em Python a
indentação é obrigatória. O aumento da indentação indica o início de um
novo bloco, que termina da diminuição da indentação.
Usando um
editor de texto comum é muito fácil existir erros de indentação, o recomendado é configurar o editor conforme a
análise léxica do Python ou utilizar uma
IDE. Todas as IDE que suportam a linguagem fazem indentação automaticamente.
Exemplo:
- Indentação correta
def valor1():
while True:
try:
c = int(raw_input('Primeiro Valor: '))
return c
except ValueError:
print 'Inválido!'
|
- Indentação incorreta
def valor1():
while True:
try:
c = int(raw_input('Primeiro Valor: '))
return c
except ValueError:
print 'Inválido!'
|
O código está correto para os dois exemplos, mas o analisador léxico
verificará se a indentação está coerente. O analisador reconhecerá as
palavras reservadas while
,
def
,
try
,
except
,
return
,
print
e as
cadeias de caracteres
entre aspas simples e a indentação, e se não houver problemas o
programa executará normalmente, senão apresentará a exceção: "Seu
programa está com erro no bloco de indentação".
Compilador de bytecode
A linguagem é de altíssimo nível, como já dito, mas ela também pode
compilar
seus programas para que a próxima vez que o executar não precise
compilar novamente o programa, reduzindo o tempo de carga na execução.
Utilizando o interpretador interativo não é necessário a criação do
arquivo de Python compilado, os comandos são executados interativamente.
Porém quando um programa ou um módulo é evocado, o interpretador
realiza a análise léxica e sintática, compila o código de alto nível se
necessário e o executa na
máquina virtual da linguagem.
O
bytecode é armazenado em arquivos com extensão
.pyc
ou
.pyo
, este último no caso de
bytecode otimizado. Interessante notar que o
bytecode
da linguagem também é de alto nível, ou seja, é mais legível aos seres
humanos que o código de byte do C, por exemplo. Para descompilar um
código de byte é utilizado o módulo
dis
da biblioteca padrão da linguagem e existem módulos de terceiros que tornam o
bytecode mais confuso, tornando a descompilação ineficaz.
Normalmente, o Python trabalha com dois grupos de arquivos:
- Os módulos do núcleo da linguagem, sua biblioteca padrão e os módulos independentes, criados pelo usuário.
- No núcleo do interpretador existe o analisador léxico, o analisador sintático que utiliza Estruturas de Objetos (tempo de execução), o Compilador que aloca memória (tempo de execução) e depois do Avaliador de código que modifica o estado atual do programa (tempo de execução), mostrando resultado para o usuário.
Polimorfismo
O conceito de
polimorfismo
descreve como objetos podem ser manipulados e acessados usando
atributos e comportamentos em comum sem considerar sua classe específica
e indica a presença de
late binding, permitindo sobrecarga e determinação de tipos em tempo de execução e verificação.
Muitas linguagens orientadas a objeto utilizam assinaturas de função
para determinar qual versão de um método sobrecarregado chamar. No
entanto, as chamadas de função em Python são universais ou genéricas sem
determinação de tipo. Por isso, sobrecarga não é suportada na
linguagem.
Orientação a objetos
Python suporta a maioria das técnicas da
programação orientada a objeto.
Qualquer objeto pode ser usado para qualquer tipo, e o código
funcionará enquanto haja métodos e atributos adequados. O conceito de
objeto na linguagem é bastante abrangente: classes, funções, números e
módulos são todos considerados objetos. Também há suporte para
metaclasses,
polimorfismo, e
herança (inclusive
herança múltipla). Há um suporte limitado para variáveis privadas.
Na versão 2.2 de Python foi introduzido um novo estilo de classes em
que objetos e tipos foram unificados, permitindo a especialização de
tipos. Já a partir da versão 2.3 foi introduzido um novo método de
resolução de ambiguidades para heranças múltiplas.
27
Uma classe é definida com
class nome:
, e o código
seguinte é a composição dos atributos. Todos os métodos da classe
recebem uma referência a uma instância da própria classe como seu
primeiro argumento, e a convenção é que se chame este argumento
self
. Assim os métodos são chamados
objeto.método(argumento1, argumento2, ...)
e são definidos iguais a uma função, como
método(self, argumento1, argumento2, ...)
. Veja que o parâmetro
self
conterá uma referência para a instância da classe definida em
objeto
quando for efetuada esta chamada. Os atributos da classe podem ser
acessados em qualquer lugar da classe, e os atributos de instância (ou
variável de instância) devem ser declarados dentro dos métodos
utilizando a referência à instância atual (
self)
(ver código contextualizado em anexo).
Em Python não existe proteção dos membros duma classe ou instância pelo interpretador, o chamado
encapsulamento.
Convenciona-se que atributos com o nome começando com um _ são de uso
privado da classe, mas não há um policiamento do interpretador contra
acesso a estes atributos. Uma exceção são nomes começando com
__
, no caso em que o interpretador modifica o nome do atributo
(ver código contextualizado em anexo).
Python permite polimorfismo, que condiz com a reutilização de código.
É fato que funções semelhantes em várias partes do software sejam
utilizadas várias vezes, então definimos esta função como uma biblioteca
e todas as outras funções que precisarem desta a chamam sem a
necessidade de reescrevê-la
(ver código contextualizado em anexo).
Programação funcional
Uma das construções funcionais de Python é
compreensão de listas,
uma forma de construir listas. Por exemplo, pode-se usar a técnica para
calcular as cinco primeiras potências de dois. O algoritmo
quicksort também pode ser expressado usando a mesma técnica
(ver códigos contextualizados para ambos os casos em anexo).
Em Python, funções são objetos de primeira classe que podem ser
criados e armazenados dinamicamente. O suporte à funções anônimas está
na construção
lambda
(
cálculo Lambda). Não há disponibilidade de funções anônimas de fato, pois os lambdas contêm somente expressões e não blocos de código.
Python também suporta
clausuras léxicas desde a versão 2.2
(ver códigos contextualizados para ambos os casos em anexo). Já
geradores foram introduzidos na versão 2.2 e finalizados na versão 2.3, e representam o mecanismo de Python para a
avaliação preguiçosa de funções
(ver códigos contextualizados para ambos os casos em anexo).
Tratamento de exceções
Python suporta e faz uso constante de
tratamento de exceções
como uma forma de testar condições de erro e outros eventos inesperados
no programa. É inclusive possível capturar uma exceção causada por um
erro de sintaxe. O estilo da linguagem apóia o uso de exceções sempre
que uma condição de erro pode aparecer. Por exemplo, ao invés de testar a
disponibilidade de acesso a um recurso, a convenção é simplesmente
tentar usar o recurso e capturar a exceção caso o acesso seja rejeitado
(recurso inexistente, permissão de acesso insuficiente, recurso já em
uso, ...).
Exceções são usadas frequentemente como uma estrutura de seleção, substituindo blocos
if-else
, especialmente em situações que envolvem
threads.
Uma convenção de codificação é o EAFP, do inglês, "é mais fácil pedir
perdão que permissão". Isso significa que em termos de desempenho é
preferível capturar exceções do que testar atributos antes de os usar.
Segue abaixo exemplos de código que testam atributos ("pedem permissão")
e que capturam exceções ("pedem perdão"):
- Teste de atributo
if hasattr(spam, 'eggs'):
ham = spam.eggs
else:
handle_error()
|
- Captura de exceção
try:
ham = spam.eggs
except AttributeError:
handle_error()
|
Ambos os códigos produzem o mesmo efeito, mas há diferenças de desempenho. Quando
spam
possui o atributo
eggs
,
o código que captura exceções é mais rápido. Caso contrário, a captura
da exceção representa uma perda considerável de desempenho, e o código
que testa o atributo é mais rápido. Na maioria dos casos o paradigma da
captura de exceções é mais rápido, e também pode evitar problemas de
concorrência.
28
Por exemplo, num ambiente multitarefa, o espaço de tempo entre o teste
do atributo e seu uso de fato pode invalidar o atributo, problema que
não acontece no caso da captura de exceções.
Biblioteca padrão
Python possui uma grande
biblioteca padrão, geralmente citada como um dos maiores triunfos da linguagem,
29 fornecendo ferramentas para diversas tarefas. Recentemente, a
biblioteca Boost do
C++
incluiu uma biblioteca para permitir a interoperabilidade entre as duas
linguagens. Por conta da grande variedade de ferramentas fornecida pela
biblioteca padrão, combinada com a a habilidade de usar linguagens de
nível mais baixo como C e C++, Python pode ser poderosa para conectar
componentes diversos de software.
A biblioteca padrão conta com facilidades para escrever aplicações para a
Internet, contando com diversos formatos e
protocolos como
MIME e
HTTP. Também há módulos para criar
interfaces gráficas, conectar em
bancos de dados relacionais e manipular
expressões regulares.
Algumas partes da biblioteca são cobertas por especificações (por exemplo, a implementação
WSGI da
wsgiref
segue o PEP 333
30 ), mas a maioria dos módulos não segue.
Comentários
Python fornece duas alternativas para documentar o código. A primeira
é o uso de comentários para indicar o que certo código faz. Comentários
começam com
#
e são terminados pela quebra da linha. Não
há suporte para comentários que se estendem por mais de uma linha; cada
linha consecutiva de comentário deve indicar
#
. A segunda
alternativa é o uso de cadeias de caractere, literais de texto inseridos
no código sem atribuição. Cadeias de caracteres em Python são
delimitadas por
"
ou
'
para única linha e por
"""
ou
'''
para múltiplas linhas. Entretanto, é convenção usar o métodos de múltiplas linhas em ambos os casos.
Diferente de comentários, a cadeias de caracteres usadas como
documentação são objetos Python e fazem parte do código interpretado.
Isso significa que um programa pode acessar sua própria documentação e
manipular a informação. Há ferramentas que extraem automaticamente essa
documentação para a geração da documentação de
API
a partir do código. Documentação através de cadeias de caracteres
também pode ser acessada a partir do interpretador através da função
help()
.
Plataformas disponíveis
A linguagem e seu interpretador estão disponíveis para as mais diversas
plataformas, desde
Unix (
Linux,
FreeBSD,
Solaris,
MacOS X, etc.),
Windows,
.NET, versões antigas de
MacOS até consoles de jogos eletrônicos ou mesmo alguns celulares, como a série 60, N8xx(PyMaemo) da
Nokia e
palmtops.
Para algum
sistema operacional não suportado, basta que exista um
compilador C disponível e gerar o Python a partir do fonte. O código fonte é traduzido pelo interpretador para o formato
bytecode, que é
multiplataforma e pode ser executado e distribuído sem fonte original.
Implementações
A implementação original e mais conhecida do Python é o
CPython, escrita em
C e compatível com o padrão
C89,
31
sendo distribuída com uma grande biblioteca padrão escrita em um misto
de Python e C. Esta implementação é suportada em diversas plataformas,
incluindo
Microsoft Windows e sistemas
Unix-like modernos.
Stackless Python é uma variação do CPython que implementa
microthreads (permitindo
multitarefa sem o uso de
threads), sendo suportada em quase todas as plataformas que a implementação original.
Existem também implementações para plataformas já existentes:
Jython para a
Plataforma Java e
IronPython para
.NET.
Em
2005 a
Nokia lançou um interpretador Python para os
telefones celulares S60, chamado
PyS60.
Essa versão inclui vários módulos das implementações tradicionais, mas
também alguns módulos adicionais para a integração com o sistema
operacional
Symbian. Uma implementação para
Palm pode ser encontrada no
Pippy. Já o
PyPy, é a linguagem Python totalmente escrita em Python.
Diversas implementações, como CPython, pode funcionar como um
interpretador de comandos
em que o usuário executa as instruções sequencialmente, recebendo o
resultado automaticamente. A execução compilada do código oferece um
ganho substancial em velocidade, com o custo da perda da
interatividade.
Desenvolvimento
O desenvolvimento de Python é conduzido amplamente através do
processo Python Enhancement Proposal ("PEP"), em português Proposta de
Melhoria do Python. Os PEPs são documentos de projeto padronizados que
fornecem informações gerais relacionadas ao Python, incluindo propostas,
descrições,
justificativas de projeto
(design rationales) e explicações para características da linguagem.
PEPs pendentes são revisados e comentados por Van Rossum, o
Benevolent Dictator For Life
(líder arquiteto da linguagem) do projeto Python. Desenvolvedores do
CPython também se comunicam através de uma lista de discussão,
python-dev, que é o fórum principal para discussão sobre o
desenvolvimento da linguagem. Questões específicas são discutidas no
gerenciador de erros Roundup mantido em python.org. O desenvolvimento acontece no auto-hospedado
svn.python.org
Licença
Python possui uma licença
livre aprovada pela
OSI e compatível com a
GPL,
porém menos restritiva. Ela prevê (entre outras coisas) que binários da
linguagem sejam distribuídos sem a necessidade de fornecer o
código fonte junto.
32
Módulos e frameworks
Ao longo do tempo têm sido desenvolvidos pela comunidade de programadores muitas
bibliotecas de funções especializadas (módulos) que permitem expandir as capacidades base da linguagem. Entre estes módulos especializados destacam-se:
Interfaces gráficas
Exemplos de
bibliotecas de
GUI disponíveis para Python incluem:
Etk |
interface para a biblioteca EFL |
PyGTK |
interface para a biblioteca GTK |
PyQT |
interface para a biblioteca QT |
Tkinter |
Módulo padrão para GUI no Python |
wxPython |
interface para a biblioteca wxWidgets |
Wax |
Construído para simplificar o uso do wxPython |
Ambientes de desenvolvimento integrado
Existem vários
ambientes de desenvolvimento integrado (IDE) disponíveis para Python:
Aplicações
Alguns dos maiores projetos que utilizam Python são o
servidor de aplicação Zope, o compartilhador de arquivos
Mnet, o sítio
YouTube e o cliente original do
BitTorrent. Grandes organizações que usam a linguagem incluem
Google33 (parte dos
crawlers),
Yahoo! (para o sítio de grupos de usuários) e
NASA.
34 O sistema de gerenciamento de reservas da
Air Canada também usa Python em alguns de seus componentes.
35 A linguagem também tem bastante uso na indústria da
segurança da informação.
A linguagem tem sido embarcada como linguagem de script em diversos softwares, como em programas de edição tridimensional como
Maya,
36 Autodesk Softimage,
TrueSpace e
Blender.
37 Programas de edição de imagem também a usam para scripts, como o
GIMP.
38 Para diversos sistema operacionais a linguagem já é um componente padrão, estando disponível em diversas distribuições
Linux. O
Red Hat Linux usa Python para instalação, configuração e gerenciamento de pacotes.
Outros exemplos incluem o
Plone,
sistema de gerenciamento de conteúdo desenvolvido em Python e Zope e a
Industrial Light & Magic,
39 que produz filmes da série
Star Wars usando extensivamente Python para a
computação gráfica nos processos de produção dos filmes.
MODULOS
Ciência da computação é a ciência que estuda as técnicas,
metodologias e instrumentos computacionais, que automatiza processos e
desenvolve soluções baseadas no uso do processamento digital. Não se
restringe apenas ao estudo dos
algoritmos, suas aplicações e implementação na forma de
software,
extrapolando para todo e qualquer conhecimento pautado no computador,
que envolve também a telecomunicação, o banco de dados e as aplicações
tecnológicas que possibilitam atingir o tratamento de dados de entrada e
saída, de forma que se transforme em informação. Assim, a Ciência da
Computação também abrange as técnicas de modelagem de dados e os
protocolos de comunicação, além de princípios que abrangem outras
especializações da área.
Enquanto ciência, classifica-se como ciência exata, apesar de herdar
elementos da lógica filosófica aristotélica, tendo por isto um papel
importante na formalização matemática de algoritmos, como forma de
representar problemas decidíveis, i.e., os que são susceptíveis de
redução a operações elementares básicas, capazes de serem reproduzidas
através de um qualquer dispositivo mecânico/eletrônico capaz de
armazenar e manipular dados. Um destes dispositivos é o
computador digital,
de uso generalizado, nos dias de hoje. Também de fundamental
importância para a área de ciência da computação são as metodologias e
técnicas ligadas à implementação de software que abordam a
especificação, modelagem, codificação, teste e avaliação de sistemas de
software.
Os estudos oriundos da ciência da computação podem ser aplicados em qualquer área do
conhecimento humano
em que seja possível definir métodos de resolução de problemas baseados
em repetições previamente observadas. Avanços recentes na ciência da
computação tem impactado fortemente a sociedade contemporânea, em
particular as aplicações relacionadas às áreas de redes de computadores,
Internet, Web e computação móvel que têm sido utilizadas por bilhões de
pessoas ao
História da computação
O
ábaco, primeira ferramenta de computação, em sua forma moderna.
A primeira ferramenta conhecida para a computação foi o
ábaco1 , cuja invenção é atribuída a habitantes da
Mesopotâmia, em torno de
2700–
2300 a.C.. Seu uso original era desenhar linhas na
areia com rochas. Versões mais modernas do ábaco ainda são usadas como instrumento de cálculo.
No século VII a.C., na
antiga Índia, o gramático
Pānini formulou a gramática de
Sânscrito usando 3959 regras conhecidas como
Ashtadhyāyi,
de forma bastante sistemática e técnica. Pānini usou transformações e
recursividade com tamanha sofisticação que sua gramática possuía o poder
computacional teórico tal qual a
Máquina de Turing.
Entre
200 a.C. e
400, os indianos também inventaram o
logaritmo, e partir do
século XIII tabelas logarítmicas eram produzidas por matemáticos
islâmicos. Quando
John Napier descobriu os logaritmos para uso computacional no
século XVI1 , seguiu-se um período de considerável progresso na construção de ferramentas de cálculo.
Algoritmos
No século VII, o matemático indiano Brahmagupta explicou pela primeira vez o sistema de numeração hindu-arábico e o uso do
0. Aproximadamente em 825, o matemático persa
al-Khwarizmi escreveu o livro
Calculando com numerais hindus,
responsável pela difusão do sistema de numeração hindu-arábico no
Oriente Médio, e posteriormente na Europa. Por volta do século XII houve
uma tradução do mesmo livro para o latim:
Algoritmi de numero Indorum.
Tais livros apresentaram novos conceitos para definir sequências de
passos para completar tarefas, como aplicações de aritmética e álgebra.
Por derivação do nome do matemático, atualmente usa-se o termo
algoritmo.
Lógica binária
Por volta do século III a.C., o matemático indiano
Pingala inventou o
sistema de numeração binário.
Ainda usado atualmente no processamento de todos computadores modernos,
o sistema estabelece que sequências específicas de uns e zeros podem
representar qualquer informação.
Em
1703 Gottfried Leibniz desenvolveu a
lógica
em um sentido formal e matemático, utilizando o sistema binário. Em seu
sistema, uns e zeros também representam conceitos como verdadeiro e
falso, ligado e desligado, válido e inválido. Mais de um século depois,
George Boole publicou a
álgebra booleana (em
1854), com um sistema completo que permitia a construção de modelos matemáticos para o processamento computacional. Em
1801, apareceu o
tear controlado por
cartão perfurado, invenção de
Joseph Marie Jacquard,
no qual buracos indicavam os uns e, áreas não furadas, indicavam os
zeros. O sistema está longe de ser um computador, mas ilustrou que as
máquinas poderiam ser controladas pelo sistema binário.
Engenho analítico
Foi com
Charles Babbage que o computador moderno começou a ganhar forma, através de seu trabalho no
engenho analítico. O equipamento descrito originalmente em
1837,
mais de um século antes de seu sucessor, nunca foi construído com
sucesso, mas possuía todas as funções de um computador moderno. O
dispositivo de Babbage se diferenciava por ser programável, algo
imprescindível para qualquer computador moderno.
Durante sua colaboração, a matemática
Ada Lovelace publicou os primeiros
programas de computador em uma série de notas para o engenho analítico
2 . Por isso, Lovelace é popularmente considerada como a primeira
programadora.
Nascimento da ciência da computação
Antes da
década de 1920,
computador
era um termo associado a pessoas que realizavam cálculos, geralmente
liderados por físicos. Milhares de computadores eram empregados em
projetos no comércio, governo e sítios de pesquisa. Após a década de
1920, a expressão
máquina computacional começou a ser usada para
referir-se a qualquer máquina que realize o trabalho de um profissional,
especialmente aquelas de acordo com os métodos da
Tese de Church-Turing.
O termo
máquina computacional acabou perdendo espaço para o termo reduzido
computador no final da
década de 1940, com as máquinas digitais cada vez mais difundidas.
Alan Turing, conhecido como pai da ciência da computação, inventou a
Máquina de Turing, que posteriormente evoluiu para o computador moderno.
Trabalho teórico
Os fundamentos matemáticos da ciência da computação moderna começaram a ser definidos por
Kurt Gödel com seu
teorema da incompletude (
1931).
Essa teoria mostra que existem limites no que pode ser provado ou
desaprovado em um sistema formal; isso levou a trabalhos posteriores por
Gödel e outros teóricos para definir e descrever tais sistemas formais,
incluindo conceitos como
recursividade e
cálculo lambda.
Em
1936 Alan Turing e
Alonzo Church
independentemente, e também juntos, introduziram a formalização de um
algoritmo, definindo os limites do que pode ser computador e um modelo
puramente mecânico para a computação. Tais tópicos são abordados no que
atualmente chama-se
Tese de Church-Turing,
uma hipótese sobre a natureza de dispositivos mecânicos de cálculo.
Essa tese define que qualquer cálculo possível pode ser realizado por um
algoritmo sendo executado em um computador, desde que haja tempo e
armazenamento suficiente para tal.
Turing também incluiu na tese uma descrição da
Máquina de Turing,
que possui uma fita de tamanho infinito e um cabeçote para leitura e
escrita que move-se pela fita. Devido ao seu caráter infinito, tal
máquina não pode ser construída, mas tal modelo pode simular a
computação de qualquer algoritmo executado em um computador moderno.
Turing é bastante importante para a ciência da computação, tanto que seu
nome é usado para o
Prêmio Turing e o
teste de Turing. Ele contribuiu para as quebras de código da
Grã-Bretanha3 na
Segunda Guerra Mundial, e continuou a projetar computadores e programas de computador pela
década de 1940; cometeu suicídio em
1954.
4 5 .
Shannon e a teoria da informação
Até a
década de 1930,
engenheiros eletricistas podiam construir circuitos eletrônicos para
resolver problemas lógicos e matemáticos, mas a maioria o fazia sem
qualquer processo, de forma particular, sem rigor teórico para tal. Isso
mudou com a tese de mestrado de
Claude Shannon de 1937,
A Symbolic Analysis of Relay and Switching Circuits.
Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de
George Boole, e percebeu que poderia aplicar esse aprendizado em
conjuntos eletro-mecânicos para resolver problemas. Shannon desenvolveu a
teoria da informação no artigo de
1948:
A Mathematical Theory of Communication6 , cujo conteúdo serve como fundamento para áreas de estudo como
compressão de dados e
criptografia.
7
Realizações para a sociedade
Apesar de sua pequena história enquanto uma disciplina acadêmica, a
ciência da computação deu origem a diversas contribuições fundamentais
para a
ciência e para a
sociedade. Esta ciência foi responsável pela definição formal de
computação e
computabilidade, e pela prova da existência de
problemas insolúveis ou intratáveis computacionalmente.
8 Também foi possível a construção e formalização do conceito de
linguagem de computador, sobretudo
linguagem de programação,
uma ferramenta para a expressão precisa de informação metodológica
flexível o suficiente para ser representada em diversos níveis de
abstração.
9
Para outros campos científicos e para a sociedade de forma geral, a ciência da computação forneceu suporte para a
Revolução Digital, dando origem a
Era da Informação.
8 A computação científica é uma área da computação que permite o avanço de estudos como o mapeamento do genoma humano (ver
Projeto Genoma Humano).