qbjc is a QBasic to JavaScript compiler. It can compile a QBasic / QuickBASIC program to:
- A standalone executable Node.js script, with zero external dependencies; or
- An ES6 module that can be imported and executed in both Node.js and browser environments.
Try it out in the qbjc playground: 👉 qbjc.dev 👈
The qbjc playground (👉 qbjc.dev 👈) allows you to edit and run QBasic / QuickBASIC programs directly in the browser, no installation required.
# Install qbjc from NPM
npm install -g qbjc
# Compile hello.bas and write output to hello.bas.js
qbjc hello.bas
# Run the compiled program
./hello.bas.js
# ...or run hello.bas directly:
qbjc --run hello.bas
# See all command line options
qbjc --help
Compiling a QBasic program:
import {compile} from 'qbjc';
...
const {
// Compiled JavaScript code.
code,
// Sourcemap for the compiled JavaScript code.
map,
// Abstract syntax tree representing the compiled code.
astModule,
} = await compile({
// QBasic source code.
source: 'PRINT "HELLO WORLD"',
// Optional - Source file name (for debugging information).
sourceFileName: 'hello.bas',
// Optional - Whether to bundle with Node.js runtime code in order
// to produce a standalone script.
enableBundling: true,
// Optional - Whether to minify the output.
enableMinify: false,
});
Executing the compiled code:
-
In browsers (using xterm.js):
import {Terminal} from 'xterm'; import {BrowserExecutor} from 'qbjc/browser'; import {compiledModule} from './hello.bas.js'; // Set up xterm.js Terminal instance const terminal = new Terminal(...); await new BrowserExecutor(terminal).executeModule(compiledModule);
-
In Node.js:
import {NodeExecutor} from 'qbjc/node'; import {compiledModule} from './hello.bas.js'; await new NodeExecutor().executeModule(compiledModule);
-
In Node.js with bundling enabled (i.e. compiled with
enableBundling: true
):import {run} from './hello.bas.js'; await run();
For detailed compatibility information on individual commands and functions, see 👉 Implementation Status.
-
Core language features
- Control flow structures - loops, conditionals,
GOTO
,GOSUB
etc. - Data types - primitive types, arrays and user-defined types (a.k.a. records)
- Expressions - arithmetic, string, comparison, boolean
SUB
s andFUNCTION
sDATA
constants- Many built-in commands and functions like
VAL
,STR$
,INSTR
,MID$
- Control flow structures - loops, conditionals,
-
Text mode
- Basic text mode I/O -
PRINT
,INPUT
,INKEY$
,INPUT$
etc. - Text mode screen manipulation -
COLOR
,LOCATE
etc. - Note that the current implementation depends on a VT100-compatible terminal emulator.
- On Windows, this means using WSL or something like PuTTY.
- In the browser, the implementation uses xterm.js.
- Basic text mode I/O -
-
It's just enough to run the original
NIBBLES.BAS
game that shipped with QBasic:
- Graphics and audio
- Events -
ON ERROR
,ON TIMER
etc. - OS APIs like file I/O,
CALL INTERRUPT
etc. - Direct memory access -
PEEK
,POKE
etc. - Less common syntax, inputs or options
- ...and more - contributions are welcome!
qbjc is distributed under the Apache License v2.