Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 27.05.13 17:20
Оценка:
Тут в дотнетах развернулась жаркая дискуссия про функционалльной програмирование
http://rsdn.ru/forum/dotnet/5179867.1
Автор: igor-booch
Дата: 24.05.13


По ходе дискуссии у меня родился вопрос.
В Haskell есть if выражение. http://en.wikibooks.org/wiki/Haskell/Control_structures
Написано, что

If you programmed in C or Java, you will recognize Haskell's if/then/else as an equivalent to the ternary conditional operator ?


Смотрим документацию по оператору ? в C#

condition ? first_expression : second_expression;

Смотрим теперь документация по if-else в C#:

if (expression)
statement1
[else
statement2]

Я так понимаю, что в данных нотациях в expression я не могу использовать инструменты императивного языка позволяющие управлять потоком исполнения (flow control), а именно if, for. А в statement могу. Но это ограничение легко обойти. Я могу в expression вызвать метод, в котором уже if и for будут.

В связи с этим возникает вопрос насколько справедливо что if в Haskell равносильно тернарному оператору в императивных языках.
Возможно expression в императивных языках не эквивалентно expression в функциональных.
Если не эквивалентно, я тогда не понимаю разницы между expression и statement.





30.05.13 05:42: Перенесено модератором из 'Декларативное программирование' — VladD2
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re: Тернарный оператор в императивных языках
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.05.13 17:40
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Тут в дотнетах развернулась жаркая дискуссия про функционалльной програмирование

IB>http://rsdn.ru/forum/dotnet/5179867.1
Автор: igor-booch
Дата: 24.05.13

Жарите там в основном вы
Re: Тернарный оператор в императивных языках
От: _NN_ www.nemerleweb.com
Дата: 27.05.13 18:01
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Если не эквивалентно, я тогда не понимаю разницы между expression и statement.


А что непонятного ?
Формула проста:
statement = expression возвращающий void.

В языках типа C# невозможно создать переменную из statement.
Вот и получается:

var a = true ? 1 : 2; // OK

var a = if(true) 1 else 2; // Error, if-else "возвращают" void.
void a = ... // Такое вообще нельзя


В функциональных языках и в гибридных языках понятие statement как отдельный элемент просто отсутствует.
В таких языка как правило отсутствует явное ключевое слово 'return' в понимании C (в Хаскелле это означает совсем другое если что),
И всегда последнее выражение используется как результат.
Это не отменяет возможность эмуляции 'return' стиля C.

Возьмем нефункциональный Ruby в котором, однако, все является выражением:
if true then 2 else 3 end; # Результат игнорируем

a = if true then 2 else 3 end; # Результат используем
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 27.05.13 18:17
Оценка:
IB>>Тут в дотнетах развернулась жаркая дискуссия про функционалльной програмирование
IB>>http://rsdn.ru/forum/dotnet/5179867.1
Автор: igor-booch
Дата: 24.05.13

S>Жарите там в основном вы
Вы хотите сказать что я Вас жарю?
Не я не садист.
Я стремлюсь к совершенству, а Вы мне помогаете в этом
И сами чему-то учитесь (возможно).
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Тернарный оператор в императивных языках
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.05.13 18:23
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>>>Тут в дотнетах развернулась жаркая дискуссия про функционалльной програмирование

IB>>>http://rsdn.ru/forum/dotnet/5179867.1
Автор: igor-booch
Дата: 24.05.13

S>>Жарите там в основном вы
IB>Вы хотите сказать что я Вас жарю?
Нет, что вы Жарите в смысле "поддаете жару".

IB>Не я не садист.

IB>Я стремлюсь к совершенству, а Вы мне помогаете в этом
IB>И сами чему-то учитесь (возможно).
Не исключено
Re[2]: Тернарный оператор в императивных языках
От: Кодт Россия  
Дата: 27.05.13 19:42
Оценка: 1 (1) +2
Здравствуйте, _NN_, Вы писали:

IB>>Если не эквивалентно, я тогда не понимаю разницы между expression и statement.


_NN>А что непонятного ?

_NN>Формула проста:
_NN>statement = expression возвращающий void.

Грубое и, в общем случае, неверное утверждение.
statement — это утверждение. Например, определение переменной — это тоже statement.
Стейтменты, управляющие потоком (ветвления, циклы, переходы) проблематично рассматривать как выражения.
Кстати говоря, void-выражения можно утилизировать в операторе последовательности ",". Попробуйте туда мысленно подставить goto — и станет ясно, что не всякий стейтмент есть выражение.

_NN>В языках типа C# невозможно создать переменную из statement.

_NN>Вот и получается:

_NN>
_NN>var a = true ? 1 : 2; // OK

_NN>var a = if(true) 1 else 2; // Error, if-else "возвращают" void.
_NN>void a = ... // Такое вообще нельзя
_NN>


В С++ (стандарт 2003 и далее) можно делать return f() где void f().
В питоне тип None (аналог void) — обычное значение.

Так что это вопрос синтаксиса, в большей степени, нежели вопрос семантики.

_NN>Возьмем нефункциональный Ruby в котором, однако, все является выражением:


В руби и питоне "всё есть выражение" — это способ упрощения модели языка.
Там даже объявление класса — это не статическая конструкция, а интерпретируемая последовательность.
print "----1----"
class Foo :
  print "defclass"
  def __init__(self) :
    print "init"

print "----2----"
f = Foo()
print "----3----"

результат
----1----
defclass
----2----
init
----3----

Кстати, в питоне 2.x — print является не выражением, а стейтментом.
Написать x = (print "foo") нельзя.
Перекуём баги на фичи!
Re[3]: Тернарный оператор в императивных языках
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.05.13 19:46
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Стейтменты, управляющие потоком (ветвления, циклы, переходы) проблематично рассматривать как выражения.


Строго говоря, как выражения проблематично использовать только циклы и операторы перехода. Потому что идея о том, что значением цикла является значение последнего прохода несколько контринтуитивна, IMHO.
Re[4]: Тернарный оператор в императивных языках
От: Кодт Россия  
Дата: 27.05.13 21:05
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Строго говоря, как выражения проблематично использовать только циклы и операторы перехода. Потому что идея о том, что значением цикла является значение последнего прохода несколько контринтуитивна, IMHO.


Она "несколько" контр-интуитивна постольку, поскольку у цикла может оказаться ноль проходов — и непонятно, что возвращать в этом случае.
Либо обёртывать в какой-то моноид с пустым элементом (например, nullable значение или список всех итераций);
либо вводить в синтаксис цикла ветку "иначе", как это сделано в питоне (там, правда, она отрабатывает всегда);
либо сделать теневой моноид: бросок исключения в качестве пустого элемента (и опять же, так сделано в питоне).

Если же мы рассмотрим цикл как некую свёртку, то ноль проходов — это ноль применений к исходному значению: вернём его; любое ненулевое количество проходов — вернём результат последнего прохода.
Но как это красиво в синтаксис оформить...
Скажем, так
x = 1234 and_for range(k) { |i| i*100 } # при k<1, x=1234; иначе, x=(k-1)*100
Перекуём баги на фичи!
Re[3]: Тернарный оператор в императивных языках
От: _NN_ www.nemerleweb.com
Дата: 28.05.13 06:18
Оценка:
Здравствуйте, Кодт, Вы писали:

_NN>>statement = expression возвращающий void.


К>Грубое и, в общем случае, неверное утверждение.

В большинстве случаев оно подходит.
Если statement возвращает void, то все просто и логично.
Просто языки не умеют или не хотят оперировать с 'void' типами.

К>statement — это утверждение. Например, определение переменной — это тоже statement.

Почему в этом случае нельзя рассматривать как выражение с результатом void ?
Скажем, в Nemerle как раз так и есть:
def a = def b = 1;
// b = 1
// a = ()


Возможно где-то в ML семействе есть такая фишка тоже.

К>Стейтменты, управляющие потоком (ветвления, циклы, переходы) проблематично рассматривать как выражения.

В Nemerle аналогично определению переменной.
def a = foreach(x in []) {};
// a = ()


К>Кстати, в питоне 2.x — print является не выражением, а стейтментом.

Это не противоречит утверждению.
print возвращает void, а Python просто не умеет с ним работать.

К>Написать x = (print "foo") нельзя.

Также как и
a = if True:
      1
    else
      2

Зато можно
a = 1 if True else 2

Потому что тут это будет выражением.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Тернарный оператор в императивных языках
От: Pzz Россия https://github.com/alexpevzner
Дата: 28.05.13 09:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Она "несколько" контр-интуитивна постольку, поскольку у цикла может оказаться ноль проходов — и непонятно, что возвращать в этом случае.


Согласен.

К>Но как это красиво в синтаксис оформить...

К>Скажем, так
К>
К>x = 1234 and_for range(k) { |i| i*100 } # при k<1, x=1234; иначе, x=(k-1)*100
К>


— Пане, як по вашему дупа?
— ...
— А, ну тоже красиво.
Re[5]: Тернарный оператор в императивных языках
От: Воронков Василий Россия  
Дата: 29.05.13 06:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Она "несколько" контр-интуитивна постольку, поскольку у цикла может оказаться ноль проходов — и непонятно, что возвращать в этом случае.

К>Либо обёртывать в какой-то моноид с пустым элементом (например, nullable значение или список всех итераций);
К>либо вводить в синтаксис цикла ветку "иначе", как это сделано в питоне (там, правда, она отрабатывает всегда);
К>либо сделать теневой моноид: бросок исключения в качестве пустого элемента (и опять же, так сделано в питоне).

К>Если же мы рассмотрим цикл как некую свёртку, то ноль проходов — это ноль применений к исходному значению: вернём его; любое ненулевое количество проходов — вернём результат последнего прохода.

К>Но как это красиво в синтаксис оформить...
К>Скажем, так
К>
К>x = 1234 and_for range(k) { |i| i*100 } # при k<1, x=1234; иначе, x=(k-1)*100
К>


Посмотри, как это в том же Немерле сделано. Цикл всегда возвращает Unit — и никаких проблем.
Re: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.05.13 10:19
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Я так понимаю, что в данных нотациях в expression я не могу использовать инструменты императивного языка позволяющие управлять потоком исполнения (flow control), а именно if, for.


Вместо if ты можешь использовать все тот же тернарный оператор, а for/foreach по своей сути — мутабельная конструкция, и заталкивать ее в выражение — крайне фиговая идея. Вместо for в функциональном стиле используют linq выражения.

IB>В связи с этим возникает вопрос насколько справедливо что if в Haskell равносильно тернарному оператору в императивных языках.


Справедливо.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.05.13 10:23
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Она "несколько" контр-интуитивна постольку, поскольку у цикла может оказаться ноль проходов — и непонятно, что возвращать в этом случае.


Это если считать что цикл возвращает скалярное выражение. А если он возвращает итератор, то все становится предельно логично.

К>Если же мы рассмотрим цикл как некую свёртку


Не, это слишком узкая семантика для цикла.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 31.05.13 12:32
Оценка:
AVK>Вместо for в функциональном стиле используют linq выражения.
Жалко только что http://stackoverflow.com/questions/4814242/linq-recursion-function

IB>>В связи с этим возникает вопрос насколько справедливо что if в Haskell равносильно тернарному оператору в императивных языках.

AVK>Справедливо.
Если императивным языком считать C#, то
я для себя на этот вопрос ответил так:
если не считать, что в first_expression и second_expression в тернарном операторе можно вызвать императивный метод (грязную функцию), то да
если не считать, что в first_expression и second_expression в тернарном операторе не обладают всеми возможностями функциональных языков (напр. carring, lazy evaluation)
то справедливо
Возможно в других языках expressions более приближены к возможностям (и ограничениям) функциональных языков.

Зачем вообще expressions в императивных языках, если они такие "неполноценные" в свете функциональных языков?
— Без них компилятор (точнее парсер, не важно кого компилятора или интерпретатора) не построить
http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c

Но концептуально expressions во всех языках означают означают одно.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Тернарный оператор в императивных языках
От: C.A.B LinkedIn
Дата: 31.05.13 12:44
Оценка:
Здравствуйте, igor-booch, Вы писали:
IB>— Без них компилятор (точнее парсер, не важно кого компилятора или интерпретатора) не построить
То есть? Почему?
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[3]: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.05.13 13:01
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Жалко только что http://stackoverflow.com/questions/4814242/linq-recursion-function


Ну да, есть отдельные моменты, C# все таки не чисто функциональный язык.

IB>если не считать, что в first_expression и second_expression в тернарном операторе можно вызвать императивный метод (грязную функцию), то да


Ну это в любом случае считать не надо, иначе сравнивать шарп с хаскелом просто бессмысленно.

IB>Зачем вообще expressions в императивных языках, если они такие "неполноценные" в свете функциональных языков?


А что, можно придумать универсальный и удобный язык без выражений?

IB>— http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c


ИМХО бред какой то. Уже на уровне IL разницы быть не должно.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 31.05.13 13:56
Оценка: :)
CAB>Здравствуйте, igor-booch, Вы писали:
IB>>— Без них компилятор (точнее парсер, не важно кого компилятора или интерпретатора) не построить
CAB>То есть? Почему?

А вы представьте парсинг statement'а (императивного) if :


if (expression)
    statement1
[else
    statement2]




Если попустить, что в expression может быть другой if,
То есть это будет уже не expression, а statement,
то вплывут фундаментальные проблемы.

Не спрашивайте только какие именно, это все на уровне интуиции.
Если сам пойму сам напишу.
Единственно, то могу пока уточнить, опять же на уровне интуиции:
парсинг в принципе возможен,
невозможен парсинг в структуру данных, которую можно преобразовать в последовательности инструкций процессора.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[5]: Тернарный оператор в императивных языках
От: C.A.B LinkedIn
Дата: 31.05.13 13:58
Оценка:
IB>>>— Без них компилятор (точнее парсер, не важно кого компилятора или интерпретатора) не построить
CAB>>То есть? Почему?
IB>А вы представьте парсинг statement'а (императивного) if :
IB>
IB>if (expression)
IB>    statement1
IB>[else
IB>    statement2]
IB>

Представляю, в результате получится AST вида:
          if_statement  
          /     |    \
expression statement1 statement2

IB>Если попустить, что в expression может быть другой if,
Если в вашем ЯП if это statement(т.е. не возвращает какого-то значения), то он не может быть там где требуется expression, это ошибка.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[6]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 08:55
Оценка:
По моему мы друг-друга не поняли.

IB>>— Без них (expression'ов) компилятор (точнее парсер, не важно кого компилятора или интерпретатора) не построить

CAB>То есть? Почему?

Я подумал, что Вы своим вопросом (Почему?) хотели сказать, что без expression'ов ЯП возможен.
Судя по Вашему предыдущему ответу вопрос "Почему?" касался чего-то другого.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[7]: Тернарный оператор в императивных языках
От: C.A.B LinkedIn
Дата: 01.06.13 09:15
Оценка:
IB>Я подумал, что Вы своим вопросом (Почему?) хотели сказать, что без expression'ов ЯП возможен.
Ассемблер?
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[8]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 09:34
Оценка:
IB>>Я подумал, что Вы своим вопросом (Почему?) хотели сказать, что без expression'ов ЯП возможен.
CAB>Ассемблер?

Да, ассемблер это ЯП без expression'ов.
Уточняю, я имел ввиду структурный ЯП (с if, for).
Структурный ЯП без expression'ов не возможен.
Кстати вопрос

Интересно cmov появился в инструкция процессоров до или после развития структурного программирования?


который я задал в http://rsdn.ru/forum/philosophy/5187562.1 касается Вашего замечания.
Я думаю что все-таки до, но было бы интересно если его появление, было вызвано необходимостью оптимизировать ассемблерный вывод структурных программ.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[4]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 10:14
Оценка:
AVK>Ну это в любом случае считать не надо, иначе сравнивать шарп с хаскелом просто бессмысленно.

В каком-то плане действительно бессмысленно: У Haskell и C# разные области применения.
У функционального языка, основная область применения это расчеты (или задачи типа парсинга), без интенсивного ввода вывода, то есть дали на вход программе Haskell данные, она их обработала и выдала результат.
У императивного языка, основная область применения это интенсивный ввод вывод (интерактивность), а сами вычисления есть, но они простые.
Но теоретический базис у императивного и функционального программирования пересекается, если не сказать, что они имеют общий теоретический бизис, просто по-разному используют разные его части в прикладных областях (в конкретных языках программирования).

Вот мое мнение о связи императивного и функционального программирования:
http://rsdn.ru/forum/decl/5183056.1
Автор: igor-booch
Дата: 28.05.13

http://rsdn.ru/forum/decl/5183222.1
Автор: igor-booch
Дата: 28.05.13


А можно ли создать императивный язык, у которого expression'ы будут иметь такую же мощь, что и у функционально? Теоретически можно только это никому не нужно. Задач где требуется одновременно и интенсивный ввод вывод и сложные вычисления мало. Хотя есть исключения: например система управления светофорами в городе. Но и здесь никто не мешает вести разработку на двух ЯП: императивном и функциональном.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[9]: Тернарный оператор в императивных языках
От: C.A.B LinkedIn
Дата: 01.06.13 10:16
Оценка:
IB>Структурный ЯП без expression'ов не возможен.
В вики не говорится об обязательности выражений в структурном ЯП.
Почему вы считаете это не возможным?

IB>Я думаю что все-таки до, но было бы интересно если его [cmov] появление, было вызвано необходимостью оптимизировать ассемблерный вывод структурных программ.

Вероятно так и было, так, например, появились асм. инструкции enter/leave.
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[10]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 10:50
Оценка:
IB>>Структурный ЯП без expression'ов не возможен.
CAB> В вики не говорится об обязательности выражений в структурном ЯП.
CAB>Почему вы считаете это не возможным?

возвращаемся к:
http://www.rsdn.ru/forum/philosophy/5187591.1
Автор: igor-booch
Дата: 31.05.13


if это неотъемлемый элемент структурного программирования

if (expression)
statement1
[else
statement2]


Как Вы себе представляете эту конструкция без expression? В данном случае нужно что-то что возвращает значение. И этим чем-то является expression.
Пойдем дальше. В этом expression Вы будете сравнивать значения переменных, а как переменной присвоить значение:

a = expression.


Здесь опять не обойтись без expression.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[11]: Тернарный оператор в императивных языках
От: C.A.B LinkedIn
Дата: 01.06.13 11:35
Оценка: +2
IB>if это неотъемлемый элемент структурного программирования
IB>Как Вы себе представляете эту конструкция без expression? В данном случае нужно что-то что возвращает значение. И этим чем-то является expression.
IB>Пойдем дальше. В этом expression Вы будете сравнивать значения переменных, а как переменной присвоить значение:
IB>Здесь опять не обойтись без expression.
Не обязательно брать значение из выражения, можно зять его в каком ни будь, заранее известном месте, например:
  asing -1
  add 1 
  if_zero
   statement1
  else
   statement2
Между тем,что я думаю,тем,что я хочу сказать,тем,что я,как мне кажется,говорю,и тем,что вы хотите услышать,тем,что как вам кажется,вы слышите,тем,что вы понимаете,стоит десять вариантов возникновения непонимания.Но всё-таки давайте попробуем...(Э.Уэллс)
Re[12]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 17:09
Оценка: 1 (1)
IB>>if это неотъемлемый элемент структурного программирования
IB>>Как Вы себе представляете эту конструкция без expression? В данном случае нужно что-то что возвращает значение. И этим чем-то является expression.
IB>>Пойдем дальше. В этом expression Вы будете сравнивать значения переменных, а как переменной присвоить значение:
IB>>Здесь опять не обойтись без expression.
CAB>Не обязательно брать значение из выражения, можно зять его в каком ни будь, заранее известном месте,

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

1. Программист может забыть положить в заранее известное место значение для if_zero. Тогда if_zero отвалится во время выполнения (run time). При использовании expression'ов такое невозможно. Не знаю входит ли требование контроля компилятором целостности структур управляющих потоком выполнения (if, for) в принципы структурного программирования.

2. if_zero могут быть вложены друг в друга, поэтому заранее известное место будет стеком. То есть if_zero проверяет вершину стека, а при выходе из конструкции if_zero делается pop. Программист может по ошибке (или даже сознательно) положить в этот стек "лишние" значения. То есть, например, положил в стек одно значение, вошел в первый (корневой) if_zero, положил в стек два значения, вызвал второй (вложенный) if_zero. В этом случае первый (корневой) if_zero вытащит из стека (pop) не то значение, которое проверял, а при выходе из первого (корневого) if_zero в стеке будет валяться одно значение, которое можно будет использовать для следующего корневого if_zero. Не знаю допустимы ли такие ситуации в структурном программировании. Я думаю, что нет, потому-что такие выкрутасы позволят создавать алгоритмы еще хуже, чем спагетти код с goto, то есть такое нарушение структурности будет позволительно с точки зрения рассматриваемого ЯП. Является такое нарушение структурности недопустимым с точки зрения структурного программирования не знаю.

Чтобы ответить на эти тонкие вопросы необходимо рассмотреть структурное программировании на более формальном уровне. Не знаю существуют ли формализации структурного программирования позволяющие это сделать, пока нашел только теорему Бёма — Якопини и Flow diagrams, turing machines and languages with only two formation rules
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[4]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 01.06.13 18:46
Оценка:
AVK>А что, можно придумать универсальный и удобный язык без выражений?
Язык отвечающие требованиям структурного программирования нельзя не построить без выражений.

IB>>— http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c

AVK>ИМХО бред какой то. Уже на уровне IL разницы быть не должно.

There's a good chance that the ternary operator gets compiled into a cmov while the if/else results in a cmp+jmp. Just take a look at the assembly (using -S) to be sure. With optimizations enabled, it won't matter any more anyway, as any good compiler should produce the same code in both cases.

Если этому поверить, то
Если Вы напишите


int a = flag ? 1 : 2;





то IMHO на ассемблере этот statement выполнится без единого cmp и jmp
будет заюзано cmov
Процессор за одну инструкцию выполнит сравнение и на основании его результата присвоение переменной a единицы или двойки.
А теперь подумайте над тем что 1 и 2 это вырожденные expressions с точки зрения языка программирования.

А если Вы напишите

if (flag)
    a = 1;
else
    a = 2;



То такой statement скорей всего выполнится через cmp и jmp
jmp будет прыгать на mov который будет присваивать переменной a единицу
или на другой mov который будет присваивать переменной a двойку
То есть больше инструкций процессора, меньше производительность.

Это все верно если исключить оптимизирующие возможности современных компиляторов (интерпретаторов).
Но в более сложных случаях использование тернарного оператора место if "поможет" современному компилятору сделать cmov оптимизацию.

На основании этого могу предположить, что ассемблерный вывод функциональных программ содержит больше cmov, чем вывод императивных программ
А ассемблерный вывод императивных программ содержит больше cmp и jmp, чем ввод функциональных программ.
Это интересно было бы проверить на примере алгоритма быстрой сортировки.

Интересно cmov появился в инструкция процессоров до или после развития структурного программирования?
Мое мнение по этому вопросы см. http://rsdn.ru/forum/philosophy/5188085.1
Автор: igor-booch
Дата: 01.06.13


На уровне IL есть аналогичные оптимизации
http://stackoverflow.com/questions/2259741/is-the-conditional-operator-slow
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[5]: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 02.06.13 12:11
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>У функционального языка, основная область применения это расчеты (или задачи типа парсинга), без интенсивного ввода вывода, то есть дали на вход программе Haskell данные, она их обработала и выдала результат.


Функциональность или императивность языка слабо влияет на область применения. Влияет оно исключительно на стиль кодирования и используемые алгоритмы.

IB>А можно ли создать императивный язык, у которого expression'ы будут иметь такую же мощь, что и у функционально?


Можно. Немерле, не к ночи буде упомянут, примерно твоей мечте соответствует.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 02.06.13 12:11
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Если этому поверить, то


А если проверить?
var flag = true;
var a1 = flag ? 1 : 2;
int a2;
if (flag)
    a2 = 1;
else
    a2 = 2;
    
Console.WriteLine(a1);
Console.WriteLine(a2);


Компилируем в релизе, C# 5.

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       32 (0x20)
  .maxstack  1
  .locals init ([0] bool flag,
           [1] int32 a1,
           [2] int32 a2)
  IL_0000:  ldc.i4.1
  IL_0001:  stloc.0

  
// Раз
  IL_0002:  ldloc.0
  IL_0003:  brtrue.s   IL_0008
  IL_0005:  ldc.i4.2
  IL_0006:  br.s       IL_0009
  IL_0008:  ldc.i4.1
  IL_0009:  stloc.1
  
// Два
  IL_000a:  ldloc.0
  IL_000b:  brfalse.s  IL_0011
  IL_000d:  ldc.i4.1
  IL_000e:  stloc.2
  IL_000f:  br.s       IL_0013
  IL_0011:  ldc.i4.2
  IL_0012:  stloc.2
  

  IL_0013:  ldloc.1
  IL_0014:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_0019:  ldloc.2
  IL_001a:  call       void [mscorlib]System.Console::WriteLine(int32)
  IL_001f:  ret
} // end of method Program::Main


Разница только в том, что во втором случае компилятор развернул условие.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 02.06.13 14:44
Оценка: -1 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, igor-booch, Вы писали:

IB>>Если этому поверить, то
AVK>А если проверить?
AVK>Разница только в том, что во втором случае компилятор развернул условие.

Спасибо за экспериментальную работу, проведенную для проверки правильности моей трактовки цитаты из http://stackoverflow.com/questions/6754454/speed-difference-between-if-else-and-ternary-operator-in-c

There's a good chance that the ternary operator gets compiled into a cmov while the if/else results in a cmp+jmp. Just take a look at the assembly (using -S) to be sure. With optimizations enabled, it won't matter any more anyway, as any good compiler should produce the same code in both cases.


Могу сделать следующее замечание:
Цитата и трактовка касалась языка С и ассемблера, а эксперимент был проведен для C# и MSIL. Хотя результаты аналогичные: разница в MSIL коде для if и тернарного оператора присутствует и выражается в том, для тернарного оператора инструкций MSIL больше. Скорей всего при трансляции MSIL кода в ассемблерный код аналогичная разница будет также присутствовать. Для подтверждения этой гипотезы я написал тест:


using System;
using System.Diagnostics;;


namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch stopWatch = new Stopwatch();
     
            stopWatch.Start();
            for (int i = 0; i < 100000000; i++)
            {
                bool flag = true;
                int a = flag ? 1 : 2;
            }
            stopWatch.Stop();
            Console.WriteLine("Ternary operator: {0}", stopWatch.ElapsedMilliseconds);

            stopWatch.Restart();
            for (int i = 0; i < 100000000; i++)
            {
                bool flag = true;
                int a;
                if (flag)
                {
                    a = 1;
                }
                else
                {
                    a = 2;
                }
            }
            stopWatch.Stop();
            Console.WriteLine("If statement: {0}", stopWatch.ElapsedMilliseconds);

            Console.ReadLine();
        }
    }
}




Ternary operator: 426
If statement: 555


Из этого можно сделать вывод, что в участках кода, для которых важна производительность, предпочтительно использовать тернарный оператор.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[13]: Тернарный оператор в императивных языках
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.06.13 16:54
Оценка: +1
Здравствуйте, igor-booch, Вы писали:

IB>2. if_zero могут быть вложены друг в друга, поэтому заранее известное место будет стеком. То есть if_zero проверяет вершину стека, а при выходе из конструкции if_zero делается pop. Программист может по ошибке (или даже сознательно) положить в этот стек "лишние" значения. То есть, например, положил в стек одно значение, вошел в первый (корневой) if_zero, положил в стек два значения, вызвал второй (вложенный) if_zero. В этом случае первый (корневой) if_zero вытащит из стека (pop) не то значение, которое проверял, а при выходе из первого (корневого) if_zero в стеке будет валяться одно значение, которое можно будет использовать для следующего корневого if_zero. Не знаю допустимы ли такие ситуации в структурном программировании.


На всякий случай намекну, что есть несложный способ верифицировать программы, работающие со стеком, на предмет нарушения типизации, в частности разбалансировки стека. Ну, то есть например, чтобы обе ветви if всегда снимали со стека одинаковое количество аргументов, или клали туда одинаковое количество аргументов одинаковых типов.
Именно этим занимается дотнетовский верификатор кода.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 03.06.13 07:09
Оценка:
S>На всякий случай намекну, что есть несложный способ верифицировать программы,

Вы имеете ввиду статическую верификацию?
Если так то по большому счету не нужно было вводить if statement в ассемблерный код и запрещать jmp (goto)
Автор: C.A.B
Дата: 01.06.13

Можно было просто верифицировать ассемблерный код без if statement на структурность.
Но от этого ассемблер не станет структурным.
Статическая верификация это приблуда к языку, а не свойство самого языка.
Я говорил с C.A.D. о структурности языка на уровне его синтаксиса.
К языку можно написать кучу всяких верификаторов, но синтаксис и семантика языка от этого не поменяется.
Аналогия верификации из живых языков это цензура.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[15]: Тернарный оператор в императивных языках
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.13 08:29
Оценка: +1
Здравствуйте, igor-booch, Вы писали:

S>>На всякий случай намекну, что есть несложный способ верифицировать программы,


IB>Вы имеете ввиду статическую верификацию?

Да.
IB>Если так то по большому счету не нужно было вводить if statement в ассемблерный код и запрещать jmp (goto)
Автор: C.A.B
Дата: 01.06.13

IB>Можно было просто верифицировать ассемблерный код без if statement на структурность.
IB>Но от этого ассемблер не станет структурным.
Ваша манера вместо вопросов писать (весьма спорные) утверждения малоприятна. Особенно с учётом того, что вы не следите за нитью дискуссии.
Напомню: в предыдущем сообщении вы выразили набор опасений про корректность программ, написанных на структурном языке без поддержки выражений. Мой комментарий поясняет, как статически обеспечить отсутствие подобных ошибок. В связи с чем я считаю ваши опасения беспочвенными.
Откатившись по дереву обсуждения назад, мы приходим к выводу о том, что ваше смелое утверждение про невозможность создания структурного ЯП без встроенных выражений тоже ошибочно.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 03.06.13 08:49
Оценка:
S>Ваша манера вместо вопросов писать (весьма спорные) утверждения малоприятна. Особенно с учётом того, что вы не следите за нитью дискуссии.
Поставьте минус или проигнорируйте, если считаете бредом, то, что я пишу. Если не считаете не вижу смысла наколять обстановку такими заявлениями. Какой смысл вести разговор с таким дураком как я?

S>Напомню: в предыдущем сообщении вы выразили набор опасений про корректность программ, написанных на структурном языке без поддержки выражений. Мой комментарий поясняет, как статически обеспечить отсутствие подобных ошибок. В связи с чем я считаю ваши опасения беспочвенными.

S>Откатившись по дереву обсуждения назад, мы приходим к выводу о том, что ваше смелое утверждение про невозможность создания структурного ЯП без встроенных выражений тоже ошибочно.
Я согласен с тем, что можно написать для ассемблера статический верификатор, который будет проверять код на ассемблере на структурность.
Но верификатор проверяющий код на некотором ЯП (в нашем случае ассемблер) на соблюдение каких-либо ограничений (в нашем случае структурность) не является частью языка (его синтаксиса).
Можно какой угодно написать верификатор для любого языка. Но этот верификатор не будет частью синтаксиса этого языка, поэтому не является частью этого языка.
Если Вы с этим не согласны, то можем зафиксировать это несогласие.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[17]: Тернарный оператор в императивных языках
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.13 08:57
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Я согласен с тем, что можно написать для ассемблера статический верификатор, который будет проверять код на ассемблере на структурность.

Не "код на ассемблере на структурность", а код на структурном языке без выражений на корректность.

IB>Но верификатор проверяющий код на некотором ЯП (в нашем случае ассемблер) на соблюдение каких-либо ограничений (в нашем случае структурность) не является частью языка (его синтаксиса).

Язык состоит не только из синтаксиса.

IB>Можно какой угодно написать верификатор для любого языка.

Нет. Не какой угодно и не для любого. На всякий случай напомню, что есть задачи различной сложности. Если задача верификации конкретного языка эквивалентна проблеме останова, то верификатор вообще не удастся написать. Если задача верификации является NP-полной, то верификатор написать можно, но его практическое применение окажется невозможным. Если в спецификации языка нет требований к валидным программам (вроде требования сбалансированности стека), то для верификатора даже не удастся поставить задачу.
IB> Но этот верификатор не будет частью синтаксиса этого языка, поэтому не является частью этого языка.
IB>Если Вы с этим не согласны, то можем зафиксировать это несогласие.
Вы лучше почитайте ECMA-335.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[18]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 03.06.13 09:04
Оценка:
IB>>Можно какой угодно написать верификатор для любого языка.
S>Нет. Не какой угодно и не для любого. На всякий случай напомню, что есть задачи различной сложности. Если задача верификации конкретного языка эквивалентна проблеме останова, то верификатор вообще не удастся написать. Если задача верификации является NP-полной, то верификатор написать можно, но его практическое применение окажется невозможным. Если в спецификации языка нет требований к валидным программам (вроде требования сбалансированности стека), то для верификатора даже не удастся поставить задачу.

А вот это интересное уточнение, спасибо. Но на суть моей дискуссии с С.A.D. не влияет.
Если не согласны, давайте и это несогласие зафиксируем и не будем друг другу портить настроение.
Давайте уважать мнения друг друга!
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[5]: Тернарный оператор в императивных языках
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.13 09:04
Оценка: +1
Здравствуйте, igor-booch, Вы писали:

IB>Язык отвечающие требованиям структурного программирования нельзя не построить без выражений.

Нет.


IB>There's a good chance that the ternary operator gets compiled into a cmov while the if/else results in a cmp+jmp. Just take a look at the assembly (using -S) to be sure. With optimizations enabled, it won't matter any more anyway, as any good compiler should produce the same code in both cases.

Ключевое выделено. Рассматривать компиляцию с отключенной оптимизацией с точки зрения производительности не имеет смысла. Если вам это неочевидно, спрашивайте.

IB>То есть больше инструкций процессора, меньше производительность.

Эта точка зрения тоже устарела на ~ пять поколений CPU. Современные CISC-процессоры выполняют операции совсем не так, как они приведены в листинге ассемблера. Большинство оптимизаций производительности увеличивают размер ассемблерного кода, добавляя инструкции. Например, цикл REP SCANSD как правило медленнее, (а вовсе не быстрее!), чем тот же цикл в развёрнутом виде.

IB>Это все верно если исключить оптимизирующие возможности современных компиляторов (интерпретаторов).

IB>Но в более сложных случаях использование тернарного оператора место if "поможет" современному компилятору сделать cmov оптимизацию.
Чем сложнее случай, тем лучше справляется компилятор (по сравнению с человеком). Забудьте про идею "исключить оптимизирующие возможности". Проектировать язык без их учёта сейчас — это всё равно, как проектировать мобильный телефон на лампах, игнорируя существование полупроводников.

IB>На основании этого могу предположить, что ассемблерный вывод функциональных программ содержит больше cmov, чем вывод императивных программ

Из неверных утверждений легко вывести совсем бредовые, ага.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Тернарный оператор в императивных языках
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 03.06.13 09:15
Оценка:
Здравствуйте, igor-booch, Вы писали:

IB>Цитата и трактовка касалась языка С и ассемблера, а эксперимент был проведен для C# и MSIL.


А я тебе исключительно про C# и писал.

IB> Хотя результаты аналогичные: разница в MSIL коде для if и тернарного оператора присутствует


Эта разница чисто номинальная.

IB> и выражается в том, для тернарного оператора инструкций MSIL больше.


Больше, потому что там развернулось условие и понадобился еще один безусловный переход. После джита скорее всего и эта разница пропадет. Ну либо можно руками развернуть условие второе. В любом случае, к разнице между if и тернарным оператором это не имеет никакого отношения.

IB> Скорей всего при трансляции MSIL кода в ассемблерный код аналогичная разница будет также присутствовать.


Нет, не будет.
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 03.06.13 09:40
Оценка:
IB>> и выражается в том, для тернарного оператора инструкций MSIL больше.
AVK>Больше, потому что там развернулось условие и понадобился еще один безусловный переход. После джита скорее всего и эта разница пропадет.

IB>> Скорей всего при трансляции MSIL кода в ассемблерный код аналогичная разница будет также присутствовать.

AVK>Нет, не будет.

Допустим что так, в этом случае интересно Ваше мнение по поводу того, чем объясняется, что тест из http://rsdn.ru/forum/philosophy/5188867.1
Автор: igor-booch
Дата: 02.06.13
стабильно выдает результаты, в которых тернарный оператор работает быстрее, чем if statement ?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[9]: Тернарный оператор в императивных языках
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.06.13 11:31
Оценка: +1
Здравствуйте, igor-booch, Вы писали:

IB>Допустим что так, в этом случае интересно Ваше мнение по поводу того, чем объясняется, что тест из http://rsdn.ru/forum/philosophy/5188867.1
Автор: igor-booch
Дата: 02.06.13
стабильно выдает результаты, в которых тернарный оператор работает быстрее, чем if statement ?

Стабильно?
Вот что ваш тест выдаёт у меня (после коррекции — увеличения количества итераций в 10 раз):
Ternary  If
------- ---
    319 326
    311 327
    328 317
    313 329
    312 304

Ну и где стабильность?
А вы, скорее всего, измеряете погоду (например, запуская тест в режиме отладки, где оптимизации отключены).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Тернарный оператор в императивных языках
От: igor-booch Россия  
Дата: 03.06.13 14:58
Оценка:
IB>>Допустим что так, в этом случае интересно Ваше мнение по поводу того, чем объясняется, что тест из http://rsdn.ru/forum/philosophy/5188867.1
Автор: igor-booch
Дата: 02.06.13
стабильно выдает результаты, в которых тернарный оператор работает быстрее, чем if statement ?

S>Стабильно?
S>Ну и где стабильность?
S>А вы, скорее всего, измеряете погоду (например, запуская тест в режиме отладки, где оптимизации отключены).

Благодарю за ценное уточнение касающиеся условий проведения эксперимента!
Честно говоря первоначально я упустил из виду компиляцию под Release и был удивлен что даже такой <b>простой </b>случай
Автор: igor-booch
Дата: 02.06.13
компилятор C# и Jit не смог оптимизировать.
Изначально
Автор: igor-booch
Дата: 01.06.13
я предполагал, что в простом случае сработает оптимизация, но в более сложном может не сработать:

IB>Это все верно если исключить оптимизирующие возможности современных компиляторов (интерпретаторов).

IB>Но в более сложных случаях использование тернарного оператора место if "поможет" современному компилятору сделать cmov оптимизацию.

Я усложнил тест и увеличил число итераций:

using System;
using System.Diagnostics;


namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch stopWatch = new Stopwatch();
     
            stopWatch.Start();
            for (long i = 0; i < 1000000000; i++)
            {
                bool flag = i % 2 == 1;
                int a;
                long b;

                if (flag)
                {
                    a = 1;
                    b = i + a;
                }
                else
                {
                    a = 2;
                    b = i + 1;
                }
            }

            stopWatch.Stop();
            Console.WriteLine("If statement: {0}", stopWatch.ElapsedMilliseconds);

            stopWatch.Restart();
            for (long i = 0; i < 1000000000; i++)
            {
                bool flag = i % 2 == 1;
                int a = flag ? 1 : 2;
                long b = flag ? i + a : i + 1;
            }
            stopWatch.Stop();
            Console.WriteLine("Ternary operator: {0}", stopWatch.ElapsedMilliseconds);
        }
    }
}



Вот результаты (прошу прощения что не в таблице, просто скопипастил из консоли):


If statement: 9102
Ternary operator: 9045

If statement: 9043
Ternary operator: 9005

If statement: 9075
Ternary operator: 9001

If statement: 9034
Ternary operator: 9005

If statement: 9037
Ternary operator: 9000

If statement: 9035
Ternary operator: 8994

If statement: 9029
Ternary operator: 8994

If statement: 9056
Ternary operator: 9047

If statement: 9030
Ternary operator: 9009

If statement: 9035
Ternary operator: 8998

If statement: 9035
Ternary operator: 9027

If statement: 9138
Ternary operator: 8999

Для продолжения нажмите любую клавишу . . .


Спасибо Вам за подтверждение моей гипотезы об оптимизации в простых сценариях! Иначе я бы плохого мнения о компиляторе C# .
Обновленная версия теста подтверждает что в более сложных случаях, тернарный оператор может дать выигрыш в производительности.
Буду благодарен всем кто примет участие в дальнейшем обсуждении данного вопроса.

Еще хочу всех призвать относиться к результатам теста с научной толерантностью. Почитайте про базон Хигса.

Никто из ученых не говорил, что обнаружен Базон. Она говорили следующее:


Оба детектора наблюдали новую частицу с массой около 125—126 ГэВ с уровнем статистической значимости 5 сигма.



В марте 2013 года учёные ЦЕРН пришли к выводу, что открытая ими в июле 2012 года частица действительно является бозоном Хиггса[24][25]. Однако ещё не установлено точно, является ли эта частица бозоном Хиггса, предсказанным Стандартной моделью, или это другой вариант бозона Хиггса, о котором говорят некоторые другие теории, выходящие за рамки Стандартной модели


Ученые давно ушли от пустых спором. Наделали формальные теории, объясняющие некоторое подмножество экспериментальных данные. И каждое утверждение делается в рамках конкретной теории. И может быть подтверждено или опровергнуто формальными логическими выкладками конкретной теории. Утверждения из разных теорий могут противоречить друг другу (давать различный прогнозы), но никто об этом не спорит. Все сидят по своим теориям тихо. К сожалению темы данного форума не всегда вписываются в рамки какой-либо формальной научной теории. Споров поэтому не избежать. Но это и нормально в них рождается истина. Но давайте помогать друг другу в этом споре находить для себя полезное!

Все что я говорю это мои гипотезы и неформальные рассуждения основанные на моем опыте. Я могу везде добавлять умные слова (уже приходится) что это только мои гипотезы и нечего более. Но вряд ли это что то изменит. Я думаю это должно подразумеваться по умолчанию. Мои эксперименты тоже по большому счету ни о чем не говорят. Каждый программист может их провести сам и сделать свои ценные для себя выводы. И у каждого будут свои выводы. Возможно такие же как у меня, возможно такие как у кого-нибудь из Вас, возможно вообще никакие, возможно какие-то другие. Сколько людей столько и мнений. В этом нет ничего плохого. Я никого не пытаюсь насильно заставить думать так же как и я. Я такой же человек как Вы, могу ошибаться могу заблуждаться. И для будет очень ценно если при разговоре с вами я открою что-то новое. Надеюсь для вас аналогично. Уже открыл. Спасибо всем! Прошу прощения если кому-то испортил настроение.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: Тернарный оператор в императивных языках
От: nullxdth Россия  
Дата: 05.06.13 13:59
Оценка:
Здравствуйте, Кодт, Вы писали:

К>В питоне тип None (аналог void) — обычное значение.

None в Python — не аналог void (как в C/C++). None — это значение, тогда как void — отстутсвие оного.
Вообще весьма не корректно говорить, что некоторая функция возвращает void, потому что мы не можем никак с этим работать — не возможно использовать в выражениях, не возможно использовать справа от операций присваивания.

К>Так что это вопрос синтаксиса, в большей степени, нежели вопрос семантики.

Нет. Это именно вопрос семантики.
В Python нет специального ключевого слова для определения отсутствия значения.
Т.е. не возможно написать в Python функцию, которая ничего не возвращает, а в C/C++ можно.

К>В руби и питоне "всё есть выражение" — это способ упрощения модели языка.

В Ruby — да, а в Python — нет. И это вовсе не упрощения. Это дизайн такой.
В Python, как минимум, опреации присваивания ничего не возвращают, конструкции for ... in и if (не однострочный if) — тоже. И, на мой взгляд, это недостаток.

К>Кстати, в питоне 2.x — print является не выражением, а стейтментом.

К>Написать x = (print "foo") нельзя.
Верно. Это как раз подтверждает тот факт, что в Python не всё есть выражение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.