41

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

як початківець, що так зробить, ...

Я якраз той початківець, котрому на уроках інформатики в школі вчителька показала goto і з цим я пішов далі в життя, використовував "це" на роботі і був за це висміяний. Хоча я тоді ще не був програмістом, лише аналітиком із скілами SQL + Visual Basic для Excel.

P.Y. написав:

узагалі дожив до молодшого програмістського віку — по ідеї, він не пережив би і власного дитинства, коли, граючись у пісочниці, наївся піску, запив водою, заїв цементним порошком і на додачу взягнув на голову поліетиленовий пакет від нього.

А це було кумедно, хоч і не про мене ))

42

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

Коротше, з Вас десять рядків страшного (проте, робочого) коду, який неможливо застосувати комерційно. Самі завели тему в офтоп — то тепер з офтопу і виводьте.

Не обіцяю, бо трохи (за)багато різного в ту-ду. Але в малих тімах де "погроміст" також заправляє картриджі і миє вікна - всяке можливо.

43

Re: Код мінус соціум: у пошуках сенсів та форм

Треба сказати, BASIC з goto таки був позитивним явищем у певних аспектах: на початковому рівні це знижувало поріг входження, і хоча б неякісний код міг писати абсолютно кожен — перешкодою була лише відсутність самого комп'ютера, а балачки про «програмування — не для всіх» почалися тоді, коли це страшне goto зійшло зі сцени.

Подякували: Tarpan87, flatliner2

44

Re: Код мінус соціум: у пошуках сенсів та форм

Приклади навчального коду мовою С з goto від M$ існують, а індуси казяться - яка це сташна некрасива неправильна річ, бо боротися з goto легко. Бажаючих відмовитися від критичних секцій на користь атомарних операцій чи обмежити кількість потоків застосунку набагато менше. Якщо ви так не любите древні бейсики 80-х, більшість з яких надавала прямий доступ до обладнання в інтерактивному режимі, то може не в бейсиках справа, а в вашому гидотному коді на них? Може вас чмирили цими бейсиками, що у вас непозбувна goto бентега? До Дейкстри питань нема, який goto вважає шкідливим, але ж ми тут і близько не Дейкстра.

45 Востаннє редагувалося frz (11.05.2023 18:57:40)

Re: Код мінус соціум: у пошуках сенсів та форм

Tarpan87 написав:

непозбувна goto бентега

Треба десь записати в перелік крилатих висловів. Я тоді й не мав поняття, що це чимось погане, посміялися і забули (одразу перестав використовувати ґото після зауваження).

46

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

Коротше, з Вас десять рядків страшного (проте, робочого) коду, який неможливо застосувати комерційно. Самі завели тему в офтоп — то тепер з офтопу і виводьте.

До речі, взимку цього року я прямо працедавцеві і сказав, що вивчатиму мову програмування на шизопроєктах, які не мають комерційного застосування. Тому маю досить коду для цієї теми;

%%encoding: uft8

%Існує високоорганізоване місто, яке вирішило присвоїти номери кожному своєму відділу: поліції, санітарному та пожежникам.
% 
%* Номер кожного відділу повинен бути в межах від 1 до 7 (включно)
%* Всі три номери мають відрізнятися між собою
%* Сума номерів має складати 12
%* Шеф поліції не любить непарні числа та хоче мати парний номер для свого відділу
% 
% Програма виводить всі можливі комбінації номерів відділів, які підпадають під цю умову


get_departament_numbers() ->
    [{{police, X}, {sanitation, Y}, {fire, Z}} || X <- lists:seq(1, 7), Y <- lists:seq(1, 7), Z <- lists:seq(1, 7), X =/= Y, X =/= Z, Y =/= Z, (X + Y + Z) =:= 12, (X rem 2) =:= 0].


write_departament_number_table(List, Index) when is_list(List), is_integer(Index), length(List) > 0, Index > 0, Index =< length(List) ->
    {{police, Police}, {sanitation, Sanitation}, {fire, Fire}} = lists:nth(Index, List),
    io:fwrite("#~p Поліція=~p Санітарія=~p Пожежники=~p~n", [Index, Police, Sanitation, Fire]),
    if Index =:= length(List) -> ok; true -> write_departament_number_table(List, Index + 1) end.

write_departament_number_table(List) when is_list(List), length(List) > 0 ->
    write_departament_number_table(List, 1).

    
main(_) ->
    io:setopts([{encoding, utf8}]),
    Msg = "Існує високоорганізоване місто, яке вирішило присвоїти номери кожному своєму відділу: поліції, санітарному та пожежникам.
 
* Номер кожного відділу повинен бути в межах від 1 до 7 (включно)
* Всі три номери мають відрізнятися між собою
* Сума номерів має складати 12
* Шеф поліції не любить непарні числа та хоче мати парний номер для свого відділу
 
Програма виводить всі можливі комбінації номерів відділів, які підпадають під цю умову~n~n",
    io:fwrite(Msg),
    Numbers = get_departament_numbers(),
    write_departament_number_table(Numbers),
    io:nl().

47

Re: Код мінус соціум: у пошуках сенсів та форм

Але справжній некомерційний позасоціальний байтойбський код оцей:

% Програма моделювання одновимірних клітинних автоматів

%% encoding: utf8

get_bit(Index, Bits) when is_bitstring(Bits), is_integer(Index), Index >= 0, Index < bit_size(Bits) ->
  <<_:Index, Val:1, _/bitstring>> = Bits,
  Val.


get_state(Index, Bits) when is_bitstring(Bits), is_integer(Index), Index >= 0, Index < bit_size(Bits) ->
  get_bit(Index, Bits);

get_state(Index, Bits) when is_bitstring(Bits), is_integer(Index), (Index =:= -1) orelse (Index =:= bit_size(Bits)) -> 0.


get_state_wide(Index, Bits) when is_bitstring(Bits), is_integer(Index), bit_size(Bits) > 0, Index >= 0, Index < bit_size(Bits) -> 
  get_state_wide(Index, Bits, 0, 0).

get_state_wide(Index, Bits, 3, Acc) when is_bitstring(Bits), is_integer(Index), bit_size(Bits) > 0, Index >= 0, Index < bit_size(Bits) -> Acc;

get_state_wide(Index, Bits, Rel, Acc) when is_bitstring(Bits), is_integer(Index), bit_size(Bits) > 0, Index >= 0, Index < bit_size(Bits) -> 
  get_state_wide(Index, Bits, Rel + 1, Acc + get_state(Index + Rel - 1, Bits) * trunc(math:pow(2, (2 - Rel)))).


next_state(WideState, Rule) when is_integer(WideState), is_integer(Rule), WideState >= 0, WideState < 8, Rule < 256, Rule >= 0 -> 
  get_bit(7-WideState, <<Rule:8>>);

next_state(Bits, Rule) when is_bitstring(Bits), is_integer(Rule), Rule < 256, Rule >= 0, bit_size(Bits) > 0 ->
  << << (next_state(get_state_wide(X, Bits), Rule)):1 >> || X <- lists:seq(0, bit_size(Bits)-1) >>.


gen_state(Bits, Rule, Count) when is_bitstring(Bits), is_integer(Rule), is_integer(Count), Rule < 256, Rule >= 0, bit_size(Bits) > 0, Count > 0 ->
  gen_state_loop(Rule, Count-1, [Bits]).

gen_state_loop(Rule, 0, Acc) when is_integer(Rule), is_list(Acc), Rule < 256, Rule >= 0 -> lists:reverse(Acc);

gen_state_loop(Rule, Reminder, Acc)
  when is_integer(Rule), is_list(Acc), is_integer(Reminder), Rule < 256, Rule >= 0, Reminder > 0 ->
  [Prev|_] = Acc,
  gen_state_loop(Rule, Reminder-1, [next_state(Prev, Rule)|Acc]).


write_state(Bits) when is_bitstring(Bits), bit_size(Bits) > 0 ->
  Symbols = ".O",
  io:fwrite([lists:nth(get_bit(X, Bits) + 1, Symbols) || X <- lists:seq(0, bit_size(Bits) - 1)] ++ "~n");

write_state([]) -> ok;

write_state([H|T]) -> write_state(H), write_state(T).

read_rule() ->
  Input = io:fread("Введіть правило (ціле число від 0 до 255 включно): ", "~d"),
  case Input of
      {ok, [Rule]} when Rule < 256, Rule >= 0 -> Rule;
      _ -> io:fwrite("Помилка вводу. Спробуйте ще раз.~n~n"), read_rule()
  end.

read_gens() ->
  Input = io:fread("Введіть кількість поколінь (ціле число від 1 до 80 включно): ", "~d"),
  case Input of
      {ok, [Gens]} when Gens =< 80, Gens > 0 -> Gens;
      _ -> io:fwrite("Помилка вводу. Спробуйте ще раз.~n~n"), read_gens()
  end.
  
read_state() ->
  io:fwrite("Введіть початковий стан (крапка означає порожню кілтинку, а латинська велика літера Х означає заповнену клітинку).~n"),
  Input = lists:droplast(io:get_line("")),
  case Input of
      "" -> io:fwrite("Ввід порожній. Спробуйте ще раз.~n~n"), read_state();
      _ ->
        Valid = lists:all(fun(X) -> X =:= $. orelse X =:= $X end, Input),
        if Valid -> << << (if I =:= $X -> 1; true -> 0 end):1 >> || I <- Input >>; true -> io:fwrite("Стрічка містить зайві символи. Спробуйте ще раз.~n~n"), read_state() end
  end.
    
main(_) -> 
  io:setopts([{encoding, unicode}]),
  io:fwrite("Програма моделювання одновимірних клітинних автоматів~n~n"),
  State = read_state(),
  Gens = read_gens(),
  Rule = read_rule(),
  Picture = gen_state(State, Rule, Gens),
  write_state(Picture),
  io:nl().
Подякували: P.Y.1

48

Re: Код мінус соціум: у пошуках сенсів та форм

Tarpan87 написав:

древні бейсики 80-х, більшість з яких надавала прямий доступ до обладнання в інтерактивному режимі

А ще там можна було робити підпрограми в машинному коді. Що мене завжди добивало: незрозуміло, як це використати в «дитячій» мові, де багатьох елементарних речей нема взагалі. Вбудований асемблер назразок турбопаскалівського був би більш доречним — там, принаймні, можна зрозуміти, що робиш. Втім, це все одно не вирішувало проблеми відсутності вказівників та інтерпретованості мови — викликати низькорівневі команди з бейсік-програми було можливо, а, наприклад, повісити бейсік-підпрограму на якесь переривання — вже ні (а втім, не виключено, через машинні коди її можна було і таким чином вивернути. Звідки бейсік-програмісти брали машинний код?..)

49

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

Треба сказати, BASIC з goto таки був позитивним явищем у певних аспектах: на початковому рівні це знижувало поріг входження, і хоча б неякісний код міг писати абсолютно кожен — перешкодою була лише відсутність самого комп'ютера, а балачки про «програмування — не для всіх» почалися тоді, коли це страшне goto зійшло зі сцени.

Tarpan87 написав:

Приклади навчального коду мовою С з goto від M$ існують, а індуси казяться - яка це сташна некрасива неправильна річ, бо боротися з goto легко. Бажаючих відмовитися від критичних секцій на користь атомарних операцій чи обмежити кількість потоків застосунку набагато менше. Якщо ви так не любите древні бейсики 80-х, більшість з яких надавала прямий доступ до обладнання в інтерактивному режимі, то може не в бейсиках справа, а в вашому гидотному коді на них? Може вас чмирили цими бейсиками, що у вас непозбувна goto бентега? До Дейкстри питань нема, який goto вважає шкідливим, але ж ми тут і близько не Дейкстра.

Я не уявляю, де в сучасному коді може знадобитися goto: елементарний return з успіхом закриває практично всі кейси, а є ще try і т.п.!

Під час навчання я використав goto один раз: але то був Паскаль (там нема return) і програмування на швидкість.
В комерційних проєктах зустрів використання goto в імітації C++ засобами C: там в кінці функції була секція яка імітувала виклики деструкторів і повертатися з функції треба було строго через goto на цю секцію.

Тобто goto -- це радше данина традиції оскільки він просто непотрібен.
Можливо для якоїсь адської оптимізації, але в C є ще потужний оператор switch.
Тобто в 99.99999999999999999.....% випадках goto -- ознака неправильно структурованого коду.

50

Re: Код мінус соціум: у пошуках сенсів та форм

Звісно, відсутність goto сама по собі не гарантує адекватність коду: я якось стикнувся з взаємно рекурсивним викликом двох Visitor-ів наприклад. Але наявність goto практично завжди гарантує його неадекватність.

51

Re: Код мінус соціум: у пошуках сенсів та форм

Tarpan87 написав:

Приклади навчального коду мовою С з goto від M$ існують

Зрозуміло, що якощо є така фіча, то можуть бути й приклади. Але скоріш за все там зазаначається, що краще її не використовувати.

Tarpan87 написав:

а індуси казяться - яка це сташна некрасива неправильна річ, бо боротися з goto легко.

Тут ми бачимо розпалення міжнаціанальної ворожнечі https://replace.org.ua/rules/#rule-2-7
Та образи якщо не на адресу користувачів форума, то на адресу українських програмістів https://replace.org.ua/rules/#rule-2-4

Tarpan87 написав:

До Дейкстри питань нема, який goto вважає шкідливим, але ж ми тут і близько не Дейкстра.

Ви тут звісно й близько не Дейкстра. Але у вас виходить, що українські програмісти мають дослухатися порад Tarpan87, а не Дейкстри, і якщо ви вважаєте себе "українськими програмістами", то у вас виходить, що українське АйТі впринципі не може розвиватися: український програміст впринципі не може бути рівня Дейсктри і навіть наслідувати кращі практики він теж не може. Це типове совкове ставлення, тому нажаль при такій кількості кодерів, українських проєктів світового рівня вкрай мало. В совків найбільшим соціальним досягненням вважається обісрати людську думку. Совкам потрібен ідеальний продукт на вчора. І вони ще подивляться, розстріляти автора чи заслати в ГУЛАГ. Тому просто висловити ідею -- це вже є певне досягнення. Це значить -- не боятися совкового бидла.

52

Re: Код мінус соціум: у пошуках сенсів та форм

Головна претензія до Дейкстри полягає в тому, що він жив ще в гоутушні динозаврячі часи і просто не бачив, як люди пишуть макаронний код без жодного goto. Так, тоді могло здаватися, що достатньо забрати з мови це ключове слово, щоб криворукі програмісти стали писати нормальний код. Зараз ми бачимо, що ні, бачення тих часів помилкове, а відмова від goto може спонукати як до написання правильно структурованого коду, так і до написання макаронного коду, побудованого на рекурсії — який від коду з goto відрізняється хіба що перевитратою машинних ресурсів. До речі, в ті часи рекурсія була рідкісним делікатесом, який ще не всі тогочасні мови підтримували. Можливо, якщо заборонити одночасно і goto, і рекурсію, ідея Дейкстри  спрацює.

Re: Код мінус соціум: у пошуках сенсів та форм

У Вас як завжди каша і суміш грішного з праведним бо Ви як завжди не здатні усвідомити ані написаного, ані те що пишите самі.

Рекурсія не є неадкватним інструментом сама по собі і паттерн Візітор також (якщо це Вам про щось каже). Паттерн Візітор -- це подвійна диспетчеризація тобто подвійно віртуальний виклик, на практиці необхідний вкрай нечасто. Взаємно рекурсивний виклик двох Візіторів -- це зновужтаки в 99.99999999999999999.....% випадків необґрунтоване переускладнення.

goto є неадкватним інструментом сам по собі і тільки в мізерній кількості випадків його використання може бути виправданним. Тоді бажано це обґрунтовати в коментарі до коду.

Наведіть будь ласка приклад, коли використання goto є виправданним і який виграш це дає в порівнянні з халяльними засобами. Дякую.

Прихований текст

Від програмування тут -- goto, а від української мови "пензлювати" "насєлєніє" і т.п. косорило-школотний суржик

54

Re: Код мінус соціум: у пошуках сенсів та форм

Я так розумію, Марат узявся репостити нашу писанину на інший форум, а відповіді звідти — сюди? Ну, ОК.

Veladodge написав:

Можливо для якоїсь адської оптимізації, але в C є ще потужний оператор switch.

Елементи case поводяться як мітки, тому switch можна вважати певним аналогом goto чи засобом для емуляції goto (і в інвалідизованій мові назразок Java це найпростіший спосіб заміни goto). От з точки зору оптимальності — не знаю, під капотом у switch може бути як перехід на  обчислювану мітку, так і дерево з галужень типу if — тоді як goto компілюється в простий jmp, тому обігнати його switch'ем навряд чи вийде. А от що робити нещасним пітоністам, які не мають ні switch, ні goto? (Втім, goto можна ввімкнути додатково встановлюваним модулем, але це вже чітерство).

Veladodge написав:

Під час навчання я використав goto один раз: але то був Паскаль (там нема return) і програмування на швидкість.

В паскалі є exit.

Veladodge написав:

Я не уявляю, де в сучасному коді може знадобитися goto: елементарний return з успіхом закриває практично всі кейси, а є ще try і т.п.!

Якщо йдеться про багаторівневі виходи з циклу, то ідеальною заміною є break з міткою, але так може тільки Java; ще деякі мови дозволяють break на вказану кількість рівнів, але, знову ж, це локальна екзотика. Винесення багаторівневого циклу в окрему функцію — відомий обхід, але може бути незручно з точки зору використання спільних змінних. Робити це через виключення — інколи має сенс, але тільки якщо виключення використовується як виключення (тобто, це не raise/throw в сенсі goto, а там справді стається подія, після якої слід завершити цикл). Ще, звичайно, є варіант з «прапорцями» (булевими змінними, за допомогою яких можна організувати взаємодію між зовнішнім та внутрішнім циклом, щоб достроково їх завершити).

Потреба в goto може бути, наприклад, в автоматично генерованому коді якогось транслятора — коли на вході текст на одній мові програмування, на виході — текст на іншій, і розбиратися з локальними заморочками кожної мови стає дещо накладно. Особливо якщо вхідна мова являє собою якесь леґасі з часів, коли goto було нормою.
Або ще, наприклад, обхід синтаксичного дерева зі складною структурою — код програми тоді можна структурувати подібно до цього дерева (тут «макаронність» — не баг, а фіча).
Втім, так — сфера застосування goto досить обмежена, задачі доволі специфічні. Загалом, це низькорівневий засіб, без якого здебільшого можна обійтись, але інколи він стає необхідним.

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

Я так розумію, Марат узявся репостити нашу писанину на інший форум, а відповіді звідти — сюди? Ну, ОК.

Ви як завжди нічого не зрозуміли.


P.Y. написав:

В паскалі є exit.

Точно! Але то як я казав було програмування на швидкість, і я вирішив написати так а не виносити код в окрему процедуру.

P.Y. написав:

Потреба в goto може бути, наприклад

Можна будь ласка конкретний приклад. Бо я наприклад робив автоматичну генерацію блок-схем з пасклівського коду і парсинг файлу бази даних (не маючи документації на формат файлу). Але де там використати goto я при всьому бажанні не можу уявити. Я гадаю, що для цього треба мати специфічне "ковбасне" мислення, коли програма являє собою кашу з всього підряд. Із зміною сенсу змінних на додачу...

P.Y. написав:

goto компілюється в простий jmp, тому обігнати його switch'ем навряд чи вийде

goto компілюється в простий jmp якщо це перехід наприклад на початок циклу себто якщо нічого "переключати" непотрібно.
Я припускаю, що реалізація switch-а за допомогою goto ніякого виграшу не дасть, а скоріш за все дасть лише програш.

P.Y. написав:

Винесення багаторівневого циклу в окрему функцію — відомий обхід, але може бути незручно з точки зору використання спільних змінних.

Прикольне мислення адептів goto: для них структурне програмування -- це обхід заборони goto :D
Попіл goto б'є в їхніх серцях!

Це не "обхід": багаторівневий цикл з середини якого треба виходити повернувши результат -- це однозначно функція. Якщо такий код не виділяти в окрему функцію, то що тоді взагалі?!

З try -- те саме: це не "заміна goto" а фіча яка просто виключає випадки коли без goto неможна обійтися.

Щодо спільних змінних, то в ООП такої проблеми нема взагалі, є ще глобальні змінні (тут треба бути обережним, але в якраз програмах з goto з цим повний ахтунг) і параметри функції: нічого неможливого. Відмова від goto спонукає структурувати код. Ім'я функції має казати, що вона робить, а її код -- як вона це робить. З goto -- це є дещо нечленороздільне.

P.Y. написав:

А от що робити нещасним пітоністам, які не мають ні switch, ні goto?

Навіть не знаю як вони кодять, без goto :D
switch там можна реалізуати іншими засобами, хоча це не буде повним аналогом того що в C.
Однак goto-шність switch-а в більшості випадках є багою а не фічею.
Зазвичай кожен case завершується break-ом.

Отже чекаємо від вас, шановні реплейсяни, конкретні приклади, де програмісту може знадобитися goto і які переваги це йому дасть.

Re: Код мінус соціум: у пошуках сенсів та форм

Королівство Русь написав:
P.Y. написав:

goto компілюється в простий jmp, тому обігнати його switch'ем навряд чи вийде

goto компілюється в простий jmp якщо це перехід наприклад на початок циклу себто якщо нічого "переключати" непотрібно.
Я припускаю, що реалізація switch-а за допомогою goto ніякого виграшу не дасть, а скоріш за все дасть лише програш.

Сорян, некоректно висловився: goto звісно компілюється в простий jmp, але P.Y. як справжній реплейсянин пересмикує, бо ми кажемо про умовний перехід. Умовний перехід чистим goto реалізувати неможливо. Тому доведеться писати ті самі if - else. Я підозрюю, що оператор switch може це зробити ефективніше вирахувавши адресу наприклад.

Порівняти безумовний goto можна наприклад з break. Переваги break очевидні.

goto -- це точно що "код мінус соціум" :D

Re: Код мінус соціум: у пошуках сенсів та форм

P.Y. написав:

Треба сказати, BASIC з goto таки був позитивним явищем у певних аспектах: на початковому рівні це знижувало поріг входження, і хоча б неякісний код міг писати абсолютно кожен — перешкодою була лише відсутність самого комп'ютера, а балачки про «програмування — не для всіх» почалися тоді, коли це страшне goto зійшло зі сцени.

«програмування — не для всіх» але кодять всі підряд.
Себто поріг входження насправді знизився.

Пам'ятаю, перейшов у нову школу, де програмування вивчали вже рік, але на олімпіаду відправили мене, хоч я його вивчав пару місяців. Структурне програмування ніякої проблеми не становить. В вузі спершу важко було перекрутити мізки на ООП, але зновужтаки, нічого неможливого нема.

58 Востаннє редагувалося P.Y. (04.06.2023 23:12:14)

Re: Код мінус соціум: у пошуках сенсів та форм

Королівство Русь написав:

Умовний перехід чистим goto реалізувати неможливо.

Від мови залежить. Якщо goto вміє переходити на обчислювану мітку, то це цілком собі умовний перехід, що синтаксично виглядає як goto. Втім, це таки екзотика.

Ось, наприклад, код для пакетного файла з обчислюваною міткою:

@choice /m "Do you love my code?"
@goto %errorlevel%
:1
@echo I love your code too! & goto :eof
:2
@echo I hate you! & goto :eof

Re: Код мінус соціум: у пошуках сенсів та форм

Ще прикол: власний комп'ютер в мене з'явився коли я вже завершив навчання.
Програмування на листочку -- ось де справжній хардкор!

Ну а поняття "алгоритму" виникло за 1000 років до появи комп'ютерів!
Боюся, Аль-Хорезмі goto теж не використовував :D

Себто комп'ютерна програма це є текст призначений і для людини і для машини, і вона має бути наближена для алгоритму описаного людською мовою. Високорівневі засоби покликані якраз для цього. Код з goto -- це такий собі "псевдокомп'ютерний підхід" з одного боку незрозумілий людям з іншого -- неефективний з т.з. машини. Наприклад у Бейсику треба було городити купу глобальних змінних, котрі непотрібні одночасно, себто неефективно використовувалася пам'ять.

Отже, грамотний код з goto -- це структурне програмування, грамотне структурне програмування -- це об'єктно орієнтоване програмування. По суті кожен наступний етап еволюції програмування -- це best practices попереднього, а не тому що "індуси казяться" :D

P.Y. написав:
Королівство Русь написав:

Умовний перехід чистим goto реалізувати неможливо.

Від мови залежить. Якщо goto вміє переходити на обчислювану мітку, то це цілком собі умовний перехід, що синтаксично виглядає як goto. Втім, це таки екзотика.

Ось, наприклад, код для пакетного файла з обчислюваною міткою:

@choice /m "Do you love my code?"
@goto %errorlevel%
:1
@echo I love your code too! & goto :eof
:2
@echo I hate you! & goto :eof

По-перше це чергове пересмикування реплейсянина.
Розмова була про те що goto мовляв компілюється в асемблерну команду jmp і тому він мовяв ефективніший за switch.
А приклад наведений -- bat файлу, себто це є набір КОНСОЛЬНИХ команд!
Які звісно ні в який машинний код не компілюються: це є юзерські команди, які можна набирати прямо в консолі ОС.
Тобто приклад максимально далекий від машинних команд, цей goto -- навіть не оператор строго кажучи, але для реплейсян канає: от у чому реплейсяни молодці, так це в підміні понять!

По-друге пересмикування ще й в тому, що синтаксис bat файлів -- вкрай примітивний. Можливо це є єдиний випадок окрім Бейсика де дійсно може виникнути необхідність в goto :D Наприклад bash-скрипти (аналог bat файлів у Linux) -- достатньо розвинута мова і там є повноцінний перемикач, котрий називається оператор case.

Коротше, "реплейсянин мінус соціум"(тм) звивається як вуж на пательні :D

Королівство Русь написав:

Отже чекаємо від вас, шановні реплейсяни, конкретні приклади, де програмісту може знадобитися goto і які переваги це йому дасть.

Реплейсяни пропонують нам писати програми bat-файлами або на Бейсику, бо там без goto дійсно не обійтися :D

60

Re: Код мінус соціум: у пошуках сенсів та форм

Королівство Русь написав:

Розмова була про те що goto мовляв компілюється в асемблерну команду jmp і тому він мовяв ефективніший за switch.
А приклад наведений -- bat файлу, себто це є набір КОНСОЛЬНИХ команд!

Королівство Русь написав:

По-друге пересмикування ще й в тому, що синтаксис bat файлів -- вкрай примітивний.

Ну, насправді синтаксис машинних команд такий же примітивний — у багатьох випадках в асемблерному коді доводиться використовувати ті ж підходи, що й у програмі на класичному бейсіку чи в батнику.

Якщо говорити про обчислювані мітки, то, наприклад, в системі команд 86-го процесора така можливість є. Власне, при компіляції switch може генеруватися код, що їх використовує.

.data
L DW L0, L1, L2 ; масив адрес переходу

.code 
....
JMP L[AX] ; AX має бути в діапазоні 0...2
L0: ; дії, якщо AX=0
...
L1: ; дії, якщо AX=1
...
L2: ; дії, якщо AX=2
...