Current languages like C++
, Java
or Python
where made not for contests and certainly not for precise time and memory evaluation. Beside the fact that these languages are different (speed, presence or absence of memory management), they also carry lots of features that are not necessary for competitive programming, For instance import of libraries (C++, Python, Java), packages (Java with its package org.thing
) and etc.
Whats the problem?
It not so easy to create problems where not a single language gets advantage (Though It rarely happens cause C++ is taken for standard). Made a problem on long numbers? then Python and Java get easier time. Or made a problem where careful realization needed? Then java gets less errors. There are lots of cases like this. You would say language is a tool and you have to pick a right for specific problem but you can't switch programming languages like regular tools a at least not in competitive programming, because many people learned their templates for algorithms and optimizations which can not be transferred between programming languages (like cin.tie(NULL)
in C++ or custom reader class in Java).
Not only participants suffers
Beside jury testing system developers also struggles. Running alien code on your own machine a serious treat if language not built with that in mind like Javascript, not only you should run code safe but also count time and memory precisely. A separate post can be written in about vulnerabilities in testing systems О, here is a list of part of them: Infinite compilation (int C++, Yes it exists), Creating new Threads, Creating new subprocesses, Gain access to ethernet, Access to files, Memory abuse. Every single one can crash worker, system, or even gain access to solution. It is a terribly hard task to solve, and by the end It is participants who pays the price or slow and maybe buggy testing system.
You wont use these languages
You could say that these languages are used in production but not in a way competitive programming does. For instance in C++ nobody cares about freeing memory. Therefore language should be learned again.
Everyone use C++ what the difference?
If you use C++ then go and read next chapter "Panacea recipe". To be precise C++ coders wont notice a thing.
Panacea recipe
Панацея — Новый язык, специально разработанный для соревнование который будет включать возможности многих языков. Вот вам его код решения возведения в степень.
Основная идея
// Вообще STRONG_TYPING включен по умолчанию
#enable STRONG_TYPING
#define ll int
int bp(int a, int b) {
if (!b)
return 1;
if (b&1)
return a;
int x = bp(a, b/2);
return x*x;
}
int p, q;
scanf("%d %d", &p, &q);
printf("%d", bp(p, q));
Кажется знакомым? Синтаксис будет взят у C++ и Java (Питонщики не расстраивайтесь :3 ). Ключевой идей будет #enable
этот препроцессор будет задавать какой режим или функция будут использоваться программой к примеру будет ли она строго типизированная или динамическая. По сути собирая набор #enable
вы получаете свой язык для решения конкретной задачи.
Список режимов и доступных(Будет дорабатываться):
#enable FUCNTIONAL_PROGRAMMING
— Функции становятся не мутабельны т.е. нельзя изменить передаваемую переменную. Некоторые встроеные функции становятся не доступными (их заменяют другие) Когда нужно писать аккуратно.#enable DYNAMIC_TYPING
— нельзя влючать одновременно с STRONG_TYPING.#enable STRONG_TYPING
— включен по умолчанию.#enable NO_TYPE_CONVERSION
— не будет приведение типов —1.0 + int(2)
-> error. Когда нужно писать очень аккуратно#define
так же доступен
Пример с динамической типизацией:
#enable DYNAMIC_TYPING
// в DYNAMIC_TYPING можно указать тип если вы к примеру перешли с из STRONG_TYPING в DYNAMIC_TYPING
def bp(a, int b) { // def нужен что бы указать что это функция но (int bp()) тоже правильно
if (!b)
return 1;
if (b&1)
return a;
let x = bp(a, b/2); // let - объявление переменной
return x*x;
}
let p, q;
p = int(readItem()) // Функция считывает до пробела или переноса и возвращает `String`
q = int(readItem())
print(bp(p, q));
Как оценивать? Он же будет медленным
Да возможно будет но мы больше не будет оценивать время, теперь мы будем оценивать количество инструкций т.к. наш язык будет работать на виртуальной машине. А об этом подробнее в Структуре языка
Структура языка Кратко
- Нету компиляции только проверка типов
- объекты и примитивы
- возможность создавать свои структуры через
struct Type {}
- встроеные api функции для io
- встроенная библиотека std с реализованными алгоритмами как в c++ написанная на этом же языке
- Управление памятью как C++. Режимы и дополнительные функции например динамической типизации доступные через препроцессор
#enable THING
- Имеет все возможности C++, Java, Python используемые в соревнованиях.
- Возможность писать богатые чекеры, интеракторы а также дополнительные функции для конкретной задачи
- У каждой операцией над примитивами будет свой вес а их сумма количество инструкций. например
int + int
имеет вес 1 аint/int
имеет вес 2.
Преимущества
- На много безопаснее для системы чем C++. можно сказать что полностью но багов никто не отменял
- Система будет намного быстрее без проверок безопасности и компиляции.
- Возможность соревноваться по количеству инструкций а так же ставить балы по ним. Как в игре "TIS-100"
- Возможность писать богатые чекеры, интеракторы а также дополнительные функции для конкретной задачи. Это сделает задачи более интересными и даст больше свободы авторам задач
- Использовать лучшее от всех языков.
- Сразу понятен тем кто пишет на java или c++.
- С++ код будет почти валидным.
- Решения не будет страдать от
Wall Time Limit
- В количество инструкций будет входить только ваше решение, IO не будет учитываться как многие другие вещи вне вашем контроле в других языках.
Итог
Возможно отдельный язык покажется лишним но для проверяющих систем это будет больший прыжком в качестве тестирования.
P.S. Это черновик нового языка. Идеи предложения принимаются.
P.S.S. Если это будет интересной идеи то разработаю более подробный план и приступлю к реализации.