Pull to refresh
16K+
73
Artem (tёmix) Solopiy@EntityFX

Iot Solutions Developer

12
Rating
59
Subscribers
Send message

Тут обсудить можно, если есть возможность: https://t.me/setun_1958

Чтобы такое реализовать - понадобится симулятор троичного процессора, хотя бы уровня микроконтроллера и компилятор, который генерирует под него код с языка T в бинарник тринарник.

EBNF-грамматика
(* ============================================================
   Полная EBNF-грамматика языка T
   ============================================================ *)

(* --- Лексическая структура --- *)
trit_digit         = "-" | "0" | "+" .

identifier         = ( letter | "_" ) { letter | digit | "_" } .
letter             = latin_letter | cyrillic_letter .
latin_letter       = "A".."Z" | "a".."z" .
cyrillic_letter    = "А".."Я" | "а".."я" | "Ё" | "ё" .
digit              = "0".."9" .

decimal_suffix     = "t" | "tl" | "tll" .
decimal_literal    = [ "+" | "-" ] digit { digit } decimal_suffix .
balanced_prefix    = "0t" .
balanced_digits    = trit_digit { trit_digit } [ "_" trit_digit ] .
balanced_literal   = balanced_prefix balanced_digits .
tryx_prefix        = "0y" .
tryx_digit         = digit | "A".."Q" | "a".."q" .
tryx_literal       = tryx_prefix tryx_digit { tryx_digit } .
integer_literal    = decimal_literal | balanced_literal | tryx_literal .

float_suffix       = "f" | "d" .
decimal_float      = [ "+" | "-" ] digit { digit } "." digit { digit }
                     [ "e" [ "+" | "-" ] digit { digit } ] [ float_suffix ] .
balanced_float     = balanced_prefix mantissa_part "e" exponent_part float_suffix .
mantissa_part      = trit_digit { trit_digit } [ "_" trit_digit ]
                     "." trit_digit { trit_digit } .
exponent_part      = trit_digit { trit_digit } .
float_literal      = decimal_float | balanced_float .

char_literal       = "'" ( trit_digit | any_character ) "'" .
string_literal     = '"' { any_character } '"' .

true_const         = "true" | "истина" .
false_const        = "false" | "ложь" .
maybe_const        = "maybe" | "может" .
constant           = integer_literal | float_literal | char_literal
                   | string_literal | true_const | false_const | maybe_const .

(* --- Выражения --- *)
primary_expr       = identifier | constant | "(" expression ")" .
postfix_expr       = primary_expr
                   | postfix_expr "[" expression "]"
                   | postfix_expr "(" [ argument_list ] ")"
                   | postfix_expr "." identifier
                   | postfix_expr "->" identifier
                   | postfix_expr "++"
                   | postfix_expr "--" .
argument_list      = expression { "," expression } .

unary_expr         = postfix_expr
                   | "++" unary_expr
                   | "--" unary_expr
                   | unary_operator unary_expr .
unary_operator     = "+" | "-" | "!" | "~" | "*" | "&"
                   | "sizeof" | "размер" .

multiplicative_expr = unary_expr { ( "*" | "/" | "%" ) unary_expr } .
additive_expr      = multiplicative_expr { ( "+" | "-" ) multiplicative_expr } .
shift_expr         = additive_expr { ( "<<" | ">>" ) additive_expr } .
relational_expr    = shift_expr { ( "<" | ">" | "<=" | ">=" ) shift_expr } .
equality_expr      = relational_expr { ( "==" | "!=" ) relational_expr } .

bitwise_and_expr   = equality_expr { "&" equality_expr } .
bitwise_xor_expr   = bitwise_and_expr { "^" bitwise_and_expr } .
bitwise_or_expr    = bitwise_xor_expr { "|" bitwise_xor_expr } .
logical_and_expr   = bitwise_or_expr { "&&" bitwise_or_expr } .
logical_or_expr    = logical_and_expr { "||" logical_and_expr } .

ternary_expr       = logical_or_expr
                     "??" expression ":?" expression ":!" expression .
assignment_expr    = ternary_expr
                   | unary_expr assignment_operator assignment_expr .
assignment_operator = "=" | "+=" | "-=" | "*=" | "/=" | "%="
                     | "<<=" | ">>=" | "&=" | "|=" | "^=" .
expression         = assignment_expr .

(* --- Объявления --- *)
void_type          = "void" | "пусто" .
tint_type          = "tint" | "тинт" .
tlong_type         = "tlong" | "тлонг" .
tlong_long_type    = "tlong" "long" | "тлонглонг" .
tryte_type         = "tryte" | "трайт" .
trit_type          = "trit" | "трит" .
tril_type          = "tril" | "трил" .
tfloat_type        = "tfloat" | "твещ" .
tdouble_type       = "tdouble" | "тдвойн" .
signed_spec        = "signed" | "знак" .
unsigned_spec      = "unsigned" | "беззнак" .

type_specifier     = void_type | tint_type | tlong_type | tlong_long_type
                   | tryte_type | trit_type | tril_type
                   | tfloat_type | tdouble_type
                   | signed_spec | unsigned_spec
                   | struct_or_union_specifier | enum_specifier
                   | typedef_name .

struct_or_union    = "struct" | "структура" | "union" | "объединение" .
struct_or_union_specifier = struct_or_union [ identifier ] "{" { struct_declaration } "}"
                         | struct_or_union identifier .
struct_declaration = type_specifier struct_declarator_list ";" .
struct_declarator_list = struct_declarator { "," struct_declarator } .
struct_declarator  = declarator | [ declarator ] ":" expression .

enum_kw            = "enum" | "перечисление" .
enum_specifier     = enum_kw [ identifier ] "{" enumerator_list "}"
                   | enum_kw identifier .
enumerator_list    = enumerator { "," enumerator } .
enumerator         = identifier [ "=" expression ] .

type_qualifier     = "const" | "конст" | "volatile" | "изменч" .

declaration_specifiers = ( type_specifier | type_qualifier )
                         { type_specifier | type_qualifier } .
declarator         = pointer_decl direct_declarator | direct_declarator .
direct_declarator  = identifier
                   | "(" declarator ")"
                   | direct_declarator "[" [ expression ] "]"
                   | direct_declarator "(" parameter_list ")"
                   | direct_declarator "(" ")" .
pointer_decl       = "*" [ type_qualifier { type_qualifier } ] [ pointer_decl ] .
parameter_list     = parameter_declaration { "," parameter_declaration } .
parameter_declaration = declaration_specifiers [ declarator | abstract_declarator ] .
abstract_declarator = pointer_decl [ direct_abstract_declarator ]
                    | direct_abstract_declarator .
direct_abstract_declarator = "(" abstract_declarator ")"
                           | "[" [ expression ] "]"
                           | "(" [ parameter_list ] ")" .
initializer        = expression | "{" initializer_list [ "," ] "}" .
initializer_list   = initializer { "," initializer } .
declaration        = declaration_specifiers [ init_declarator_list ] ";" .
init_declarator_list = init_declarator { "," init_declarator } .
init_declarator    = declarator [ "=" initializer ] .

(* --- Операторы --- *)
if_kw              = "if" | "если" .
maybe_kw           = "maybe" | "может" .
else_kw            = "else" | "иначе" .
switch_kw          = "switch" | "выбор" .
case_kw            = "case" | "случай" .
default_kw         = "default" | "умолчание" .
while_kw           = "while" | "пока" .
do_kw              = "do" | "делать" .
for_kw             = "for" | "для" .
continue_kw        = "continue" | "продолжить" .
break_kw           = "break" | "прервать" .
return_kw          = "return" | "возврат" .
goto_kw            = "goto" | "перейти" .

statement          = expression_statement
                   | compound_statement
                   | selection_statement
                   | switch_statement
                   | labeled_statement
                   | iteration_statement
                   | jump_statement .
expression_statement = [ expression ] ";" .
compound_statement   = "{" { declaration | statement } "}" .
selection_statement  = if_kw "(" expression ")" statement
                       ( [ maybe_kw statement ] [ else_kw statement ]
                       | [ else_kw statement ] [ maybe_kw statement ] ) .
switch_statement     = switch_kw "(" expression ")" statement .
case_label           = case_kw expression ":" .
default_label        = default_kw ":" .
labeled_statement    = case_label statement | default_label statement .
iteration_statement  = while_kw "(" expression ")" statement
                     | do_kw statement while_kw "(" expression ")" ";"
                     | for_kw "(" [ expression ] ";" [ expression ] ";"
                               [ expression ] ")" statement .
jump_statement       = continue_kw ";"
                     | break_kw ";"
                     | return_kw [ expression ] ";"
                     | goto_kw identifier ";" .

(* --- Внешние определения --- *)
extern_kw          = "extern" | "внеш" .
static_kw          = "static" | "статич" .
auto_kw            = "auto" | "авто" .
register_kw        = "register" | "регистр" .
inline_kw          = "inline" | "встроен" .
typedef_kw         = "typedef" | "типрег" .

translation_unit   = { external_definition } .
external_definition = function_definition | declaration .
function_definition  = declaration_specifiers declarator
                      [ declaration_list ] compound_statement .
declaration_list    = { declaration } .

Хотелось бы разбор конкретных решений в виде кода и как оно оптимизировалось, сравнение с amd64 архитектурой. Видео с разбором от сотрудницков МЦСТ интересное.

Ну и не хватает .Net (dotnet 6, mono), которые так же есть под Эльбрус.

Ну и да, добавьте в сравнение что-то arm-подобное и x86-64 (amd64), так будет нагляднее.

Что-то подобное я делал: https://habr.com/ru/companies/icl_group/articles/558564/
Самое главное, указать надо с какими флагами собирали и запускали, какие настройки сред. На Эльбрусе это прямо сильно влияет. Удивительно, что шланг (там тоже Эльбрусный бэк под капотом) быстрее родного компилятора оказался. Гошка какая: gccgo или Гугловая -- родная?

Энтузиасты активно пользуются, студентам об этом вещаем.

Хотелось бы ссылку на научную статью и дополнительно техническую документацию как это всё запустить и воспроизвести, а железки найдём для воспроизведения.

Спасибо, а где про это почитать можно? А оригинальная статья про советские ЭВМ очень крутая.

Хорошо, отосплюсь и исправлю))

Version: 6.0.10, Architecture: e2k
$ /opt/mcst/dotnet/dotnet/dotnet --info
Пакет SDK для .NET (отражающий любой global.json):
 Version:   6.0.10.3
 Commit:    1231ff0e6f

Среда выполнения:
 OS Name:     elbrus
 OS Version:  7
 OS Platform: Linux
 RID:         elbrus-e2k
 Base Path:   /opt/mcst/dotnet/dotnet/sdk/6.0.110/

global.json file:
  Not found

Host:
  Version:      6.0.10
  Architecture: e2k
  Commit:       N/A

.NET SDKs installed:
  6.0.110 [/opt/mcst/dotnet/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 6.0.10 [/opt/mcst/dotnet/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 6.0.10 [/opt/mcst/dotnet/dotnet/shared/Microsoft.NETCore.App]

Download .NET:
  https://aka.ms/dotnet-download

Learn about .NET Runtimes and SDKs:
  https://aka.ms/dotnet/runtimes-sdk-info

А если накатить Alt Linux на e2k, там 17000 пакетов и в нативе до 3 раз быстрее комп работает: https://packages.altlinux.org/ru/sisyphus_e2k/

Atomic Heart на Эльбрусе в Alt (RTC)
Atomic Heart на Эльбрусе в Alt (RTC)
e2k KDE
e2k KDE
IntelliJ IDEA
IntelliJ IDEA

Это страница панели управления, сервера здесь. Это автор доступа решил так захостить. Спросите в канале ТГ, который на странице.

Если интересно, то тоже писал свой набор бенчмарков для разных ЯП: https://github.com/EntityFX/EntityFX-Bench

  • C#

  • PHP

  • JavaScript (Browser, NodeJS)

  • Java

  • Python

  • Lua

  • Golang

1
23 ...

Information

Rating
581-st
Location
Казань, Татарстан, Россия
Works in
Date of birth
Registered
Activity

Specialization

Фулстек разработчик, IoT
Старший
C#
.NET Core
.NET
SQL
Linux
Docker
JavaScript
Проектирование архитектуры приложений