Skip to content

Stepami/hydrascript

HydraScript

logo

"Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ подмноТСство ЯП JavaScript"

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ

Π€Π°ΠΉΠ» ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° собираСтся Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π΅Π»ΠΈΠ·Π° Π½Π° Ρ‚Ρ€ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹:

  • Windows (x64)
  • MacOS (arm64 Apple Silicon)
  • Linux (x64)

Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ со страницы ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π°

ПослСдний Ρ€Π΅Π»ΠΈΠ· доступСн ΠΏΠΎ этой ссылкС

Вводная информация

Π—Π° основу Π±Ρ‹Π» взят стандарт ECMA-262

ЛСксичСская структура

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π¦Π΅Π»ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

  1. Частично Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ JavaScript с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ статичСской структурной Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, избавившись ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… понятий, ΠΊΠ°ΠΊ constructor, class, interface
  2. ΠŸΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ рСвСрс-ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΡ‚ΡŒ соврСмСнный статичСский Π°Π½Π°Π»ΠΈΠ· (Π²Ρ‹Π²ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΠ², Ρ„ΠΎΡ€Π²Π°Ρ€Π΄ Ρ€Π΅Ρ„Ρ‹, ошибки выполнСния Π½Π° стадии компиляции)
  3. Π£ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ области конструирования компиляторов Π·Π° счёт исходного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° - ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ понятныС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (Lexer, Parser, CFG, SSA, DCE, etc.)

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ языка

Випизация

Π’ языкС структурная статичСская сильная типизация.

Π•ΡΡ‚ΡŒ 5 ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²:

  1. number
  2. boolean
  3. string
  4. null
  5. 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!"

ВрСбования

Π”ΠΎ вСрсии 2.3.0 для запуска ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ установка .NET Runtime

Π’Π°Π±Π»ΠΈΡ†Π° соотвСтствий hydrascript ΠΈ dotnet:

hydrascript dotnet
  • 1.0.0
  • 1.0.2
.NET 5
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.1.5
.NET 6
  • 1.2.5
  • 1.2.6
    .NET 7
    2.0.0 .NET 8
    • 2.1.0
    • 2.1.1
    • 2.2.0
    .NET 9

    Π‘Π±ΠΎΡ€ΠΊΠ°

    ПослС клонирования рСпозитория ΠΈΠ΄Ρ‘ΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° HydraScript.

    Π’Π°ΠΌ выполняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: dotnet publish ./src/HydraScript/HydraScript.csproj -r <RUNTIME_IDENTIFIER> -o <OUTPUT_DIRECTORY>

    Бписок ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΡƒΡ‚

    Запуск

    ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ:

    HydraScript file.js
    

    Π‘ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π΄Π΅Π±Π°Π³ ΠΈΠ½Ρ„Ρ‹ (Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ast, инструкции):

    HydraScript file.js --dump
    

    Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ:

    1. ΠšΡƒΡ€ΡΡ‹ "ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠ²" ΠΈ "ГСнСрация ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Кода" ΠΊΠ°Ρ„Π΅Π΄Ρ€Ρ‹ ИУ-9 ΠœΠ“Π’Π£ ΠΈΠΌ. Н.Π­. Π‘Π°ΡƒΠΌΠ°Π½Π° @bmstu-iu9
    2. ECMA-262
    3. DragonBook
    4. Stanford CS143 Lectures
    5. Simple Virtual Machine
    6. Ахо А., Ульман Π”ΠΆ. ВСория синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈ компиляции
    7. Π‘Π²Π΅Ρ€Π΄Π»ΠΎΠ² Π‘.Π—. Π―Π·Ρ‹ΠΊΠΈ программирования ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ трансляции