Re: Что такое синтаксический сахар
От: VGn Россия http://vassilsanych.livejournal.com
Дата: 19.01.08 03:48
Оценка:
M>Может мне кто-нибудь объяснить, что такое "синтаксический сахар"?

То без чего можно программировать, но трудно пить чай.
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[19]: Что такое синтаксический сахар
От: lse  
Дата: 23.01.08 12:31
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, IT, Вы писали:


IT>>Ты плохо читал моё определение, если вообще читал. Я подчеркнул, что речь должна идти об одном и том же языке. Вы же с автором топика почему-то всё время скатываетесь на Тьюринга, ассемблер, железо и молекулы.


VD>Я хорошо читал. Потому и говорил не об cmp, mov и т.п., а о goto, if и присвоении. Эта база есть почти в любом языке и ее достаточно для эмуляции любых фич. Если бы это было не так, то на первых Васиках нельзя было бы программировать.


VD>Исходя из твоего определения все кроме этих инструкций можно считать сахаром.


VD>Дело тут не в моих докапываниях, а в том, что ты сам не можешь дать точного определения данному термину.


VD>На самом деле, в это определение нужно добавить еще одну фаруз. Что-то вроде: "Вносящее несущественные изменения в язык.". Но такое определение само по себе очень сильно зависит от IMHO-в.


Да, пожалуй это уточнение во многом соответствует приближению данного выше определения к установишимся понятиям о "сахаре". Но все-таки это еще не все.
Например, foreach в java вроде бы по общему признанию является сахаром над стандартным циклом for.

foreach (Test test : elements)
{
    foo(test);
}

//или
for (int i=0; i<elements.length(); i++)
{
    foo(elements.get(i));
}



В то же время, например, почему-то никто не считает while сахаром на if и goto. Почему? Только ли потому, что goto в java не существует, хотя и зарезервирован? Мне кажется, нет.

Псеводява:
while (res)
{
    res = foo();
}

//или
label:
res = foo();
if (res)
    goto label;


Почему в первом случае — это сахар, а во втором — нет? Только потому, что foreach вносит менее существенные изменения по сравнению с while? Или тут кроется еще что-то? Например то, что while был еще в древнем С, когда термина "синтаксический сахар" вроде не было, стал, так сказать, необходимым элементом любого языка. А foreach возник в тот момент, когда в мода на всякий "сахар" была в самом разгаре. Т. е. по сути, все тот же субъективизм, о котором говорили. Так что, ИМХО, точного определения таки дать нельзя.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[20]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 05:50
Оценка:
Здравствуйте, lse, Вы писали:

lse>В то же время, например, почему-то никто не считает while сахаром на if и goto. Почему? Только ли потому, что goto в java не существует, хотя и зарезервирован?

lse>Мне кажется, нет.
А мне кажется — да.

lse>Псеводява:

lse>//или
lse>label:
lse>res = foo();
lse>if (res)
lse> goto label;
lse>[/java]
Ну так в этой воображаемой псевдояве while и был бы сахаром. Если бы у бабушки было сами-знаете-что, то она была бы дедушкой. Если бы соль была сладкой, то она была бы сахаром.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 06:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:


lse>>В то же время, например, почему-то никто не считает while сахаром на if и goto. Почему? Только ли потому, что goto в java не существует, хотя и зарезервирован?

lse>>Мне кажется, нет.
S>А мне кажется — да.

lse>>Псеводява:

lse>>//или
lse>>label:
lse>>res = foo();
lse>>if (res)
lse>> goto label;
lse>>[/java]
S>Ну так в этой воображаемой псевдояве while и был бы сахаром. Если бы у бабушки было сами-знаете-что, то она была бы дедушкой. Если бы соль была сладкой, то она была бы сахаром.

Может быть. Ну тогда в С++, где goto есть, while будет являться сахаром. while и еще пол-языка. Ты согласен?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[21]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 06:35
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:


lse>>В то же время, например, почему-то никто не считает while сахаром на if и goto. Почему? Только ли потому, что goto в java не существует, хотя и зарезервирован?

lse>>Мне кажется, нет.
S>А мне кажется — да.

lse>>Псеводява:

lse>>//или
lse>>label:
lse>>res = foo();
lse>>if (res)
lse>> goto label;
lse>>[/java]
S>Ну так в этой воображаемой псевдояве while и был бы сахаром. Если бы у бабушки было сами-знаете-что, то она была бы дедушкой. Если бы соль была сладкой, то она была бы сахаром.

Можно еще следующим образом усилить определение, дополненное VladD2:

...служащее другой (более удобной) формой записи определенной конструкции языка.

Т. е. while тогда нельзя назвать сахаром, т к он получается путем комбинации различных конструкций, каждая из которых НЕ ПРЕДНАЗНАЧЕНА только лишь для организации циклов. С помощью этих же выражений можно всю программу написать, а не просто организовать цикл. А вот foreach будет являться сахаром, т к по сути, служит другой формой записи конструкции, служащей (в общем) ТОЛЬКО для определения циклов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[22]: Что такое синтаксический сахар
От: VoidEx  
Дата: 24.01.08 06:58
Оценка: +1 :)
Здравствуйте, lse, Вы писали:

lse>С помощью этих же выражений можно всю программу написать

Я уже привел пример, что нет.
Но вот while действительно получается сахаром.
Re[22]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 08:39
Оценка: :)
Здравствуйте, lse, Вы писали:
lse>Может быть. Ну тогда в С++, где goto есть, while будет являться сахаром. while и еще пол-языка. Ты согласен?
Нет, не согласен. Покажи мне эти пол-языка. Не надо преувеличивать мощность goto.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[22]: Что такое синтаксический сахар
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 24.01.08 08:39
Оценка:
Здравствуйте, lse, Вы писали:

lse>Может быть. Ну тогда в С++, где goto есть, while будет являться сахаром. while и еще пол-языка. Ты согласен?


всякие циклы пришли из структурного программирования. Специально доказывалось, что при наличии в языке структурных конструкций можно программировать без goto. И в данном случае наличие goto это низкоуровневая оптимизация, типа ассемблрной вставки. Без goto вполне себе можно жить.
http://www.smalltalk.ru << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[23]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 08:40
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, lse, Вы писали:


lse>>С помощью этих же выражений можно всю программу написать

VE>Я уже привел пример, что нет.
VE>Но вот while действительно получается сахаром.

как это нет? if, goto, := — полная по Тьюрингу комбинация.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[23]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 09:10
Оценка: +1 -1
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:

lse>>Может быть. Ну тогда в С++, где goto есть, while будет являться сахаром. while и еще пол-языка. Ты согласен?
S>Нет, не согласен. Покажи мне эти пол-языка. Не надо преувеличивать мощность goto.

for, while, do...while, class, struct, определение функции (метода), вызов функции (метода) (с полной поддержкой стека), реализация виртуальных вызовов ...

все это можно реализовать полным по Тьюрингу набором — операторы присваивания (предполагающее, само-собой, наличия переменных), условного ветвления, перехода на метку. И согласно твоему определению, все это является сахаром.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[23]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 09:15
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Здравствуйте, lse, Вы писали:


lse>>Может быть. Ну тогда в С++, где goto есть, while будет являться сахаром. while и еще пол-языка. Ты согласен?


ANS>всякие циклы пришли из структурного программирования. Специально доказывалось, что при наличии в языке структурных конструкций можно программировать без goto. И в данном случае наличие goto это низкоуровневая оптимизация, типа ассемблрной вставки. Без goto вполне себе можно жить.


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

Я не против самого понятия "сахар" Я только против неверного определения этого понятия
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[24]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 09:30
Оценка:
Здравствуйте, lse, Вы писали:
lse>for, while, do...while, class, struct, определение функции (метода), вызов функции (метода) (с полной поддержкой стека), реализация виртуальных вызовов ...
Ничего, кроме операторов цикла, через goto реализовать не удастся.
lse>все это можно реализовать полным по Тьюрингу набором — операторы присваивания (предполагающее, само-собой, наличия переменных), условного ветвления, перехода на метку. И согласно твоему определению, все это является сахаром.
Нет. Сахар действует локально — он не приводит к переписыванию всей программы. Никаким goto ты не заменишь стейтмент, в котором определяется struct.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[24]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 09:30
Оценка: +1
Здравствуйте, lse, Вы писали:
lse>как это нет? if, goto, := — полная по Тьюрингу комбинация.
Сахар не имеет никакого отношения к полноте по Тьюрингу. Мы же говорим о синтаксическом сахаре — когда один синтаксис является альтернативой другому.
А ты говоришь, фактически, о трансляции в другой язык. К примеру, обработка CFront превратит C++ программу в C программу, но это не означает, что весь C++ состоит из сахара, дополнительного к C++. Потому, что нельзя применить CFront к части исходников, и надеяться, что остальная часть станет работать. К примеру, отказ от встроенной в компилятор поддержки VMT потребует переписать все места вызова метода.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[25]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 10:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:

lse>>как это нет? if, goto, := — полная по Тьюрингу комбинация.
S>Сахар не имеет никакого отношения к полноте по Тьюрингу. Мы же говорим о синтаксическом сахаре — когда один синтаксис является альтернативой другому.
S>А ты говоришь, фактически, о трансляции в другой язык. К примеру, обработка CFront превратит C++ программу в C программу, но это не означает, что весь C++ состоит из сахара, дополнительного к C++. Потому, что нельзя применить CFront к части исходников, и надеяться, что остальная часть станет работать. К примеру, отказ от встроенной в компилятор поддержки VMT потребует переписать все места вызова метода.

Все же я утверждаю, что можно именно заменить конкретные конструкции и писать сходным образом. См. ответ выше по ветке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[25]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 10:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:

lse>>for, while, do...while, class, struct, определение функции (метода), вызов функции (метода) (с полной поддержкой стека), реализация виртуальных вызовов ...
S>Ничего, кроме операторов цикла, через goto реализовать не удастся.

Можно.
Вот, например, определение и вызов функции. При каждом новом вызове функцию нужно модифицировать, это не нарушает определения функции.
int ret;
int param1;
int retVal;

// Определение функции
goto function_end;
function_begin:
//тело функции
if (param1==1)
    retVal=1;
else
    retVal=0;
if (ret==0) // Это исключительно из-за того, что без метапрограммир.
    goto ret0;
else if (ret==1)
    goto ret1;
else if (ret==2)
    goto ret2;
...
function_end:

// Вызов функции
ret=0;
int oldParam=param1;
param1=1; // Передаваемый параметр
goto function_begin;
param1=oldParam; // Не забыть восстановить стек!
ret0:


Вот исключения не реализовать, это да.

lse>>все это можно реализовать полным по Тьюрингу набором — операторы присваивания (предполагающее, само-собой, наличия переменных), условного ветвления, перехода на метку. И согласно твоему определению, все это является сахаром.

S>Нет. Сахар действует локально — он не приводит к переписыванию всей программы.

Вот! Уже лучше. Все, что я хочу — это чтобы ты дополнил нужным образом свое же определение. Я, например, не знаю, как это можно сделать, поэтому интересно...
Но прошу заметить, что все, что я привел, не является переписыванием программы. Те же концепции, реализованные напрямую. Вызов функции, например.

S>Никаким goto ты не заменишь стейтмент, в котором определяется struct.


структура заменится списком, элементы списка будут эквивалентны полям структуры. Далее, работаешь со списком, используя адресную арифметику указателей. Можешь, конечно, возразить, что структура полностью определена в compile-time, а список только в runtime.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[26]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 11:30
Оценка: +2
Здравствуйте, lse, Вы писали:

S>>Никаким goto ты не заменишь стейтмент, в котором определяется struct.


lse>структура заменится списком, элементы списка будут эквивалентны полям структуры.

А ничего, что поля структуры могут иметь разный тип?
А ничего, что элементы списка собственно сами должны быть структурвми?
lse>Далее, работаешь со списком, используя адресную арифметику указателей.
Я же говорю — придется везде, где мы писали A.b писать некую другую хрень. Например, (int)next(next(A))). Нарушилась локальность.
lse>Можешь, конечно, возразить, что структура полностью определена в compile-time, а список только в runtime.
Угу. Вычислительная эквивалентность всем мозг проела. Забудьте про нее. Тезис Черча интересен только в плане проблемы P=NP. Новые языки программирования создаются не для того, чтобы изменить понятие вычислимости, а для того, чтобы сделать тексты более лаконичными.
Возможность обойтись без некоторой конструкции совсем не относится к сахару. Внутри CPU, как известно, ни шаблонов, ни операторов нет. Вопрос во внутренней структуре самого языка: является ли некоторая локальная синтаксическая конструкция эквивалентом другой?
for() в С++ является чистейшим сахаром для while(). А вот частичная специализация не является сахаром для ручного описания всех видов потребных функций.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[26]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 11:30
Оценка:
Здравствуйте, lse, Вы писали:
lse>Все же я утверждаю, что можно именно заменить конкретные конструкции и писать сходным образом. См. ответ выше по ветке.
Ничего сходного в ответе выше по ветке нет.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[27]: Что такое синтаксический сахар
От: lse  
Дата: 24.01.08 12:08
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, lse, Вы писали:


S>>>Никаким goto ты не заменишь стейтмент, в котором определяется struct.


lse>>структура заменится списком, элементы списка будут эквивалентны полям структуры.

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

Ни то, ни другое — не проблема. Первое лечится void* и приведением типов при обращении, второе — указателем на вложенный список. Только структура, полученная таким образом, и struct все-таки будут разными. Под struct-объекты память резервируется на этапе компиляции, это достаточно серъезное различие. Так что пример не катит, т к противоречит определению 1; т е struct — таки не сахар.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[19]: Что такое синтаксический сахар
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.08 12:50
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Поясни, плиз, что мне помешает это сделать? Ну, кроме объемов и запутаности получаемого кода? switch-и строются по двум принципам: на базе вложенных ифоф и на базе таблиц переходов. Обе концепции переписываются на if+goto+присоение. Машинный код будет полностью идетниченый. Не говоря уже о семантике.


The switch instruction implements a jump table. The format of the instruction is an unsigned int32 representing the number of targets N, followed by N int32 values specifying jump targets. These targets are represented as offsets (positive or negative) from the beginning of the instruction following this switch instruction.

The switch instruction pops a value off the stack and compares it, as an unsigned integer, to N. If value is less than N, execution is transferred to the target indexed by value, where targets are numbered from 0 (for example, a value of 0 takes the first target, a value of 1 takes the second target, and so on). If the value is greater than or equal to N, execution continues at the next instruction (fall through).

If the target instruction has one or more prefix codes, control can only be transferred to the first of these prefixes.

Control transfers into and out of try, catch, filter, and finally blocks cannot be performed by this instruction. (Such transfers are severely restricted and must use the leave instruction instead).

... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[28]: Что такое синтаксический сахар
От: Sinclair Россия https://github.com/evilguest/
Дата: 24.01.08 12:55
Оценка:
Здравствуйте, lse, Вы писали:
lse>Ни то, ни другое — не проблема. Первое лечится void* и приведением типов при обращении, второе — указателем на вложенный список.
Вот этого не понял. Кто куда указатель? Обычный список — просто куча структур (data, next). Из скаляра ты список не построишь.
lse>Только структура, полученная таким образом, и struct все-таки будут разными. Под struct-объекты память резервируется на этапе компиляции, это достаточно серъезное различие. Так что пример не катит, т к противоречит определению 1; т е struct — таки не сахар.
Дело даже не в том, как резервируется память. А в том, что к членам такой "псевдоструктуры" нельзя обратиться по имени через точку.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.