1
0

Update Rust edition; Edit README; Clean up

This commit is contained in:
Jeff 2025-01-09 10:38:35 -05:00
parent 68c77f5474
commit 5caad00f65
4 changed files with 22 additions and 20 deletions

View File

@ -5,7 +5,7 @@ resolver = "2"
[workspace.package] [workspace.package]
authors = ["Jeff Anderson"] authors = ["Jeff Anderson"]
edition = "2021" edition = "2024"
license = "GPL-3.0" license = "GPL-3.0"
readme = "README.md" readme = "README.md"
repository = "https://git.jeffa.io/jeff/dust.git" repository = "https://git.jeffa.io/jeff/dust.git"

View File

@ -47,11 +47,10 @@ aspirations are to be **fast**, **safe** and **easy**.
- **Fast** - **Fast**
- **Fast Compilation** Despite its compile-time abstractions, Dust should compile and start - **Fast Compilation** Despite its compile-time abstractions, Dust should compile and start
executing quickly. The compilation time should feel negligible to the user. executing quickly. The compilation time should feel negligible to the user.
- **Fast Execution** Dust should be generally faster than Python, Ruby and NodeJS. It should be - **Fast Execution** Dust should be competitive with highly optimized, modern, register-based VM
competitive with highly optimized, modern, register-based VM languages like Lua. Dust should languages like Lua. Dust should be bench tested during development to inform decisions about
be bench tested during development to inform decisions about performance. performance.
- **Low Resource Usage** Despite its performance, Dust's use of memory and CPU power should be - **Low Resource Usage** Memory and CPU power should be used conservatively and predictably.
conservative and predictable enough to accomodate a wide range of devices.
- **Safe** - **Safe**
- **Static Types** Typing should prevent runtime errors and improve code quality, offering a - **Static Types** Typing should prevent runtime errors and improve code quality, offering a
superior development experience despite some additional constraints. Like any good statically superior development experience despite some additional constraints. Like any good statically
@ -239,9 +238,7 @@ Dust has gone through several iterations, each with its own design choices. It w
implemented with a syntax tree generated by an external parser, then a parser generator, and finally implemented with a syntax tree generated by an external parser, then a parser generator, and finally
a custom parser. Eventually the language was rewritten to use bytecode instructions and a virtual a custom parser. Eventually the language was rewritten to use bytecode instructions and a virtual
machine. The current implementation: compiling to bytecode with custom lexing and parsing for a machine. The current implementation: compiling to bytecode with custom lexing and parsing for a
register-based VM, is by far the most performant and the general design is unlikely to change, register-based VM, is by far the most performant and the general design is unlikely to change.
although it has been optimized and refactored several times. For example, the VM was refactored to
manage multiple threads.
Dust previously had a more complex type system with type arguments (or "generics") and a simple Dust previously had a more complex type system with type arguments (or "generics") and a simple
model for asynchronous execution of statements. Both of these features were removed to simplify the model for asynchronous execution of statements. Both of these features were removed to simplify the

View File

@ -16,7 +16,7 @@ serde = { version = "1.0.203", features = ["derive"] }
serde_json = "1.0.117" serde_json = "1.0.117"
getrandom = { version = "0.2", features = [ getrandom = { version = "0.2", features = [
"js", "js",
] } # Indirect dependency, for wasm builds ] } # Indirect dependency, for WASM builds
smartstring = { version = "1.0.1", features = [ smartstring = { version = "1.0.1", features = [
"serde", "serde",
], default-features = false } ], default-features = false }

View File

@ -25,7 +25,7 @@ mod type_checks;
pub use error::CompileError; pub use error::CompileError;
use parse_rule::{ParseRule, Precedence}; use parse_rule::{ParseRule, Precedence};
use tracing::{debug, info, span, Level}; use tracing::{Level, debug, info, span};
use type_checks::{check_math_type, check_math_types}; use type_checks::{check_math_type, check_math_types};
use std::mem::replace; use std::mem::replace;
@ -33,9 +33,9 @@ use std::mem::replace;
use optimize::control_flow_register_consolidation; use optimize::control_flow_register_consolidation;
use crate::{ use crate::{
instruction::{CallNative, Close, GetLocal, Jump, LoadList, Negate, Not, Return, SetLocal},
Argument, Chunk, ConcreteValue, DustError, DustString, FunctionType, Instruction, Lexer, Local, Argument, Chunk, ConcreteValue, DustError, DustString, FunctionType, Instruction, Lexer, Local,
NativeFunction, Operation, Scope, Span, Token, TokenKind, Type, Value, NativeFunction, Operation, Scope, Span, Token, TokenKind, Type, Value,
instruction::{CallNative, Close, GetLocal, Jump, LoadList, Negate, Not, Return, SetLocal},
}; };
/// Compiles the input and returns a chunk. /// Compiles the input and returns a chunk.
@ -665,7 +665,7 @@ impl<'src> Compiler<'src> {
expected: &[TokenKind::Bang, TokenKind::Minus], expected: &[TokenKind::Bang, TokenKind::Minus],
found: operator.to_owned(), found: operator.to_owned(),
position: operator_position, position: operator_position,
}) });
} }
}; };
@ -716,7 +716,7 @@ impl<'src> Compiler<'src> {
return Err(CompileError::ExpectedExpression { return Err(CompileError::ExpectedExpression {
found: self.previous_token.to_owned(), found: self.previous_token.to_owned(),
position: self.previous_position, position: self.previous_position,
}) });
} }
}; };
@ -826,7 +826,7 @@ impl<'src> Compiler<'src> {
], ],
found: operator.to_owned(), found: operator.to_owned(),
position: operator_position, position: operator_position,
}) });
} }
}; };
@ -836,8 +836,13 @@ impl<'src> Compiler<'src> {
} }
fn parse_comparison_binary(&mut self) -> Result<(), CompileError> { fn parse_comparison_binary(&mut self) -> Result<(), CompileError> {
if let Some([Operation::EQUAL | Operation::LESS | Operation::LESS_EQUAL, _, _]) = if let Some(
self.get_last_operations() [
Operation::EQUAL | Operation::LESS | Operation::LESS_EQUAL,
_,
_,
],
) = self.get_last_operations()
{ {
return Err(CompileError::ComparisonChain { return Err(CompileError::ComparisonChain {
position: self.current_position, position: self.current_position,
@ -898,7 +903,7 @@ impl<'src> Compiler<'src> {
], ],
found: operator.to_owned(), found: operator.to_owned(),
position: operator_position, position: operator_position,
}) });
} }
}; };
let jump = Instruction::jump(1, true); let jump = Instruction::jump(1, true);
@ -949,7 +954,7 @@ impl<'src> Compiler<'src> {
expected: &[TokenKind::DoubleAmpersand, TokenKind::DoublePipe], expected: &[TokenKind::DoubleAmpersand, TokenKind::DoublePipe],
found: operator.to_owned(), found: operator.to_owned(),
position: operator_position, position: operator_position,
}) });
} }
}; };
let test = Instruction::test(operand_register, test_boolean); let test = Instruction::test(operand_register, test_boolean);
@ -1227,7 +1232,7 @@ impl<'src> Compiler<'src> {
if let Some(Operation::LOAD_BOOLEAN | Operation::LOAD_CONSTANT) = if let Some(Operation::LOAD_BOOLEAN | Operation::LOAD_CONSTANT) =
self.get_last_operation() self.get_last_operation()
{ {
let (mut loader, _, _) = self.instructions.last_mut().unwrap(); let (loader, _, _) = self.instructions.last_mut().unwrap();
loader.set_c_field(true as u8); loader.set_c_field(true as u8);
} else { } else {