Я думал о создании собственного языка (практичность: это мысленный эксперимент).Одна из идей, которые мне пришли, - это семантическая вариация на языке.Вы бы написали по существу семантические регулярные выражения, которые должны быть заменены эквивалентным кодом.Вы можете увидеть это в несколько менее прямой форме в D - у них есть строковые миксины, которые преобразуются в код D.За исключением того, что я собирался делать их неявно и более круговым способом.
Прямо сейчас я происходил из C ++.Так что если вы считаете:
string a, b, c, d;
// do stuff
a = b + c + d;
Этот код приводит к различным временным изменениям.Даже если у вас есть ссылки на rvalue, вы создадите временные ссылки, они просто будут использоваться более эффективно.Но они все еще существуют и все еще бесполезны.В самом простом случае я думал о том, как их можно устранить.Вы могли бы написать семантическое регулярное выражение, которое преобразовало бы его в наиболее оптимизированную форму.
string a, b, c, d;
// do stuff
a.resize(b.size() + c.size() + d.size());
a = b; a += c; a += d;
Если бы я реализовал std :: string, я мог бы написать что-то еще быстрее.Ключом к этому является то, что они неявные - когда вы используете класс std :: string, аксиомы, написанные реализатором std :: string, могут влиять на любой код std :: string.Вы можете просто вставить его в существующую кодовую базу C ++, перекомпилировать и получить самую быструю конкатенацию строк, которую ваш разработчик std :: string может представить бесплатно.
В настоящее время возможности оптимизации, которые вы можете сделать, ограниченыпотому что у вас есть только столько контекста, сколько позволяет язык, в этом случае перегрузка операторов в C ++ принимает только два аргумента: this и arg.Но семантический регистр ex может взять практически весь контекст, который вам когда-либо понадобится - поскольку вы можете диктовать, что ему соответствует - и даже соответствовать языковым функциям, которых нет в языке хоста.Например, было бы тривиально обменять
string a;
a.size;
на
string a;
a.size();
, если вы хотите украсть свойства C #.Вы можете сопоставить определения классов и реализовать отражение во время компиляции или выполнения и т. Д.
Но, я имею в виду, это может привести к путанице.Если была ошибка, или то, что действительно было сделано за кулисами, не отражало код, который был написан, это могла быть полная сука, чтобы отследить, и я не думал, как это будет реализовано подробно.Что вы, ребята, думаете о моей предложенной языковой функции?
О, чувак, выбирая правильные теги.Ммм ....
Редактировать: Я также хотел нарушить пределы ограничений, что касается одного ответа, который я получил.Простой факт заключается в том, что семантическое регулярное выражение не имеет ограничений (за исключением деталей реализации, которые, возможно, придется добавить).Например, вы можете превратить выражение
int i;
cin >> i;
int lols[i];
в
int i;
cin >> i;
std::variable_array<int>(alloca(sizeof(int) * i), i);
Семантика alloca делает невозможным манипулирование с шаблонами - вы должны написать макрос, если вы хотите выше.В C ++ 03 или C ++ 0x вы не можете инкапсулировать свои собственные VLA.
Кроме того, семантические регулярные выражения могут соответствовать коду, который фактически не вызывает никакой работы во время компиляции.Например, вы можете сопоставить каждый член определения класса и использовать его для создания системы отражения.На сегодняшний день это также невозможно в C ++.