Здравствуйте, VladD2, Вы писали:
VD>Опять пошла подмена понятий. Они не являются необходимыми чтобы порвав задницу хоть что-то изобразить. Но можно ли назвать программированием эмуляцию приводящую к ужасному нагромождению кода?
Я опять влезу со своим напоминанием про то, что все тьюринг-полные языки функционально эквивалентны. Что позволяет эмулировать что угодно на чем угодно.
Поэтому основное значение имеет
количество кода, потребное для такой эмуляции. А также умение компилятора настучать по рукам, если эмуляция нарушает контракты.
Вот, к примеру, дотнет не даст создать делегат из метода, несовместимого по сигнатуре. Таким образом, среда и компилятор следят за тем, что за указатель я кладу в структурку. Я, конечно, могу эмулировать ровно то же хоть на C, хоть на asm, но любые ошибки будут отложены до рантайма.
А вот, к примеру, проследить, чтобы я не забыл сделать EndXXX() с IAsyncResult, полученным из BeginXXX(), компилятор C# пока не может. И это очень плохо, потому что чревато всякими занятными ошибками и утечками.
По идее, тот же Немерле мог бы делать что-то типа Рихтеровского AsyncEnumerator, только с человеческим лицом.
Ну то есть чтобы из синхронного кода типа такого:
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse;
try
{
webResponse = webRequest.GetResponse();
}
catch (WebException e)
{
Console.WriteLine("Failed to contact server: {0}", e.Message);
return;
}
using (webResponse)
{
Stream webResponseStream = webResponse.GetResponseStream();
...
}
асинхронный получался не вот так:
WebRequest webRequest = WebRequest.Create(url);
webRequest.BeginGetResponse(ae.End(), null);
yield return 1;
WebResponse webResponse;
try
{
webResponse = webRequest.EndGetResponse(ae.DequeueAsyncResult());
}
catch (WebException e) {
Console.WriteLine("Failed to contact server: {0}", e.Message);
yield break;
}
using (webResponse) {
Stream webResponseStream = webResponse.GetResponseStream();
...
}
а как-то вот так:
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse;
try
{
webResponse = async webRequest.GetResponse();
}
catch (WebException e)
{
Console.WriteLine("Failed to contact server: {0}", e.Message);
return;
}
using (webResponse)
{
Stream webResponseStream = webResponse.GetResponseStream();
...
}
И чтобы семантика, соответственно, совпадала с Рихтеровской. То есть вместо блокировки вызываюшего потока он возвращался бы в пул, а в момент окончания async из пула бы брался другой поток и начинал с того же места.
... << RSDN@Home 1.2.0 alpha rev. 677>>