<?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>Forem: Atomi J.D.</title>
    <description>The latest articles on Forem by Atomi J.D. (@atomijd).</description>
    <link>https://forem.com/atomijd</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3487191%2Ff74d950a-d042-4730-b1a9-3c799d83058d.jpg</url>
      <title>Forem: Atomi J.D.</title>
      <link>https://forem.com/atomijd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/atomijd"/>
    <language>en</language>
    <item>
      <title>Python vs. a Modern BASIC Interpreter: When the “Toy Language” Actually Wins</title>
      <dc:creator>Atomi J.D.</dc:creator>
      <pubDate>Sun, 08 Feb 2026 06:24:51 +0000</pubDate>
      <link>https://forem.com/atomijd/python-vs-a-modern-basic-interpreter-when-the-toy-language-actually-wins-2h3j</link>
      <guid>https://forem.com/atomijd/python-vs-a-modern-basic-interpreter-when-the-toy-language-actually-wins-2h3j</guid>
      <description>&lt;p&gt;I like Python. A lot, actually. It is hard to argue against it: Python dominates data science, AI, and a large part of backend development.&lt;/p&gt;

&lt;p&gt;But I am also a C++ developer, and over the last year I built my own interpreter: &lt;strong&gt;jdBasic&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Not as a Python replacement, but as an experiment in a different direction.&lt;/p&gt;

&lt;p&gt;The question behind it was simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if you design a language and an interpreter purely around reducing friction during everyday development and experimentation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article is not about hype. It is about very practical trade-offs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Motivation: The Hidden Cost of “Just Import a Library”
&lt;/h2&gt;

&lt;p&gt;Python’s strength is its ecosystem. At the same time, that ecosystem introduces a constant overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;virtual environments&lt;/li&gt;
&lt;li&gt;package management&lt;/li&gt;
&lt;li&gt;imports for even small tasks&lt;/li&gt;
&lt;li&gt;tooling setup before you can actually think&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That cost is usually acceptable. Sometimes it is not.&lt;/p&gt;

&lt;p&gt;jdBasic explores a different idea:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Bake common, complex operations directly into the language instead of outsourcing them to libraries.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. The "Always-Open" Utility Console
&lt;/h2&gt;

&lt;p&gt;One of the most common interruptions in development is context switching.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open a terminal&lt;/li&gt;
&lt;li&gt;start a REPL&lt;/li&gt;
&lt;li&gt;import something&lt;/li&gt;
&lt;li&gt;run a quick check&lt;/li&gt;
&lt;li&gt;close everything again&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;jdBasic is small and fast enough that I simply keep it open all day. It works like a scratchpad.&lt;/p&gt;

&lt;p&gt;Need to check if a text block fits in a 500-char database field?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? LEN("paste the massive string here...")

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

&lt;/div&gt;



&lt;p&gt;Quick hex arithmetic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? $FF * 2

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

&lt;/div&gt;



&lt;p&gt;No setup, no imports, no ceremony.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Unique Random Numbers Without Loops
&lt;/h2&gt;

&lt;p&gt;Generating something like “6 out of 49” sounds trivial, but in many languages it immediately leads to loops or helper libraries.&lt;/p&gt;

&lt;p&gt;jdBasic supports APL-style vector operations.&lt;br&gt;
That means you can treat numbers like a deck of cards:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;generate 1..49&lt;/li&gt;
&lt;li&gt;shuffle the sequence&lt;/li&gt;
&lt;li&gt;take the first 6 elements
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' IOTA(49, 1) generates 1..49, SHUFFLE randomizes, TAKE gets the first 6
PRINT TAKE(6, SHUFFLE(IOTA(49, 1)))
' Output: [12 4 49 33 1 18]

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

&lt;/div&gt;


&lt;p&gt;No loops, no duplicate checks, no additional code.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. ASCII Visualization in a Single Statement
&lt;/h2&gt;

&lt;p&gt;In Python, visualization usually means installing and configuring libraries like matplotlib or pandas.&lt;/p&gt;

&lt;p&gt;jdBasic takes a different approach:&lt;br&gt;
2D arrays and string matrices are native data types.&lt;/p&gt;

&lt;p&gt;This makes it possible to calculate and render ASCII charts directly in the console.&lt;/p&gt;

&lt;p&gt;The following example is a complete biorhythm chart (physical, emotional, intellectual) rendered in one statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' One-liner Biorhythm Chart
BD="1967-10-21":W=41:H=21:D=DATEDIFF("D",CVDATE(BD),NOW()):X=D-W/2+IOTA(W):C=RESHAPE([" "],[H,W]):PY=INT((SIN(2*PI*X/23)+1)*((H-1)/2)):EY=INT((SIN(2*PI*X/28)+1)*((H-1)/2)):IY=INT((SIN(2*PI*X/33)+1)*((H-1)/2)):C[H/2,IOTA(W)-1]="-":C[IOTA(H)-1,INT(W/2)]="|":C[PY,IOTA(W)-1]="P":C[EY,IOTA(W)-1]="E":C[IY,IOTA(W)-1]="I":PRINT "Biorhythm for " + BD:PRINT FRMV$(C)

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

&lt;/div&gt;



&lt;p&gt;It calculates the sine waves for three different cycles, maps them to a 2D grid, overlays axes, and prints the result—all without a single external library or loop.&lt;/p&gt;

&lt;p&gt;It returns to the roots of the 8-bit era: the computer is a calculator that is always ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Persistent Workspaces
&lt;/h2&gt;

&lt;p&gt;In Python, a REPL session is temporary.&lt;br&gt;
Once you close it, everything is gone unless you explicitly serialize your state.&lt;/p&gt;

&lt;p&gt;jdBasic reintroduces an old idea: persistent workspaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SAVEWS "debugging_session"

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

&lt;/div&gt;



&lt;p&gt;The next morning, I open my console and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOADWS "debugging_session"

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

&lt;/div&gt;



&lt;p&gt;Variables, functions, objects, history – everything is restored.&lt;br&gt;
I use this constantly for long-running investigations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one workspace for database analysis&lt;/li&gt;
&lt;li&gt;one for AI experiments&lt;/li&gt;
&lt;li&gt;one for automation tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  5. Working with Corporate Data (MS Access, ADODB)
&lt;/h2&gt;

&lt;p&gt;Enterprise environments often come with “unfashionable” data sources.&lt;br&gt;
MS Access databases are a good example.&lt;/p&gt;

&lt;p&gt;In Python, this usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ODBC drivers&lt;/li&gt;
&lt;li&gt;pyodbc&lt;/li&gt;
&lt;li&gt;platform-specific setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;jdBasic uses COM and ADODB directly, without external libraries.&lt;/p&gt;

&lt;p&gt;I keep a workspace called "SQL_Console" that contains a simple 150-line script (&lt;a href="https://github.com/AtomiJD/jdBasic/blob/master/jdb/acct.jdb" rel="noopener noreferrer"&gt;&lt;code&gt;acct.jdb&lt;/code&gt;&lt;/a&gt;). It wraps the complexity of ADO into a simple REPL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Implementation (Simplified):&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;' Connect to Access without external libraries
conn = CREATEOBJECT("ADODB.Connection")
conn.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Orders.accdb")

' Execute SQL and get results
rs = CREATEOBJECT("ADODB.Recordset")
rs.Open("SELECT * FROM Orders", conn)

' Print results
DO WHILE NOT rs.EOF
    PRINT rs.Fields("Customer").Value; " | "; rs.Fields("Amount").Value
    rs.MoveNext()
LOOP

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

&lt;/div&gt;



&lt;p&gt;Because I save this in a workspace, I never re-type the connection string. I just load &lt;code&gt;SQL_Console&lt;/code&gt; and fire queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExecuteSQL "SELECT * FROM Users WHERE ID=5"

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

&lt;/div&gt;



&lt;p&gt;It returns a formatted Map or Array immediately.&lt;br&gt;
Because this lives in a workspace, I never reconfigure it.&lt;br&gt;
I just load it and run queries.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Desktop Automation: Controlling Windows Native Apps
&lt;/h2&gt;

&lt;p&gt;Automating Windows applications used to be easy in the VB6 era.&lt;br&gt;
In Python, it is possible, but often feels bolted on.&lt;/p&gt;

&lt;p&gt;In jdBasic, COM automation is a core language feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' Launching Microsoft Word...
wordApp = CREATEOBJECT("Word.Application")
wordApp.Visible = TRUE
doc = wordApp.Documents.Add()

' Select text and format it via COM
sel = wordApp.Selection
sel.Font.Name = "Segoe UI"
sel.Style = -2 ' wdStyleHeading1
sel.TypeText "My Generated Doc"

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Vector Math Without NumPy
&lt;/h2&gt;

&lt;p&gt;In Python, element-wise math requires NumPy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="n"&gt;V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;jdBasic:&lt;/strong&gt;&lt;br&gt;
In jdBasic, arrays are first-class citizens. The interpreter knows how to handle math on collections natively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;V = [10, 20, 30, 40]
PRINT "V * 2: "; V * 2
' Output: [20 40 60 80]

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

&lt;/div&gt;



&lt;p&gt;There are no imports. No &lt;code&gt;pip install&lt;/code&gt;. The interpreter understands what you mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Learning AI with Transparent Tensors
&lt;/h2&gt;

&lt;p&gt;For production AI, Python frameworks are unbeatable.&lt;/p&gt;

&lt;p&gt;For learning how things actually work internally, they can be opaque.&lt;/p&gt;

&lt;p&gt;jdBasic has a built-in Tensor type with automatic differentiation.&lt;br&gt;
Gradients are explicit and inspectable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' Built-in Autodiff
A = TENSOR.FROM([[1, 2], [3, 4]])
B = TENSOR.FROM([[5, 6], [7, 8]])

' Matrix Multiplication
C = TENSOR.MATMUL(A, B)

' Calculate Gradients
TENSOR.BACKWARD C
PRINT "Gradient of A:"; TENSOR.TOARRAY(A.grad)

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

&lt;/div&gt;



&lt;p&gt;This is not about performance.&lt;br&gt;
It is about understanding.&lt;/p&gt;
&lt;h2&gt;
  
  
  9. Micro-Services Without a Framework
&lt;/h2&gt;

&lt;p&gt;In Python, even a small HTTP API usually involves a framework.&lt;/p&gt;

&lt;p&gt;jdBasic includes an HTTP server as a language feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FUNC HandleApi(request)
  response = {
    "status": "ok",
    "server_time": NOW()
  }
  RETURN response
ENDFUNC

HTTP.SERVER.ON_POST "/api/info", "HandleApi"
HTTP.SERVER.START(8080)

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

&lt;/div&gt;



&lt;p&gt;Define a function, return a map, get JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict: Ecosystem vs. Immediacy
&lt;/h2&gt;

&lt;p&gt;This is not a “Python vs. BASIC” argument.&lt;br&gt;
It is about choosing where you want to pay the cost.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;jdBasic&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session State&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vector Math&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;NumPy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native COM / ADODB support.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pyodbc&lt;/code&gt; / &lt;code&gt;pywin32&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single executable&lt;/td&gt;
&lt;td&gt;Virtual envs, pip, package management.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For production systems and large teams: Python is the right choice.&lt;/p&gt;

&lt;p&gt;For an always-on, persistent, low-friction development console:&lt;br&gt;
sometimes, my jdBasic interpreter is surprisingly effective.&lt;/p&gt;

&lt;p&gt;Basic never really disappeared :-)&lt;/p&gt;

&lt;p&gt;You can explore the interpreter's source code, dive into the documentation, and see more examples over at the official GitHub repository: &lt;a href="https://github.com/AtomiJD/jdBasic" rel="noopener noreferrer"&gt;jdBasic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can try the main features online at: &lt;a href="https://www.jdbasic.org/" rel="noopener noreferrer"&gt;jdBasic&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>My jdBasic Interpreter Just Got True "Edit and Continue" — In VS Code</title>
      <dc:creator>Atomi J.D.</dc:creator>
      <pubDate>Thu, 30 Oct 2025 14:37:03 +0000</pubDate>
      <link>https://forem.com/atomijd/my-jdbasic-interpreter-just-got-true-edit-and-continue-in-vs-code-39ec</link>
      <guid>https://forem.com/atomijd/my-jdbasic-interpreter-just-got-true-edit-and-continue-in-vs-code-39ec</guid>
      <description>&lt;p&gt;We've all been there. You're 15 minutes into a complex debugging session, you've finally reproduced the bug, your app state is perfect, your variables are all set... and you spot the error. It's a one-line fix.&lt;/p&gt;

&lt;p&gt;The painful choice: stop the debugger, lose your entire state, re-compile, re-run, and spend another 15 minutes getting back to where you were?&lt;/p&gt;

&lt;p&gt;Not anymore.&lt;/p&gt;

&lt;p&gt;I'm thrilled to announce that my custom-built interpreter, &lt;code&gt;jdBasic&lt;/code&gt;, now supports a true &lt;strong&gt;"Edit and Continue"&lt;/strong&gt; feature, running directly inside Visual Studio Code.&lt;/p&gt;

&lt;p&gt;This isn't just "Live Reload" that restarts your app. This is a full &lt;strong&gt;p-code (bytecode) hot-swap&lt;/strong&gt; that preserves your &lt;em&gt;entire&lt;/em&gt; application state (call stack, global, and local variables) while the program is paused.&lt;/p&gt;

&lt;h3&gt;
  
  
  See it in Action
&lt;/h3&gt;

&lt;p&gt;Talk is cheap. Here are three demos of this feature in action during a single, uninterrupted debug session.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Changing Function Signatures On-the-Fly
&lt;/h4&gt;

&lt;p&gt;This is the big one. Most hot reload systems balk at changing method signatures. With &lt;code&gt;jdBasic&lt;/code&gt;, you can add new parameters to a function, save, and the new signature is live &lt;em&gt;instantly&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here, I'm paused in the debugger, I change &lt;code&gt;FUNC Add2(a)&lt;/code&gt; to &lt;code&gt;FUNC Add(a, b)&lt;/code&gt;, and then call the new signature from the immediate window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12jlokxqejqryl9s7fdi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12jlokxqejqryl9s7fdi.gif" alt="Live Function Signature Change" width="548" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Defining New Data Structures Live
&lt;/h4&gt;

&lt;p&gt;What if you realize mid-debug that you're missing a data structure? No problem.&lt;/p&gt;

&lt;p&gt;In this demo, I'm paused, I write a brand new &lt;code&gt;TYPE Fluppi ... ENDTYPE&lt;/code&gt; definition, save the file, and then &lt;em&gt;immediately&lt;/em&gt; &lt;code&gt;DIM&lt;/code&gt; a new variable of that type and assign values to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nuhr2cj0z10etebuy5w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nuhr2cj0z10etebuy5w.gif" alt="Live TYPE Definition" width="555" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Mutating State in the Immediate Window
&lt;/h4&gt;

&lt;p&gt;Of course, no debugging experience is complete without an immediate window. While paused, you can execute any &lt;code&gt;jdBasic&lt;/code&gt; command. Here, I'm changing the value of a variable &lt;code&gt;C&lt;/code&gt; and then printing it with &lt;code&gt;?&lt;/code&gt; (the shortcut for &lt;code&gt;PRINT&lt;/code&gt;). This is perfect for testing edge cases or forcing a specific logic path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoya909dhwho0jvs8ohb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhoya909dhwho0jvs8ohb.gif" alt="Immediate Window State Change" width="547" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;This "magic" is possible because &lt;code&gt;jdBasic&lt;/code&gt; is an interpreter that compiles source code into an internal p-code representation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; I run my code in VS Code with the debugger (F5).&lt;/li&gt;
&lt;li&gt; When I hit a breakpoint, the program pauses.&lt;/li&gt;
&lt;li&gt; I can edit any of my &lt;code&gt;.jdb&lt;/code&gt; source files and hit &lt;strong&gt;Save (Ctrl+S)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; The &lt;code&gt;jdBasic&lt;/code&gt; interpreter detects the save, recompiles the &lt;em&gt;entire&lt;/em&gt; source file into a fresh block of p-code, and atomically &lt;strong&gt;swaps&lt;/strong&gt; the old p-code with the new one.&lt;/li&gt;
&lt;li&gt; It then intelligently remaps the current execution pointer to the equivalent instruction in the new p-code.&lt;/li&gt;
&lt;li&gt; I press "Continue" (F10), and the &lt;strong&gt;new, corrected code&lt;/strong&gt; is executed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Best of all, this fully supports VS Code's &lt;strong&gt;"Jump to Cursor"&lt;/strong&gt; feature. If I make a huge change and the old execution pointer doesn't make sense, I can just right-click any line in my program, select "Jump to Cursor," and the interpreter will resume execution from that exact spot.&lt;/p&gt;

&lt;p&gt;This has been a game-changer for my own productivity.&lt;/p&gt;

&lt;p&gt;You can explore the interpreter's source code, dive into the documentation, and see more examples over at the official GitHub repository: &lt;strong&gt;&lt;a href="https://github.com/AtomiJD/jdBasic" rel="noopener noreferrer"&gt;https://github.com/AtomiJD/jdBasic&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>basic</category>
      <category>devtools</category>
      <category>vscode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Forget GPUs: Let's Render a Spinning 3D Cube in a Console</title>
      <dc:creator>Atomi J.D.</dc:creator>
      <pubDate>Sat, 27 Sep 2025 07:36:45 +0000</pubDate>
      <link>https://forem.com/atomijd/forget-gpus-lets-render-a-spinning-3d-cube-in-a-console-1969</link>
      <guid>https://forem.com/atomijd/forget-gpus-lets-render-a-spinning-3d-cube-in-a-console-1969</guid>
      <description>&lt;p&gt;By day, I manage large-scale software projects for a Fortune 500 company. By night, I get back to my roots. After decades of programming in C (since 1990) and C++, I decided to build my own programming language from scratch, just for the fun of it: &lt;strong&gt;jdBasic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This led me to a classic nerdy challenge: could I render a solid, spinning 3D object using only the characters in a standard console window?&lt;/p&gt;

&lt;p&gt;Challenge accepted. The result is pure, real-time, ASCII-based 3D rendering:&lt;/p&gt;

&lt;p&gt;This isn't a pre-recorded animation. It's a program calculating 3D transformations and perspective for every frame. And it's all running in jdBasic.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70fin17penip13sh7f0b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70fin17penip13sh7f0b.gif" alt=" " width="720" height="530"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tool: What is jdBasic?
&lt;/h2&gt;

&lt;p&gt;I built jdBasic to fuse the simplicity of classic BASIC with the power of modern programming paradigms. It’s a hobby, but a serious one, written in C++20. Think of it as a language where &lt;code&gt;FOR...NEXT&lt;/code&gt; loops can coexist with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APL-Inspired Array Programming:&lt;/strong&gt; This is the secret sauce for the cube. You can perform math on entire matrices in a single line, no loops required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Built-in AI Engine:&lt;/strong&gt; It has first-class &lt;code&gt;Tensor&lt;/code&gt; objects and automatic differentiation for building and training neural networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Features:&lt;/strong&gt; It has &lt;code&gt;Maps&lt;/code&gt; (dictionaries), &lt;code&gt;TRY...CATCH&lt;/code&gt; error handling, and can even be extended with C++ DLLs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can explore the interpreter's source code, dive into the documentation, and see more examples over at the official GitHub repository: &lt;strong&gt;&lt;a href="https://github.com/AtomiJD/jdBasic" rel="noopener noreferrer"&gt;https://github.com/AtomiJD/jdBasic&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Deconstructing the Cube
&lt;/h2&gt;

&lt;p&gt;The magic behind the animation boils down to four key steps applied in every frame:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define Geometry:&lt;/strong&gt; We start with two matrices: one for the 8 (X, Y, Z) vertices of the cube, and another defining the 6 faces by referencing the vertex indices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply Rotation:&lt;/strong&gt; Standard trigonometry rotation matrices are used to calculate the new position of every vertex as the cube spins. This is done with a single &lt;code&gt;MATMUL&lt;/code&gt; (Matrix Multiplication) operation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project to 2D:&lt;/strong&gt; We simulate perspective to make the 3D object look right on a 2D screen. The simple rule is: objects farther away appear smaller. This entire calculation is "vectorized"—performed on all 8 vertices at once without a single &lt;code&gt;FOR&lt;/code&gt; loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the Painter's Algorithm:&lt;/strong&gt; To make the cube solid and hide rear faces, we calculate the average depth of each face, sort them from back to front, and draw them in that order. This ensures that closer faces are drawn on top of farther ones.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Full Code
&lt;/h2&gt;

&lt;p&gt;Here is the complete source code. The power of jdBasic's array-oriented functions makes it surprisingly compact.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' ==========================================================
' == Fully Optimized ASCII 3D Cube
' ==========================================================

' --- Configuration Section ---
SCREEN_WIDTH = 40
SCREEN_HEIGHT = 20

' --- 1. Define Vertices, Faces, and Transformations ---
DIM Vertices[8, 3]
Vertices = RESHAPE([-1,-1,-1,  1,-1,-1,  1, 1,-1, -1, 1,-1, -1,-1, 1,  1,-1, 1,  1, 1, 1, -1, 1, 1], [8, 3])

DIM Faces[6, 4]
Faces = RESHAPE([4,5,6,7, 0,3,2,1, 0,1,5,4, 2,3,7,6, 1,2,6,5, 3,0,4,7], [6, 4])

DIM FaceChars$[6]
FaceChars$ = ["#", "O", "+", "=", "*", "."]

DIM ScalingMatrix[3, 3]
ScalingMatrix = [[1,0,0], [0,2,0], [0,0,1]]

' --- 2. Main Animation Loop ---
DIM ScreenBuffer[SCREEN_HEIGHT, SCREEN_WIDTH]
DIM ProjectedPoints[8, 2]
AngleX = 0 : AngleY = 0
FocalLength = 5

' --- 3. Functions for Rotation and drawing---
FUNC CreateRotationX(angle)
    RETURN [[1, 0, 0], [0, COS(angle), -SIN(angle)], [0, SIN(angle), COS(angle)]]
ENDFUNC

FUNC CreateRotationY(angle)
    RETURN [[COS(angle), 0, SIN(angle)], [0, 1, 0], [-SIN(angle), 0, COS(angle)]]
ENDFUNC

SUB DrawLine(x1, y1, x2, y2, char$)
    dx = ABS(x2 - x1) : dy = -ABS(y2 - y1)
    sx = -1: IF x1 &amp;lt; x2 THEN sx = 1
    sy = -1: IF y1 &amp;lt; y2 THEN sy = 1
    err = dx + dy
    DO
        IF x1 &amp;gt;= 0 AND x1 &amp;lt; SCREEN_WIDTH AND y1 &amp;gt;= 0 AND y1 &amp;lt; SCREEN_HEIGHT THEN ScreenBuffer[y1, x1] = char$
        IF x1 = x2 AND y1 = y2 THEN EXITDO
        e2 = 2 * err
        IF e2 &amp;gt;= dy THEN err = err + dy : x1 = x1 + sx
        IF e2 &amp;lt;= dx THEN err = err + dx : y1 = y1 + sy
    LOOP
ENDSUB

SUB FillFace(points, char$)
    y_min = MAX([0, MIN(SLICE(points, 1, 1))])
    y_max = MIN([SCREEN_HEIGHT - 1, MAX(SLICE(points, 1, 1))])
    FOR y = y_min TO y_max
        intersections = []
        FOR i = 0 TO 3
            p1 = SLICE(points, 0, i)
            p2 = SLICE(points, 0, (i + 1) MOD 4)
            IF p1[1] &amp;lt;&amp;gt; p2[1] AND ((y &amp;gt;= p1[1] AND y &amp;lt; p2[1]) OR (y &amp;gt;= p2[1] AND y &amp;lt; p1[1])) THEN
                intersections = APPEND(intersections, p1[0] + (y - p1[1]) * (p2[0] - p1[0]) / (p2[1] - p1[1]))
            ENDIF
        NEXT i
        IF LEN(intersections) &amp;gt;= 2 THEN
            FOR x = MAX([0, MIN(intersections)]) TO MIN([SCREEN_WIDTH - 1, MAX(intersections)])
                ScreenBuffer[y, x] = char$
            NEXT x
        ENDIF
    NEXT y
ENDSUB

CURSOR FALSE

F = 0

DO
    ' --- a) Rotate &amp;amp; Scale Vertices ---
    CombinedTransform = MATMUL(ScalingMatrix, MATMUL(CreateRotationY(AngleY), CreateRotationX(AngleX)))
    RotatedVertices = MATMUL(Vertices, CombinedTransform)

    ' --- b) Vectorized Perspective Projection ---
    X_col = SLICE(RotatedVertices, 1, 0)
    Y_col = SLICE(RotatedVertices, 1, 1)
    Z_col = SLICE(RotatedVertices, 1, 2)
    Perspective = FocalLength / (FocalLength - Z_col)
    ScreenX = (X_col * Perspective) * (SCREEN_WIDTH / 8) + (SCREEN_WIDTH / 2)
    ScreenY = (Y_col * Perspective) * (SCREEN_HEIGHT / 8) + (SCREEN_HEIGHT / 2)
    ProjectedPoints = STACK(1, INT(ScreenX), INT(ScreenY))

    ' --- c) Vectorized Painter's Algorithm ---
    FaceZCoords = RESHAPE(Z_col[Faces], [6, 4])
    FaceDepths = SUM(FaceZCoords, 1) / 4
    DrawOrder = GRADE(FaceDepths)

    ' --- d) Draw Faces from Back to Front ---
    ScreenBuffer = RESHAPE([" "], [SCREEN_HEIGHT, SCREEN_WIDTH])
    FOR i = 0 TO 5
        face_idx = DrawOrder[i,0]
        v_indices = SLICE(Faces, 0, face_idx)
        face_x_coords = SLICE(ProjectedPoints, 1, 0)[v_indices]
        face_y_coords = SLICE(ProjectedPoints, 1, 1)[v_indices]
        face_points = STACK(1, face_x_coords, face_y_coords)

        FillFace face_points, FaceChars$[face_idx]
        FOR p = 0 TO 3
            p1 = SLICE(face_points, 0, p)
            p2 = SLICE(face_points, 0, (p + 1) MOD 4)
            DrawLine p1[0], p1[1], p2[0], p2[1], "*"
        NEXT p
    NEXT i

    ' --- e) Render and Update ---
    CLS
    PRINT "Fully Optimized 3D Cube (Press any key)"
    PRINT FRMV$(ScreenBuffer)
    YIELD
    AngleX = AngleX + 0.05 : AngleY = AngleY + 0.08
    F = F + 1
LOOP UNTIL F &amp;gt; 200

CURSOR TRUE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;You can run this code right now in your browser. No installation needed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Go to the jdBasic Web REPL:&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://jdbasic.org/live/index.html" rel="noopener noreferrer"&gt;https://jdbasic.org/live/index.html&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;EDIT&lt;/code&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste&lt;/strong&gt; the entire code block from above into the editor.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;"Save &amp;amp; Close"&lt;/strong&gt; button.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;RUN&lt;/code&gt; and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enjoy the show! Happy hacking.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>gamedev</category>
      <category>programming</category>
      <category>cli</category>
    </item>
    <item>
      <title>My 49-Year Journey: From a 1976 IBM 5100 to Building an AI-Powered BASIC</title>
      <dc:creator>Atomi J.D.</dc:creator>
      <pubDate>Mon, 08 Sep 2025 14:51:33 +0000</pubDate>
      <link>https://forem.com/atomijd/my-49-year-journey-from-a-1976-ibm-5100-to-building-an-ai-powered-basic-9hh</link>
      <guid>https://forem.com/atomijd/my-49-year-journey-from-a-1976-ibm-5100-to-building-an-ai-powered-basic-9hh</guid>
      <description>&lt;p&gt;Hi everyone,&lt;/p&gt;

&lt;p&gt;I wanted to properly introduce myself and share the project that's become my obsession. Let's start with the code comment version:&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;// Name: AtomiJD&lt;/span&gt;
&lt;span class="c1"&gt;// Coding Since: 1976 (APL on IBM 5100)&lt;/span&gt;
&lt;span class="c1"&gt;// Current Stack: C++, Python, C#&lt;/span&gt;
&lt;span class="c1"&gt;// Core Passion: Building programming languages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tiny comment block spans nearly five decades. My first taste of programming was on a IBM 5100 in APL.&lt;/p&gt;

&lt;p&gt;But this post isn't just about the past. It's about a question: &lt;strong&gt;What if BASIC hadn't stopped evolving?&lt;/strong&gt; What if it had kept up, borrowing ideas from APL, Python, and LISP, and even embraced the AI revolution?&lt;/p&gt;

&lt;p&gt;I decided to find out.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Sprint: Building jdBasic with an AI Partner
&lt;/h3&gt;

&lt;p&gt;This project, &lt;strong&gt;jdBasic&lt;/strong&gt;, came to life in an intense, two-month coding marathon. It wasn't a solo journey in a dark room. It was a dynamic, modern process I can only describe as "vibe coding" with Google's Gemini and ChatGPT.&lt;/p&gt;

&lt;p&gt;The result is a language that I believe is truly unique. It's a blend of retro simplicity and modern power.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is jdBasic? A Tour of the Core Features
&lt;/h3&gt;

&lt;p&gt;jdBasic is a modern interpreter designed to be easy to learn but powerful enough for complex tasks. Here are some of the things that make it special:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;APL-Inspired Array Programming:&lt;/strong&gt; At its heart, jdBasic is an array-first language. Most operations are element-wise by default. You can multiply a whole vector by a number or add two matrices together without a single &lt;code&gt;FOR&lt;/code&gt; loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Functional Core:&lt;/strong&gt; It embraces functional concepts like higher-order functions, lambdas, and a pipe operator (&lt;code&gt;|&amp;gt;&lt;/code&gt;) for creating elegant, readable data pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object-Oriented Style:&lt;/strong&gt; You can define your own complex data structures with methods using &lt;code&gt;TYPE...ENDTYPE&lt;/code&gt;, allowing for a clean, object-oriented approach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in 2D Game Engine:&lt;/strong&gt; It has a complete multimedia toolkit with a sprite system (including Aseprite animation support), tilemap integration (from the Tiled editor), collision detection, sound, and graphics commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reactive Programming:&lt;/strong&gt; Create variables that automatically update when the values they depend on change, using a simple -&amp;gt; operator for spreadsheet-like behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Integrated AI Engine:&lt;/strong&gt; This is the big one. jdBasic has a built-in &lt;code&gt;Tensor&lt;/code&gt; object with automatic differentiation. You can build and train complex neural networks, from simple models to Transformers, right inside the interpreter with high-level commands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Show, Don't Just Tell: jdBasic in Action
&lt;/h3&gt;

&lt;p&gt;Talk is cheap. Here’s what the code actually looks like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Functional Pipelines&lt;/strong&gt;&lt;br&gt;
Here, we generate numbers 1-10, filter for values greater than 5, and multiply them by 10—all in one clean, declarative line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' Start with a sequence of numbers from 1 to 10
numbers = IOTA(10)

' This pipeline:
' 1. Filters numbers &amp;gt; 5
' 2. Multiplies the remaining numbers by 10
result = numbers |&amp;gt; FILTER(lambda val -&amp;gt; val &amp;gt; 5, ?) |&amp;gt; SELECT(lambda v -&amp;gt; v * 10, ?)

PRINT "Result: "; result
' Expected Output: [60 70 80 90 100]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;2. The Power of APL-Style One-Liners&lt;/strong&gt;&lt;br&gt;
The true power of the array-first design is that you can create complex visual output without loops. This single line of code calculates and plots a personal biorhythm chart directly in the console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BD="1967-10-21":W=41:H=21:D=DATEDIFF("D",CVDATE(BD),NOW()):X=D-W/2+IOTA(W):C=RESHAPE([" "],[H,W]):PY=INT((SIN(2*PI*X/23)+1)*((H-1)/2)):EY=INT((SIN(2*PI*X/28)+1)*((H-1)/2)):IY=INT((SIN(2*PI*X/33)+1)*((H-1)/2)):C[H/2,IOTA(W)-1]="-":C[IOTA(H)-1,INT(W/2)]="|":C[PY,IOTA(W)-1]="P":C[EY,IOTA(W)-1]="E":C[IY,IOTA(W)-1]="I":PRINT "Biorhythm for " + BD + " | P=Physical(23) E=Emotional(28) I=Intellectual(33)":PRINT FRMV$(C)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;3. Object-Oriented &lt;code&gt;TYPE&lt;/code&gt;s for a Game&lt;/strong&gt;&lt;br&gt;
Define a &lt;code&gt;Player&lt;/code&gt; type with its own data and methods, just like a class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TYPE Player
    Name AS STRING
    Health AS INTEGER

    ' Method to take damage
    SUB TakeDamage(damage)
        THIS.Health = THIS.Health - damage
        IF THIS.Health &amp;lt; 0 THEN THIS.Health = 0
        PRINT THIS.Name; " takes "; damage; " damage! Health is now "; THIS.Health
    ENDSUB
ENDTYPE

' Create a player instance
DIM Hero AS Player
Hero.Name = "Arion"
Hero.Health = 100

Hero.TakeDamage(15)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;4. The Magic of Built-in AI (Auto-differentiation)&lt;/strong&gt;&lt;br&gt;
No Python, no complex libraries. Just create &lt;code&gt;Tensor&lt;/code&gt; objects, perform math, and call &lt;code&gt;TENSOR.BACKWARD&lt;/code&gt; to automatically calculate all the gradients needed for training a neural network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;' Create two simple tensors
A = TENSOR.FROM([[1, 2], [3, 4]])
B = TENSOR.FROM([[5, 6], [7, 8]])

' Forward Pass (this operation's history is tracked)
C = MATMUL(A, B)

' Backward Pass (calculate gradients for A and B automatically)
TENSOR.BACKWARD C

' Check the calculated gradients
PRINT "Gradient of A:"; TENSOR.TOARRAY(A.grad)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  So, Who is This For?
&lt;/h3&gt;

&lt;p&gt;I designed jdBasic to be a "get things done" language for several groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Educators and Hobbyists:&lt;/strong&gt; A simple, self-contained environment to teach programming, from turtle graphics to game logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indie Game Devs:&lt;/strong&gt; A fast way to prototype and build 2D retro games without the overhead of large engines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI/ML Students &amp;amp; Curious Programmers:&lt;/strong&gt; An incredibly accessible way to learn the fundamentals of neural networks without getting lost in Python's ecosystem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power Users &amp;amp; Scripters:&lt;/strong&gt; A powerful "glue" language for automating tasks, parsing files, and even creating simple web APIs with the built-in HTTP server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I'd Love to Hear From You
&lt;/h3&gt;

&lt;p&gt;This project has been a fusion of my entire career's experience with today's incredible technology. Now, I'm excited to share it with a wider community.&lt;/p&gt;

&lt;p&gt;You can check out the project, download the latest release, and dive into the documentation on GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Main Repo:&lt;/strong&gt; &lt;code&gt;https://github.com/AtomiJD/jdBasic&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; Language Reference (&lt;code&gt;https://github.com/AtomiJD/jdBasic/languages.md&lt;/code&gt;) and The Official Manual (&lt;code&gt;https://github.com/AtomiJD/jdBasic/manual.md&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have a few questions for the DEV community:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; What was the first programming language that made you fall in love with code?&lt;/li&gt;
&lt;li&gt; Looking at the features, what's the first thing you would be tempted to build with jdBasic?&lt;/li&gt;
&lt;li&gt; Does a language like this have a place in 2025?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks for reading. I can't wait to see what you think!&lt;/p&gt;

&lt;p&gt;Cheers :- )&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>basic</category>
      <category>gamedev</category>
    </item>
  </channel>
</rss>
