Em um dos meus projetos de SDK, precisamos adicionar scripts que tivessem o menor efeito no tamanho do arquivo binário final, mas ainda fornecessem boas funcionalidades. Isso deu origem ao projeto, que é descrito neste artigo. Observe que desde no SDK temos certos requisitos, eles foram parcialmente transferidos para a linguagem de script, portanto, algumas linguagens de programação embarcadas bastante conhecidas não participaram do projeto (mas Lua está incluída para comparação).
O site do projeto está disponível aqui . Direi imediatamente que o Chibi-Scheme é o vencedor para mim no momento. Detalhes para os interessados sob o corte.
Os requisitos eram os seguintes:
- Portabilidade máxima (somente C / C ++).
- Tipagem suficientemente forte (o que não permite adicionar laranjas e maçãs), portanto, as implementações ECMAScript não foram consideradas.
- Conveniência de minimizar os próprios scripts (por exemplo, para que você possa remover com segurança todas as quebras de linha), respectivamente, as implementações de Forth, Lua e Python não foram consideradas.
- Licença comercial amigável.
A lista inicial foi tirada de um projeto no qual eles estão tentando levar em consideração todos os scripts incorporados possíveis: https://github.com/dbohdan/embedded-scripting-languages Talvez a lista não esteja completa e não contenha scripts adicionais que possam satisfazer os requisitos acima ... Se você souber sobre isso, por favor me avise via PM ou por comentário.
O código de teste para todas as linguagens de programação inclui a criação e chamada de uma função que adiciona "Hello" e o resultado da chamada de uma função externa (C / C ++) que retorna "world". O código da função é apresentado na tabela como um exemplo de sintaxe. O executável final é compilado com otimização de tamanho e remoção de todos os símbolos desnecessários (GCC -s).
, , 8 (Lua ):
| () | ||
|---|---|---|
| TinyScheme | 86824 | (define fn(lambda () (string-append "Hello, " (read)))) |
| Lua | 252880 | function fn() return "Hello, " .. read() end |
| Chibi-Scheme | 261480 | (define fn(lambda () (string-append "Hello, " (read)))) |
| Squirrel | 277008 | function fn() { return "Hello, " + read(); } |
| ArkScript | 449792 | (let fn(fun() (+ "Hello, " (read)))) |
| Gravity | 507896 | extern var read; func fn() { return "Hello, " + read(); } |
| Janet | 537560 | (defn fn[] (string "Hello, " (read))) |
| ChaiScript | 1374976 | def fn() { return "Hello, " + read(); } |
| AngelScript | 1923960 | string fn() { return 'Hello, ' + read(); } |
GitLab-, :
- TinyScheme R5RS, GIMP. Chibi-Scheme R7RS, . SourceForge SVN trunk-.
- ChaiScript — , . , , , ( Dell XPS 13 2-3 ). , .
- Gravity Swift. , , . .
- Squirrel , ( — ).
Chibi-Scheme , .. Scheme (R7RS) ( Scheme ). , , ( init-7.scm , string-append).
( , Chibi-Scheme C):
res = sexp_define_foreign(*ctx, sexp_context_env(*ctx), "read", 0,
[](sexp ctx, sexp self, sexp_sint_t n) -> sexp {
return sexp_c_string(ctx, "world", -1);
});
:
- (chibi crypto rsa) — RSA-
- (chibi json) — JSON
- (chibi net http-server) — HTTP-
Infelizmente, a documentação não é rica, mas é compensada pelo acesso a todo o código-fonte. Além disso, o Chibi-Scheme é bem conhecido em seus próprios círculos e não será potencialmente descartado ou colocado em um suporte mínimo como alguns outros candidatos potenciais.
Eu ficaria feliz em ouvir todos os comentários e considerar outros YPs dentro dos requisitos mencionados acima. A pesquisa ainda está em andamento e talvez o vencedor mude, mas isso já dependerá de você.