> man operating_systems
Центр информации по операционным системам :: Форумы :: Концепции :: ОС-21
 
<< Предыдущая тема | Следующая тема >>
Заглядывая в туманное будущее - обсуждение
Переход на страницу  1 2 3 [4] 5 ... 13 14 15
Модераторы: Roman I Khimov, Wanderer, Dron
Автор Добавил
batu
Среда 17.08.2005 09:14
ID пользователя #5
Зарегистрирован: Суббота 03.07.2004 22:20
Местонахождение: Г Харьков
Сообщений: 22
captain cobalt написал(а) ...

batu написал(а) ...
Из обсуждения примера вы поняли что без проверки типов ... во время выполнения не обойтись.
Я протестую лишь против приведённых примеров, которые являются примером неправильного проектирования (например прибавление единицы к произвольному объекту).
При таком подходе из-за ошибок программирования может возникать "неожиданный полиморфизм" (бич некоторых языков программирования) - ситуация, когда корректная операция применяется к корректному объекту и вызывает некорректный (возможно, разрушительный) результат.

Протестовать то можно, но жизнь диктует свои задачи. Вот нужно прибавить единицу, а какой объект нам попадется узнаем при выполнении. Я про единицу и про сложение просто пример привел, а реально возникают задачи сложнее, например, "покрасить". И специалист по технологии красок пишущий программу для покраски, понятия не имеет для какого объекта его программа будет применяться. Он професионал только по покраске. Это обычные и повседневные задачи. И я хочу дать програмистам такой механизм. Не понимаю почему вы против? Я б согласно вашему совету так не делал, но ведь нужно.
Наверх
Сайт
batu
Среда 17.08.2005 09:50
ID пользователя #5
Зарегистрирован: Суббота 03.07.2004 22:20
Местонахождение: Г Харьков
Сообщений: 22
captain cobalt написал(а) ...

batu написал(а) ...
Начнем с простого. Попробуй придумать как после трансляции будет выглядеть на ассемблере вот такая процедура
Sub NN (OD As Object)
OD+=1
End Sub
Разумеется, ответ зависит от предположений насчёт языка программирования. Возможны следующие предположения:

1. Язык программирования поддерживает перегрузку операторов - синтаксический сахар над вызовами методов, в данном случае оператор инкрементного сложения.
1.1. Язык программирования требует, что тип Object, являющийся подразумеваемым базовым суперклассом всех других классов бла-бла-бла...
1.2. Язык использует динамическую типизацию. бла-бла-бла...
1.3. Язык использует статическую типизацию. бла-бла-бла...
2. Язык не поддерживает перегрузку операторов. бла-бла-бла...

Вопрос то без ответа. На ассемблере представили такой кусок программы? Какая команда должна применятся? Что на месте адресов операндов в команде должно стоять? Или там много команд должно сгенерироваться? И куча команд для проверки типа, а потом в зависимости от типа данных разные команды? А если допускается перегрузка операторов еще и вызов процедуры с перегруженым оператором. Правильно? Это сколько команд для выполнения получается? А теперь вдумайся в мое предложение проверять типы на этапе выполнения (в случае если они не были проверены и не сформирована адресная часть операндов на этапе 0-выполнения при компиляции и тогда ничего по скорости не теряется.) . Вместо вот этой кучи команд формируется только одна! Вдумался. И не обязательно это должна быть новая архитектура машины. Все это прекрасно можно эмулировать на любой машине генерала Фон Неймана. Что я и делаю сейчас.
И в случае если типы известны на этапе компиляции (я тоже за сильно типизированые языки), то все происходит как обычно. Ошибки обнаруживаются на этапе трансляции. Адресную часть операндов команды тоже известно как формировать. А вот в случае когда объект не известен до этапа выполнения мой подход здорово упрощает решение. Упрощается и компилятор и генерируемый код. Тут я должен напомнить что и адресация данных у меня отличается. Но это уже детали реализации.
Наверх
Сайт
Dron
Среда 17.08.2005 10:12


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Rygoravich: Так это же всеравно не програиммирование... это юзание.

Возможно программирование будет базороваться на аналогичных методиках, (то есть клавиатуры умрут, я не против, только пусть сперва комп научится читать по губам, или по глазам... или... ну чтобы молча все это происходило...)

А там уже программисты как нибудь научатся вдалбливать компу что ему надо делать.

Кстати вот какая интересная идея...
Комп ведь большую часть времени простаивает... так давайте давать ему не программы а алгоритмы... идеальные реализации для которых комп со временем найдет сам. (пусть сперва будет не шибко быстро, но чем дальше - тем бустрее) И проблема тормозных программ исчезает сама собой...

Правда не стоит забывать что такая работа черезвычайно ресурсоемка.
Может единые сети в этом помогут? тогда глядишь и реализации компам не придется изобретать, достаточно будет пошукать в сети...

У-у-у... куда меня занесло...
То есть программирование превратиться в правильную постановку задачи.
[ Редактирование среда 17.08.2005 10:13 ]

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
batu
Среда 17.08.2005 10:32
ID пользователя #5
Зарегистрирован: Суббота 03.07.2004 22:20
Местонахождение: Г Харьков
Сообщений: 22
captain cobalt написал(а) ...
batu написал(а) ...
(а ткаже формирования адресной части команд) во время выполнения не обойтись
Про "формирование адресной части команд" до сих пор ничего не понятно.
Например?

Машинные команды бывают одно- двух- и трех-операндные.
Структура команд при этом следующая:
Для однооперандных команд
КОМАНДА| ОПЕРАТОР ИЛИ АДРЕС ОПЕРАНДА
Для двухоперандных команд
КОМАНДА| ОПЕРАТОР ПЕРВЫЙ ИЛИ АДРЕС ПЕРВОГО ОПЕРАНДА| ОПЕРАТОР ВТОРОЙ ИЛИ АДРЕС ВТОРОГО ОПЕРАНДА

Так вот при генерации кода нужно сгенерировать не только команду, но и сформировать адреса операндов. И понятное дело не зная типов данных сформировать адрес операнда проблематично. Особенно если это элемент массива или структуры.
captain cobalt написал(а) ...

batu написал(а) ...
Машина это будет делать или программа вопрос второй. Но если вы представили объем генерируемого кода и накладные расходы в программном решении, то... сделайте сами выводы.И ведь мы говорим о будущем!
Одна проверка типа == одно сравнение - весьма немного.

Весьма много. В предыдущем ответе я написал что получается сейчас в сгенерированом коде. Там далеко не одно сравнение.
captain cobalt написал(а) ...

Разумеется, это должна делать программа. Тогда процессор может быть проще, и, следовательно, может быть сделан быстрее, что приведёт к общему повышению производительности.

А вот это совсем не правильно. Скорость выполнения задачи очевидно зависит от скорости работы процессора, но это мало что говорит о производительности. Будем сравнивать операционки? Так что много зависит и от инструментов разработки программы. Ну и, конечно, от прокладки между клавиатурой и креслом.
captain cobalt написал(а) ...

Возьмём, например, E2K.
Разработчики утверждают, что EPIC/VLIW должен вытеснить суперскаляры.
Суперскаляры - это машины которые динамически аппаратно во время выполнения выполняют instruction scheduling - выбирают подходящий порядок исполнения инструкций, меняют их местами и т. п. Это требует вычислительных ресурсов и серьёзно препятствует повышению параллелизма.
В EPIC/VLIW машинах instruction scheduling, в том числе распараллеливание, выполняет компилятор (естественно программно).

Вот оно будущее - очень быстрая и очень "тупая" машина с массовым параллелизмом и "умный" компилятор.
Осталось только взять с собой "умный" язык программирования.
И Bluebottle.

Я не канонизирую E2K. но там есть интересные моменты. Например, память при выделении очищается, и при записи данных в ячейку устанвливатся аппаратно бит с признаком наличия данных. Таким образом, при обращении для чтения к отсутствующим данным возникает ошибка. Программное решение этой проблемы гораздо сложнее, требует массу ресурсов, и я не знаю надежного решения (может вы в курсе?).
Второе-Там реализован аппаратно механизм програмирования последовательности выполнения команд процессорами. И программы перетранслируются на разное число процессоров. Без этого механизма добавленияе процессоров не эффективно в общем случае. Конечно молотить скаляры и матрицы на многопроцессорной машине приятно, но усилия затраченые на програмирование такого "обмолота" я считаю слишком велики. Решение E2K этого вопроса считаю весьма удачным.
Наверх
Сайт
Rygoravich
Среда 17.08.2005 16:44

ID пользователя #10
Зарегистрирован: Воскресенье 04.07.2004 16:29
Местонахождение: Navapolatsk, Belarus
Сообщений: 30
2Dron: а идейка действительно любопытная . Использовать время простоя процессора для самообучения... Фактически в этом случае будем иметь ИИ...
Наверх
Dron
Среда 17.08.2005 16:55


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Ну типа ИИ...
человечнее он от этого не станет...
по моему это и не нужно.

А здесь вполне бы подошли всякие ГА, или НС...
Скорость не сильно важна... (тем более когда сеть компов... чем еще заниматься как не перебирать варианты)

Одну из двух вечных российских проблем можно, в принципе, решить с помощью асфальтоукладчиков и катков. А вот с дорогами, конечно, будет труднее...

Андрей Валяев
Наверх
Сайт
den1
Среда 17.08.2005 18:37
ID пользователя #363
Зарегистрирован: Вторник 05.07.2005 16:47
Местонахождение: Россия. Москва.
Сообщений: 151
Rygoravich написал(а) ...
2Dron: а идейка действительно любопытная . Использовать время простоя процессора для самообучения...

Даже в данном контексте некорректно связывать время "простоя" и самообучение. Здесь нет идеи. Это естественно для правильных , например, созданных природой вычислителей, так как они действуют в реальном мире. Даже время сна - также вовсе не время "простоя". Нет такого понятия в природе.

Если есть алгоритм самообучения, то вторично, как и где он реализуется.

Rygoravich написал(а) ...
Фактически в этом случае будем иметь ИИ...
и в этом случае не будем. Порой словосочетание ИИ употребляется с такой легкостью к месту и не очень. Я согласен с теми, кто считает, что корректность и, соответственно, употребление термина ИИ требуется еще существенно исследовать.
Наверх
Сайт
Vadim Ushakov
Четверг 18.08.2005 04:28

ID пользователя #409
Зарегистрирован: Четверг 18.08.2005 04:25
Местонахождение: Красноярск
Сообщений: 85
Давно и с интересом читаю этот форум, но как-то все не было случая высказаться. А тут речь зашла о принципах разработки ЯВУ и их поддержке со стороны железа... В общем задели за живое.
batu написал(а) ...
Вопрос то без ответа. На ассемблере представили такой кусок программы? Какая команда должна применятся? Что на месте адресов операндов в команде должно стоять? Или там много команд должно сгенерироваться? И куча команд для проверки типа, а потом в зависимости от типа данных разные команды? А если допускается перегрузка операторов еще и вызов процедуры с перегруженым оператором. Правильно? Это сколько команд для выполнения получается? А теперь вдумайся в мое предложение проверять типы на этапе выполнения (в случае если они не были проверены и не сформирована адресная часть операндов на этапе 0-выполнения при компиляции и тогда ничего по скорости не теряется.) . Вместо вот этой кучи команд формируется только одна! Вдумался. И не обязательно это должна быть новая архитектура машины. Все это прекрасно можно эмулировать на любой машине генерала Фон Неймана. Что я и делаю сейчас.
Сразу следует уточнить, о каких языках идет речь. Если о чем-то полу-интерпретируемом, как, например, Visual Basic, то тут спорить не о чем. Там производительность не является основной характеристикой. Если же говорить о сильнотипизированных языках, то вот вполне конкретный ответ на ваш вопрос:

/* "мать всех объектов" с заглушками чисто-виртуальных методов */
class BaseObject{
public:
// bla-bla-bla
virtual BaseObject& operator+=(const BaseObject&) = 0;
// bla-bla-bla
private:
// bla-bla-bla
};
/* реализация интерфейса BaseObject */
class A1 : public BaseObject{
public:
virtual BaseObject& operator+=(const BaseObject&){
// bla-bla-bla
return *this;
}
};
void main(void){
BaseObject *obj1 = new A1(), *obj2 = new A1();
*obj1 += *obj2;
delete obj1, obj2;
}

Вот, собственно и все. НИКАКИХ проверок типа во время исполнения не производится. Только переход по v-таблице и вызов переопределенного метода. Честно говоря, здесь только половина решения, поскольку при вызове метода operator+= класса A1 нам известен только тип левого операнда. Потом мы используем двойную передачу (double dispatch) и узнаем точный тип второго операнда. Итого два перехода по v-таблице.
Если вам так уж важно "на ассемблере представить такой кусок программы", то вот что мне выдала IDA:
mov edx, [ebp+var_24]
mov [ebp+var_14], edx
mov eax, [ebp+var_14]
mov [ebp+var_8], eax
mov ecx, [ebp+var_8]
push ecx
mov edx, [ebp+var_4]
mov eax, [edx]
mov ecx, [ebp+var_4]
call dword ptr [eax]

batu написал(а) ...
Я не канонизирую E2K. но там есть интересные моменты. Например, память при выделении очищается, и при записи данных в ячейку устанвливатся аппаратно бит с признаком наличия данных. Таким образом, при обращении для чтения к отсутствующим данным возникает ошибка. Программное решение этой проблемы гораздо сложнее, требует массу ресурсов, и я не знаю надежного решения (может вы в курсе?).
Не вижу здесь проблемы. Как и всегда, все сводится к "отлову" "диких" указателей. В НОРМАЛЬНЫХ языках программирования, где нельзя записать в указатель произвольное число и где есть автоматическая сборка мусора, просто не может возникнуть такой ситуации, когда программа обращается к неинициализированным данным. Т.е. такого не может быть, потому что не может быть никогда. А обращения к нулевому указателю легко отлавливаются такими средствами аппаратуры, как страничная защита. И тоже нет никаких проверок во время исполнения.
batu написал(а) ...
Второе-Там реализован аппаратно механизм програмирования последовательности выполнения команд процессорами. И программы перетранслируются на разное число процессоров. Без этого механизма добавленияе процессоров не эффективно в общем случае. Конечно молотить скаляры и матрицы на многопроцессорной машине приятно, но усилия затраченые на програмирование такого "обмолота" я считаю слишком велики. Решение E2K этого вопроса считаю весьма удачным.
А вот об этом впервые слышу. Можно поподробнее? Что это такое и с чем его едят.

Падает тот, кто бежит; тот, кто лежит – уже не падает.
Наверх
batu
Понедельник 22.08.2005 02:40
ID пользователя #5
Зарегистрирован: Суббота 03.07.2004 22:20
Местонахождение: Г Харьков
Сообщений: 22
Vadim Ushakov написал(а) ...
Если же говорить о сильнотипизированных языках, то вот вполне конкретный ответ на ваш вопрос:

/* "мать всех объектов" с заглушками чисто-виртуальных методов */
class BaseObject{
public:
// bla-bla-bla
virtual BaseObject& operator+=(const BaseObject&) = 0;
// bla-bla-bla
private:
// bla-bla-bla
};
/* реализация интерфейса BaseObject */
class A1 : public BaseObject{
public:
virtual BaseObject& operator+=(const BaseObject&){
// bla-bla-bla
return *this;
}
};
void main(void){
BaseObject *obj1 = new A1(), *obj2 = new A1();
*obj1 += *obj2;
delete obj1, obj2;
}

Вот, собственно и все. НИКАКИХ проверок типа во время исполнения не производится. Только переход по v-таблице и вызов переопределенного метода. Честно говоря, здесь только половина решения, поскольку при вызове метода operator+= класса A1 нам известен только тип левого операнда. Потом мы используем двойную передачу (double dispatch) и узнаем точный тип второго операнда. Итого два перехода по v-таблице.
Если вам так уж важно "на ассемблере представить такой кусок программы", то вот что мне выдала IDA:
mov edx, [ebp+var_24]
mov [ebp+var_14], edx
mov eax, [ebp+var_14]
mov [ebp+var_8], eax
mov ecx, [ebp+var_8]
push ecx
mov edx, [ebp+var_4]
mov eax, [edx]
mov ecx, [ebp+var_4]
call dword ptr [eax]

Очень благодарен за ответ, но, к сожалению, не на мой вопрос. Здесь выполняется операция с известным при трансляции типом. А вопрос был задан какой код генерировать если тип данных (или объекта) станет известным только в момент выполнения.
Напоминаю пример

Sub NN (OD As Object)
OD+=1
End Sub

Ситуация со сбоем может возникнуть в этой процедуре если объекта не существует (не создан или уничтожен до входа в процедуру BB) и вопрос с выполнением операции зависит еще от типов данных, который тоже будет известен только при выполнении. Совершенно согласен, что такая ситуация может быть уловлена только на этапе выполнения. Как и в данном случае
Sub EE (J As Integer)
I As Integer=0
J=I+J
End Sub
Ну, не знаем мы есть ли значение в J на этапе трансляции. И проверить это можно только на этапе выполнения.
Я извиняюсь за бестолковость примеров, но смысл, надеюсь понятен.
Замечу что это проблема не с указателем, а самими данными.
Но проблемы с указателем тоже могут возникнуть в таких случаях если объект создавался динамически и уничтожен. И страничной защиты в таком случае мало.
Vadim Ushakov написал(а) ...

А обращения к нулевому указателю легко отлавливаются такими средствами аппаратуры, как страничная защита. И тоже нет никаких проверок во время исполнения.

batu написал(а) ...

Второе-Там реализован аппаратно механизм програмирования последовательности выполнения команд процессорами. И программы перетранслируются на разное число процессоров. Без этого механизма добавленияе процессоров не эффективно в общем случае. Конечно молотить скаляры и матрицы на многопроцессорной машине приятно, но усилия затраченые на програмирование такого "обмолота" я считаю слишком велики. Решение E2K этого вопроса считаю весьма удачным.

А вот об этом впервые слышу. Можно поподробнее? Что это такое и с чем его едят.

Подробнее на сайте эльбруса. Нет смысла повторять. Описание E2K. Там достаточно подробно.
Еще раз благодарен за дискусию.
Наверх
Сайт
batu
Вторник 23.08.2005 03:05
ID пользователя #5
Зарегистрирован: Суббота 03.07.2004 22:20
Местонахождение: Г Харьков
Сообщений: 22
Dron написал(а) ...
У-у-у... куда меня занесло...
То есть программирование превратиться в правильную постановку задачи.

И ничего не занесло. Старая песня. Формулируется как сокращение семантического разрыва между постановкой задачи и ее решением завсиящем от языка на котором общаемся. Чем выше уровень языка, тем выше возможности оптимизации. Собственно сильно типизированые языки это первый шаг в направлении сокращения этого разрыва. ну и я работаю в этом направлении. Если б наше мышление и язык програмирования были одно целое, то и проблем бы не было.. пример простой..
Dim I As Integer
I=I+1 Попробуй отгадать что бы это значило?
И совсем другое дело
Dim I As Apple
I=I+1Я
Это пример из моего языка. Где тип можно определять суффиксом. Понятно что такая конструкция дает больше информации транслятору для выявления ошибки и для оптимизации (или в нашем контексте "для размышления").
Сори.. Как всегда с наивными примерами. Но за ними серьезные вопросы.
Наверх
Сайт
Переход на страницу  1 2 3 [4] 5 ... 13 14 15  

Перейти:     Наверх

Транслировать сообщения этой темы: rss 0.92 Транслировать сообщения этой темы: rss 2.0 Транслировать сообщения этой темы: RDF
Powered by e107 Forum System

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.