Если что-то может быть сгенерировано, то это данные, а не код.
Поскольку позже вы укажете, что код - это данные, ваше предложение сводится к «Если что-то может быть сгенерировано, то это не код». Не могли бы вы сказать, что ассемблерный код, сгенерированный компилятором C, не является кодом? Что, если это точно совпадает с кодом сборки, который я пишу от руки? Вы можете пойти туда, если хотите, но я не пойду с вами.
Давайте начнем с определения «кода». Не вдаваясь в технические подробности, довольно хорошим определением для целей этого обсуждения были бы «машинно-управляемые инструкции для выполнения вычислений».
Учитывая это, не является ли вся эта идея генерации исходного кода недоразумением?
Да, ваше начальное предложение состоит в том, что код не может быть сгенерирован, но я отклоняю это предложение. Если вы согласны с моим определением «кода», тогда не должно быть никаких концептуальных проблем с генерацией кода в целом.
То есть, если для чего-то есть генератор кода, то почему бы не сделать это чем-то надлежащим образом, чтобы оно могло получать требуемые параметры и выполнять правильные действия, которые мог бы выполнить «сгенерированный» код?
Что ж, это совершенно другой вопрос, касающийся причины создания кода, а не его природы. Вы предлагаете альтернативу, что вместо написания или использования генератора кода, вы пишете функцию, которая вычисляет результат напрямую. Но на каком языке? Прошли те времена, когда кто-то писал непосредственно в машинном коде, и если вы пишете свой код на любом другом языке, то вы зависите от генератора кода в виде компилятора и / или ассемблера для создания программы, которая фактически выполняется.
Почему же тогда вы предпочитаете писать на Java, C, Lisp или что-то еще? Даже ассемблер? Я утверждаю, что, по крайней мере, частично, потому что эти языки предоставляют абстракции для данных и операций, которые облегчают выражение деталей вычислений, которые вы хотите выполнить.
То же самое относится и к большинству генераторов кода более высокого уровня. Прототипными случаями, вероятно, являются сканеры и генераторы парсеров, такие как lex
и yacc
. Да, вы можете написать сканер и парсер непосредственно на C или на другом языке программирования по вашему выбору (даже необработанный машинный код), а иногда и так. Но для проблемы любой существенной сложности использование высокоуровневого языка специального назначения, такого как lex или yacc, облегчает написание, чтение и обслуживание рукописного кода. Обычно тоже намного меньше.
Вы должны также рассмотреть, что именно вы подразумеваете под «генератором кода». Я хотел бы рассмотреть предварительную обработку C и создание шаблонов C ++ как упражнения при генерации кода; Вы возражаете против этого? Если нет, то я думаю, что вам нужно выполнить некоторую умственную гимнастику, чтобы рационализировать принятие этих, но отвергая другие разновидности генерации кода.
Если это делается по соображениям производительности, то это звучит как недостаток компилятора.
Почему? Вы в основном утверждаете, что у вас должна быть универсальная программа, в которую пользователь передает данные, некоторые классифицируются как «инструкции», а другие как «ввод», и которая выполняет вычисления и генерирует больше данных, которые мы называем «выводом». (С определенной точки зрения такую универсальную программу можно назвать «операционной системой».) Но почему вы полагаете, что компилятор должен быть столь же эффективен для оптимизации такой универсальной программы, как и для оптимизации более специализированной? программа? Две программы имеют разные характеристики и разные возможности.
Если это делается для объединения двух языков, то это звучит как отсутствие интерфейса библиотеки.
Вы говорите, что как будто наличие универсальной в некоторой степени библиотеки интерфейса обязательно будет хорошей вещью. Возможно, так и будет, но во многих случаях такая библиотека будет большой и трудной для написания и поддержки, а может быть, даже медленной. И если такого зверя на самом деле не существует для решения конкретной проблемы, то кто вы такой, чтобы настаивать на том, чтобы он был создан, когда подход генерации кода может решить проблему намного быстрее и проще?
Я что-то здесь упускаю?
Я думаю несколько вещей.
Я знаю, что код это тоже данные. Что я не понимаю, зачем генерировать исходный код? Почему бы не превратить это в функцию, которая может принимать параметры и воздействовать на них?
Генераторы кода преобразуют код, написанный на одном языке, в код на другом, обычно более низком уровне языка. Вы спрашиваете, почему люди хотят писать программы на нескольких языках, и особенно, почему они могут хотеть смешивать языки субъективно разных уровней.
Но я уже коснулся этого. Один выбирает язык для конкретной задачи, частично основываясь на его ясности и выразительности для этой задачи. Поскольку меньший код в среднем содержит меньше ошибок и его легче обслуживать, существует также и уклон в сторону языков более высокого уровня, по крайней мере, для крупномасштабной работы. Но сложная программа включает в себя много задач, и часто некоторые из них могут быть более эффективно решены на одном языке, тогда как другие более эффективно или более кратко решаются на другом языке. Использование правильного инструмента для работы иногда означает использование генерации кода.