HydraScript 2.1.0
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet tool install --global HydraScript --version 2.1.0
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
dotnet tool install --local HydraScript --version 2.1.0
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=HydraScript&version=2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
nuke :add-package HydraScript --version 2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
HydraScript
"Расширенное подмножество ЯП JavaScript"
Вводная информация
За основу был взят стандарт ECMA-262
Цели проекта
- Частично реализовать JavaScript с объектами и статической структурной типизацией, избавившись от таких понятий, как
constructor,class,interface - Публично реверс-инжинирить современный статический анализ (вывод типов, форвард рефы, ошибки выполнения на стадии компиляции)
- Упростить понимание области конструирования компиляторов за счёт исходного кода проекта - собрать понятные реализации алгоритмов и типовых задач в репозитории (Lexer, Parser, CFG, SSA, DCE, etc.)
Конструкции языка
Типизация
В языке структурная статическая сильная типизация.
Есть 5 примитивных типов:
- number
- boolean
- string
- null
- void
Остальные типы делятся на группы:
- NullableType (тип, который допускает значение
null) - ObjectType (тип объекта, является NullableType)
- ArrayType (списковый тип)
Значения по умолчанию
| Тип | Значение |
|---|---|
| number | 0 |
| boolean | false |
| string | "" |
| NullableType | null |
| ArrayType | [] |
type alias
Можно создать свой type alias по типу того, как это сделано в С++
type int = number
type maybeInt = int?
type ints = int[]
type point = {
x: int;
y: int;
}
type composite = {
p: point;
arr: ints;
}
Объявление переменных
let i = 1 // интерпретатор выведет тип из выражения
let j: number // запишет значение по умолчанию в переменную
let k: number = 1 // полностью явное объявление
Функции
Объекты
let v2d = {
x: 3;
y: 4;
}
Списки
let array = [1, 2, 3]
let size = ~array // длина списка
array::1 // удаление элемента по индексу
array = array ++ [5, 7] // конкатенация списков
Операторы
| Оператор | Вид | Типы операндов | Тип операции |
|---|---|---|---|
| + | бинарный | оба number, оба string | number, string |
| *, -, /, % | бинарный | number | number |
| ||, && | бинарный | boolean | boolean |
| !=, == | бинарный | равный с двух сторон | boolean |
| ⇐, >=, >, < | бинарный | number | boolean |
| ! | унарный | boolean | boolean |
| - | унарный | number | number |
| ++ | бинарный | [] | [] |
| :: | бинарный | [] и number | void |
| ~ | унарный | [] | number |
Ветвление
if (1 == 1) {
// ...
} else if (2 == 2) {
// ...
}
else {
// ...
}
// в общем как в Си подобных языках
// главное, чтобы выражение условия
// возвращало boolean
Также есть тернарный оператор
let x = 1 > 0 ? 0 <= 1 ? 1 : 0 : -2 < 0 ? -1 : 0
Цикл
while (cond) {
// ...
continue
// ...
break
}
Функции
// объявление
function add(a: number, b: number): number {
return a + b
}
// вызов
let c = add(1, 2)
Методы
// сделаны подобно Go - привязка по имени типа
// шаг 1. Объявить type alias
type Point2 = {
x: number;
y: number;
}
// шаг 2. Объявить переменную этого типа
let v2d: Point2 = {
x: 3;
y: 4;
}
// шаг 3. Указать первым параметром функции - объект типа
function lengthSquared(obj: Point2) {
let x = obj.x
let y = obj.y
return x * x + y * y
}
Операции доступа
// объекты
let x = v2d.x
let s = v2d.lengthSquared()
// массивы
let l = array[2]
Приведение типов
let s = v2d as string
Печать на экран
let obj = {}
>>>obj
>>>"Hello, World!"
Требования
- .NET 9 SDK
Сборка
После клонирования репозитория идём в папку проекта HydraScript.
Там выполняем команду:
dotnet publish ./src/HydraScript/HydraScript.csproj -r <RUNTIME_IDENTIFIER> -p:PublishSingleFile=true -p:DebugType=embedded --self-contained false -o <OUTPUT_DIRECTORY>
Список идентификаторов рантайма лежит тут
Запуск
Простой:
HydraScript file.js
С выводом дебаг инфы (токены, ast, инструкции):
HydraScript file.js --dump
Источники:
- Курсы "Конструирование Компиляторов" и "Генерация Оптимального Кода" кафедры ИУ-9 МГТУ им. Н.Э. Баумана @bmstu-iu9
- ECMA-262
- DragonBook
- Stanford CS143 Lectures
- Simple Virtual Machine
- Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции
- Свердлов С.З. Языки программирования и методы трансляции
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.6.0 | 71 | 12/26/2025 |
| 2.5.1 | 118 | 12/23/2025 |
| 2.5.0 | 113 | 12/23/2025 |
| 2.4.0 | 120 | 12/23/2025 |
| 2.3.0 | 120 | 12/23/2025 |
| 2.2.0 | 116 | 12/23/2025 |
| 2.1.1 | 114 | 12/23/2025 |
| 2.1.0 | 118 | 12/23/2025 |
| 2.0.0 | 113 | 12/23/2025 |
| 1.2.6 | 113 | 12/23/2025 |
| 1.2.5 | 115 | 12/23/2025 |
| 1.1.5 | 112 | 12/23/2025 |
| 1.1.4 | 109 | 12/23/2025 |
| 1.1.3 | 118 | 12/23/2025 |
| 1.1.2 | 114 | 12/23/2025 |
| 1.0.2 | 123 | 12/23/2025 |
| 1.0.0 | 118 | 12/23/2025 |