LINUX.ORG.RU
ФорумTalks

целесообразность компиляции


0

2

Допустим есть ф-ция long-calculation, которая внутри себя содержит некую свободную переменную a. Если прогер знает, что эта а не будет изменяться во время исполнения, то ф-цию он не будет использовать (вызывать) в дальнейщем коде, а запишет все в переменную result, и будет использовать ее. Компилятор, по-идее, должен сделать то же самое. Но как он узнает, будет ли она изменяться? Допустим, если не предусмотрено динамическое изменение, во время исполнения, он может просто пропарсить код. В других случаях, поможет явная декларация.

Итого: если код не сможет оптимизировать прогер, этого не сможет сделать и компилятор. Выигрыш в писанине для прогера нулевой: либо Result = call long-calculation, либо type: clear_func fu: long-calculation

Идем далее. Что если прогер все же захочет оптимизировать код в грязной ф-ции? Он просто завернет муттабельную переменную в ф-цию, и присвоит переменной result не результат вычисления long-calculation, а ф-цию, возвращающую вычисления с этой переменной, т.е. он вычислит long-calculation не до конца, а сколько возможно, без учета изменения a. Как вариант, он может создать переменную b, которая будет ссылаться на символ (не значение) муттабельной a. Соответственно, ф-ция long-calculation будет пользоваться чистой b, а не грязной a, поэтому можно соптимизировать. Правда, ссылка на символ не во всех ЯП возможна, но это уже другой вопрос, а в целом, такая техника даже более прозрачна, чем фп-стиль. Компилятор, естественно, сделет примерно то же самое (при наличии соответствующего забубенного синтаксиса деклараций типов и пр.)

Тут напрашивается резонный вопрос: а зачем нужна компиляция, если прогер настолько легко может соптимизировать свой код руками?

С другой стороны, компиляция накладывает на программиста массу ограничений, в том числе, в плане оптимизаций, как ни странно.

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

Резюмируюя. Компилятор ограничивает выразительные возможности, гибкость, и (парадоксально) возможности оптимизации ЯП.



Последнее исправление: anonimous (всего исправлений: 1)

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

userid2
()

Не, ну ты идиот, таки да.

Если прогер знает, что эта а не будет изменяться во время исполнения, то ф-цию он не будет использовать (вызывать) в дальнейщем коде, а запишет все в переменную result, и будет использовать ее.

Гуглить слово memoize. Все давно придумано до нас, в кой-каких местах и реализовано.

Компилятор, по-идее, должен сделать то же самое. Но как он узнает, будет ли она изменяться? Допустим, если не предусмотрено динамическое изменение, во время исполнения, он может просто пропарсить код. В других случаях, поможет явная декларация.

А зачем ему это знать? Компилятор же не выполняет код. Он его компилирует. Это ты знаешь, детерминированная твоя функция или нет. Если бы компилятор знал, то задача останова была бы решена.

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

ТС-у по видимому приходится всё время что то похожее делать. Причём страдает неприменно от этого моск ТС-а. Жизнь штука непростая...

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

Он знает, в чистых ЯП. Для этого их и придумали. Знает благодаря спец синтаксису, попросту говоря.

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

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

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

Вот именно, умник, что твой язык не исполняется на эквивалентном МТ исполнителе, грубо-говоря, оттранслированный из твоего ЯП код исполняется.

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

Забей уже думать, у тебя хреново получается.

спасибо, посмеялся.

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

И, да, спасибо за это,

Гуглить слово memoize

кэп, но ты, как водится, ничего не понял.

anonimous
() автор топика

Резюмируюя. Компилятор ограничивает выразительные возможности, гибкость, и (парадоксально) возможности оптимизации ЯП.

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

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

прочитал. думать лень,но пару вопросов на вскидку есть

Тут напрашивается резонный вопрос: а зачем нужна компиляция, если прогер настолько легко может соптимизировать свой код руками?

Чтобы соптимизировать руками придётся затратить время программиста. Кто будет платить? Т.е. если есть задача такая - то да, понятно.

С другой стороны, компиляция накладывает на программиста массу ограничений, в том числе, в плане оптимизаций, как ни странно.

хотелось бы примеров «массы ограничений в плане оптимизации».

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

я пожалуй соглашусь с данным мнением в общем.

AndreyKl ★★★★★
()

Компиля́тор — программа или техническое средство, выполняющее компиляцию.

Компилировать — проводить трансляцию машинной программы с проблемно-ориентированного языка на машинно-ориентированный язык.

Википедия.

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

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

anonimous
() автор топика
Ответ на: комментарий от Napilnik

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

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

Нет, дорогой, ты путаешь компиляцию с трансляцией.

А ты вроде не предлагал транслировать хацкель на бейсик, и я про тоже не говорил.

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

компилтайм жиреет.

Да на здоровье.
Время компиляции САМАЯ неважная характеристика, связанная с компиляцией...

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

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

anonimous
() автор топика
Ответ на: комментарий от Stahl

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

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

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

вариантов применения много.

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

P.S. Дебильное ответвление маразматического топика. В этом весь ЛОР:)

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

Но забить шуруп всё-таки не получится.

Если в сосновое/ольховое полено с торца, во всё возможно:) А если во что-то твёрдое и хрупкое, то всё равно надо сверлить, так почему бы не сделать отверстие пошире, всё равно ведь «нужна» халтура на зависть китайским бракоделам:)

P.S. Дебильное ответвление маразматического топика.

:)

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

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

любопытная т.з. спасибо.

правда вопрос - насколько это актуально? ну пусть бинарь будет 70мб вместо 7, ну и что? не уверен что это важно. хотя кто знает.

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

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

Планируйте ЯП нормально и время компиляции не будет так волновать.

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

Дебильное ответвление маразматического топика

Пожалуй, можно еще увеличить градус, это не предел.

Тезис 1. В общем случае, вы не сможете забить любой шуруп любым гвоздем в любую древесину. Но!

Тезис 2. Если у вас маленький шуруп (менее 2х10), достаточно большой гвоздь (не менее 150) и древесина средней или малой плотности, можно забить следующим образом. Делаем гвоздем глубокий накол в древесине. С силой вдавливаем шуруп пальцем. Крутим его вручную, пока крутится. После этих операций, шуруп должен войти не менее, чем на треть. Затем, тщательно прицеливаясь, добиваем его шляпкой гвоздя, крепко держа гвоздь в кулаке за его стержень.

Но забить шуруп всё-таки не получится.

Держу пари, этим методом возможно забить шуруп, хотя не гарантированно.

anonimous
() автор топика
Ответ на: комментарий от buddhist

Я за него брался когда-то, но бросил быстро, не понял ни хрена, надо, наверное, быдет продолжить. Но ведь там все процедуры сразу компилируются ЕМНИП, нет эквивалентности кода и данных, или я ошибаюсь?

anonimous
() автор топика
Ответ на: комментарий от AndreyKl

правда вопрос - насколько это актуально?

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

anonimous
() автор топика

Распни^Wзабаньте его уже, кто-нибудь.

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

нет эквивалентности кода и данных

Да, в оригинальном форте гомоиконности нет, но есть его дальнейшее развитие в виде Factor, который уже гомоиконный.

buddhist ★★★★★
()

Переменная которая не изменяется внезапно называется константой.
А так всё правильно --- писать нужно только ассемблере, а то вдруг где-то получится не достаточно оптимизированным!

pony
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.