C42 - это язык программирования, который представляет собой эзотерическую разновидность ассемблера, где программы конструируются исключительно из ограниченного набора команд, состоящего из 42 инструкций, пронумерованных от 01 до 42.
В языке определены три варианта использования команд (у каждой команды свой вариант написания):
COMMAND ARGCOMMAND ARG1 ARG2COMMAND
В языке C42 переменные - это ячейки (подобные регистрам), каждая из которых способна хранить только один из определенных типов данных:
INTSTRINGFLOAT
Для создания ячейки используется команда 41. Пример:
41 -1 0
Первый аргумент — имя переменной (только отрицательное число, начиная с -1).
Второй аргумент — тип данных, которое оно сможет хранить:
0- INT1- STRING2- FLOAT
Код на C42 может быть структурирован в блоки, аналогичные функциям в других языках программирования. Блоки могут иметь любые идентификаторы.
#1 <имя>— ключевое слово объявления блока. После#1указывается имя блока.#0— завершение блока.
Блок с идентификатором main является точкой входа программы, где размещается основной исполняемый код.
Программа для вывода любимой фразы программистов:
#1 main $ Создаем блок с идентификатором main (точка входа)
41 -1 1 $ Создание ячейки -1 с типом STRING
04 -1 "Hello, World!" $ Записываем в ячейку нашу фразу
02 -1 $ Выводим ячейку в консоль
#0 $ Завершаем блок
Этот пример иллюстрирует основные элементы синтаксиса и функциональность языка.
| Код | Синтаксис | Описание |
|---|---|---|
| 01 | 01 | Завершает выполнение программы. |
| 02 | 02 CELL | Выводит значение указанной ячейки в консоль. |
| 03 | 03 CELL | Записывает данные, введенные пользователем, в указанную ячейку. |
| 04 | 04 CELL VALUE | Присваивает указанной ячейке конкретное значение. |
| 05 | 05 CELL1 CELL2 | Суммирует значения двух указанных ячеек и записывает результат в первую ячейку. |
| 06 | 06 CELL1 CELL2 | Вычитает значение второй ячейки из первой и записывает результат в первую ячейку. |
| 07 | 07 CELL1 CELL2 | Умножает значения двух указанных ячеек и записывает результат в первую ячейку. |
| 08 | 08 CELL1 CELL2 | Делит значение первой ячейки на значение второй и записывает результат в первую ячейку. |
| 09 | 09 CELL | Увеличивает значение указанной ячейки на 1 (только для чисел типа int/float). |
| 10 | 10 CELL | Уменьшает значение указанной ячейки на 1 (только для чисел типа int/float). |
| 11 | 11 CELL1 CELL2 | Записывает в первую ячейку остаток от деления значения первой ячейки на значение второй. |
| 12 | 12 | Очищает консоль. |
| 13 | 13 CELL1 CELL2 | Выполняет следующую команду, если значения двух указанных ячеек равны. |
| 14 | 14 CELL1 CELL2 | Выполняет следующую команду, если значения двух указанных ячеек не равны. |
| 15 | 15 CELL1 CELL2 | Выполняет следующую команду, если значение первой ячейки больше значения второй. |
| 16 | 16 CELL1 CELL2 | Выполняет следующую команду, если значение первой ячейки меньше значения второй. |
| 17 | 17 CELL1 CELL2 | Выполняет следующую команду, если значение первой ячейки больше или равно значению второй. |
| 18 | 18 CELL1 CELL2 | Выполняет следующую команду, если значение первой ячейки меньше или равно значению второй. |
| 19 | 19 CELL | Переводит значение указанной ячейки в верхний регистр (если это строка). |
| 20 | 20 CELL | Переводит значение указанной ячейки в нижний регистр (если это строка). |
| 21 | 21 CELL1 CELL2 | Возвращает длину строки во второй ячейке и записывает результат в первую ячейку. |
| 22 | 22 CELL | Инвертирует значение указанной ячейки. |
| 23 | 23 CELL | Вызывает блок с идентификатором, указанным в ячейке. |
| 24 | 24 CELL VALUE | Увеличивает значение указанной ячейки на константное число или добавляет строку. |
| 25 | 25 CELL1 CELL2 | Обменивает значения между двумя указанными ячейками. |
| 26 | 26 CELL1 CELL2 | Копирует значение из второй ячейки в первую. |
| 27 | 27 CELL1 CELL2 | Удаляет в первой ячейке символ по индексу, указанному во второй ячейке. |
| 28 | 28 CELL1 CELL2 | Сохраняет в первую ячейку преобразованное число из строки во второй ячейке. |
| 29 | 29 CELL1 CELL2 | Сохраняет в первую ячейку преобразованную строку из числа во второй ячейке. |
| 30 | 30 CELL1 CELL2 | Выполняет битовую операцию И и сохраняет результат в первую ячейку (только для int). |
| 31 | 31 CELL1 CELL2 | Выполняет битовую операцию ИЛИ и сохраняет результат в первую ячейку (только для int). |
| 32 | 32 CELL1 CELL2 | Выполняет битовую операцию исключающего ИЛИ и сохраняет результат в первую ячейку (только для int). |
| 33 | 33 CELL | Выполняет битовую операцию НЕ и сохраняет результат в указанную ячейку (только для int). |
| 34 | 34 CELL | Останавливает выполнение программы на время, указанное в ячейке. |
| 35 | 35 CELL | Начинает цикл, код которого будет блок, указанный в ячейке. |
| 36 | 36 CELL1 CELL2 | Выбирает случайный символ из CELL2 и сохраняет его в CELL1. |
| 37 | 37 CELL1 CELL2 | Ищет максимальное значение из двух указанных ячеек и сохраняет его в первую ячейку. |
| 38 | 38 CELL1 CELL2 | Ищет минимальное значение из двух указанных ячеек и сохраняет его в первую ячейку. |
| 39 | 39 CELL1 CELL2 | Вычисляет НОД двух чисел и сохраняет результат в первую ячейку. |
| 40 | 40 CELL1 CELL2 | Вычисляет НОК двух чисел и сохраняет результат в первую ячейку. |
| 41 | 41 NAME DATATYPE | Создание новой ячейки. |
| 42 | 42 | Принудительное завершение блока или цикла. |