Frango (implementação do esquema) - Chicken (Scheme implementation)

Esquema De Frango
Logotipo e marca de palavras do Chicken Scheme.svg
Logo para Chicken Scheme
Frango 5.0.0.png
Intérprete do Chicken 5.0.0 em execução no macOS
Paradigmas Multi-paradigma : funcional , imperativo , meta
Família Lisp
Projetado por Felix Winkelmann
Desenvolvedor The Chicken Team
Apareceu pela primeira vez 20 de julho de 2000 ; 20 anos atras  ( 20/07/2000 )
Versão estável
5.2.0 / 29 de fevereiro de 2020 ; 9 meses atrás  ( 2020-02-29 )
Disciplina de digitação Dinâmico , latente , forte
Escopo Lexical
Linguagem de implementação Esquema , C
Plataforma IA-32 , x86-64 , ARM , MIPS , SPARC 64, PowerPC
SO Plataforma cruzada : Windows , Linux , macOS , FreeBSD , NetBSD , OpenBSD , Solaris , AIX , Haiku , Android , iOS
Licença BSD
Extensões de nome de arquivo .scm
Local na rede Internet www .call-cc .org Edite isso no Wikidata
Influenciado por
Lisp , Scheme

Frango (estilizado como GALINHA ) é uma linguagem de programação , especificamente um compilador e intérprete que implementar um dialeto da linguagem de programação Esquema , e que compila Esquema código fonte para padrão C . É em grande parte compatível com R5RS e oferece muitas extensões para o padrão. O padrão R7RS mais recente é compatível com uma biblioteca de extensão . Chicken é um software gratuito e de código aberto disponível sob uma licença BSD . Ele é implementado principalmente em Scheme, com algumas partes em C para desempenho ou para tornar a incorporação em programas C mais fácil.

Foco

O foco do Chicken é rapidamente claro em seu slogan: " Um sistema Scheme prático e portátil ".

O foco principal do Chicken é a aplicação prática do Scheme para escrever software do mundo real. Scheme é bem conhecido por seu uso em currículos de ciência da computação e experimentação de linguagem de programação, mas tem visto pouco uso nos negócios e na indústria. A comunidade de Chicken produziu um grande conjunto de bibliotecas para realizar uma variedade de tarefas. O wiki do Chicken (o software que o executa também é um programa do Chicken) também contém uma lista de softwares que foram escritos no Chicken.

O outro objetivo do frango é ser portátil . Compilando para uma representação intermediária , neste caso C portátil (como Gambit e Bigloo ), programas escritos em Chicken podem ser compilados para sistemas operacionais populares comuns , como Linux , macOS , outros sistemas semelhantes ao Unix, Windows , Haiku e dispositivos móveis plataformas iOS e Android . Ele também possui suporte integrado para compilação cruzada de programas e extensões, o que permite que seja usado em várias plataformas de sistema integrado .

Projeto

Como muitos compiladores Scheme, Chicken usa C padrão como uma representação intermediária . Um programa Scheme é traduzido para C pelo compilador Chicken e, em seguida, um compilador C traduz o programa C em código de máquina para a arquitetura do computador de destino , produzindo um programa executável. A disponibilidade universal de C o torna útil para esse propósito.

Criação de galinha foi inspirado por um papel de 1994 por Henry Baker que delineada uma estratégia inovadora para compilar Esquema C. Um programa em Esquema é compilado em C funções . Essas funções C nunca alcançam a instrução return ; em vez disso, eles chamam uma nova continuação quando concluídos. Essas continuações são funções C e são passadas como argumentos extras para outras funções C. Eles são calculados pelo compilador.

Até agora, essa é a essência do estilo de passagem de continuação . A ideia original de Baker é usar a pilha de chamadas C para o heap do Scheme. Conseqüentemente, as operações normais da pilha C, como criação automática de variável, alocação de array de tamanho variável e assim por diante, podem ser usadas. Quando a pilha fica cheia (ou seja, o ponteiro da pilha atinge o topo da pilha), uma coleta de lixo pode ser iniciada. O design usado é um coletor de lixo de cópia originalmente desenvolvido por CJ Cheney, que copia todas as continuações ao vivo e outros objetos ao vivo para o heap. Apesar disso, o código C não copia quadros de pilha C, apenas objetos Scheme, portanto, não requer conhecimento da implementação C.

Por completo, o heap Scheme consiste na pilha C como berçário junto com os dois heaps exigidos pelo coletor de lixo de geração. Essa abordagem fornece a velocidade da pilha C para muitas operações e permite o uso de continuações como chamadas simples para funções C. Além disso, a solução de Baker garante comportamento recursivo de cauda assintótica , conforme exigido pelo padrão de linguagem Scheme. A implementação no compilador Chicken Scheme é até mesmo assintoticamente segura para o espaço .

Limitações e desvios do padrão

O esquema de frango é em grande parte compatível com R5RS, com algumas limitações e desvios notáveis. A compatibilidade com R7RS é fornecida como uma biblioteca de extensão.

O sistema central tem suporte básico para caracteres UTF-8 , no entanto, os procedimentos de indexação e manipulação de strings não reconhecem UTF-8. Existe uma biblioteca de extensão que adiciona suporte para reconhecimento total de UTF-8.

Software adicional

O Chicken tem um grande repositório de software com bibliotecas e programas adicionados, chamados de ovos . Este sistema é muito semelhante ao RubyGems .

Inicialmente, esses ovos foram desenvolvidos em um repositório svn central, no qual a criação de uma tag faria automaticamente com que uma nova versão da extensão ficasse disponível para download. Atualmente, os eggs podem ser desenvolvidos em qualquer lugar e sob qualquer sistema de controle de versão , mantendo o gerenciamento de versão semiautomático ao usar a maioria dos sites de hospedagem de código populares. Este método de liberação é independente de VCS, no sentido de que o usuário não precisa ter esses VCSes instalados. O desenvolvedor é livre para hospedar em qualquer lugar que escolher e pode até mesmo optar por evitar o controle de versão pública e distribuir apenas tarballs simples.

Para todos os ovos lançados, a versão mais recente é testada automaticamente como parte de um processo de integração contínua . Existe um servidor de teste canônico , onde o sistema central e todos os ovos são testados diariamente contra a versão de desenvolvimento mais recente (para detectar bugs regressivos) e a versão estável mais recente (para garantir que tudo funcione para os usuários do sistema estável). Além disso, qualquer pessoa pode se voluntariar para fornecer capacidade de teste adicional, em diferentes: hardware, sistemas operacionais ou versões principais.

Características

O Chicken suporta a maior parte do Scheme padrão do R5RS , mas também adiciona alguns recursos não padronizados que não estão disponíveis em todas as implementações do Scheme.

Interface de função estrangeira

A compilação do Chicken para C torna possível injetar código C customizado no resultado compilado, o que facilita a integração com bibliotecas C. Sua interface de função externa oferece suporte à conversão entre a maioria dos tipos C embutidos e os objetos Scheme correspondentes.

Além disso, existem bibliotecas de extensão para interface com Python , Lua e Java , via Java Native Interface (JNI) ou uma ponte.

Compilação cruzada

É relativamente fácil compilar o código do Scheme para outra plataforma (por exemplo, para uso integrado em um dispositivo).

Para tornar a compilação cruzada possível para o código do Scheme, Chicken impõe um modelo de compilação separada: Um módulo compilado consiste em duas bibliotecas compartilhadas . Uma biblioteca contém o código real que será usado em tempo de execução (compilado para a plataforma de destino), e a outra é um módulo de importação , que será usado para carregar o código que é executado em tempo de compilação (na plataforma host), como como código de macro procedural.

O compilador Chicken também pode ser compilado cruzado facilmente. Depois que a tradução para C for alcançada, pode-se simplesmente usar um compilador C que é configurado para ser compilado para outra plataforma.

Módulos e macros

Desde a versão 4, o Chicken tem um sistema de módulo embutido e suporte para macros higiênicas de baixo nível por meio de macros de renomeação explícita (antes da versão 4, isso estava disponível por meio de uma biblioteca adicional). Também há suporte para macros de regras de sintaxe padrão e macros de renomeação implícita , que são basicamente uma versão reversa da renomeação explícita.

Este mecanismo troca desempenho por conveniência. Cada identificador não injetado explicitamente como anti-higiênico será renomeado automaticamente para evitar a captura de nome. O custo de desempenho ocorre porque a renomeação implícita exige que o macroexpansor retroceda as expressões mais duas vezes. Este custo é pago no tempo de expansão, portanto, um autor de macro deve considerar se tempos de compilação mais longos são aceitáveis.

Depurador remoto

Desde a versão 4.11, o Chicken vem com um depurador chamado Feathers . Quando o código do Scheme é compilado com a opção de depuração necessária, os eventos de depuração são injetados em pontos específicos do código. Eles são implementados como chamadas para uma função C, que é relativamente baixa sobrecarga quando não está realmente depurando o código. Durante a depuração, ele tentará fazer uma conexão TCP com um processo do servidor Feathers, possivelmente em uma máquina diferente. O processo é interrompido, o usuário pode definir pontos de interrupção e iniciar o programa. Então, quando o ponto de interrupção é atingido, o cliente (processo sendo depurado) entra em um loop de comando, que permite interrogar o cliente para ler variáveis ​​ou modificá-las.

Análise limitada de tipo estático

O frango oferece suporte à análise de fluxo local. Isso permite que o compilador detecte erros de tipo de variável em tempo de compilação e execute a especialização de tipo. Essa especialização torna possível remover várias verificações de segurança para detecção de tipo em tempo de execução, quando o tipo pode ser deduzido em tempo de compilação. Isso resulta em melhor desempenho de tempo de execução.

Este escrutinizador não permite a análise de fluxo entre módulos, portanto, só pode ser usado para otimizar o código que faz parte de uma unidade de compilação (ou módulo).

Veja também

Referências

links externos