черновик:

Panacea Recipe or How To Build Contests Communism

Правка en2, от ruslanjan, 2019-12-10 11:31:38

Current languages like C++, Java or Python were made not for contests and certainly not for precise time and memory evaluation. Besides 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), etc.

What's the problem?

It not so easy to create problems where not a single language gets an advantage (Though It rarely happens cause C++ is taken for the standard). Made a problem on long numbers? then Python and Java get an easier time. Or made a problem where careful realization needed? Then java gets fewer 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 an 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 suffer

Besides jury testing system developers also struggles. Running alien code on your 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 parts 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 workers, system, or even gain access to a solution. It is a hard task to solve, and by the end, It is participants who pay the price or slow and maybe buggy testing system.

You won't 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 the next chapter "Panacea recipe". To be precise C++ coders won't 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. Если это будет интересной идеи то разработаю более подробный план и приступлю к реализации.

Теги c++, java, competitive programming, testing

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en2 Английский ruslanjan 2019-12-10 11:31:38 57
en1 Английский ruslanjan 2019-12-10 11:27:48 6499 Initial revision for English translation (saved to drafts)
ru5 Русский ruslanjan 2019-12-10 10:50:00 2 Мелкая правка: 'имаются.\nP.S.S. Е' -> 'имаются.\n\nP.S.S. Е'
ru4 Русский ruslanjan 2019-12-10 10:13:43 1 Мелкая правка: ' использую в соревно' -> ' используют в соревно'
ru3 Русский ruslanjan 2019-12-10 07:55:01 149
ru2 Русский ruslanjan 2019-12-10 06:14:04 3 Мелкая правка: 'лимпиад и не уж точно ' -> 'лимпиад и уж точно '
ru1 Русский ruslanjan 2019-12-10 06:13:39 6266 Первая редакция (опубликовано)