Π€Π°ΠΉΠ» ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠ΅Π»ΠΈΠ·Π° Π½Π° ΡΡΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ:
- Windows (x64)
- MacOS (arm64 Apple Silicon)
- Linux (x64)
Π‘ΠΊΠ°ΡΠ°ΡΡ Π½ΡΠΆΠ½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ΅Π»ΠΈΠ·Π°
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ΅Π»ΠΈΠ· Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ ΡΡΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅
ΠΠ° ΠΎΡΠ½ΠΎΠ²Ρ Π±ΡΠ» Π²Π·ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡ 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 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 |
---|---|
|
.NET 5 |
|
.NET 6 |
|
.NET 7 |
2.0.0 | .NET 8 |
|
.NET 9 |
ΠΠΎΡΠ»Π΅ ΠΊΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΈΠ΄ΡΠΌ Π² ΠΏΠ°ΠΏΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° HydraScript
.
Π’Π°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
dotnet publish ./src/HydraScript/HydraScript.csproj -r <RUNTIME_IDENTIFIER> -o <OUTPUT_DIRECTORY>
Π‘ΠΏΠΈΡΠΎΠΊ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ° Π»Π΅ΠΆΠΈΡ ΡΡΡ
ΠΡΠΎΡΡΠΎΠΉ:
HydraScript file.js
Π‘ Π²ΡΠ²ΠΎΠ΄ΠΎΠΌ Π΄Π΅Π±Π°Π³ ΠΈΠ½ΡΡ (ΡΠΎΠΊΠ΅Π½Ρ, ast, ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ):
HydraScript file.js --dump
- ΠΡΡΡΡ "ΠΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ²" ΠΈ "ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΠΎΠ΄Π°" ΠΊΠ°ΡΠ΅Π΄ΡΡ ΠΠ£-9 ΠΠΠ’Π£ ΠΈΠΌ. Π.Π. ΠΠ°ΡΠΌΠ°Π½Π° @bmstu-iu9
- ECMA-262
- DragonBook
- Stanford CS143 Lectures
- Simple Virtual Machine
- ΠΡ ΠΎ Π., Π£Π»ΡΠΌΠ°Π½ ΠΠΆ. Π’Π΅ΠΎΡΠΈΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ
- Π‘Π²Π΅ΡΠ΄Π»ΠΎΠ² Π‘.Π. Π―Π·ΡΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ