Оптимизация кода OpenSCAD

Существует ли эффективный подход к обнаружению того, что является посторонним ("мертвым" или "неиспользуемым") кодом в OpenSCAD для содействия процессу обучения?

Я добиваюсь прогресса, используя рабочие примеры кода; однако некоторые из них содержат код с большим количеством модулей и "тестовых случаев" (например, генераторы передач), которые не всегда используются или на которые ссылаются. Это отличные утилиты, но при попытке упростить файл, чтобы сделать только небольшую часть того, что возможно (обычно комментируя то, что я считаю неиспользуемыми строками кода), вещи (для меня) становятся очень непредсказуемыми. Обзор "AST Dump" немного помог, но я надеюсь, что существует более практичный подход к изоляции только голого основного кода.

, 👍4

Обсуждение

Это совершенно бесполезный ответ с практической точки зрения, но [это невозможно](https://en.wikipedia.org/wiki/Rice%27s_theorem), чтобы определить, является ли код неиспользуемым или нет., @Tom van der Zanden

@TomvanderZanden: [это невозможно](https://en.wikipedia.org/wiki/Dead_code_elimination) только в теории (то есть для всех возможных алгоритмов или чего-то еще). Один из подходов может заключаться в том, чтобы начать с пустого файла и скопировать нужные биты, а затем добавить еще в ответ на ошибки., @Tomas By

Спасибо, Томас. С более сложными файлами, с которыми я сталкивался, которые имеют модули, ссылающиеся на другие модули и использующие переменную "объявленную" в скрытых частях длинного кода, более практично начать с комментирования подозрительного "постороннего" кода. Я надеялся, что есть более эффективный способ сделать это - помимо комментирования раздела за разделом, чтобы увидеть, что происходит с моделью. Хотя я могу понять, почему это можно назвать невозможным, я с уважением полностью не согласен с этой оценкой. "Непрактично"? Может быть, но это зависит от каждого примера. НЕТ ничего невозможного!, @JoeVanGeaux

@TomvanderZanden: Теорема Райса не имеет никакого отношения к тому, используется ли код, а только к тому, достигается ли он во время выполнения. В большинстве языков для того, чтобы программа была действительной и идентификатор, на который ссылаются, должен иметь определение где-то в источнике, независимо от того, будет ли оно достигнуто во время выполнения, поэтому "используется" - это чисто статическое свойство, поддающееся тривиальному статическому анализу., @R.. GitHub STOP HELPING ICE

@R.. Вопрос задан о "постороннем (мертвом или неиспользуемом)" коде. Я интерпретировал это более широко, чтобы включить недостижимый код (который обычно называют "мертвым кодом")., @Tom van der Zanden

@TomvanderZanden: Я полагаю, что это правильная интерпретация, но удаление неиспользуемого кода в этом смысле требует инвазивных изменений в исходном коде, которые, вероятно, были бы нежелательны. В любом случае теорема Райса все еще не применима к конкретной модели, хотя она может быть применима к параметризованной, поскольку с фиксированным входом, для которого программа (предположительно) завершает достижимость, вычисляется только путем трассировки., @R.. GitHub STOP HELPING ICE

@R, @TomvanderZanden, спасибо. Я попытался избежать семантики, которая, как я думал, исказит мое первоначальное стремление. Возьмем, к примеру, случай, когда оператор "If" приводит к обходу большой части кода, тогда этот код фактически "мертв" или "неиспользуем" в том смысле, что я могу "закомментировать" этот код и эффективно упростить его для более легкого чтения. Это было бы полезно, если бы я никогда на самом деле не собирался идти по какому-либо необязательному пути, например, если бы я всегда генерировал только один тип объекта (в моем случае простую эвольвентную шестерню или, если бы я хотел - но не хочу-сложную серию редукторов)., @JoeVanGeaux

Рассматриваете ли вы только выполненные части или также части, которые вносят вклад в объект? Рассмотрим код, который создает некоторую геометрию, и объединения его с твердотельным кубом, который содержит эту геометрию. Первый код теперь не вносит никакой геометрической сложности. Это "используется"? Он может быть упрощен или удален., @cmm


1 ответ


1

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

Если бы я действительно хотел решить эту проблему, то начал бы с такого подхода:

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

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

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

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

Наконец, проверьте биты на каждом из исходных токенов и выражений. Если бит равен нулю, то этот конкретный элемент не вносит никакого вклада в результат. Если бит равен единице, то это необходимо в результате.

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

Однако я думаю, что это был бы путь вперед к нужному вам оптимизатору OpenSCAD.

В то же время OpenSCAD предоставляет некоторые префиксные символы. Один из них, возможно,"*", удаляет поддерево из сгенерированной геометрии, не испортив синтаксический анализ. Я часто использую эту метку, чтобы выяснить, используется ли код и какой вклад он вносит.


,