.. index:: 
	single: Introduction; Introduction

============
Introduction
============

.. image:: thering.jpg
	:alt: The Ring Programming Language

Welcome to the Ring programming language!

The Ring is an Innovative and practical general-purpose multi-paradigm language
that can be embedded in C/C++ projects, extended using C/C++ code and/or used as standalone language.
The supported programming paradigms are Imperative, Procedural, Object-Oriented, Functional,
Meta programming, Declarative programming using nested structures, and Natural programming.
The language is portable (Windows, Linux, Mac OS X, Android, etc.) and can be used to create
Console, GUI, Web, Games and Mobile applications. The language is designed to be Simple, Small,
Flexible and Fast. Its Dynamic Language (Dynamic Typing and Weakly Typed) that compile the source
code to byte code then execute it by the Ring Virtual Machine, which is integrated with the Ring
Compiler in one program.

In this chapter we are going to discuss the goals behind the language design and implementation.

.. index:: 
	pair: Introduction; Motivation

Motivation
==========

In Nov. 2011, I started to think about creating a new version of the 
`Programming Without Coding Technology (PWCT) <http://doublesvsoop.sf.net/>`_ software from scratch.

I was interested in creating multi-platform edition of the software beside adding support for
Web & Mobile development.
Most of the PWCT source code was written in VFP and the software comes with a simple scripting language for creating the components called (RPWI). 
The software contains components that support code generation in programming languages 
like Harbour, C, Supernova & Python.

What I was looking for is a programming language that can be used to build the development 
environment, provides multi-platform support, more productivity, better performance, can be used for components 
scripting & can be used for developing different kinds of applications.

Instead of using a mix of programming languages, I decided to use one programming language 
for creating the development environment, for components scripting & for creating the applications.

I looked at many programming languages like C, C++, Java, C#, Lua, PHP, Python & Ruby. 
I avoided using C or C++ directly because I want high-level of productivity more than the level
provided by these languages, also a language behind visual programming environment for novice programmers
or professionals must be easy to use & productive.

Java & C# are avoided for some reason too!
I wanted to use a dynamic programming language and these languages are static typing, Java is multi-platform, 
also C# through Mono, but the use of huge number of classes and forcing the use of Object-Orientation, using
a verbose language is not right for me. I need a small language, but fast and productive, also I need
better control on the Garbage Collector (GC), I need a better one that is designed for fast applications.

Lua is small and fast, but it's avoided because I need more powerful language for large applications.

PHP is a Web programming language and it's syntax is very similar to C, this leads to a language not
general as I want and not simple as I need to have.

Python & Ruby are more like what I need, but I need something more simple, smaller, faster & productive.

Python and Ruby are Case-Sensitive, the list index start counting from 0, you have to define the function
before calling it, Ruby usage of Object-Orientation and message passing is more than what I need and 
decrease performance, Python syntax (indentation, using self, :, pass & _) is not good for my goals.

All of these languages are successful languages, and very good for their domains, but what I need 
is a different language that comes with new ideas and intelligent implementation (Innovative, Ready, Simple, Small, Flexible and Fast).

.. index:: 
	pair: Introduction ; History

History
=======

In Sept. 2013 I started the design and the implementation of the Ring programming language.
After 21 months of development, In May 2015 the language Compiler & Virtual Machine were ready for use!

After that I spent three months testing the language again, trying to discover any bug to fix, writing better tests,
by the end of August 2015, all know bugs were fixed, Writing many tests and testing automation helped a lot in 
getting a stable product.

In September 12, 2015, most of the documentation was written. Before releasing the language I started the marketing by
writing a post in Arabic language about it to my facebook profile page asking for contributors interested in the language 
idea after reading a short description, In the same day I got a lot of emails from developers and friends interested to contribute!

The first version of the language Ring 1.0 is released on January 25, 2016

The second version of the language Ring 1.1 is released on October 6, 2016

The current version of the language Ring 1.2 is released on January 25, 2017

.. index:: 
	pair: Introduction; Features

Features
========

The Ring language comes with the next features

.. tip:: The language is ready for production!

* Free Open Source (MIT License)
* Hybrid Implementation (Compiler + Virtual Machine) 
* Declarative programming on the top of Object-Oriented programming
* Natural Language programming on the top of Object-Oriented programming
* Syntax Flexibility (You can change the language keywords and operators)
* Compact Syntax, No explicit end for statements (No ; or ENTER is required)
* Using braces { } we can access objects and use attributes/methods as variables/functions
* Transparent Implementation 
* Visual Implementation - Developed using Visual Programming (PWCT) 
* A small language (Around 200,000 lines of code) 
	* The compiler + The Virtual Machine are 15,000 lines of C code
	* The other 185,000 lines of code are related to libraries!
* Writen in ANSI C (The code is generated)
* Optional Printing for Tokens/Grammar/Byte-Code during execution
* Portable (Windows, Linux & Mac OS X)
* Comments (One line & Multi-lines)
* Not Case-Sensitive
* Dynamic Typing
* Weakly typed 
* Lexical Scoping (Global, Local & Object State)
* Default scope for variables inside functions (Local)
* Default scope for variables outside functions (global)
* Garbage Collector - Automatic Memory Management (Escape Analysis and Reference Counting)
* Structure Programming
* Rich control structures & Operators
* For in get item by reference not value, you can read/edit the item
* Use exit to go outside from more than one loop 
* Procedures/Functions
* Main Function (optional)
* Call Function before the definition
* Recursion
* Multi-line literals
* Access (read/write) string letter by index
* The list index start by 1
* No keyword to end Functions/Classes/Packages
* Range operator ex: 1:10 and "a":"z"
* First Class Variables, Lists, Objects and Functions
* Store/Copy Lists/Objects by value (Deep Copy)
* Pass Lists/Objects by reference
* Native Object-Oriented Support

	* Encapsulation
	* Setter/Getter (optional)
	* private state (optional)
	* Instantiation
	* Polymorphism 
	* Composition 
	* Inheritance (Single Inheritance)
	* Operator Overloading
	* Packages

* Reflection and Meta-programming
* Clear program structure (Statements then functions then packages & classes)
* Exception Handling
* Eval() to execute code during run-time
* 8-bit clean, work on binary data directly
* I/O commands
* Math functions
* String functions
* List functions
* File processing functions
* Database support (ODBC, SQLite & MySQL)
* Security Functions (OpenSSL)
* Internet Functions (LibCurl)
* CGI Library (Written in Ring)

	* HTTP Get
	* HTTP Post
	* File upload
	* Cookies
	* URL Encode
	* HTML Templates
	* HTML Special Characters
	* HTML Generation using Functions
	* HTML Generation using Classes
	* CRUD Example (using MVC)
	* Users Example (Register, Login and Check)

* Extension using C/C++ (Simple API)
* Embedding the language in C/C++ programs
* Comes with code generator (Written in Ring) to quickly wrap C/C++ Libraries
	* Used to Support Allegro by creating RingAllegro
	* Used to Support LibSDL by creating RingLibSDL
	* Used to Support Qt by creating RingQt
* Create 2D Games for Desktop and Mobile (Using the Allegro Library or the LibSDL Library)
* Comes with simple Game Engine for 2D Games
* Create GUI Applications for Desktop and Mobile (Using the Qt Framework)


License
=======

The Ring Programming Language

http://ring-lang.net/

Version 1.2

The MIT License (MIT)

Copyright (c) Mahmoud Fayed

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.