Awesome
Budget Pascal
A compiler for a small subset of Pascal (hence, "budget") to WebAssembly. Demo & blog.
Why Pascal?
When I was reorganizing my files, I found a hangman game that my friends and I wrote 10 years ago for a programming class project. I think it would be fun to try to compile and run it on the web.
Why WebAssembly?
I want something that can run on the web for easy demo, and compiling pascal to web assembly seems more challenging and fun than "just" making a custom VM or transpiling to javascript.
Building & Running
- Make sure to have node and yarn installed
- Run
yarn install
to install all dependencies - Run
yarn build
to build the CLI, oryarn build-web
for the web version. - To use the CLI, run
yarn start [pascal filename]
. To use the web UI, just serve directorydist/web
using serve or other http server.
Which Subset of Pascal?
Because implementing full-blown Pascal is really time consuming, I decided to just implement at least what I need to run that hangman game. What is and what is not included will seem arbitrary but I tried my best to include some basic features. I also try to make sure that the compiler compiles a strictly subset of Pascal, meaning if a program is successfully compiled by this compiler, it should also be successfully compiled in other major Pascal compilers like FreePascal.
If you actually need to compile Pascal codes to webassembly, I suggest first to use FreePascal to compile WebAssembly with LLVM.
Implemented data types:
integer
, 32-bit signed integerchar
, 8-bit unsigned integerboolean
, 8-bint unsigned integerreal
, 64-bit floating point numberstring
, Pascal-style static-sized ShortStringarray
, Array type with staticly declared sizerecord
, Pascal record typefile
andtext
, Pascal binary and text file type
Notable datatypes that didn't get included (non-exhaustive):
- Different-sized integers and real numbers
- Enumeration type
- Range type
- Set
- Pointers
- AnsiString, PChar, and other character types
- Dynamic Arrays
- Record with variant parts
Implemented expressions, statements and other language constructs:
- All arithmetic, logic and binary operators
- Read and write to console or file
in
set expression, likex in [1, 2..5, 9..11]
- Partially implemented range expression in
case of
statements and array index declaration. - Typecasting between basic types
- Basic compound and control flow statements:
begin-end
,if-else
,case-of
,for to/downto
,repeat-until
,while-do
- Variable, constant and type definition with global & local scoping
- Procedure and function, with
var
andconst
parameter - Procedure / function declarations inside another procedure / function
- A very small number of library functions and procedures from standard library and crt library
Notable language constructs that didn't get included (non-exhaustive):
- All object pascal features (class, exception, etc.)
- Units and user-defined libraries
- Initializing variable in declaration
- Function and operator overloading
- Forward declaration
for-in
andwith
statement- Set operator expressions other than
in
- Pointer address expression
- Most procedure and functions in the standard library
Other limitation and details:
- Record field memory arrangement are packed and not aligned to powers of 2, so it might affect performance and processing binary files of record types might be incompatible with other compilers.
- Call stack is limited to 256
- Total memory is limited to 4 MB