Rastreo
Un recolector por rastreo encuentra los objetos inalcanzables y los libera. No tienes que pensar en nada.
Antril es un lenguaje compilado con una sintaxis moderna. Larva lo convierte en ejecutables nativos, WebAssembly o bibliotecas portables, y cada proyecto elige cómo se gestiona su memoria.
curl -fsSL https://www.antril.org/install.sh | sh
irm https://www.antril.org/install.ps1 | iex
Para Windows, Linux y macOS · Otras formas de instalar
import System;
into namespace People
{
public record class Person
{
public:
str Name;
i32 Age;
new(str Name, i32 Age);
}
Main()
{
Person ana = new Person("Ana", 31);
Person older = ana with { Age = 32 };
Console.WriteLine(ana);
Console.WriteLine(ana == new Person("Ana", 31));
if (ana is Person(var name, > 30))
Console.WriteLine(name + " is over 30");
}
}
larva run
Person { Name = Ana, Age = 31 }
true
Ana is over 30
El lenguaje
Cada programa de abajo está completo, compila con la versión actual de Larva e imprime lo que ves. Elige una idea:
import System;
into namespace Shapes
{
public interface IShape
{
Area() : f64;
Describe() : str => "a shape of area " + Area();
}
public base class Shape : IShape
{
public:
Area() : f64;
virtual Name() : str => "shape";
}
public class Circle : Shape
{
f64 radius;
public:
new(f64 radius) { this.radius = radius; }
override Area() : f64 => 3.14 * radius * radius;
override Name() : str => "circle";
}
public final class Square : Shape
{
f64 side;
public:
new(f64 side) { this.side = side; }
override Area() : f64 => side * side;
}
Main()
{
List<Shape> shapes = new List<Shape>();
shapes.Add(new Circle(1));
shapes.Add(new Square(2));
loop (Shape s in shapes)
Console.WriteLine(s.Name() + ": " + s.Area());
IShape i = new Square(3);
Console.WriteLine(i.Describe());
}
}
larva run
circle: 3.14
shape: 4
a shape of area 9
import System;
import System.Threading.Tasks;
into namespace Jobs
{
async Fetch(i32 id) : Task<i32>
{
await Task.Delay(10);
return id * 10;
}
async Total() : Task<i32>
{
i32 a = await Fetch(1);
i32 b = await Fetch(2);
return a + b;
}
async Tick(str name, i32 times) : Task
{
loop (i32 i = 0..times)
{
Console.WriteLine(name + " " + i);
await Task.Yield();
}
}
Main()
{
Console.WriteLine(Total().Result);
Task[] both = [Tick("a", 2), Tick("b", 2)];
Task.WhenAll(both).Wait();
}
}
larva run
30
a 0
b 0
a 1
b 1
import System;
import System.Reactive;
into namespace Ui
{
public class Cart
{
public:
reactive i32 items = 0;
reactive f64 price = 2.5;
computed f64 Total => items * price;
reacts Log()
{
Console.WriteLine("items: " + items);
}
}
Main()
{
Cart cart = new Cart();
Effect shown = effect { Console.WriteLine("total: " + cart.Total); };
cart.items = 2;
Reactive.Batch(() => { cart.items = 3; cart.price = 4.0; });
shown.Dispose();
cart.items = 10;
}
}
larva run
items: 0
total: 0
items: 2
total: 5
items: 3
total: 12
items: 10
import System;
MinMax(i32[] values) : (i32, i32)
{
i32 low = values[0], high = values[0];
loop (i32 v in values)
{
if (v < low)
low = v;
if (v > high)
high = v;
}
return (low, high);
}
Main()
{
(i32, i32) range = MinMax([4, 9, 1, 7]);
Console.WriteLine(range);
Console.WriteLine(range.Item2 - range.Item1);
(i32, str) pair = (1, "one");
if (pair is (1, var word))
Console.WriteLine(word);
Dictionary<(i32, i32), str> grid = new Dictionary<(i32, i32), str>();
grid[(0, 1)] = "a";
Console.WriteLine(grid[(0, 1)]);
}
larva run
(1, 9)
8
one
a
import System;
unsafe Fill(i32* p, i32 count, i32 value)
{
loop (i32 i = 0..count)
p[i] = value;
}
Main()
{
i32[] data = new i32[4];
unsafe
{
Fill(&data[0], data.Length, 9);
i32* second = &data[0] + 1;
*second = 1;
}
Console.WriteLine(data[0] + data[1] + data[2] + data[3]);
}
larva run
28
La memoria a tu manera
Cada proyecto elige su recolector con una línea de su archivo .queen. El mismo código fuente compila en todos los modos, y las bibliotecas compiladas para modos distintos siguen funcionando juntas.
Un recolector por rastreo encuentra los objetos inalcanzables y los libera. No tienes que pensar en nada.
Los objetos se liberan en cuanto desaparece su última referencia, y los destructores se ejecutan en ese momento.
Todo lo que creó una region { } se libera junto cuando se cierra. Las fugas son errores de compilación.
Liberas cada objeto con delete, en código unsafe, cuando sabes lo que haces.
import System;
into namespace Mem
{
public class Resource
{
str name;
public:
new(str name) { this.name = name; }
destroy() { Console.WriteLine("close " + name); }
}
Main()
{
region
{
Resource a = new Resource("a");
Resource b = new Resource("b");
Console.WriteLine("leaving the region");
}
Console.WriteLine("end");
}
}
queen 1.0;
chunk PROJ:
name: Mem,
type: exe
chunk BUILD:
gc: arena
larva run
leaving the region
close b
close a
end
&T y &mut T con un verificador de préstamos opcionalUna cadena de herramientas, muchos destinos
Larva compila a través de una forma intermedia, Larva HIR, al back end que elijas.
LLVM con -O3: ejecutables nativos optimizados para tu máquina.
--backend x64: el back end propio de Larva compila más rápido mientras iteras.
--target wasm o wasm-llvm: el mismo programa en el navegador.
larva lib genera una .dll que cualquier lenguaje sobre Larva puede usar.
larva build -o hello.exe hello.ant
larva build --backend x64 -o hello.exe hello.ant
larva build --target wasm-llvm -o hello.js hello.ant
larva lib -o Geo.dll geo.ant
Bibliotecas nativas en minutos
Declara una función con [Import] y llámala. Para una biblioteca completa, larva bind lee sus exportaciones y un encabezado de C o una descripción breve, y escribe un binding tipado.
.dll, .so y .dyliblarva bind kernel32.dll kernel32.bind --source Kernel32.ant
Kernel32Bindings.dll: Kernel32 with 4 function(s) of kernel32.dll
Kernel32.ant: Antril source
import System;
import System.Runtime.InteropServices;
into namespace Native
{
[Import("kernel32.dll")]
GetCurrentProcessId() : u32;
[Import("kernel32.dll", "lstrlenW")]
WideLength(String<u16> text) : i32;
Main()
{
Console.WriteLine(GetCurrentProcessId() > 0);
Console.WriteLine(WideLength(new String<u16>(Unicode.ToUtf16("hello"))));
}
}
Un ecosistema de paquetes
Cada paquete tiene su hash y su autor puede firmarlo. larva hive add Author/Name agrega uno a tu proyecto.
Aún no se ha publicado ningún paquete. El tuyo podría ser el primero.
Publica un paqueteCuando los paquetes empiecen a depender unos de otros, los más usados aparecerán aquí.
Usar paquetesHecho para editores
Las extensiones de VS Code llevan el servidor de lenguaje de Larva a tu editor: el mismo compilador, mientras escribes.
.queen que se aplican al guardarLenguajes sobre Larva
Larva compila cualquier lenguaje que tenga un paquete de lenguaje. Los paquetes los firman sus autores y el registro, y comparten la biblioteca estándar, los back ends y Hive.
De la comunidad
Estos espacios son provisionales hasta que lleguen las primeras citas de la comunidad. ¿Estás creando algo con Antril? Cuéntanos en el foro.
Aquí aparecerá una cita de alguien que crea con Antril, Larva o Hive.
Aquí aparecerá una cita de alguien que crea con Antril, Larva o Hive.
Aquí aparecerá una cita de alguien que crea con Antril, Larva o Hive.
Instala Larva, crea un proyecto y ejecútalo en menos de un minuto.
larva new Console-App Hello --lang antril