Осуждаю ник. И - да, пытался, и успехи в этом есть, довольно обширные.
Мой язык - Arete, делаю его на базе Rust. Упор идет в еще большую безопасность, нежели у Rust, но при этом язык делается для того, чтобы на низком уровне взаимодействовать с железом. К примеру, в моем языке есть такой модификатор как "hardware", который позволяет отметить функцию как ту, которая будет небезопасна, но взаимодействовать с железом, или у нее будут права на вызов операций вне среды гипервизора компилятора языка. То-есть, что-то вроде такого: hardware func VMCALLCTM(tr: VMCALLTR, triple: *const os::c_char, cpu: *const os::c_char, features: *const os::c_char, lvl: RingCPL, dcl: RingDCL, cm: Model
) -> VMCALLTMR;
hardware func VMCALLRWA(Dst: *const os::c_char, NumMembers: size_t, Members: *const VMCALLRAMR, IsDriver: bool, Kind: ArchiveKind
) -> c_int;
hardware func VMCALLPIC(context: VMCALLCR, buf: VMCALLMBR, om: *mutable VMCALLMR, msg: *mutable *mutable os::c_char
) -> VMCALLB; В моем случае, это все подфункции большой операции гипервызова. Так же, я направлял свой язык на compile-time код, как бы странно это не звучало в контексте безопасности и системности языка. Для того, чтобы отметить функцию или тип как compile-time выражение, можно использовать несколько путей:
1. В случае, если как comptime указывается функция main, необходимо указать флаг #[allow(main_comptime)] и указать main с флагом #[comptime]. При этом функция должна будет обязательно возвращать результат компиляции в сигнатуре и в конце.
2. Если нужно указать тип или переменную как comptime, можно использовать constexpr/consteval: constexpr bool VMCALLTrue : VMCALLBool = 1;
constexpr bool VMCALLFalse : VMCALLBool = 0;
constexpr usize VMCPUSMax = MAXCPUs; Так же, в свой язык я стараюсь добавить некоторые фишки, позволяющие сгладить требования borrow checker'a из Rust и расширить функционал. К примеру, модификатор open для открытия наследия класса/метода/функции, override для переопределения открытого элемента, или модификатор absolute, который указывает, что переопределение запрещено даже косвенно: absolute {
inline hardware func VMCALLST(M: VMCALLMR, Triple: *const os::c_char);
// ...
} Сейчас в своем языке я работаю над компиляцией в JIT, AOT (разумеется, не один) и хочу сделать свой язык самокомпилируемым. Вернемся к системности.
Поскольку мой язык ориентирован на системность и низкоуровневое взаимодействие, у меня есть поддержка специфических операций. Пока что реализовано взаимодействие через COM: hardware {
comopen COM5() -> Result {
operation read(port: &ComPort, buffer: &mutable [u8]) -> Result {
var serial = unstable { comcall PortOpen => ("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY) };
var n = unstable { comcall PortRead => (port.serial, buffer.as_mutptr(), buffer.len()) };
if n < 0 {
throw New Err:
"Failed to read data");
}
Ok(n as usize)
}
// ... Расширение comopen может вызывать 3 операции: read, write, execute. Все операции должны быть утверждены в конце расширения командой run. Сейчас в плане операций я работаю в сторону взаимодействия с аппаратным гипервизором.
В принципе, я бы еще долго рассказывал, но лимиты сообщения.