Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

TypeScript & Go inspired open-source public research project written in C#

License

NotificationsYou must be signed in to change notification settings

Stepami/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 (списковый тип)
Значения по умолчанию
ТипЗначение
number0
booleanfalse
string""
NullableTypenull
ArrayType[]
type alias

Можно создать свой type alias по типу того, как это сделано в С++

type int = numbertype 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, оба stringnumber, string
*, -, /, %бинарныйnumbernumber
||, &&бинарныйbooleanboolean
!=, ==бинарныйравный с двух сторонboolean
<=, >=, >, <бинарныйnumberboolean
!унарныйbooleanboolean
-унарныйnumbernumber
++бинарный[][]
::бинарный[] и numbervoid
~унарный[]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 aliastype 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.xlet s = v2d.lengthSquared()// массивыlet l = array[2]

Приведение типов

let s = v2d as string

Печать на экран

let obj = {}>>>obj>>>"Hello, World!"

Требования

До версии2.3.0 для запуска интерпретатора требоваласьустановка .NET Runtime

Таблица соответствий hydrascript и dotnet:

hydrascriptdotnet
  • 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. Свердлов С.З. Языки программирования и методы трансляции

    About

    TypeScript & Go inspired open-source public research project written in C#

    Topics

    Resources

    License

    Code of conduct

    Security policy

    Stars

    Watchers

    Forks

    Contributors7


    [8]ページ先頭

    ©2009-2025 Movatter.jp