Мова програмування Сtag. Вступ

Вперше я познайомився з програмуванням в 6 класі… Тоді це був старовинний компілятор borland pascal, який міг запускатися тільки з допомогою емулювання MS-DOS. З тих пір пройшло 6 років… Маленький хлопчик виріс і став писати більш читабельний код, а доля привела його в один з кращих технічних вузів країни. Але ті 6 років не пройшли даром. Протягом них накопичувався величезний пласт суперечностей, які змушували його шукати все більш і більш досконалий мову… Так з'явився на світ Ctag — продукт переосмислення досягнень людства.

Скажу відразу, що досвіду роботи над великими серйозними проектами у мене поки немає, та й знань може бути не так багато, так що буду радий будь-яким цінним коментарям з вашого боку. Також мова перебуває поки в стадії зовсім ранньої альфи (повністю без компілятора), і тому він може не раз змінитися, і, якщо знайдуться ентузіасти, то буду вдячний будь-якої сторонньої допомоги.

Давайте подумаємо, що обов'язково потрібно сучасній мові програмування. Для відповіді на це питання не потрібно далеко ходити. Досить подивитися на найпопулярніші і швидко набирають популярність мови програмування. Я б виділив наступну четвірку (на підставі цієї і цієї статей):

  1. С/C++
  2. Java і C#
  3. Python
  4. JavaScript
Тепер розберемо докладніше кожен з мов.

Мови С/C++ були розроблені ще в доісторичні часи (1970-80 роки), але і сьогодні їх продовжують використовувати для реалізації високо продуктивних систем, тому що їх код легко компілюється в код асемблера без істотної втрати продуктивності. Java та С# є дуже стійкими мовами по відношенню до оточуючих їх середовищ. Python радує своєю простотою та зручністю при написанні коду (хоча, чесно сказати, це мій самий нелюбимий мова програмування). Ну і нарешті, JavaScript дуже зручний мова для реалізації роботи в браузері (хоча робота з canvas марока ще та...)).

На підставі вищесказаного, можна виділити основні вимоги, які хотілося б пред'явити до мови:

  1. Швидкодія
  2. Відмовостійкість
  3. Зручність
  4. Простота освоєння базового
  5. Кросплатформеність
Також ще бажано:

  • ООП
  • Функціональне програмування
  • Єдність роботи в різних середовищах (браузер, ПК, мобільний додаток)
  • Збереження працездатності коду для більш нових версій мови
Що ж, приступаємо до розробки.

Перше, з чого хочеться почати розповідь, — це кросплатформеність. Напевно не для кого не секрет, що Java і JavaScript компілюються в байт-код, а проміжною стадією роботи компілятора/інтерпретатора для інших мов є асемблер. У будь-якому випадку, якщо ви намагаєтеся зробити багатоплатформовий мову, то у нього повинна бути стадія компіляції, код якої максимально наближений до машинної мови, але при цьому зберігає свою одноманітність для різних платформ. Залишається тільки вибрати між ассемблером і машинним байт кодом. Думаю, що тут буде пріоритетнішим вибрати мову асемблера синтаксису AT&T(див. эту статтю) для подальшого зручності. Але і його ми трохи відредагуємо також під однорідний стиль, отримавши таким чином мова у якого стилістика команд буде приблизно такий:

(знакова/беззнаковая) ; команда ; (використовуються прапори) ; розмірність операндів ; операнд 1; операнд 2; ...

Коментар: крапки з комами розставлені для зручності читання, дужки позначають необов'язковість параметра для деяких команд. Про нього я розповім докладніше в наступних статтях, а поки повернемося до Ctag.

Глава 1. Привіт Світ.
Синтаксис нашої мови не буде надто відрізнятися від звичного, але мова буде не повністю компилируемым (якщо можливо, то отримуємо асемблерний код, інакше компілюємо порядково (інтерпретуємо)...). Це пов'язано з тим, що змушувати мова бути повністю компилируемым — значить позбавити його елегантного коду в області пов'язаної, наприклад, з метапрограммированием.

Отже, напишемо типову першу програму:

#import print from stdio
function main() -> int(4){
print("hello world");
return 0;
}

Дивна суміш, яку я поки відмовлюся коментувати. Прийміть на віру).

Розділ 2. Змінні.
Тут настає час нових одкровень. Справа в тому, що Сtag за прикладом З# є мовою подвійний типізації, тобто дозволяє як статичні змінні, так і динамічні. Всього в мові існує понад 10 базових типів:

1) nil
2) int
3) double
4) register
5) char
6) string
7) function
8) code
9) operator
10) statment
11) bool
11) object

А також ще кілька стандартних типів, як array, set, map,… підключаються через бібліотеки. Тепер докладніше про кожен тип:

1) nil або пустий тип. За замовчуванням присвоюється будь змінної при оголошенні. Також може бути повернуть будь функцією як ознака помилки.

int a; print(a) //nil
function f() -> int(4) {return nil;} //не помилка

2) int. Стандартний тип для роботи з цілими числами. Існує дві форми оголошення:

  • Статична з параметром — розмір.
  • Динамічна.
Якщо у якості параметра статичного оголошення стоїть невелике число(<=8), «клас» замінюється більш дешевим у плані операцій еквівалентом. (ви не можете визначити змінну розміру <8 не є ступенем 2).

int(4) a; //equal to int in C++
int(128) b; //static int type
int c; //dynamic type int

4) register. Спеціальний тип призначений для змінних з великою кількістю звернень. Якщо в якості імені змінної буде вказано справжнє ім'я одного з регістрів, то компілятор спробує виділити вам його. В іншому випадку компілятор спробує знайти місце найбільш близьке по швидкості до регістрової пам'яті (регістр або кеш 1 рівня). Має один параметр визначає розмір регістра. За замовчуванням вибирається найбільша доступне значення.

register a; //give me some register
register ax; //give me ax
register bx; //give me rbx

5) char. Тип для зберігання символу. Має один параметр типу рядок, який визначає кодування символу ASCII = 1 байт, utf-16 = 2 байти, utf-32 = 4, utf-8 = 4 завжди, для зручності індексації). За замовчуванням вибирається utf-8.

char c; //the same to char(utf-8) c; sizeof© = 4!!!!
char(ASCII) ch;

6) string. Базовий тип, похідний від char. Має два параметри. Перший — кодування. Другий — розмір. Обидва параметри необов'язкові. Якщо не вказано другий, то рядок вважається динамічної.

string s1; //charset = utf-8; dynamic string
string(ASCII) s2; //dynamic string of ASCII characters
string(ASCII, 80) buf; //standart C string

7) function. Базовий тип для завдання функцій. Існують два об'єкти даного типу: сира функція і скомпільована. Всі використовувані в програмі функції отримують цей тип. Без спеціальних подій не є компилируемым об'єктом.

function hello;
hello.code = {print("hello world");}
hello.lock() //we can't do anything with this function in future
hello.compile() //compile function(can't make this without lock) 
hello.run() //it runs faster than without lock

8) code. Базовий тип реалізує сирої код. Є некомпилируемым об'єктом, якщо оголошений без специфікатора const. Сенс це типу буде показано надалі.

code a = {print(x);} //could not compile
const code b = {print(x);} //could compile
fuction print_var(int x) -> nil {b;}

9) operator. Базовий тип здатний підміняти різні оператори. Навколо оператора обов'язкові пробільні символи.

operator op = "<";
if (a op b) ...

10) statment або вираз. Базовий тип покликаний приховувати обчислення виразу. Вхідні дані — будь-які змінні. Вихідний тип bool.

statment s = (a < b);
int a =10;
int b = 15;
if (s) ...

11) object. Тип призначений для динамічної типізації. Має інший спосіб оголошення — ключове слово var.

#import readint from stdio
#import print from stdio
function main() -> int(4){
var a, b;
a = readint();
b = readint();
print(a + b);
}

Ключові слова і змінні

За допомогою декількох ключових слів можна змінювати видимість змінних. Їх всього 3:

  1. global
  2. local
  3. const
1) Ключове слово global використовується для розширення області видимості змінної. Якщо змінна оголошується всередині функції, то робить її глобальної змінної. Поза коду функцій робить змінну повністю глобальної.

2) Ключове слово local використовується для звуження області видимості змінної. Якщо змінна оголошується всередині функції, то не стягує впливу. Застосоване до зовнішніх змінних, звужує область видимості до поточного файлу.

Тепер я хотів би закінчити цю статтю. Продовження слідує…
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.