Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

93 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

ram_simulator_rust

So, basically, I wanted to learn Rust and this is what came out of it.

RustKotlin

What is this?

ram_simulator_rust is a simple Register Machine simulator written in Rust. It supports hardcoded programs and executing files via its cli. By default, it outputs all registers (up to the highest that was used) after executing every instruction.

The instruction set is the one described in lib/ram_simulator/src/instruction/mod.rs. (Basically the one from my Computability and Complexity course with one minor addition.)

Program syntax

For the instruction set, see lib/ram_simulator/src/instruction/mod.rs.

Here's an example program that computes floor(ld(c(1))) (the floor of the log_2 of the value that is in the 1st register):

INIT 256 ; Initialize the 1st register with 256CLOAD 0 ; this is line 1 (not 2, the initialisation is **not** counted)STORE 2CLOAD 1STORE 3LOAD 3SUB1IF c(0) > 0 THEN GOTO 15LOAD 2CADD 1STORE 2LOAD 3CMULT 2STORE 3GOTO 4LOAD 2 ; even though this is technically line 16, GOTO 15 jumps hereCSUB 1STORE 1END

The INIT instruction is my own addition. It initializes the first n registers with the given values. For example, to set c(1)=5, c(2)=3, c(3)=2, you can use INIT 5 3 2. Every program must start with this, even if it's not used/empty.

Note: For hardcoded programs, look at src/examples/example{1,2}.rs.

On the topic of syntax

  • Empty lines between instructions are currently not supported.
  • Comments are supported on any line via any delimiter (e.g. #, //, ;, --, /* */, --[[ ]]--, etc.), except on INIT, as long as there's at least one space between the comment and the instruction.
  • IF's syntax is matched using a regex and is intentionally not very strict. The number of whitespaces doesn't matter either. The following get parsed as the exact same instruction:
    IF c(0)>0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15 ; if you write code like this,IF c(0)> 0 THEN GOTO 15 ; you're a menace to society thoughIF c(0) >0 THEN GOTO 15IF c(0) > 0 THEN GOTO 15

Limitations

Generic

WebAssembly Interface

  • If you have an endless loop in your code, the simulation maycrash your browser tab, or make it appear unresponsive, if you set max depth too high.
  • Specific errors on which the parser panics cannot be shown on the page via javascript. There is currently only one generic error. Done. All parser errors now get propagated to rswasm, which then shows them on the page.

Usage

CLI

  1. Get the rscli binary
    • Build the project with cargo build --release. The binary will be in target/release/rscli, or
    • Grab the latest release
  2. (optional) Install the binary
    • Linux: sudo install -m 755 target/release/rscli /usr/local/bin/rscli
    • Windows: i don't know, figure it out
    • MacOS: ¯\_(ツ)_/¯
  3. Execute a program
    • Continuous mode: rscli c /path/to/program.s
    • Step-by-step mode: rscli s /path/to/program.s

WebAssembly Interface

Note: The WASM interface is not fully-featured yet, see Limitations.

License

The project consists of the ram_simulator library, the rscli command line interface, and the ram_webassembly WebAssembly Interface (as a library).

About

A simple Register Machine simulator written in Rust.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages