- Notifications
You must be signed in to change notification settings - Fork6
TypeScript & Go inspired open-source public research project written in C#
License
Stepami/hydrascript
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Файл интерпретатора собирается в рамках релиза на три платформы:
- 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 = 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, оба 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 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:
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
- Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции
- Свердлов С.З. Языки программирования и методы трансляции
About
TypeScript & Go inspired open-source public research project written in C#
Topics
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Uh oh!
There was an error while loading.Please reload this page.
Contributors7
Uh oh!
There was an error while loading.Please reload this page.