Comparação de linguagens incorporadas por tamanho no arquivo executável

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ê.




All Articles