
Saudações a todos pelo ano novo de 2020.
Desde a publicação do primeiro Quase exatamente um ano se passou desde Mash.
Ao longo deste ano, a linguagem foi significativamente aprimorada, muitos de seus aspectos foram repensados e a direção de seu desenvolvimento foi definida.
Fico feliz em compartilhar tudo isso com a comunidade.
Aviso Legal
Este projeto está sendo desenvolvido puramente por entusiasmo e não pretende dominar o mundo no campo das linguagens de programação dinâmica!
Este desenvolvimento não deve ser considerado um padrão a ser alcançado; o projeto não é ideal, mas, mesmo assim, está em desenvolvimento.
Novo compilador
Na ramificação /mashc do repositório do projeto, você pode ver uma nova versão do compilador, escrita em Mash (a primeira versão da linguagem).
O compilador possui um gerador de código na listagem asm (para assembler para máquina virtual de pilha).
Atualmente estou desenvolvendo uma versão do gerador para Java (JDK 1.8).
A nova versão do compilador oferece suporte completo à funcionalidade da primeira versão da linguagem e a complementa.
Nova Programação Orientada a Objetos
Na nova versão da linguagem, o trabalho com classes foi parcialmente reformulado.
Os métodos de classe podem ser declarados tanto dentro do corpo da classe quanto fora dele.
A classe agora possui um construtor explícito: init.
Exemplo de código:
...
class MyClass:
private:
var a, b
public:
init(a, b):
$a ?= a
$b ?= b
end
func Foo():
return $a + $b
end
end
func MyClass::Bar(c):
return $a + $b + c
end
...
Se ocorrer herança, então teremos a capacidade de fazer chamadas herdadas facilmente (super).
Exemplo de código:
...
class MySecondClass(MyClass):
public:
var c
init(a, b, c):
super(a, b)
$c ?= c
end
func Bar():
super($c)
end
end
...
x ?= new MySecondClass(10, 20, 30)
println( x -> Bar() ) // 60
Sobrescrita dinâmica de métodos em instâncias de classe:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pacotes/Espaços de nomes
O espaço de nomes deve permanecer limpo!
Assim sendo, a linguagem deve proporcionar essa oportunidade.
Em Mash, se um método de classe for estático, ele poderá ser chamado com segurança de qualquer lugar no código.
Exemplo:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Aliás, o superoperador funcionará corretamente quando chamado desta forma.
Exceções
Na nova versão da linguagem, eles são tratados como classes:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Novo enum
Agora, os elementos de enumeração podem receber valores constantes:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Linguagem de programação embarcada
Potencialmente, o Mash poderia encontrar seu nicho como uma linguagem de programação embarcada, semelhante ao Lua.
Para começar a usar o Mash para esses fins, você nem precisa compilar o projeto você mesmo.
O Mash possui um Ambiente de Execução — uma VM baseada em pilha, construída como uma biblioteca dinâmica com uma API completa.
Basta adicioná-lo às dependências do seu projeto e fazer algumas chamadas.
A própria linguagem oferece funcionalidades para funcionar como uma linguagem incorporada.
Ao mesmo tempo, a funcionalidade em conjunto com bibliotecas de idiomas e de terceiros não é prejudicada.
Obtemos uma linguagem incorporada que pode usar todo o poder de várias estruturas escritas nela.
Mash + JVM
Comecei a desenvolver uma versão do tradutor para a JVM.
Talvez, depois de algum tempo, uma postagem sobre esse assunto apareça no Habr.
Resultados de
Não há resultados específicos. Esta é uma apresentação preliminar dos resultados.
Boa sorte a todos em 2020.
Fonte: habr.com
