Skip to main content

UntypedScript original implementation compiler

Project description

UntypedScript

Project that branched off of the discontinued PogScript, with a considerably different JavaScript-like syntax. UntypedScript's goal is to become an easy-to-understand and easy-to-write language with speeds comparable to that of C or C++. Version 1.0.0 of the language will be published and available for download as soon as floats are introduced and error throwing is fixed (see the todo list). The todo list is not necessarily based on an order of priority, although many low-priority tasks are near the end of the list.

Boils down to assembly code. As per the name, includes no form of a type system - you are on your own! Type hints may be introduced in the future. Sample Hello World - (other programs can be found in tests/)

import puts from "<libc>"

const main = () => {
	puts("Hello World!")

	return 0
}

export { main }

Compile it with utsc -e helloworld.uts and run helloworld.exe, or just run utsc -r helloworld.uts! (You need NASM and MinGW installed - currently only tested on Windows)

Note that structs in this langauge are very limited - they cannot be nested (i.e. you cannot have a struct member whose type is a struct) or returned from functions unless their type is declared explicitly. For example, take the following code:

import { printf } from "<libc>"

struct Person
{
	name, age
}

struct Car
{
	owner
}

const get_person = () => {
	// WILL WORK
	const struct Person person = ["Joe", 23]

	return person

	// WILL ALSO WORK (produces same effect as the above code, since types don't actually exist and the structs are just syntax sugar for arrays)
	return ["Joe", 23]

	// WILL NOT WORK
	return (struct Person ["Joe", 23])
}

const main = () => {
	// WILL NOT WORK
	printf(get_person().name)

	// WILL WORK
	const struct Person person = get_person()
	printf(person.name)


// -----------------------------------------

	const struct Car mycar = [person]

	// WILL NOT WORK
	printf(mycar.owner.name)

	// WILL WORK
	const struct Person car_owner = mycar.owner

	printf(car_owner.name)
}

export { main }

In this manner, many operations with structs require implicit casts and to some extent wastage of memory. Dynamic objects do not need these implicit casts, but are much slower than structs and will also take up more memory than them (even with struct implicit casting), so structs are still recommended for objects that are not created arbitrarily at runtime.

Structs vs. Objects

At the moment (although the test conducted is very small), there seems to be a neglibile performance difference while using structs versus using objects. They average out at 25.14575ms for structs and 25.843025ms for objects. However, it is important to note that the struct average would be about one millisecond lower if there was no outlier.

Chart of Struct vs. Object Performance

Next on the list to do:

  • Test on Linux system
  • Import and insert AST expressions
  • Different types of functions
    • Inline functions (ideas/optimization/funcs)
    • Pure functions (ideas/optimization/funcs)
    • Stack-allocated functions -> this will probably not become a feature, the idea was replaced with the localonly function feature
  • Error throwing that actually shows the correct line
  • Solve recursion errors in parser
  • Remove weird parser bugs that result in a lot of errors (ongoing, constant task)
  • Floats
    • Literals
    • Arithmetic (maybe thru functions because the language is untyped)
  • Optimizations
    • Add asm optimizations (in progress, constant task)
    • Type hinting for optimization
    • Other optimizations from compiler collected info, type inferencing, and predefined knowledge of libc functions
    • Compiler speed optimizations
  • Language information (constantly in progress)
    • Language Specification/Standard
    • Docs
  • Elif Blocks (not else-ifs)
  • For loops
  • 64-bit programs and types
  • Hoist global-level funcs
  • Inline asm
  • Try-catch blocks
  • Allow for stdcall functions
  • Expand async library
  • Add stackalloc (int) and stackalloc[int]
  • DLL integration
    • Imports
    • Exports
    • Fix DLL Compilation
  • Dynamic Objects
    • Object integration with C structs
    • Object destructuring
  • May integrate a sort of lightweight runtime in the future (for a try-catch framework, etc.) that itself runs on the C runtime
    • If this is added there will be an option to compile with the UTS runtime and an option to compile without the runtime (both executables will be standalone (as long as the C runtime exists), the UTS runtime will be automatically linked into the output)
  • VSCode extension

Notes

  • For the moment, \uXXXX and \XXXX escape codes are not permitted, and may continue to not be permitted in the future (this feature may never be added)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

untypedscript-utsc-1.0.0.tar.gz (32.2 kB view details)

Uploaded Source

Built Distribution

untypedscript_utsc-1.0.0-py3-none-any.whl (37.9 kB view details)

Uploaded Python 3

File details

Details for the file untypedscript-utsc-1.0.0.tar.gz.

File metadata

  • Download URL: untypedscript-utsc-1.0.0.tar.gz
  • Upload date:
  • Size: 32.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.7

File hashes

Hashes for untypedscript-utsc-1.0.0.tar.gz
Algorithm Hash digest
SHA256 9279999c310419ffe9ac5dd043d95772122d1eb11194fe1a87ae354e3f0d54fa
MD5 9f2c7c020357a51ca76e716e7b07e732
BLAKE2b-256 9d5ae90b5cc21a27074fff8400f412022b5506ac388b77c7abb0aa807c6d4fff

See more details on using hashes here.

File details

Details for the file untypedscript_utsc-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for untypedscript_utsc-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f612d17706a1c957b15a5d00b555e617a31296ac737451d8cc0f4d8c202c9302
MD5 dd0c48600273a74d9cf9532f40720410
BLAKE2b-256 79058e2713466db683c6f22a3d5189b2dc79c9b28657688baefb97e7196e105f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page