Хочется странного
Oct. 9th, 2008 08:27 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Есть кроссплатформенные языки типа Java. Но они все как назло - интерпретаторы.
Есть кроссплатформенные библиотеки к компиляторам. Но они все как назло - не стандарт языка.
А хочется странного. Хочется, чтобы многие вещи стали стандартом для компилируемого языка. Хочется языка типа C++, но с кое-какими изменениями. Могу я ведь помечтать, а? :)
Я напишу только один пункт моих "мечт".
1. Хочу, чтобы были стандартные средства работы с thread-ами - мутексы, треды, сигналы... Причем, даже не в форме библиотек, а в форме ключевых слов, дополнительных конструкций языка.
Например:
int a, b, c;
mutex x for a, b;
- чтобы компилятор завел мутекс x и использовал его сам, автоматически при обращениях к переменным a, b. Чтобы компилятор сам оптимизировал это дело. Например вот для такой серии:
a++;
c = 4;
b-= 2;
- хороший компилятор должен "понять", что хотя переменная c и не требует защиты мутексом, но присвоение занимает мало времени, а потому весь фрагмент лучше обрамить одной парой x.lock ... x.unlock.
Далее, чтобы компилятор снял с программиста заботу о разблокировании мутексов при передаче управления (исключения, return и т.п.)
Треды тоже... каждая операционка кто во что горазд. Надо единую хрень, встроенную в йезыг. Как-то так:
void myfunc(int x, char *y)
{
...
}
- Это просто функция. Параметры произвольные.
А потом так:
thread t= myfunc(99, "Loading...");
или так:
thread myfunc(99, "Loading...");
- то есть, чтобы произвольную функцию можно было средствами самого языка вызвать в отдельном треде как тред. И передать треду параметры не через жопу, а просто как параметры функции. В первом варианте синтаксиса еще и вернуть идентификатор треда.
Опционально чтобы у типа thread был какой-то разумный набор операций (suspend/resume/kill...). Как минимум - сравнение тредов, узнавание id текущего треда (ключевое слово thread.this ), узнавание id треда, который создал этот тред (ключевое слово thread.parent ).
Ну и, наконец, к тредам добавить средства синхронизации и передачи данных между тредами. Что-нибудь вроде такого:
Пояснения. Надо, чтобы содержимое любой переменной можно было отослать в другой тред. Как только тот тред доходит до нужного места, он забирает "подарочек". Если подарка еще нет, тот тред ждет. Отсылающий тред ничего не ждет, содержимое переменной копируется в скрытый буфер. Если не хочется копировать много данных, то отсылаем указатель.
...
class MyData
{
int a;
char *c;
};
...
MyData b;
MyData result;
...
thread t = myfunc(99, "Loading...");
...
b.a= 1; //заполняем данные в "подарке"
b >> t; /*отсылаем "подарок", какие-то дополнительные данные, которые
на момент вызова myfunc еще не были готовы */
...
result << t; //забираем результаты исполнения треда, ждем если надо
void myfunc(int x, char *y)
{
...
MyData b;
MyData result;
...
//берем какие-то дополнительные параметры
b << thread.parent; /* thread.parent - ключевое слово, означает тред, который создал этот тред */
...
//отсылаем результаты
result >> thread.parent;
}
Помечтаем, а? :)
Есть кроссплатформенные библиотеки к компиляторам. Но они все как назло - не стандарт языка.
А хочется странного. Хочется, чтобы многие вещи стали стандартом для компилируемого языка. Хочется языка типа C++, но с кое-какими изменениями. Могу я ведь помечтать, а? :)
Я напишу только один пункт моих "мечт".
1. Хочу, чтобы были стандартные средства работы с thread-ами - мутексы, треды, сигналы... Причем, даже не в форме библиотек, а в форме ключевых слов, дополнительных конструкций языка.
Например:
int a, b, c;
mutex x for a, b;
- чтобы компилятор завел мутекс x и использовал его сам, автоматически при обращениях к переменным a, b. Чтобы компилятор сам оптимизировал это дело. Например вот для такой серии:
a++;
c = 4;
b-= 2;
- хороший компилятор должен "понять", что хотя переменная c и не требует защиты мутексом, но присвоение занимает мало времени, а потому весь фрагмент лучше обрамить одной парой x.lock ... x.unlock.
Далее, чтобы компилятор снял с программиста заботу о разблокировании мутексов при передаче управления (исключения, return и т.п.)
Треды тоже... каждая операционка кто во что горазд. Надо единую хрень, встроенную в йезыг. Как-то так:
void myfunc(int x, char *y)
{
...
}
- Это просто функция. Параметры произвольные.
А потом так:
thread t= myfunc(99, "Loading...");
или так:
thread myfunc(99, "Loading...");
- то есть, чтобы произвольную функцию можно было средствами самого языка вызвать в отдельном треде как тред. И передать треду параметры не через жопу, а просто как параметры функции. В первом варианте синтаксиса еще и вернуть идентификатор треда.
Опционально чтобы у типа thread был какой-то разумный набор операций (suspend/resume/kill...). Как минимум - сравнение тредов, узнавание id текущего треда (ключевое слово thread.this ), узнавание id треда, который создал этот тред (ключевое слово thread.parent ).
Ну и, наконец, к тредам добавить средства синхронизации и передачи данных между тредами. Что-нибудь вроде такого:
Пояснения. Надо, чтобы содержимое любой переменной можно было отослать в другой тред. Как только тот тред доходит до нужного места, он забирает "подарочек". Если подарка еще нет, тот тред ждет. Отсылающий тред ничего не ждет, содержимое переменной копируется в скрытый буфер. Если не хочется копировать много данных, то отсылаем указатель.
...
class MyData
{
int a;
char *c;
};
...
MyData b;
MyData result;
...
thread t = myfunc(99, "Loading...");
...
b.a= 1; //заполняем данные в "подарке"
b >> t; /*отсылаем "подарок", какие-то дополнительные данные, которые
на момент вызова myfunc еще не были готовы */
...
result << t; //забираем результаты исполнения треда, ждем если надо
void myfunc(int x, char *y)
{
...
MyData b;
MyData result;
...
//берем какие-то дополнительные параметры
b << thread.parent; /* thread.parent - ключевое слово, означает тред, который создал этот тред */
...
//отсылаем результаты
result >> thread.parent;
}
Помечтаем, а? :)
no subject
Date: 2008-10-09 05:14 pm (UTC)Ну кстати видел:
http://haskell.org/haskellwiki/Haskell
http://caml.inria.fr/resources/index.en.html
http://smarteiffel.loria.fr/
http://www.erlang.org/
http://www.rapideuphoria.com/index.html
Кое что из них может компилироваться.
no subject
Date: 2008-10-09 05:18 pm (UTC)no subject
Date: 2008-10-09 05:22 pm (UTC)Несамостоятельность это ты о чем? Многие из перечисленных мною написаны на себе.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: (Anonymous) - Date: 2008-10-09 07:30 pm (UTC) - Expandno subject
Date: 2008-10-09 10:00 pm (UTC)невозможность отлова всех синтаксических ошибок во _всем_ объеме кода
пока управление по этой ветке кода не пройдет - интерпретатор ни гугу :(
no subject
Date: 2008-10-09 05:42 pm (UTC)no subject
Date: 2008-10-09 09:31 pm (UTC)no subject
Date: 2008-10-09 06:10 pm (UTC)no subject
Date: 2008-10-09 06:47 pm (UTC)no subject
Date: 2008-10-09 06:59 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-10-09 07:01 pm (UTC)Ну и треды встроены в виртуальную машину, потому как без нее никуда - можно считать что они в языке.
Языки типа Java. Но они все как назло - интерпретаторы
Date: 2008-10-09 06:15 pm (UTC)Re: Языки типа Java. Но они все как назло - интерпретаторы
Date: 2008-10-09 06:46 pm (UTC)no subject
Date: 2008-10-09 07:28 pm (UTC)no subject
Date: 2008-10-09 08:36 pm (UTC)Виртуальная машинка интерпритирует байт-код.
Что же касается Явы, то тут тоже все зависит от устройства виртуальной машины. ВМ может интерпретировать псевдокод, но это медленно, а может его на лету один раз преобразовать в нативный код и исполнять уже как обычное приложение - достоинство песевдокода в том, что такое преобразование делается весьма быстро. А можно сочетать и то и другое - компилировать какие-то модули, и загружать их интепретирующим диспетчером. Обычно так и поступают.
(no subject)
From:no subject
Date: 2008-10-09 08:42 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-10-09 07:29 pm (UTC)Какой бред :)
Есть кроссплатформенные API вроде QT.
no subject
Date: 2008-10-10 09:12 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-10-10 03:05 pm (UTC)a++;
c = 4;
b-= 2;
ПЛОХО. Неочевидное поведение.
no subject
Date: 2008-10-11 02:34 pm (UTC)no subject
Date: 2008-10-11 04:45 pm (UTC)no subject
Date: 2008-10-17 08:38 am (UTC)no subject
Date: 2008-10-17 08:41 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: