Z-Sharp logo

Z-Sharp AstroSam

Use this command to install Z-Sharp:
winget install --id=sam-astro.Z-Sharp -e

Custom programming interpreter for ZSharp (Z#), a custom game programming language

README

> Z-Sharp is no longer in development! This project was never meant to go beyond the scope of a simple thing I could make pong in, yet people continue to ask for features and fixes, and I continue to oblige. So sadly, even though this was a cool project in which I learned a lot, it will be ending now. I will eventually make some docs and standards for the syntax, and will still leave this repository open. This way anybody can make their own interpreter or compiler for it. I will also still accept pull requests for any changes to this repository.

Introduction

Z-Sharp is a custom programming language I made because I don't like c++ very much (Z-Sharp's interpreter is written in c++ though). Z-Sharp scripts have the file extension .ZS. The base syntax and formatting I would say is quite similar to C# or Python, but differs as task complexity increases. It also has support for graphics using SDL2.

Before using Z#: There is no documentation, strings barely work, performance isn't great, the syntax is very specific, and most errors just cause it to crash without warning. I am just a single developer working on this during my free time; between school, other projects, and YouTube. Z-Sharp will most likely never be finished, since it was really supposed to end when the video was published about it. If you are trying to use a common programming language feature, ask yourself this: Is this feature required to play pong? If not, then most likely that feature has not been implemented yet. I initially only made the language so I could create pong and make a video about it, so it really is the bare minimum.

Documentation and getting started:

The docs and tutorial

Installation

Downloading or installing is very simple, here is how depending on your version and operating system:

Windows

  1. Navigate to the most recent release and download ZSharp-Win-Installer.zip.
  2. Unzip ZSharp-Win-Installer.zip and open the unzipped folder.
  3. Inside is a single file titled ZSharp-Setup.exe. Run it, and follow the setup instructions.
  4. If it fails to run, make sure the MS Visual Runtime and MSVC C++ Redistribute are installed. You can download them here from Microsoft
  5. Now that it is installed, there are a few ways to use it:
    • (recommended) Any ZSharp file that ends with .ZS will automatically be associated with the interpreter. Just double-click it, and the interpreter will run.
    • Drag and drop any .ZS script directly onto the executable.
    • Use command line, providing path to interpreter and then to script like so: > ./ZSharp.exe ./Pong-Example-Project/script.zs
  6. Feel free to use and edit the Pong-Example-Project. It is a single script called script.zs, and you can open it with any of the methods above. It is also located on the releases page. > If you don't want to install ZSharp on your device, or you want easier acces to the executable and .DLLs, another version is provided called ZS_Win_Base_Raw.zip. This just contains all of the files the installer puts on your computer.

Linux

  1. Install requirements: SDL2, SDL2 Image, SDL2 TTF Commands for apt and pacman below:

Debian

$ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev

Arch

$ sudo pacman -S sdl2 sdl2_image sdl2_ttf
  1. Navigate to the most recent release and download ZSharp-Linux.zip.
  2. Unzip ZSharp-Linux.zip and open the unzipped folder.
  3. You will see some files. The Z# interpreter is ZSharp. Any time you want to execute a script, this is the program that will be used. You can use it like so:
    • Use terminal, providing path to executable and then to script like so: $ ./ZSharp ./Pong-Example-Project/script.zs
  4. Feel free to use and edit the included Pong-Example-Project. It is a single script called script.zs, and you can open it with any of the methods above.

Here is some example code:

// Comments are indicated by two forward slashes
// They can only be on their own line
//    int j = 4 // <- This is invalid comment placement

// All programs start with a main function
func Main()
{
    int i = 0
    string s = "r"
    
    i += 2
    i -= 1
    i /= 3
    i *= 2
    
    while i < 10
    {
        i += 1
    }
    
    if s == "r"
    {
        Printl(s + " is r")
    }
    
    int functionNumber = ExampleFunction("A", s)
    ExampleFunction(1, 3)
    
    GlobalFunction()
}

// Declare new function with 'func', then it's name, and the names of any input variables.
// The input variables don't need type, as those are automatic. Also, they don't need to
/// be assigned at all on execute and can be left blank
func ExampleFunction(inputA, inputB)
{
    Printl("In A is: " + inputA)
    Printl("In B is: " + inputB)
    
    // Return a value to the valling location
    return 4
}

func GlobalFunction()
{
    // Create variables that can be accessed from anywhere (ex. in Main or ExampleFunction) with the 'global' keyword before type
    global int x = 12
    global string y = "Y String"
}

Here is how to use graphics:

func Main()
{
    int screenWidth = 500
    int screenHeight = 500
    ZS.Graphics.Init("Title of window", screenWidth, screenHeight)
    // After graphics are initialized, the main function will not finish.
    // Instead, Start() will be called a single time, then Update() every frame after that.
}

// Runs once at start of graphics initialization
func Start()
{
    // Vec2 are initialized using function 'NVec2(x, y)'
    Vec2 position = NVec2(250, 250)
    Vec2 scale = NVec2(20, 20)
    float rotation = 0

    // Sprite object, stores (and loads from file) the texture, location, scale, and rotation
    global Sprite exampleSprite = ZS.Graphics.Sprite("./square.png", position, scale, rotation)
}

// Executes each frame
func Update(deltaTime)
{
    // Draws the image created in Start(). This is usually at the end of update.
    ZS.Graphics.Draw(exampleSprite)   
}

Currently, ZSharp is VERY strict with formatting, and can throw an error if you forget to put a space somewhere. Also, speaking of errors, if your code has any it will show in the console. Errors are colored red, and warnings are colored yellow. A line number will also usually be provided. This is Not the line relative to the documents beginning, but rather the functions beginning. Example:

ERROR: line 5 in function Main

This is the 5th line inside of Main.

func Main()
{
   // line 1
   // line 2
   // line 3
   // line 4
   int g = "s"
   // ^ above line is the error, since it is line 5
}

I am planning to change how error reporting works to report the document line number as well, but this is how it is for now.

Versions
2.1.3-alpha
Website
License