Skip to content

SFX (Situation Framework eXchange)

en Rust Build Status GitHub release (latest SemVer)

Rust дээр бичиж байгаа context-oriented програмчлалын хэл. Гол санаа нь: объектууд одоогийн нөхцөл байдал буюу situation-с хамаарч өөр өөрөөр ажиллах ёстой - яг л чи ажил дээрээ өөрөөр, гэртээ өөрөөр биеэ авч явдаг шиг.

Story:
    Print "Hello, SFX!"
    
    Numbers is [10, 20, 30]
    Print Numbers[1]  # хариу 10 - тийм ээ индекс 1-ээс эхэлдэг

SFX гэж юу вэ?

SFX бол анхны бие даасан Context-Oriented Programming хэл. Өмнөх COP implementation-ууд (ContextJ, ContextPy гэх мэт) бүгд бусад хэлнүүд дээр залгаж тавьсан extension-ууд байсан. SFX-д Situation болон Switch syntax хэлний үндсэн бүтцэд шууд орсон.

Уламжлалт OOP-ийн ёс журмаас залхаад л эхлүүлсэн юм. Яагаад объектууд зүгээр л... context-оос хамаарч өөрчлөгдөж болдоггүй юм бэ? Бодит амьдрал дээр User объект админ үед өөрөөр, зочин үед өөрөөр ажилладаг шүү дээ. Ихэнх хэлнүүдэд strategy pattern, dependency injection, эсвэл runtime type check хэрэгтэй болдог. SFX-д:

Situation: AdminMode
    Adjust User:
        To GetPermissions:
            Return "admin,write,delete"

Concept: User
    To GetPermissions:
        Return "read"

Story:
    Create User Called Bob
    Print Bob.GetPermissions       # "read"
    
    Switch on AdminMode
    Print Bob.GetPermissions       # "admin,write,delete"
    
    Switch off AdminMode
    Print Bob.GetPermissions       # "read"

Одоогийн байдал

Ажиллаж байгаа:

  • Python маягийн indentation-тай Lexer/parser
  • Tree-walking interpreter
  • Cranelift ашигласан JIT (100 удаа дуудагдсаны дараа идэвхждэг)
  • Reactive When observer-ууд
  • Standard library: HTTP, WebSocket, TCP, JSON, CSV, XML, HTML, TOML, LLM, File I/O
  • Do in background болон channel-тай async
  • 1-ээс эхэлдэг index, arbitrary precision тоо

Шинээр нэмэгдсэн:

  • Trace debugger (sfex debug)
  • Жижиг LSP сервер (stdio diagnostics)
  • Project scaffolding (sfex new) + package install (sfex install)
  • Error message-үүд line/column мэдээлэлтэй болсон
  • Dev web сервер (sfex serve + Web.Serve)

Суулгах

git clone https://github.com/roriau0422/sfex-lang.git
cd sfex-lang
cargo build --release
./target/release/sfex run your_script.sfex

Rust 1.75+ хэрэгтэй.

Дизайны шийдвэрүүд

Хачин санагдаж магадгүй зарим шийдвэрүүд:

1-ээс эхлэх index: List[1] бол эхний элемент. Ингэж л хүмүүс тоолдог шүү дээ. Lua ч тэгдэг. R ч тэгдэг. MATLAB ч тэгдэг.

Default-аар arbitrary precision: SFX дээр 0.1 + 0.2 = 0.3, 0.30000000000000004 биш. Хурд хэрэгтэй бол FastNumber хэрэглэ.

Null байхгүй: Хувьсагчид аюулгүй утгаар эхэлдэг (0, "", False, []). "Утга байхгүй" гэж хэрэгтэй бол OptionSome(x) эсвэл None-тэй хэрэглэ.

Grapheme-aware string: "👨‍👩‍👧‍👦".Length бол 1, 7 биш. Нэг тэмдэгт учраас.

Syntax тойм

# Хувьсагч
Name is "Alice"
Age is 25
Items is [1, 2, 3]

# Concept (class шиг юм)
Concept: Person
    Name, Age
    
    To Greet:
        Print "Hi, I'm " + This.Name

# Control flow
If Age > 18:
    Print "Adult"
Else:
    Print "Minor"

Repeat 10 times:
    Print "Hello"

For each Item in Items:
    Print Item

# Pattern matching
When Score:
    is 100:
        Print "Perfect"
    is 90:
        Print "Great"
    Otherwise:
        Print "OK"

Reactive Observer-ууд

Миний хамгийн дуртай feature. When block тодорхой нөхөлд автоматаар ажилладаг:

Concept: Product
    Price, Tax, Total
    
    When Price changes:
        Set This.Tax to This.Price * 0.1
        Set This.Total to This.Price + This.Tax

Story:
    Create Product Called Phone
    Set Phone.Price to 100
    # Tax одоо 10, Total одоо 110 - автоматаар

Pub/sub boilerplate байхгүй. Гараар invalidate хийх хэрэггүй. Зүгээр л ажилладаг.

Standard Library

Модуль Юу хийдэг
HTTP GET/POST/PUT/DELETE
WebSocket Bidirectional real-time
TCP/UDP Low-level socket
JSON/XML/HTML/CSV/TOML Parse хийх, үүсгэх
Data Формат автоматаар таниад parse хийх
File Унших/бичих/stream
Env Environment variable, .env support
System Shell command
Time Огноо/цаг
Math Random, тригонометр, тоймлох
LLM OpenAI API integration
Task/Channel Concurrency primitive
Web Dev HTTP server + router

Web сервер (Dev)

Handler файл (жишээ нь app.sfex) үүсгэнэ:

Story:
    If Request.Path = "/":
        Response is Web.Response("Hello from SFX!", 200)
    Otherwise:
        Response is Web.Response("Not Found", 404)

Router example:

Story:
    Router is Web.Router()
    Router.Get("/hello", "handlers/hello.sfex")
    Router.Static("/assets", "public")
    Router.Serve("127.0.0.1:8000")

Request fields: Method, Path, Query, Params, Headers, Body, Cookies Helpers: Web.Json, Web.File, Web.Redirect, Web.Stream

Ажиллуулах:

sfex serve app.sfex --addr 127.0.0.1:8000 --static-dir public
sfex serve app.sfex --addr 127.0.0.1:8443 --tls-cert cert.pem --tls-key key.pem

Performance

JIT нь Cranelift хэрэглэдэг. Function 100 удаа дуудагдсаны дараа native код болж compile хийгддэг. AMD Ryzen дээрх миний benchmark:

  • Энгийн арифметик loop: ~230M iteration/sec (JIT) vs ~45M (interpreted)
  • Fibonacci(30): ~3M call/sec

Эдгээр тоонуудад бүрэн ач холбогдол өгөх шаардлаггүй. Бодит performance чиний бодит кодоос хамаарна.

Яагаад "SFX"?

Situation Framework eXchange. Бас сайхан сонсогддог.

Хамтран ажиллах

Ганцаараа хийж байгаа project, гэхдээ дараах зүйлсэд туслах хүнд баяртай талархах болно:

  • Илүү сайн error message
  • Test coverage
  • Баримтжуулалт

Issue-г https://github.com/roriau0422/sfex-lang/issues дээр бичээрэй

Лиценз

Apache 2.0

Холбоо барих

Тэмүүжин - roriau@gmail.com


Хөгжүүлэлт явагдаж байгаа, дуусаагүй. Тиймээс ажиллахгүй зүйлс байгаа байх. Гэхдээ үндсэн санаа ажиллаж байгаа, идэвхтэй хөгжүүлж байна.

About

A context-oriented programming language I've been building in Rust. The core idea: objects should behave differently based on the current "situation" - like how you act differently at work vs. at home.

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages