<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Void</title>
    <description>The latest articles on DEV Community by Void (@vxiddev).</description>
    <link>https://dev.to/vxiddev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3401121%2Fced6c8b6-b4aa-4613-9751-4e1d3aa4e89c.jpg</url>
      <title>DEV Community: Void</title>
      <link>https://dev.to/vxiddev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vxiddev"/>
    <language>en</language>
    <item>
      <title>Lugn - The distraction blocker that's actually on your side</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Tue, 23 Jun 2026 19:21:57 +0000</pubDate>
      <link>https://dev.to/vxiddev/lugn-the-distraction-blocker-thats-actually-on-your-side-5dgk</link>
      <guid>https://dev.to/vxiddev/lugn-the-distraction-blocker-thats-actually-on-your-side-5dgk</guid>
      <description>&lt;p&gt;Most distraction blockers treat you like a criminal.&lt;/p&gt;

&lt;p&gt;They lock you out. They shame you. They charge you monthly to feel restricted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's a better way.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing Lugn
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lugn&lt;/strong&gt; (Scandinavian for "calm") is a privacy-first browser extension that helps you build real focus habits - without the guilt.&lt;/p&gt;

&lt;p&gt;No hard locks. No punishment. Just a simple, mindful nudge:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Are you sure you want to visit this site?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes or no - your choice. Always.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Lugn is different
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Lugn&lt;/th&gt;
&lt;th&gt;Cold Turkey&lt;/th&gt;
&lt;th&gt;Freedom&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Soft blocking&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discipline Score&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public leaderboard&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100% local free tier&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy-first&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Block distracting sites&lt;/strong&gt;&lt;br&gt;
Add any site to your blacklist in seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Get nudged, not locked out&lt;/strong&gt;&lt;br&gt;
Visiting a blocked site shows a calm redirect page - not a wall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Build your Discipline Score&lt;/strong&gt;&lt;br&gt;
Every choice you make is tracked locally. Your score reflects your real habits over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Climb the leaderboard&lt;/strong&gt; &lt;em&gt;(Premium)&lt;/em&gt;&lt;br&gt;
Opt into the public leaderboard and compete with others building better focus habits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free vs Premium
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free - forever:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Site blacklist&lt;/li&gt;
&lt;li&gt;Soft-block redirect&lt;/li&gt;
&lt;li&gt;Discipline Score&lt;/li&gt;
&lt;li&gt;Full local stats — zero accounts, zero tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Premium:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud sync across devices&lt;/li&gt;
&lt;li&gt;Detailed graphs and analytics&lt;/li&gt;
&lt;li&gt;Custom blocked page&lt;/li&gt;
&lt;li&gt;Public leaderboard&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Privacy is not an afterthought
&lt;/h2&gt;

&lt;p&gt;The free tier runs entirely on your device. No servers. No accounts. No data leaving your browser. Ever.&lt;/p&gt;

&lt;p&gt;Premium sync is opt-in, encrypted, and you can delete your data anytime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Coming soon to Chrome &amp;amp; Firefox
&lt;/h2&gt;

&lt;p&gt;Lugn is currently in development. Follow the build in public on X and be first to know when it launches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're tired of distraction blockers that feel like a punishment - Lugn is for you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Join Waitlist&lt;/strong&gt;: &lt;a href="https://tally.so/r/RG2QWj" rel="noopener noreferrer"&gt;https://tally.so/r/RG2QWj&lt;/a&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How I Built a Programming Language in C in 30 Days (After Only Coding for a Year)</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Sun, 14 Jun 2026 17:06:56 +0000</pubDate>
      <link>https://dev.to/vxiddev/how-i-built-a-programming-language-in-c-in-30-days-after-only-coding-for-a-year-1pid</link>
      <guid>https://dev.to/vxiddev/how-i-built-a-programming-language-in-c-in-30-days-after-only-coding-for-a-year-1pid</guid>
      <description>&lt;p&gt;One year ago, I didn't know how to write a single line of code. I was trapped in what the community calls "tutorial hell," building generic web apps and feeling like I wasn't pushed enough. I had this lingering fear that if I only stuck to trivial, high-level projects, I’d never truly understand how computers work under the hood.&lt;/p&gt;

&lt;p&gt;So, 30 days ago, I decided to take the ultimate plunge into low-level engineering. &lt;strong&gt;I decided to build my own programming language from scratch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Arc&lt;/strong&gt; (not to be confused with the Lisp dialect!): an interpreted language powered by a custom, stack-based bytecode virtual machine written entirely in pure C. It features class-based abstractions, automatic list/string structures, custom error handling (&lt;code&gt;TRY/CATCH&lt;/code&gt;), file I/O, and its own modular file-import system.&lt;/p&gt;

&lt;p&gt;Here is a quick look at what native Arc code looks like running on my runtime:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IMPORT "math.arc"

FN printSum(a, b) THEN
    print(a + b)
END

VAR i = 0
WHILE i &amp;lt; argc THEN
    print("Arg", i, ": " + argv[i])
    i = i + 1
END

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The entire project is completely free and open-source.&lt;/strong&gt; If you want to dive into the codebase, see the compilation pipeline, or test it out yourself, consider dropping a star on the repository!&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/VxidDev/Arc" rel="noopener noreferrer"&gt;Link to Arc Repository on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Twist: Completing "Easy Mode" on "Nightmare Mode"
&lt;/h2&gt;

&lt;p&gt;When I started, I didn't know how to write an abstract syntax tree or a compiler pipeline. I found a couple of great videos demonstrating how to build a basic mathematical parser and conditions, &lt;strong&gt;but they were written in Python.&lt;/strong&gt; Instead of copy-pasting the instructor, I forced a brutal constraint on myself: &lt;strong&gt;Watch the concepts in Python, but implement them entirely in pure C.&lt;/strong&gt;&lt;br&gt;
This instantly transformed the project from a standard tutorial into a low-level gauntlet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python handles variable sizes, dynamic strings, arrays, and type objects completely behind the scenes.&lt;/li&gt;
&lt;li&gt;In C, I had no safety nets. Every time I wanted to append to a list, read a file, or create an object, I had to manually wrestle with memory tracking, pointers, and structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Architectural Evolution:
&lt;/h2&gt;

&lt;p&gt;From Tree-Walking to Bytecode VM&lt;br&gt;
Originally, Arc started as a standard tree-walk interpreter. It evaluated the Abstract Syntax Tree recursively line-by-line. It worked, but it was slow, and I wanted to know how real industrial languages executed code.&lt;br&gt;
So, I ripped the execution engine out and replaced it with a &lt;strong&gt;Stack-Based Bytecode Virtual Machine&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Source Code] ---&amp;gt; [Lexer] ---&amp;gt; [Parser/AST] ---&amp;gt; [Bytecode Compiler] ---&amp;gt; [Custom VM Stack Engine]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of running instructions straight from the parse tree, Arc now compiles code down into raw, compact bytecode array instructions, passing them into an execution loop that mutates values across a lightweight custom VM evaluation stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moving Off-Script (Building Features In the Dark)
&lt;/h3&gt;

&lt;p&gt;After the first few videos, I stopped watching tutorials completely. The remaining features were coded purely by reading documentation, drawing memory layouts on paper, and running experiments. I built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope-Aware Variable Lookups:&lt;/strong&gt; Managing standard and nested scopes across execution blocks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Loops:&lt;/strong&gt; Native execution of WHILE and index-swapping FOR...IN loops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit Class Architectures:&lt;/strong&gt; Grouping data and methods seamlessly without an implicit this/self binding requirement, requiring users to explicitly pass data structures back into encapsulated functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native C Function Bindings:&lt;/strong&gt; Exposing high-performance C standard utilities to the Arc runtime environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Memory Battle: Malloc, Arenas, and AddressSanitizer
&lt;/h2&gt;

&lt;p&gt;Replacing Python's dynamically typed objects with real, explicit C structs was by far the hardest engineering challenge I have ever tackled.&lt;br&gt;
Early on, every string initialization, list manipulation, and class instantiation was handled with messy, individual malloc and calloc calls. This quickly turned into an absolute nightmare of memory leaks, dangling pointers, and segmentation faults.&lt;br&gt;
During weeks two and three, &lt;strong&gt;Valgrind&lt;/strong&gt; and &lt;strong&gt;AddressSanitizer (ASan)&lt;/strong&gt; became my absolute best friends. I spent entire nights tracking down single byte offsets that were corrupting the runtime stack.&lt;br&gt;
To bring order to the chaos, I ended up rewriting major portions of the core architecture to rely on &lt;strong&gt;Memory Pools and Arenas&lt;/strong&gt;. Instead of blasting the heap with thousands of tiny allocations, the runtime requests large chunks of contiguous memory up front and partitions it safely out to strings, structures, and arrays.&lt;/p&gt;
&lt;h2&gt;
  
  
  What It Feels Like to Run Your Own Runtime
&lt;/h2&gt;

&lt;p&gt;There is a genuinely crazy, indescribable satisfaction that comes from writing a text script, passing it into a binary &lt;em&gt;you&lt;/em&gt; wrote, and seeing your custom VM process data perfectly, catch its own errors safely via a TRY/CATCH block, and exit with 0 memory leaks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TRY
    VAR file = open_file("missing.txt", "r")
CATCH e THEN
    print("Caught expected runtime error safely:", e)
END

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building Arc proved to me that systems programming isn't an exclusive club reserved for veterans who have been coding for twenty years. It's accessible to anyone willing to suffer through the segmentation faults, look closely at the memory addresses, and put in the hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next for Arc?
&lt;/h2&gt;

&lt;p&gt;The language is evolving rapidly. My next milestone is to abstract file handles into an entirely native object-oriented file architecture (class File).&lt;br&gt;
The codebase is structured to be highly readable for anyone else who wants to learn how compilers and interpreters work without getting lost in millions of lines of corporate boilerplate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you ever attempted to write a low-level runtime engine?&lt;/li&gt;
&lt;li&gt;What strategies do you prefer when managing custom type objects inside an Arena?
Let me know your thoughts or feedback in the comments below!
&lt;strong&gt;Check out the source code, view the standard libraries, and track my updates on &lt;a href="https://github.com/VxidDev/Arc" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;!&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>devjournal</category>
      <category>programming</category>
      <category>c</category>
    </item>
    <item>
      <title>How I Migrated My Language (Arc) from a Tree-Walker to a Bytecode VM in 7 Days</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Thu, 11 Jun 2026 09:57:18 +0000</pubDate>
      <link>https://dev.to/vxiddev/how-i-migrated-my-language-arc-from-a-tree-walker-to-a-bytecode-vm-in-7-days-4i23</link>
      <guid>https://dev.to/vxiddev/how-i-migrated-my-language-arc-from-a-tree-walker-to-a-bytecode-vm-in-7-days-4i23</guid>
      <description>&lt;p&gt;If you told me a year ago, when I first started learning how to code, that I would be writing a custom bytecode virtual machine, I would have laughed you out of the room.&lt;/p&gt;

&lt;p&gt;But after spending about 1.5 months building my programming language, Arc, as a standard tree-walking interpreter, I hit a wall. Tree-walkers are elegant, but they are notoriously slow because they constantly traverse the Abstract Syntax Tree (AST) during execution.&lt;br&gt;
I wanted speed. I wanted to understand how the big leagues (like Lua or Python) actually execute code. So, I decided to rip out the heart of Arc and replace it with a stack-based bytecode VM.&lt;/p&gt;

&lt;p&gt;It was a wild 3-day sprint. Here is how it went down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Timeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Day 1: The Valley of Despair
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Very tough day. Code is completely half-baked. Most things are broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; I underestimated bytecode. Turning an AST into a linear stream of instructions (opcodes) and operands is a massive mental shift. I spent hours wrestling with stack offsets and trying to emit correct bytecode. By the end of the day, the codebase was a graveyard of compiler errors. I went to bed questioning my life choices.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Day 2: It Works... But It's Slower?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Basic support is finally there, but the VM is incredibly slow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; The VM finally successfully executed its first program! The excitement lasted for exactly five seconds until I ran my benchmarks. The bytecode VM was slower at EVERYTHING... except for a recursive Fibonacci function. Why? Because the tree-walker had massive overhead for function calls, while my VM handled call frames a bit better. But for loops, math, and variable assignments? The VM was dragging its feet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Day 3: The Optimization Breakthrough
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; Optimizations kicked in. Matches the tree-walker, and smashes Fibonacci.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; Day 2's slowness was because of naive decoding loops. On Day 3, I tightened the main loop, used a flat array for the stack, and streamlined instruction decoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; The bytecode VM is now neck-and-neck with the old tree-walking approach on basic scripts, and it absolutely annihilated the recursive fib(30) benchmark, running almost 500ms faster!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Day 4-7: Coming soon...
&lt;/h3&gt;

&lt;h2&gt;
  
  
  What is Next?
&lt;/h2&gt;

&lt;p&gt;The core architecture is finally handling the heavy lifting, but the sprint is not over yet.&lt;br&gt;
For the second half of the week, the focus shifts entirely to stability, refinement, and edge cases. Up next is tracking down some elusive memory leaks, hunting down edge-case bugs that crash the stack, and polishing the codebase so it is ready for prime time. Stay tuned for the next update.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/VxidDev/Arc" rel="noopener noreferrer"&gt;https://github.com/VxidDev/Arc&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>c</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Moving From Tree-Walk to Bytecode: Announcing My Ultimate C Programming Challenge</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Mon, 08 Jun 2026 11:00:46 +0000</pubDate>
      <link>https://dev.to/vxiddev/moving-from-tree-walk-to-bytecode-announcing-my-ultimate-c-programming-challenge-29d4</link>
      <guid>https://dev.to/vxiddev/moving-from-tree-walk-to-bytecode-announcing-my-ultimate-c-programming-challenge-29d4</guid>
      <description>&lt;p&gt;For the past few months, I’ve been building a custom, dynamically typed programming language from scratch in pure C. Up until now, it has lived comfortably as a classic, textbook &lt;strong&gt;AST Tree-Walk Interpreter&lt;/strong&gt;.&lt;br&gt;
If you’ve ever built one, you know the drill: your parser spits out a nested Abstract Syntax Tree, and you evaluate operations on the fly by recursively executing visit() functions down the nodes. It’s elegant, intuitive, and highly rewarding to write.&lt;br&gt;
But recursive pointer-chasing and host-stack overhead eventually hit a performance wall.&lt;br&gt;
So, I've decided to issue myself a massive technical challenge: &lt;strong&gt;I am going to completely tear down my comfortable tree-walk interpreter and rebuild it as a linear Bytecode Compiler and Virtual Machine.&lt;/strong&gt;&lt;br&gt;
I am giving myself a strict timeline to get a minimal, stack-based VM running. I haven't written a single byte of the new engine yet, this is a raw, ground-zero start. Here is why I'm taking on this architectural migration, the design hurdles I'm preparing to face, and how the mental models are about to collide.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Core Problem: Why the Tree-Walker Has to Go
&lt;/h2&gt;

&lt;p&gt;In my current interpreter, the execution pipeline is completely unified. A binary operator node evaluates its subtrees down to raw host pointers immediately, runs the C math logic on the spot, and passes the result up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MY CURRENT APPROACH: Direct recursive evaluation&lt;/span&gt;
&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;visitBinOpNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ASTNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Interpretator&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;BinOpNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;binOper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BinOpNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;srcObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binOper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;leftNode&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binOper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;leftNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;destObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binOper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rightNode&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binOper&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;rightNode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Runtime evaluation happens RIGHT HERE&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;addNumber&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;destObj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;srcObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The challenge of moving to a bytecode VM is that I have to split this execution into two completely distinct phases. I will no longer be evaluating expressions on the fly; I have to &lt;strong&gt;linearize&lt;/strong&gt; them.&lt;br&gt;
My new compiler pass will have to traverse the tree and flatten it into a one-dimensional array of instructions (uint8_t), which a completely separate Virtual Machine runner will execute later via a tight switch loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge 1: Migrating the Memory System
&lt;/h2&gt;

&lt;p&gt;One design constraint I'm setting for myself is to reuse my existing, heavily optimized type system. I already have robust, pooled constructor functions like initInt(), initFloat(), and initString().&lt;br&gt;
My plan is to have the VM's computational evaluation stack literally hold arrays of these exact same host data structure pointers (Object* stack[256]).&lt;br&gt;
The real test will be handling memory ownership. Right now, my AST visitor functions have clear rules for when to call freeObject(). In a VM, values will be flying off the evaluation stack constantly. My VM execution loop is going to have to take full, manual ownership of freeing intermediate, short-lived objects without destroying my persistent memory pools or causing catastrophic memory leaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge 2: Control Flow Without a Safety Net
&lt;/h2&gt;

&lt;p&gt;This is the part of the project I am dreading the most. In a tree-walk interpreter, implementing a while loop or an if statement feels like cheating because you lean entirely on the host language. You literally just write a native C while loop inside your visitor function and recursively execute the body node.&lt;br&gt;
In a bytecode engine, &lt;strong&gt;there are no native loops.&lt;/strong&gt; There are only directional jumps (OP_JUMP, OP_JUMP_IF_FALSE).&lt;br&gt;
To make a loop work, I have to implement a &lt;strong&gt;backpatching&lt;/strong&gt; mechanism. When compiling an if condition, the compiler has to emit a jump instruction before it even knows &lt;em&gt;how many bytes&lt;/em&gt; the interior body block will take. I'll have to emit dummy placeholder bytes for the jump target offset, compile the interior statements, calculate the exact byte distance, and then surgically go back into my bytecode array to rewrite those placeholder bytes with the correct offset.&lt;br&gt;
Getting those offsets right down to the exact byte without causing the instruction pointer to derail into illegal memory is going to be an absolute nightmare to debug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Roadmap Ahead
&lt;/h2&gt;

&lt;p&gt;My goal for the next few days is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define a core set of fundamental Opcodes (OP_CONSTANT, OP_ADD, OP_RETURN).&lt;/li&gt;
&lt;li&gt;Implement a dynamic array structure to hold raw bytes (the &lt;strong&gt;Chunk&lt;/strong&gt;) alongside a &lt;strong&gt;Constant Pool&lt;/strong&gt; for my objects.&lt;/li&gt;
&lt;li&gt;Build a simple stack-based VM loop that can execute hardcoded math arrays before hooking it up to the parser.
Stripping away the abstraction of recursive AST interpretation is going to force me to reckon with how hardware actually processes instructions. I’m fully expecting a week of segmentation faults, index-out-of-bounds errors, and broken logic.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wish me luck. I’ll be posting updates on my progress, design mistakes, and whatever breakthroughs happen along the way.&lt;/p&gt;

</description>
      <category>c</category>
      <category>challenge</category>
      <category>coding</category>
    </item>
    <item>
      <title>Arc v0.0.2-alpha, Release notes</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:03:41 +0000</pubDate>
      <link>https://dev.to/vxiddev/arc-v002-alpha-release-notes-3jg1</link>
      <guid>https://dev.to/vxiddev/arc-v002-alpha-release-notes-3jg1</guid>
      <description>&lt;p&gt;Release Notes - v0.0.2-alpha&lt;/p&gt;

&lt;p&gt;Version Overview&lt;/p&gt;

&lt;p&gt;Version: v0.0.2-alpha&lt;br&gt;
Status: Alpha (Experimental)&lt;br&gt;
License: GPL-3.0&lt;/p&gt;

&lt;p&gt;This release focuses on stability, performance, and memory safety improvements. Several critical bugs have been fixed, the internal architecture has been refined, and the interpreter is now measurably faster across all benchmarks.&lt;/p&gt;

&lt;p&gt;Highlights&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed parser stack overflow caused by unbounded mutual recursion.&lt;/li&gt;
&lt;li&gt;Fixed interpreter stack overflow on deeply recursive function calls.&lt;/li&gt;
&lt;li&gt;Fixed multiple memory management issues, including a double-free and a zero-argument function call crash.&lt;/li&gt;
&lt;li&gt;Reduced "Token" size from 88 bytes → 56 bytes.&lt;/li&gt;
&lt;li&gt;Reduced "Position" size from 40 bytes → 24 bytes.&lt;/li&gt;
&lt;li&gt;Replaced AST visitor dispatch "switch" statements with per-node dispatch tables.&lt;/li&gt;
&lt;li&gt;Added "--cleanup" ("-C") flag for Valgrind and memory leak analysis workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bug Fixes&lt;/p&gt;

&lt;p&gt;Stack Overflow in Parser&lt;/p&gt;

&lt;p&gt;Fixed unbounded mutual recursion between "exprParser", "blockParser", "andOrParser", and "compExprParser" that caused a segmentation fault on files with many statements or deeply nested expressions.&lt;/p&gt;

&lt;p&gt;A per-statement depth reset and recursion depth guard have been added.&lt;/p&gt;

&lt;p&gt;Stack Overflow in Interpreter&lt;/p&gt;

&lt;p&gt;Fixed unbounded recursion in "visitNode" that caused a segmentation fault on deeply recursive Arc functions (e.g. "countdown(5000)").&lt;/p&gt;

&lt;p&gt;A configurable call depth limit has been introduced.&lt;/p&gt;

&lt;p&gt;Double-Free in Function Calls&lt;/p&gt;

&lt;p&gt;Fixed a double-free in "initFunctionCall" where "calleeObj" was freed both inside the function and by the caller.&lt;/p&gt;

&lt;p&gt;Zero-Argument Function Call Crash&lt;/p&gt;

&lt;p&gt;Fixed a crash when calling a function with no arguments caused by "arenaAlloc" returning "NULL" for a zero-size allocation.&lt;/p&gt;

&lt;p&gt;Performance Improvements&lt;/p&gt;

&lt;p&gt;Dispatch Table on ASTNode&lt;/p&gt;

&lt;p&gt;Each AST node now carries a "visit" function pointer assigned during parsing.&lt;/p&gt;

&lt;p&gt;Internal visitors now call "node-&amp;gt;visit" directly, reducing dispatch overhead during AST traversal.&lt;/p&gt;

&lt;p&gt;Smaller Token and Position Structs&lt;/p&gt;

&lt;p&gt;Removed "filename" and "filetext" from "Position", reducing:&lt;/p&gt;

&lt;p&gt;Structure| Old Size| New Size&lt;br&gt;
"Position"| 40 bytes| 24 bytes&lt;br&gt;
"Token"| 88 bytes| 56 bytes&lt;/p&gt;

&lt;p&gt;Parser stack frames now consume significantly less memory, increasing the safe nesting depth before overflow.&lt;/p&gt;

&lt;p&gt;Parser Token Locals Reduced&lt;/p&gt;

&lt;p&gt;Replaced full "Token" locals used only for error reporting with lightweight "Position" pairs, further reducing parser frame size.&lt;/p&gt;

&lt;p&gt;Architecture Improvements&lt;/p&gt;

&lt;p&gt;filename and filetext Moved off Position&lt;/p&gt;

&lt;p&gt;"filename" and "filetext" are now stored on the "Parser" structure and dispatch arguments rather than duplicated inside every token.&lt;/p&gt;

&lt;p&gt;This reduces memory usage and more accurately scopes file metadata for imports and multi-file compilation.&lt;/p&gt;

&lt;p&gt;Memory Management&lt;/p&gt;

&lt;p&gt;Optional Cleanup Mode&lt;/p&gt;

&lt;p&gt;Added an explicit opt-in cleanup mode:&lt;/p&gt;

&lt;p&gt;arc --cleanup program.arc&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;arc -C program.arc&lt;/p&gt;

&lt;p&gt;When enabled, Arc frees all arenas, pools, and tables before exiting.&lt;/p&gt;

&lt;p&gt;By default, memory is reclaimed by the operating system on process termination for maximum performance.&lt;/p&gt;

&lt;p&gt;This behavior does not affect memory usage while programs are running.&lt;/p&gt;

&lt;p&gt;Arena Block Size Pre-Sizing&lt;/p&gt;

&lt;p&gt;Token array capacity is now estimated from source file length, reducing arena reallocation churn during lexing.&lt;/p&gt;

&lt;p&gt;CLI&lt;/p&gt;

&lt;p&gt;New Flag&lt;/p&gt;

&lt;p&gt;Flag| Description&lt;br&gt;
"--cleanup", "-C"| Free all memory before exit. Useful for Valgrind and leak checkers.&lt;/p&gt;

&lt;p&gt;Benchmarks&lt;/p&gt;

&lt;p&gt;Measured against CPython 3.x.&lt;/p&gt;

&lt;p&gt;Benchmark| Python| Arc| Notes&lt;br&gt;
"fibonacci(30)" recursive| 95 ms| 1163 ms| Symbol table allocation per call, to be optimized&lt;br&gt;
"fibonacci(1000)" iterative| 0.06 ms| 0.22 ms| 3.6× slower&lt;br&gt;
"sum(1..1000000)"| 51 ms| 133 ms| 2.6× slower&lt;br&gt;
String concat ×10000| 0.58 ms| 39 ms| O(n²), to be optimized&lt;br&gt;
Nested loops (1000×1000)| 42 ms| 124 ms| 3× slower&lt;br&gt;
Variable churn ×100000| ~42 ms| 25 ms| 1.7× faster than Python&lt;/p&gt;

&lt;p&gt;Roadmap&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Fix symbol table allocation per function call (major speedup for recursive code)&lt;/li&gt;
&lt;li&gt;[ ] Fix O(n²) string concatenation&lt;/li&gt;
&lt;li&gt;[ ] Stop copying objects on every variable access (reference counting or static number interning)&lt;/li&gt;
&lt;li&gt;[ ] Scoped environments for local variables&lt;/li&gt;
&lt;li&gt;[ ] Bytecode Virtual Machine (VM) for improved execution speed&lt;/li&gt;
&lt;li&gt;[ ] Expanded standard library (Networking, JSON support)&lt;/li&gt;
&lt;li&gt;[ ] Enhanced REPL with history and auto-completion&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Arc is currently in alpha. Feedback and contributions are welcome as we move toward a stable 1.0 release.&lt;/p&gt;

</description>
      <category>c</category>
      <category>development</category>
      <category>programming</category>
      <category>coding</category>
    </item>
    <item>
      <title>Arc v0.0.1-alpha - A Lightweight C-Based Programming Language</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Thu, 04 Jun 2026 18:28:32 +0000</pubDate>
      <link>https://dev.to/vxiddev/arc-v001-alpha-a-lightweight-c-based-programming-language-2n4o</link>
      <guid>https://dev.to/vxiddev/arc-v001-alpha-a-lightweight-c-based-programming-language-2n4o</guid>
      <description>&lt;p&gt;We are excited to announce the first alpha release of Arc, a lightweight, C-based programming language and interpreter designed for simplicity, performance, and educational clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version Overview&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: v0.0.1-alpha&lt;/li&gt;
&lt;li&gt;Status: Alpha (Experimental)&lt;/li&gt;
&lt;li&gt;License: GPL-3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This initial release establishes the foundational pipeline of the Arc language, from lexical analysis to AST-based interpretation, featuring a robust set of core language constructs and a custom memory management system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Language Core&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variable System: Declaration and updates using the VAR keyword.&lt;/li&gt;
&lt;li&gt;Functions: Support for custom functions (FN) with parameters and RETURN values.&lt;/li&gt;
&lt;li&gt;Control Flow:
Conditional branching with IF, THEN, ELIF, and ELSE.&lt;/li&gt;
&lt;li&gt;Iterative loops with WHILE, FOR, and THEN.&lt;/li&gt;
&lt;li&gt;Loop control with BREAK and CONTINUE.&lt;/li&gt;
&lt;li&gt;Exception Handling: Graceful error recovery using TRY...CATCH blocks.&lt;/li&gt;
&lt;li&gt;Data Types: Integrated support for Numbers (Integers/Floats), Strings, Booleans, and Lists.&lt;/li&gt;
&lt;li&gt;Import System: Modularize projects by importing other .arc files using IMPORT.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Syntax Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Case Sensitivity:
Keywords (e.g., VAR, WHILE, IF) are case-insensitive.&lt;/li&gt;
&lt;li&gt;Identifiers (variable and function names) are case-sensitive.&lt;/li&gt;
&lt;li&gt;Operators: Comprehensive set of arithmetic (+, -, *, /, ^), comparison (==, !=, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=), and logical (AND, OR, NOT) operators.&lt;/li&gt;
&lt;li&gt;Comments: Single-line comments starting with #.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built-in Standard Library
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I/O Operations: print, get_input, open_file, read_file, write_file, close_file.&lt;/li&gt;
&lt;li&gt;Data Manipulation: len_of, typeof, to_int, split_string, append_list, range.&lt;/li&gt;
&lt;li&gt;Math Library: A comprehensive math.arc providing constants (PI, E) and functions (sin, cos, tan, sqrt, log, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tooling &amp;amp; CLI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Arc comes with a powerful CLI and an interactive REPL:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interactive REPL: Run code line-by-line with syntax highlighting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CLI Options
&lt;/h3&gt;

&lt;p&gt;--debug (-d): View tokens and AST tree during execution.&lt;br&gt;
--code (-c): Execute a string of code directly.&lt;br&gt;
--float-precision (-p): Control decimal output.&lt;br&gt;
--mempool-size (-m): Tune the custom memory allocator.&lt;br&gt;
--last-result (-l): Print the result of the last evaluated expression.&lt;br&gt;
--disable-colored-formatting (-n): For plain text environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Clean Pipeline: Modular separation of Lexer, Parser, AST, and Interpreter.&lt;br&gt;
Memory Management: Implements a Memory Pooling system to minimize malloc/free overhead and prevent fragmentation.&lt;br&gt;
Zero External Dependencies: Built entirely in standard C.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GCC or Clang&lt;/li&gt;
&lt;li&gt;Make&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;make release&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Run&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;./arc script.arc&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Roadmap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Scoped environments for local variables.&lt;/li&gt;
&lt;li&gt;Bytecode Virtual Machine (VM) for improved execution speed.&lt;/li&gt;
&lt;li&gt;Expanded standard library (Networking, JSON support).&lt;/li&gt;
&lt;li&gt;Enhanced REPL with history and auto-completion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arc is currently in alpha. We welcome feedback and contributions as we move toward a stable 1.0 release.&lt;/p&gt;

</description>
      <category>c</category>
      <category>opensource</category>
      <category>programming</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building Arc: A Programming Language Written in C</title>
      <dc:creator>Void</dc:creator>
      <pubDate>Tue, 02 Jun 2026 06:25:30 +0000</pubDate>
      <link>https://dev.to/vxiddev/building-arc-a-programming-language-written-in-c-2agd</link>
      <guid>https://dev.to/vxiddev/building-arc-a-programming-language-written-in-c-2agd</guid>
      <description>&lt;p&gt;For the past month, I've been building Arc, a programming language written in C.&lt;/p&gt;

&lt;p&gt;As someone who started coding roughly a year ago, I wanted a project that would push me beyond application development and into language implementation.&lt;/p&gt;

&lt;p&gt;The project started as a way to learn more about interpreters, language design, parsing, and runtime systems. Over time, it evolved into something much larger: a language that aims to stay simple while remaining powerful enough for real scripting and automation tasks.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/VxidDev/Arc" rel="noopener noreferrer"&gt;https://github.com/VxidDev/Arc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why Build Yet Another Programming Language?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Programming languages are one of the best ways to learn how software works beneath the surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Arc forced me to understand:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lexical analysis &lt;/li&gt;
&lt;li&gt;Parsing&lt;/li&gt;
&lt;li&gt;Abstract Syntax Trees (ASTs) &lt;/li&gt;
&lt;li&gt;Runtime execution&lt;/li&gt;
&lt;li&gt;Symbol tables &lt;/li&gt;
&lt;li&gt;Error handling &lt;/li&gt;
&lt;li&gt;Memory management &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of reading about these topics, I wanted to implement them myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design Goals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Arc is heavily inspired by the simplicity of languages such as Python and Lua.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goals are:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy-to-read syntax&lt;/li&gt;
&lt;li&gt;Small and understandable implementation&lt;/li&gt;
&lt;li&gt;Fast iteration on language features&lt;/li&gt;
&lt;li&gt;Lightweight scripting capabilities&lt;/li&gt;
&lt;li&gt;Potential for embedding into larger applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the same time, I want to keep the implementation straightforward enough that contributors can understand how the entire language works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arc currently includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lexer&lt;/li&gt;
&lt;li&gt;Parser&lt;/li&gt;
&lt;li&gt;AST generation&lt;/li&gt;
&lt;li&gt;Tree-walking interpreter&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Control flow statements&lt;/li&gt;
&lt;li&gt;Error reporting&lt;/li&gt;
&lt;li&gt;Basic type system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VAR i = 0

WHILE i &amp;lt; 10
    PRINT(i)
    i = i + 1
END
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Challenges&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The hardest parts so far haven't been adding new features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They've been:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing clean language semantics&lt;/li&gt;
&lt;li&gt;Managing memory correctly&lt;/li&gt;
&lt;li&gt;Avoiding interpreter architecture mistakes&lt;/li&gt;
&lt;li&gt;Improving diagnostics and error messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's surprisingly easy to add syntax. It's much harder to keep a language coherent as it grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some areas I'm currently working on:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better error messages&lt;/li&gt;
&lt;li&gt;More standard library functionality&lt;/li&gt;
&lt;li&gt;Further interpreter optimizations&lt;/li&gt;
&lt;li&gt;Stabilizing the type system&lt;/li&gt;
&lt;li&gt;Exploring a future bytecode VM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I've Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest lesson so far is that programming languages are much more than parsers and syntax.&lt;/p&gt;

&lt;p&gt;A language is a collection of design decisions. Every new feature affects readability, maintainability, implementation complexity, and future growth.&lt;/p&gt;

&lt;p&gt;Building Arc has been one of the most educational projects I've worked on.&lt;/p&gt;

&lt;p&gt;If you're interested in language design, interpreters, or compiler construction, feedback is always welcome.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/VxidDev/Arc" rel="noopener noreferrer"&gt;https://github.com/VxidDev/Arc&lt;/a&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>computerscience</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
