github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/ARCHITECTURE.md (about)

     1  # Architecture
     2  
     3  This document only keeps visual schemas of the core language components. For details see [CONTRIBUTING.md](./CONTRIBUTING.md).
     4  
     5  ## Compiler
     6  
     7  ```mermaid
     8  flowchart LR
     9      package-manager -->|raw-build| compiler
    10  
    11      subgraph package-manager
    12          git-client
    13          file-system
    14      end
    15  
    16      subgraph compiler
    17          subgraph backend
    18              go-code-generator
    19          end
    20  
    21          parser -->|parsed-build| analyzer
    22  
    23          subgraph parser
    24              antlr
    25          end
    26  
    27          analyzer -->|analyzed-build| desugarer
    28  
    29          subgraph analyzer
    30              typesystem
    31          end
    32  
    33          desugarer -->|desugared-build| irgen
    34  
    35          irgen -->|ir| backend
    36      end
    37  
    38      compiler -->|go-code| go-compiler
    39  ```
    40  
    41  ## Runtime
    42  
    43  ```mermaid
    44  flowchart LR
    45      program-->runtime
    46  
    47      subgraph runtime
    48          connector-->|msg|func-runner
    49          func-runner-->|msg|connector
    50      end
    51  
    52      subgraph connector
    53          event-listener
    54      end
    55  
    56      subgraph func-runner
    57          func-registry[(func-registry)]
    58      end
    59  ```
    60  
    61  ### Connector Algorithm
    62  
    63  > WARNING: Algorithm has changed, update is needed.
    64  
    65  ```mermaid
    66  flowchart TB
    67      cond{are there still connections?}
    68      cond -->|yes| broadcast[spawn broadcast goroutine]
    69      cond -->|no| exit[wait for all broadcast goroutines to finish]
    70      broadcast --> cond
    71  ```
    72  
    73  #### Broadcast
    74  
    75  ```mermaid
    76  flowchart TB
    77      msg[await new message from sender] --> inc[semaphore increment]
    78      inc --> distribute[spawn distribute goroutine]
    79      distribute --> |first receiver processed| msg
    80      distribute --> |all receivers processed| dec[semaphore decrement]
    81  ```
    82  
    83  #### Distribute
    84  
    85  ```mermaid
    86  flowchart TB
    87      q{is receivers queue empty?}
    88      q --> |yes| exit
    89      q --> |no| pick[pick receiver]
    90      pick --> try[try to send message to current receiver]
    91      try --> busy{is current receiver busy?}
    92      busy --> |yes| next[go to the next one]
    93      busy --> |no| remove[remove this receiver from queue]
    94      remove --> next
    95      next --> q
    96  ```
    97  
    98  ## Interpreter
    99  
   100  ```mermaid
   101  flowchart LR
   102      source-code-->interpreter
   103  
   104      subgraph interpreter
   105          compiler-->|ir|adapter-->|program|runtime
   106      end
   107  ```
   108  
   109  ## VSCode Extension
   110  
   111  ```mermaid
   112  flowchart LR
   113      language-server-->|jsonrpc|vscode
   114      vscode-->|jsonrpc|language-server
   115  
   116      subgraph language-server
   117          indexer
   118      end
   119  
   120      subgraph vscode
   121          webview-->extension
   122          extension-->webview
   123      end
   124  
   125      subgraph indexer
   126          compiler-frontend
   127      end
   128  ```