Синтез программ – позволяет коду писать самостоятельно

Автонаписание кода - синтез программы

Термины для понимания (Часть ⅓)

Один термин, который вы, возможно, слышали, но не полностью поняли, – это «синтез программ», часто позиционируемый как вхождение искусственного интеллекта в написание кода. Эта статья является первой в трехчастной серии, целью которой является демистификация этой концепции. Здесь мы сосредоточимся на понимании семантической сути синтеза программ. Хотя я стремлюсь к ясности и простоте, обратите внимание, что некоторые технические детали могут быть упущены ради читаемости.

Чтобы освоить Синтез программ, мы сначала должны разобраться с термином Программа. Итак, давайте начнем с вопроса, что такое Программа.

Изображение Saar Barak (автор)

Программа

В основном, программирование – это действие, при котором вы говорите компьютеру, что делать. Запланировать напоминание на своем телефоне, настроить свои фотографии в социальных сетях, оптимизировать трафик или настроить эту статью VoAGI – все это программирование. Чтобы убедиться, что мы синхронизированы, давайте рассмотрим Тройку программирования:

  • Программист превращает задачу в программу.
  • Программа – это то, что программист дает, и что понимает интерпретатор.
  • Интерпретатор принимает программу и выполняет действия.
Изображение Saar Barak (автор)

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

Синтез программ

Синтез программ – это система, которая упрощает программирование. GCC освобождает вас от необходимости писать ассемблер, операционная система вашего смартфона берет дюжину отдельных снимков и создает панорамное фото. Маленькая зеленая кнопка “опубликовать” вверху этой страницы отправит вам всю эту статью. С помощью синтеза программ вы можете работать в улучшенной версии языка программирования – назовем его “Программа++”. Он проще, чем исходная Программа.

Изображение Saar Barak (автор)

Синтезатор действует как посредник, преобразуя вашу Программу++ обратно в исходную программу. Когда вы связываете этот синтезатор с интерпретатором, вы получаете расширенный интерпретатор – назовем его “Interpreter++”. Эта улучшенная версия принимает вашу Программу++ (обычно называемую спецификацией или спецом) и выполняет задачи. Процесс рекурсивен – вы можете добавлять слои синтезаторов и интерпретаторов, чтобы сделать программирование все более простым. Таким образом, синтез программ – это просто “программирование, упрощенное”.

Современный синтез программ

Искусство синтеза программ заключается в том, чтобы сделать программу++/спец как можно проще. В настоящее время техники синтеза программ становятся все более сложными, например, ChatGPT или CoPilot, которые генерируют код на основе высокоуровневых требований, уменьшая необходимость в “рукописном” коде и тем самым минимизируя человеческую ошибку.

Изображение Saar Barak (автор)

После того, как мы определили, что такое Программа и Синтез Программы, нам необходимо точно определить, что такая проблема.

Проблема

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

Изображение от Saar Barak (Автор)

Задача как спецификация

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

Спецификация как проблема

Спецификация или spec – это способ формулировки задачи таким образом, чтобы и люди, и компьютеры согласовали, что должно быть сделано. Одна из редких и особых форм коммуникации – это ввод-вывод (или просто I/O), которую одинаково хорошо понимают и люди, и компьютеры.

Изображение от Saar Barak (Автор)

Существуют и другие формы спецификаций, например, это может быть функция, которую нужно максимизировать, набор ограничений на поведение компьютера или предложение на естественном языке. Но у вас есть много свободы в том, как вы можете написать эту spec. Разные specs могут описывать одну и ту же проблему с разных точек зрения, синтаксиса или уровней детализации. Например, если вы хотите отсортировать список(L) из n чисел, мы можем предоставить:

  • Серия ввода-вывода: In₁[3,2,1] Out₁[1,2,3] | In₂[0,-1,2] Out₂[-1,0,2] | In₃[5,8,100] Out₃[5,8,100] | In₄[9] Out₄[9] …
  • Одно предложение: “Отсортировать список целых чисел в порядке возрастания.”
  • Математическая функция: f( X ) = x₁≤ x₂≤ x₃ … ≤ xₙ
  • Рекурсивное определение: Sorted(L) ⇔ L[1] ≤ min⁡( L[2:n] ) ∧ Sorted( L[2:n] )

Аналогично, для приготовления салата, спецификация может выглядеть так:

  • Ввод-выводные пары: In₁[салат, помидоры, огурцы] Out₁[салат] | In₂[огурцы, цезарь, помидоры] Out₂[не салат]
  • Естественный язык: Сочетайте листья салата, помидоры и огурцы
  • Ограничения: Должно включать[ по крайней мере одну зеленую овощ и один источник белка.]

корректность

С помощью spec компьютер может автоматически решить, выполнила ли программа “правильные действия”, проверив, производит ли выполнение программы на входных данных соответствующие выходные данные. Этот процесс называется Верификатором.

Изображение от Saar Barak (Автор)

Теперь простой Проверяющий дает вам прямой ответ: True или False. is_sorted( [1,2,4] ) = True. Являются ли комбинированные элементы [томаты, цезарь] ингредиентами салата? False. Но мы можем поднять планку – некоторые Проверяющие выходят за рамки простых двоичных ответов, углубляясь в метрики или шкалы, которые измеряют, насколько хорошо справилась программа.

От логики к обучению

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

Изображение от Saar Barak (Автор)

Разнообразные подходы: Таксономия синтеза программ Синтез программы – это не универсальное решение для всех задач. В зависимости от потребностей задачи могут быть более выгодными разные подходы или типы синтеза. Давайте рассмотрим некоторые из этих типов.

  1. Дедуктивный синтез – Традиционалист. Основан на формальных методах, логических фреймворках и алгоритмических принципах. Высоко точный, но может требовать значительных вычислительных ресурсов. Идеально подходит для критических систем, где надежность является главным критерием.
  2. Индуктивный синтез – Модернист. Основан в основном на методах машинного обучения и эвристических методах. Превосходит в скорости и адаптивности, но может не обладать такой же строгой точностью, как дедуктивные методы. Лучше всего подходит для быстрых циклов разработки и менее критичных приложений.
  3. Стохастический синтез – Реалист. Использует вероятностные модели для работы с неопределенностями в спецификациях или средах. Предлагает сбалансированный подход, но может требовать настройки для достижения желаемой надежности. Хорошо подходит для приложений, где ожидается некоторый уровень неопределенности или вариации.

Позвольте мне закончить несколькими мыслями…

Синтез программ – Вне возможностей человека

Мы не должны ограничивать себя. Мы стремимся создать синтезатор, который может идти даже дальше!! Цель состоит не только в том, чтобы воспроизвести возможности человека, но и превзойти их, поскольку синтез программ открывает новые решения, с которыми человечество в настоящее время не может справиться. Мы говорим о потенциальном прорыве в медицине, финансах и, возможно, даже в расшифровке космоса…

Изображение от Saar Barak (Автор)

Дальнейшее чтение и ссылки

  1. Лекции Армандо по дедуктивному синтезу ↩︎
  2. Обзор 2021 года по нейросимволическому синтезу программ ↩︎
  3. Соревновательное программирование с AlphaCode ↩︎
  4. Оценка больших языковых моделей, обученных на коде ↩︎
  5. Совмещение машинного обучения и композиционной семантики Перси Лианга ↩︎
  6. Учебник ACL 2018 по нейронному семантическому разбору ↩︎
  7. Ребенок как хакер ↩︎
  8. Вероятностные модели познания ↩︎
  9. Лекции Армандо по определению и истории синтеза программ ↩︎
  10. минималистическое руководство по синтезу программ
  11. Обзор 2017 года по синтезу программ от сотрудников Microsoft ↩︎