Якщо щось можна створити, то ця річ - це дані, а не код.
Оскільки ви згодом указуєте, що цей код є даними, ваша пропозиція зводиться до "Якщо щось можна створити, то ця річ не є кодом". Ви б сказали, що код складання, сформований компілятором C, не є кодом? Що робити, якщо це точно збігається з кодом складання, який я пишу вручну? Ви можете поїхати туди, якщо хочете, але я не буду їхати з вами.
Почнемо замість цього з визначення "коду". Не надто надто технічне, досить непоганим визначенням для цілей цієї дискусії буде "машино-прийнятні інструкції щодо проведення обчислень".
Враховуючи це, чи не вся ця ідея створення вихідного коду є непорозумінням?
Ну так, ваша початкова пропозиція полягає в тому, що код не може бути створений, але я відкидаю цю пропозицію. Якщо ви приймаєте моє визначення поняття "код", тоді не повинно виникнути концептуальної проблеми з генерацією коду взагалі.
Тобто, якщо для чогось є генератор коду, то чому б не зробити це чимось належною функцією, яка може приймати необхідні параметри і робити правильні дії, які б зробив код "сгенерований"?
Ну це зовсім інше питання про причину використання коду, а не про його природу. Ви пропонуєте альтернативу, щоб замість того, щоб писати або використовувати генератор коду, ви записуєте функцію, яка безпосередньо обчислює результат. Але якою мовою? Пройшли дні, коли хтось писав безпосередньо в машинному коді, і якщо ви пишете свій код будь-якою іншою мовою, то ви залежите від генератора коду у вигляді компілятора та / або асемблера для створення програми, яка фактично працює.
Чому тоді ви віддаєте перевагу писати на Java чи C чи Lisp чи ще? Навіть асемблер? Я запевняю, що це хоча б частково, оскільки ці мови надають абстракції для даних та операцій, що полегшують вираження деталей обчислень, які ви хочете виконати.
Те саме стосується і більшості генераторів коду вищого рівня. Прототипічні випадки - це, ймовірно, генератори сканерів та аналізаторів, такі як lex
і yacc
. Так, ви можете написати сканер і аналізатор безпосередньо на C або в будь-якій іншій мові програмування на ваш вибір (навіть сировинному машинному коді), а іноді і так. Але для проблеми будь-якої значної складності використання спеціальної мови вищого рівня, такої як lex або yacc, полегшує написання, читання та підтримку рукописного коду. Зазвичай і значно менші.
Ви також повинні врахувати, що саме ви маєте на увазі під "генератором коду". Я б вважав попередню обробку C та інстанціювання шаблонів C ++ вправами для генерації коду; чи заперечуєте проти цього? Якщо ні, то, я думаю, вам потрібно буде виконати певну розумову гімнастику, щоб раціоналізувати їх прийняття, але відхилити інші аромати генерування коду.
Якщо це робиться з міркувань продуктивності, то це звучить як недолік компілятора.
Чому? Ви в основному заявляєте, що у вас повинна бути універсальна програма, до якої користувач подає дані, деякі класифікуються як "інструкції", а інші - як "вхідні дані", і яка переходить до виконання обчислень та видає більше даних, які ми називаємо "вихідними". (З певної точки зору, таку універсальну програму можна назвати "операційною системою".) Але чому ви вважаєте, що компілятор повинен бути настільки ефективним для оптимізації такої програми загального призначення, як і для оптимізації більш спеціалізованої програми програма? Дві програми мають різні характеристики та різні можливості.
Якщо це робиться для з'єднання двох мов, то це звучить як брак бібліотеки інтерфейсів.
Ви кажете, що як би мати універсальну до певної міри бібліотеку інтерфейсів обов'язково було б хорошою справою. Можливо, це було б, але в багатьох випадках така бібліотека була б великою і складною для написання та обслуговування, а може, навіть повільною. І якщо такого звіра насправді не існує для того, щоб слугувати конкретній проблемі, то хто це ти, щоб наполягати на тому, щоб його створити, коли підхід до генерації коду може вирішити проблему набагато швидше та простіше?
Я чогось тут пропускаю?
Я думаю, кілька речей.
Я знаю, що код також є даними. Що я не розумію, чому генерувати вихідний код? Чому б не перетворити його на функцію, яка може приймати параметри і діяти на них?
Генератори коду перетворюють код, написаний однією мовою, на код іншою, як правило, нижчою мовою. Тоді ви запитуєте, чому люди хочуть писати програми, використовуючи кілька мов, і особливо, чому вони можуть хотіти змішувати мови суб'єктивно різних рівнів.
Але я вже торкнувся цього. Кожен вибирає мову для певного завдання, частково спираючись на його чіткість та виразність для цього завдання. Оскільки менший код має менше помилок у середньому і його легше обслуговувати, існує також ухил до мов вищого рівня, принаймні для масштабної роботи. Але складна програма передбачає багато завдань, і часто деякі з них можна ефективніше вирішувати однією мовою, тоді як інші ефективніше чи більш стисло розглядаються на іншій. Використання правильного інструменту для роботи іноді означає використання коду.