LINUX.ORG.RU

Объявлены победители 29 конкурса по написанию запутанного кода на языке Си

 , ,


0

4

Опубликованы исходные тексты работ, победивших в двадцать девятом конкурсе IOCCC (International Obfuscated C Code Contest), участникам которого предлагалось подготовить наиболее запутанный и трудноразбираемый код на языке Си. Участвующие в конкурсе работы, с одной стороны, должны препятствовать анализу кода и пониманию сути решаемой задачи, но, с другой стороны, код должен быть интересен и чем-то примечателен (работы могут быть необычно оформлены или выделять неожиданные стороны языка Си). Размер файла с кодом программы не должен превышать 4993 байтa, а чистый код не должен превышать 2503 байта после обработки утилитой iocccsize.

Среди победителей:

  • Эмулятор компьютера с архитектурой URISC, набор команд в котором ограничивается одной инструкцией SUBLEQ (SUbtract and Branch if Less than or EQual to zero). Размер эмулятора всего 366 байт, при том, что помимо CPU он эмулирует фреймбуфер с разрешением 800x512, используя для вывода графики библиотеку SDL3, и может загрузить образ с Linux и запустить в нём игру doom.
  • Генератор изображения чёрной дыры. Приложение включает простой интерпретатор для подмножества языка Fortran 66, программа для которого задана в форме перфокарт, закодированных через пробелы и табуляции в исходном коде. Закодированная Fortran-программа повторяет первый код для симуляции чёрной дыры, опубликованный Жан-Пьером Люмине в 1978 году. Изображение формируется в виде облака точек и сохраняется в формате PGM. Кроме симуляции чёрной дыры предложены варианты с закодированными «перфокартами» для расчёта множества Мандельброта, вычисления простых чисел и трассировки лучей.
  • Вариант утилиты patch, генерирующий утилиту diff через серию трансформаций собственного кода. На первом этапе скомпилированной утилите patch передаётся собственный исходных код, на основе которого формируется diff-файл. После применения этого diff-а к собственному коду на выходе получается программа, которая в цикле на основе своего кода генерирует набор коммитов с патчами в формате git am. При объединении данных коммитов командой git log --pretty=format:%s > final.c получается код с реализацией утилиты diff.
  • Игра (на скриншоте) в жанре Roguelike, работающая в текстовом терминале и позволяющая проходить автоматически генерируемый лабиринт, собирать артефакты и избегать монстров. Код оформлен в виде изображения подземного жителя и обфусцирован (строки зашифрованы, циклы реализованы через goto, при работе с массивами используется синтаксис «индекс[массив]»).
  • Генератор ASCII-анимации, воссоздающий заставку сериала «Доктор Кто» с симуляцией видеоэффекта «HowlRound» (туннель из уменьшающихся копий изображения), применявшегося в заставке 1963 года.
  • Эмулятор игровой приставки GameBoy, оптимизированный для запуска тетриса, но способный выполнять и другие игры (протестирован запуск ROM-файлов для десятка игр). Вывод формируется в форме псевдографики из Unicode-символов.
  • Симулятор звука морского прибоя на фоне автоматически генерируемой медитативной музыки. На выходе генерируется wav-файл, продолжительностью 5 минут.
  • Реализация самомодифицирующегося игрового автомата Quine Pong, предоставляющего две игры - пинг-понг и перепрыгивающий препятствия динозавр (как в пасхальном яйце из Google Chrome). Программа примечательна тем, что отображение кадров реализовано через цикличную перегенерацию кода программы (запуск приводит к выводу исходного кода для первого кадра, после компиляции этого кода формируется код для следующего кадра и так далее). Игровой процесс реализован через shell-скрипт, выполняющий цикличную перекомпиляцию кода.
  • Компилятор и генератор кода для языка Zoltraak. Язык включает только одно слово «zoltraak», которое комбинируется в разной форме с пробелами и пустыми строками. На вход подаётся любой текстовый файл, который преобразуется в программу на языке Си, состоящую из заголовка и последовательности на языке Zoltraak. Компиляция и выполнение сгенерированной Си-программы приводит к выводу содержимого исходного текстового файла.

Видео на youtube, длительность: 2:57:20.

>>> Источник: OpenNET

★★★★★

Проверено: maxcom ()
Последнее исправление: dataman (всего исправлений: 3)
Ответ на: комментарий от Stanson

Затем, что пользоваться вещью не представляя как она на самом деле работает - это в самом прямом смысле «магическое мышление».

И что в этом плохого, если на результат не влияет? https://thelib.ru/books/azimov_ayzek/logika-read.html

Имено по такому алгоритму и происходит тотальная жопа вида «если у меня в руке молоток, то всё вокруг кажется гвоздём». Которую мы нынче в IT и наблюдаем.

Так люди в принципе так мыслят. И именно поэтому наблюдаем. Сформулировать компьютерный алгоритм так, чтобы он не использовал понятий языка программирования вообще, по-моему, невозможно. Просто в аккуратном случае ограничения перевода из терминов ТЗ в термины языка будут сформулированы явно «будем трактовать вещественные числа как double, а целые как int32 и постулируем, что при расчётах переполнений не будет», в неаккуратном просто смешиваются математические термины с компьютерными приближениями, даты и адреса реального мира с их возможным представлением и категории реальных объектов с классами ООП.

И то и другое - идиотизм.

А как ещё? Если действия пользователя ещё как-то можно описать без использования типов данных, то алгоритм вроде никак.

Например, такая задача: пользователь производит последовательность нажатий на клавиши из набора: цифровые и пробел. После этого нажимает Enter. Трактуя последовательность как целые числа, разделённые пробелами, вывести сумму и максимум этих чисел.

Попробуй написать алгоритм не используя «идиотизма».

Вот только ничего кроме ячеек памяти компьютера не существует

Тогда уж ничего кроме атомов не существует. Или дальше кроме волн де Бройля…

Если я запускаю foldMap на начале ленивого списка, например

factorials = 1 : zipWith (*) factorials [1..]
print $ foldMap Sum $ take 20 factorials

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

У т.н. функциональных языков есть только одно значимое отличие от языков процедурных - генерация нового кода в процессе выполнения программы.

???

eval был даже в Бейсике.

генерация нового кода в процессе выполнения программы … реализована аццкими костылями в compile time

Так в процессе выполнения или compile time???

Нативные софтинки для OSM

Если они уже есть, то да. И читают только свой формат. Хотя согласен, пример плохой, тут можно данными обойтись.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от Stanson

Им не надо «учиться водить новую марку» вообще. Пообвыкнуться слегка - возможно, но не учиться.

Рычаги управления на разных машинах чуть-чуть по-разному. Поэтому есть руководство по эксплуатации, а не «сел и поехал, методом тыка разберёмся».

Жёваный крот, ну если ты уже научился есть вилкой, то тебе вообще не надо «самостоятельно учиться есть вилкой котлету из свинины».

Но вполне может понадобиться «самостоятельно учиться есть вилкой яйцо пашот».

monk ★★★★★
()
Ответ на: комментарий от Stanson

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

LightDiver ★★★★★
()
Ответ на: комментарий от monk

И что в этом плохого, если на результат не влияет?

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

Так люди в принципе так мыслят.

К счастью, пока ещё не все.

Сформулировать компьютерный алгоритм так, чтобы он не использовал понятий языка программирования вообще, по-моему, невозможно.

Ну можно для примера посмотреть как сформулированы алгоритмы работы каких-нибудь сугубо механических девайсов.

Просто в аккуратном случае ограничения перевода из терминов ТЗ

ТЗ и алгоритм вообще-то связаны только начальными условиями и результатом. Если в ТЗ прописан алгоритм, то это уже не ТЗ а хрень какая-то.

А как ещё? Если действия пользователя ещё как-то можно описать без использования типов данных, то алгоритм вроде никак.

Типы данных - это уже особенности конкретной реализации алгоритма, а не часть алгоритма.

Например, такая задача: пользователь производит последовательность нажатий на клавиши из набора: цифровые и пробел. После этого нажимает Enter. Трактуя последовательность как целые числа, разделённые пробелами, вывести сумму и максимум этих чисел.

Это вообще не задача. Это подробности реализации некоего алгоритма решения неизвестной задачи, про которую, кстати, вообще ни слова в тексте нет.

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

Вычисляются-то они где? В астрале? Или всё же как-то присутствуют в памяти или регистрах.

map - это не магия, это просто так принято цикл в функциональщине писать. Со своими плюсами и минусами.

eval был даже в Бейсике.

Речь про лямбды. Некоторые лиспы генерируют новый код в процессе выполнения лямбд. А eval есть только в интерпретируемых языках, в компилируемых его нет.

Так в процессе выполнения или compile time???

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

Stanson ★★★★★
()
Ответ на: комментарий от LightDiver

Забавно, но палочки у меня не вызвали никаких проблем при первом использовании. Хотя никаких азиатов в предках нету. :)

И нет, разные ЯП - это не вилки, ложки и палочки. Это одна и та же вилка которой едят разную еду. «Вилка» в данном случае это «превращение некоего текста в машинный код». Нет особой разницы какой текст ты будешь превращать в машинный код, итог будет один. Как в случае и с вилкой, кстати. :)

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от monk

Рычаги управления на разных машинах чуть-чуть по-разному.

Зато назначение у них одно и то же. Какая нахрен разница, чем включать фары - рычвжком под рулём, или клавишей/кнопкой на торпеде? Если некоему персонажу надо «учиться включать фары клавишей а не рычажком», то извини, этот персонаж - просто дебил.

Поэтому есть руководство по эксплуатации

Ни к одному моему автомобилю у меня не было руководства по эксплуатации. :) Не, я конечно скачивал или даже находил оригинальные экземпляры, но сильно потом, и чисто just for fun.

Но вполне может понадобиться «самостоятельно учиться есть вилкой яйцо пашот».

Это как это?

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Ну можно для примера посмотреть как сформулированы алгоритмы работы каких-нибудь сугубо механических девайсов.

Поэтому я и указал, что компьютерных программ. Для механических девайсов как раз алгоритмы в терминах состояний этих девайсов и возможных управленческих воздействий. Но компьютерные программы в терминах состояния ОЗУ и возможных состояний внешних устройств описать практически невозможно, так как они на несколько порядков сложнее.

ТЗ и алгоритм вообще-то связаны только начальными условиями и результатом. Если в ТЗ прописан алгоритм, то это уже не ТЗ а хрень какая-то.

ГОСТ 15.016-2016 ТЕХНИЧЕСКОЕ ЗАДАНИЕ ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ

4.6.3.1 Для математического обеспечения АС приводят требования к составу, области применения (ограничениям) и способам использования в АС математических методов и моделей, типовых алгоритмов и алгоритмов, подлежащих разработке.

Это вообще не задача. Это подробности реализации некоего алгоритма решения неизвестной задачи, про которую, кстати, вообще ни слова в тексте нет.

Почему не задача? Описано устройство с клавишами, действия пользователя, ожидаемый результат. Алгоритм решения как раз не указан. Как опишешь алгоритм? В каких терминах?

Вычисляются-то они где? В астрале? Или всё же как-то присутствуют в памяти или регистрах.

В регистрах. Хотя иногда могут и в астрале, в смысле foldMap Sum $ take n [1..] вполне может вместо выполнения свёртки по списку вычислить n * (n+1) / 2.

map - это не магия, это просто так принято цикл в функциональщине писать. Со своими плюсами и минусами.

Это магия в том смысле, что её область применения произвольное абстрактное множество (элементы списка, массива, дерева, результаты функции, …), а не область ячеек памяти заданной структуры, как принято в Си.

Речь про лямбды. Некоторые лиспы генерируют новый код в процессе выполнения лямбд.

Лямбды - это просто безымянные функции. Любую лямбду можно именовать. Если имелись в виду замыкания, то замыкание полностью эквивалентно объекту ООП с одним методом.

В хаскеле и пр. код всех возможных функций которые могут произойти от лямбды в compile time заранее создаются

С чего вдруг? Генерируется только используемый код, потому что функция хаскела примерно эквивалентна шаблону Си++. Код, например, foldMap на разные свёртываемые множества настолько разный, что генерируется при применении к конкретным типам.

monk ★★★★★
()
Ответ на: комментарий от Stanson

Если некоему персонажу надо «учиться включать фары клавишей а не рычажком», то извини, этот персонаж - просто дебил.

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

Это как это?

Там неинтуитивная последовательность действий. В прошлых веках у аристократии была забава: когда кто-то из провинции приезжал, его приглашали на обед и давали какое-нибудь такое хитрое блюдо со сложным правильным алгоитмои и смотрели, как бедный провинциал пытается не ударить в грязь лицом.

monk ★★★★★
()
Ответ на: комментарий от monk

ГОСТ 15.016-2016

Ты даже не представляешь, какая ахинея может быть написана в ГОСТах. Лютейшая. :) Ты в курсе, что чтобы сделать ГОСТ надо просто его написать в соответствии с некими сугубо косметическими правилами, написать обоснование для чего он нужен, заплатить положенные денежки, и дождаться его принятия? Никаких проверок на предмет даже арифметических ошибок нет. Не говоря уже о рассмотрении логики, адекватности терминологии и пр. Есть ГОСТ про способы измерения некоей величины, в котором название этой величины тупо переведено с ISO неправильно, и совпадает с названием совсем другой величины, про измерение которой есть несколько других ГОСТов. Конкретно - ГОСТ 30113, где ISO Brightness (яркость) переведена как «белизна», хотя никакого отношения к величине «белизна» вообще не имеет, из-за чего масса проблем с другими ГОСТами, где требуется измерение белизны. :) Всё сделано по ГОСТам - а в итоге получается полный, не имеющий никакого смысла бред. Или ГОСТы где упоминается «белизна по Бергеру», хотя Анни Бергер это женщина. Т.е. те кто их писал даже не удосужилсит прочитать первоисточник. :)

Так что ссылка на ГОСТ, особенно в такой области - это вообще не аргумент. :)

Описано устройство с клавишами, действия пользователя, ожидаемый результат.

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

вместо выполнения свёртки по списку вычислить n * (n+1) / 2.

Ничего, что n * (n+1) / 2 это именно что свёртка последовательности натуральных чисел? И хаскель тупо будет считать эту сумму в лоб. Что для решения задачи «найти сумму последовательности натуральных чисел» будет полным идиотизмом.

С чего вдруг? Генерируется только используемый код, потому что функция хаскела примерно эквивалентна шаблону Си++. Код, например, foldMap на разные свёртываемые множества настолько разный, что генерируется при применении к конкретным типам.

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

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

(define (myfunc f) (lambda (x y) (f x y)))
...
((myfunc +) 4 5) ; в этот момент сгенерируется код который будет делать x + y и ему будут переданы 4 и 5, получится 9
...
((myfunc f) 4 5) ; в этот момент сгенерируется код, который будет делать f(x,y), ему будут переданы 4 и 5 и получится результат применения f к аргументам 4 и 5 в зависимости от того, какое значение было в f в момент выполнения этого списка.
...

Можно даже встроенным дебаггером поглядеть что происходит. Изначально, ни машинного кода x + y, ни, тем более машинного кода делающего х.з. что с x и y нету. Он будет создан по ходу выполнения. Поэтому в отличии от хаскеля и цепепе, а также других реализаций лиспа, f может быть переменной, вычисляемой или получающей значение извне.

Stanson ★★★★★
()
Ответ на: комментарий от monk

А ты если сел за руль незнакомой машины, сразу получаешь из астрала информацию, как на ней включаются фары?

Обычно на включалке фар есть соответствующий значок. Но можно и перебрать, например, да. Нужно выполнить задачу - «найти чем включаются фары». А вот именно «учиться включать фары на этой машине» не нужно.

Там неинтуитивная последовательность действий.

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

Или речь о том, что кто-то там придумал некую вычурную «последовательность пользования вилкой для поедания яиц пашот», объявил её единственно верной и чморил тех, кто про его извраты был не в курсе? Так это что-то из области троллинга, а не пользования вилкой.

Stanson ★★★★★
()

Эх, не участвовал в этом году (в прошлом вошёл в список победителей).

Но идею с заставкой Доктора Кто чел от меня взял х) В прошлом году делились, какие раьоты вы не успели подать и я скинул «видеоплеер», который на экране рисовал заставку Outer Limits 60х годов.

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

в прошлом вошёл в список победителей.

Не это ли? 😀

Moon Phase
This code draws the current moon phase to the console. So if you’re a lycanthrope, you can monitor the phase of the moon.

dataman ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Можно глянуть широту твоего навыка?

degunino.net, colorimetry.ru, github.com/stanson-ch, stanson.ch, можно даже найти позорный проект yaw из конца 90-х, который у меня хватило ума бросить, и даже прямо здесь, на ЛОРе выкладывал свои вполне законченные высеры на JS, для демонстрации того, что вебня совершенно не обязана быть жирным тормозным говном.

К сожалению даже это, по каким-то меркам вполне заслуженный список не даёт вам право на хамство, грубость, и пренебрежительное отношение к другим участникам дискуссии. Странно, что вы не понимаете такой простой истины, своим поведением вы просто обесцениваете весь свой опыт. Отвечать не трудитесь, тут нечего обсуждать.

VIT ★★
()
Ответ на: комментарий от VIT

Странно что кто-то не понимает, что уважительное отношение для начала надо чем-то заслужить.

А ещё - я не червонец, чтобы нравится всем. Не нравится - игнорируй, делов-то.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

Не написано зачем это всё.

Просто задача в вакууме. Я хочу посмотреть на терминологию алгоритма, не привязанную ни к какому языку программирования, но при этом позволяющую на языке программирования однозначно решить программу.

И хаскель тупо будет считать эту сумму в лоб. Что для решения задачи «найти сумму последовательности натуральных чисел» будет полным идиотизмом.

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

Поэтому ни хацкель, ни цепепе не способен использовать шаблоны/функции для генерации кода если аргумент шаблона/функции принят извне - введён пользователем или принят по сети, или даже вычислен.

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

Кокрентно clisp же, например, в отличии от, именно что генерирует новый, полностью отсутствовавший до этого в бинарнике машинный код функции в момент выполнения лямбды

А clisp это среда программирования. Также как UNIX. И также, как grep создаёт машинный код для поиска, так myfunc создаёт машинный код для результата функции.

А вместо лиспового compile в UNIX есть cc с тем же результатом.

f может быть переменной, вычисляемой или получающей значение извне

Получить значение типа «функция» извне невозможно. Можно вычислить из другой функции, возвращающей функцию. Так и в UNIX можно динамическую библиотеку с разным параметром-функцией для программы на Haskell или C предоставлять.

monk ★★★★★
()
Ответ на: комментарий от Stanson

Просто я по умолчанию предполагаю, что если я встречаю нового человека, то он не дурак. Пока обратное не оказалось. Я больше не буду с вами общаться.

VIT ★★
()
Ответ на: комментарий от Stanson

Нужно выполнить задачу - «найти чем включаются фары». А вот именно «учиться включать фары на этой машине» не нужно.

На мой взгляд это одно и то же, сказанное другими словами.

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

С первого раза часто сдавливают вместо того, чтобы надрезать внешний слой, и он лопается. Если очень не повезёт, то на одежду.

monk ★★★★★
()
Ответ на: комментарий от monk

Просто задача в вакууме.

Никогда не берись решать такие задачи. :) Жизнь станет намного проще, без ситуаций описанных и нарисованных в тоннах мемов про ТЗ и что в итоге получилось. :)

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

И зачем же программист будет писать вычисление суммы натурального ряда через reduce?

Получить значение типа «функция» извне невозможно.

'+' + Enter
'pow' + Enter

:)

Можно вычислить из другой функции, возвращающей функцию.

А если возвращамая функция, в этой функции, например, выбирается при помощи генератора случайных чисел? :)

Так и в UNIX можно динамическую библиотеку с разным параметром-функцией для программы на Haskell или C предоставлять.

Только в этом случае код опять заранее скомпилирован. Нет самомодифицирующегося кода. :)

Stanson ★★★★★
()
Ответ на: комментарий от VIT

Просто я по умолчанию предполагаю, что если я встречаю нового человека, то он не дурак.

Именно за счёт этого в мире сейчас везде и царит какистократия. «давайте проголосуем за вот этого, он же не дурак». Ну и всё. Толерантность - зло. Go woke - go broke.

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

И зачем же программист будет писать вычисление суммы натурального ряда через reduce?

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

:)

Это строки.

А если возвращамая функция, в этой функции, например, выбирается при помощи генератора случайных чисел? :)

Какая разница? Функция же.

Только в этом случае код опять заранее скомпилирован. Нет самомодифицирующегося кода. :)

Он самомодифицирующийся в рамках среды-UNIX. Можно даже реально само- делать: программа пишет в файл новую версию своего исходника и запускает cc.

monk ★★★★★
()
Ответ на: комментарий от monk

С первого раза часто сдавливают вместо того, чтобы надрезать внешний слой, и он лопается. Если очень не повезёт, то на одежду.

Ну в принципе я знавал человека, который никогда не мог съесть целый помидор не испачкавшись. Для меня загадка, почему до него никак не доходило как устроен помидор и всякое про несжимаемость жидкостей и т.п. :)

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от monk

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

Если ты об этом заранее знаешь - то почему не сделал для неё нормально?

Это строки.

Которые в лиспе можно превратить в имена функций.

Какая разница? Функция же.

Разница в размере получающегося бинарника, например.

Он самомодифицирующийся в рамках среды-UNIX. Можно даже реально само- делать: программа пишет в файл новую версию своего исходника и запускает cc.

Можно. И сколько памяти и процессора это сожрёт?

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Если ты об этом заранее знаешь - то почему не сделал для неё нормально?

Чтобы не удваивать объём этого куска кода ради особого случая. Особенно, если известно, что последовательности не более 100 элементов.

Которые в лиспе можно превратить в имена функций.

Можно. Внутренних.

Разница в размере получающегося бинарника, например.

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

Можно. И сколько памяти и процессора это сожрёт?

Не больше, чем лисп для эквивалентного алгоритма.

monk ★★★★★
()
Ответ на: комментарий от Stanson

Ну в принципе я знавал человека

Вот и аналог «водителя Рено Логан».

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

monk ★★★★★
()
Ответ на: комментарий от monk

Чтобы не удваивать объём этого куска кода ради особого случая.

А с чего ты взял что это будет удвоение? Может n*(n+1)/2 это всего лишь ничтожные доли процента от того, во что развернётся reduce?

Можно. Внутренних.

И в списки. :)

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

А в прочих - влияет. И иногда очень сильно.

Не больше, чем лисп для эквивалентного алгоритма.

Да неужели. Сколько там нынче какой-нибудь g++ весит?

Stanson ★★★★★
()
Ответ на: комментарий от monk

Некоторые не умеют учиться.

Ну это совсем необучаемые.

А есть некоторые не способны научиться применять уже имеющиеся у них знания. Поэтому им и приходится постоянно что-то учить. Как «программистам на <название_язычка>».

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

Ну и как, хороший результат получился из этой экономии работодателя? Меня вот такая копроэкономика вообще не воодушевляет ни разу.

Stanson ★★★★★
()
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

А с чего ты взял что это будет удвоение? Может n*(n+1)/2 это всего лишь ничтожные доли процента от того, во что развернётся reduce?

Я про исходный код.

А в прочих - влияет. И иногда очень сильно.

А в прочих она без компилятора не существует. А с компилятором каждый вызов создаст объектник в /tmp

Да неужели. Сколько там нынче какой-нибудь g++ весит?

Меньше, чем SBCL.

monk ★★★★★
()
Ответ на: комментарий от monk

Я про исходный код.

Сферический. В вакууме. Я понял.

Меньше, чем SBCL.

Весь SBCL не нужен.

Stanson ★★★★★
()

URISC меня очень позабавил. Но, как вполне справедливо заметила гугловая ИИшечка, такая система будет работать ну ООООООООООООЧЕНЬ МЕЕЕЕЕЕЕДЛЕЕЕЕЕННОООООО.

Ибо оверхид получается чудовищным: на то, чтобы SUBLEQами сэмулировать обычные команды понадобятся мульёны вычитаний. :)

slamd64 ★★★★★
()
Ответ на: комментарий от Stanson

в компилируемых его нет.

эээ если программа(написаная на Си для выпуклости примера) может «вызвать шелл и сунуть ей скрипт на исполнение» и если в окружении есть cc то вот тебе система с компиляцией в рантайме.

qulinxao3 ★☆
()
Ответ на: комментарий от Stanson

tcc - кстати развитие одного из победных изделий в ТомСамом конкурсе

как раз пример что вариант Сяшного бинаря с компиляцией в рантайме можно получить компактней комонлиспа ибо у СяшногоБинаряСtcc_в_комплекте образ будет по размеру ближе к LISP1.5 :)

qulinxao3 ★☆
()
Ответ на: комментарий от slamd64

матан

на ютубе есть видос с life Конвея симулируемой на life Конвея - мегаломанство

по хорошему так как синтез получается из иерархий - а не чистое всюду связанное - то и итоговый выхлоп избыточный

т.е. в теории если транслировать в subleq без промежуточного слоя привычной машины - т.е. в некотором смысле сплавлять абстракции и заранее понимать что целевая машина subleq - будет по быстрее :)

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

Да чтож вы не отдупляете-то в чём разница между самомодифицирующимся кодом и всякими костылями с запуском компилятора/интерпретатора? На сишечке кстати, как раз вполне можно написать самомодифицирующийся код, между прочим. Без всяких компиляторов.

Stanson ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.