Saudações a todos no novo ano de 2020.
Desde a publicação do primeiro
Durante este ano, a linguagem foi muito melhorada, muitos dos seus aspectos foram pensados e o vetor de desenvolvimento foi determinado.
Fico feliz em compartilhar tudo isso com a comunidade.
Aviso Legal
Este projeto é desenvolvido exclusivamente com entusiasmo e não pretende dominar o mundo no campo das linguagens de programação dinâmicas!
Este desenvolvimento não deve ser considerado como 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, que é escrita em Mash (a primeira versão da linguagem).
O compilador possui um gerador de código em listagem ASM (para assembler para uma VM baseada em pilha).
Atualmente estou desenvolvendo uma versão do gerador para Java (JDK 1.8).
A nova versão do compilador suporta totalmente a funcionalidade da primeira versão da linguagem e a complementa.
Novo POO
Na nova versão da linguagem, o trabalho com classes foi parcialmente redesenhado.
Os métodos de classe podem ser declarados tanto no corpo da classe quanto fora dela.
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, teremos a oportunidade de fazer facilmente chamadas herdadas (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
Substituição 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/namespaces
O namespace deve permanecer limpo!
Conseqüentemente, a linguagem deve fornecer esta oportunidade.
No Mash, se um método de classe for estático, ele poderá ser chamado com segurança de qualquer parte do código.
Exemplo:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
A propósito, o superoperador funcionará corretamente quando chamado desta forma.
Exceções
Na nova versão da linguagem elas são tratadas como classes:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Nova enumeração
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 incorporada
Potencialmente, Mash pode encontrar seu nicho como uma linguagem de programação embarcada, semelhante a Lua.
Para começar a usar o Mash para esses fins, você nem precisa montar o projeto sozinho.
Mash possui um Runtime Environment - uma VM baseada em pilha compilada como uma biblioteca dinâmica com uma API completa.
Tudo que você precisa fazer é adicioná-lo à dependência do projeto e fazer algumas chamadas.
A própria linguagem fornece funcionalidade para funcionar como uma linguagem incorporada.
Ao mesmo tempo, o desempenho em conjunto com a linguagem e bibliotecas de terceiros não é afetado.
Obtemos uma linguagem incorporada que pode usar todo o poder de vários frameworks escritos nela.
Mash + JVM
Comecei a desenvolver uma versão do tradutor para a JVM.
Talvez, depois de N tempo, uma postagem sobre esse assunto apareça no Habré.
Resultados de
Não há resultados específicos. Esta é uma representação intermediária dos resultados.
Boa sorte a todos em 2020.
Fonte: habr.com