Интерпретатор псевдокода?

как и многие из вас, ребята, на SO, я часто пишу на нескольких языках. И когда дело доходит до планирования (или даже ответа на некоторые вопросы SO), я действительно думаю и пишу на каком-то неопределенном гибридном языке. Хотя раньше меня учили делать это с помощью блок-схем или UML-подобных диаграмм, оглядываясь назад, я нахожу "мой" язык псевдокода имеет компоненты C, Python, Java, bash, Matlab, perl, Basic. Я, кажется, бессознательно выбираю идиому лучше всего подходит для выражения концепции / алгоритма.

общие идиомы могут включать Java-подобные фигурные скобки для области, pythonic List или отступы, C++как наследование, C#-style lambdas, MATLAB-подобные срезы и матричные операции.

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

но на самом деле большинство этих языков имеют подмножество ключевых слов и библиотечных функций, которые обычно ведут себя одинаково - математические функции, имена типов,while/for/if etc. Ясно, что мне придется исключить многие "нечетные" языки, такие как lisp, APL производные, но...

Итак, мои вопросы,

  1. код уже существует, что признает программирования язык текстового файла? (Конечно, это должна быть менее сложная задача, чем синтаксические деревья eclipse или функция угадывания языка google translate, верно?) На самом деле, делает ли so синтаксический маркер что-нибудь подобное?

  2. это теоретически возможно чтобы создать один интерпретатор или компилятор, который распознает, какую языковую идиому вы используете в любой момент и (возможно, "разумно") выполняет или переводит в выполняемую форму. И помечает угловые случаи, когда мой синтаксис неоднозначен в отношении поведения. Непосредственные трудности, которые я вижу, включают: знание того, когда переключаться между режимами, зависящими от отступов и скобок, распознавание забавных операторов (например,*pointer vs *kwargs) и зная, когда использовать list vs array-like представления.

  3. существует ли какой-либо язык или переводчик, который может управлять таким гибким интерпретацией?

  4. Я упустил очевидное препятствие на пути к этому?

редактировать

спасибо всем за ваши ответы и идеи. Я планирую написать эвристический переводчик на основе ограничений, который мог бы,потенциально," решить " код для предполагаемого значения и перевести в реальный код python. Он заметит ключевые слова из многих распространенных языков и будет использовать синтаксические подсказки для устранения двусмысленности намерений человека - например, интервал, скобки, дополнительный помощник такие слова, как let или then, контекст того, как переменные ранее использовались и т. д., а также знание общих соглашений (например, имена капитала, i для итерации и некоторое упрощенное ограниченное понимание имен переменных/методов e.g содержит слово get, asynchronous, count, last, previous, my и т. д.). В реальном псевдокоде именование переменных столь же информативно, как и сами операции!

используя эти подсказки, он создаст предположения относительно реализация каждой операции (например, индексирование на основе 0/1, когда исключения должны быть пойманы или проигнорированы, какие переменные должны быть const/global/local, где начинать и заканчивать выполнение и какие биты должны быть в отдельных потоках, обратите внимание, когда числовые единицы совпадают / нуждаются в преобразовании). Каждое предположение будет иметь заданную определенность-и программа будет список предположений на каждой инструкции, а он уговаривает, что вы пишете в чем-то исполняемый!

для каждого предположение, вы можете "уточнить" свой код, если вам не нравится первоначальная интерпретация. Вопрос библиотек очень интересен. Мой переводчик, как и некоторые IDE, будет читать все определения, доступные из всех модулей, использовать некоторую статистику о том, какие классы/методы используются чаще всего и в каких контекстах, и просто угадайте! (добавление примечания к программе, чтобы сказать, почему он считал таковой...) Я думаю, что он должен попытаться выполнить все, и предупредить вас о том, что ему не нравится. Он должен ничего, но дайте вам знать, каковы несколько альтернативных интерпретаций, если вы неоднозначны.

конечно, пройдет некоторое время, прежде чем он сможет управлять такими необычными примерами, как @Albin Sunnanbo's ImportantCustomer пример. Но я дам тебе знать, как у меня дела!

7 ответов


  1. чтобы определить, какой язык программирования используется: обнаружение языка программирования из фрагмента
  2. Я думаю, что это должно быть возможно. Подход в 1. думаю, это можно использовать. Я бы попытался сделать это итеративно: обнаружить синтаксис, используемый в первой строке/предложении кода, "скомпилировать" его в промежуточную форму на основе этого обнаружения, а также любой важный синтаксис (например, начальные/конечные оболочки). Затем следующая строка / предложение и т. д. В основном напишите парсер, который пытается распознать каждый "кусок". Неоднозначность может быть отмечена тем же алгоритмом.
  3. Я сомневаюсь, что это было сделано ... кажется, что когнитивная нагрузка обучения писать, например, Python-совместимый псевдокод, будет намного проще, чем пытаться отладить случаи, когда ваш интерпретатор терпит неудачу.
  4. a. Я думаю, что самая большая проблема заключается в том, что большинство псевдокодов недействительны на любом языке. Например, я могу полностью пропустить инициализацию объекта в блоке псевдокод, потому что для человеческого читателя почти всегда легко сделать вывод. Но для вашего случая это может быть полностью недействительным в синтаксисе языка выбора, и может быть невозможно автоматически определить, например, класс объекта (он может даже не существовать). Так далее.
    b. Я думаю, что лучшее, на что вы можете надеяться, - это переводчик, который "работает" (с учетом 4a) для код только псевдокод, больше никого.

обратите внимание, что я не думаю, что 4a, 4b обязательно препятствия в возможности. Я просто думаю, что это не будет полезно для практических целей.


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

В C# У вас есть .NET Framework, в C++ У вас есть STL, в Java у вас есть некоторые библиотеки Java и т. д.

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


Предпринимаются попытки унификации языковых конструкций различных языков в "единый синтаксис". Это называлось 4gl по язык и никогда не взял.
субъективное>

в качестве примечания я видел пример кода о длинной странице, которая была действительна как код скрипта c#, Java и Java. Это может служить примером того, где невозможно определите используемый язык.

Edit:

Кроме того, вся цель псевдокода заключается в том, что его не нужно компилировать каким-либо образом. Причина, по которой вы пишете псевдокод, - создать "эскиз", как бы небрежно вам ни нравилось.
foreach c in ImportantCustomers{== OrderValue >=M}
    SendMailInviteToSpecialEvent(c)

теперь скажите мне, какой это язык и напишите интерпретатор для этого.


распознавание того, на каком языке находится программа, на самом деле не так уж важно. Распознавание языка фрагмента сложнее, и распознавание фрагментов, которые не четко разделены (что вы делаете, если четыре строки-Python, а следующая-C или Java?) будет очень трудно.

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

более того, когда вы пишете псевдо-код, вы не беспокоитесь о синтаксисе. (Если да, то вы делаете это неправильно.) Вы получите код, который просто не может быть скомпилирован, потому что он неполный или даже противоречивый.

и, предполагая, что вы преодолели все эти препятствия, насколько Вы были бы уверены, что псевдокод интерпретируется так, как вы думаете?

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

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


программам, интерпретирующим человеческий вклад, необходимо предоставить возможность сказать: "я не знаю."Язык PL / I является известным примером системы, предназначенной для поиска разумной интерпретации чего-либо, напоминающего компьютерную программу, которая может вызвать хаос, когда она ошибается: см. http://horningtales.blogspot.com/2006/10/my-first-pli-program.html

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


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


интересным подходом был бы интерпретатор псевдокода" type-as-you-go". То есть, вы бы установили язык, который будет использоваться спереди, а затем попытались бы преобразовать псевдокод в реальный код в режиме реального времени, как вы набрали. Интерактивное средство может использоваться для прояснения неоднозначных вещей и внесения исправлений. Частью механизма может быть библиотека кода, которую конвертер пытается сопоставить. Со временем, он смог выучить и приспособить свой перевод основанный на привычках а конкретный пользователь.

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

-Нил


код уже существует, что распознает язык программирования текстового файла?

да, Unix file.

(конечно, это должно быть меньше сложная задача, чем синтаксис eclipse деревья или чем Google translate функция угадывания языка, верно?) В факт, не так подсветки синтаксиса что-нибудь подобное?

насколько я могу судить, так one-size-fits-all синтаксический маркер, который пытается объединить ключевые слова и синтаксис комментариев каждого основного языка. Иногда он ошибается:

def median(seq):
    """Returns the median of a list."""
    seq_sorted = sorted(seq)
    if len(seq) & 1:
        # For an odd-length list, return the middle item
        return seq_sorted[len(seq) // 2]
    else:
        # For an even-length list, return the mean of the 2 middle items
        return (seq_sorted[len(seq) // 2 - 1] + seq_sorted[len(seq) // 2]) / 2

обратите внимание, что маркер SO предполагает, что // запускает комментарий в стиле C++, но в Python это оператор целочисленного деления.

это будет серьезной проблемой, если вы пытаетесь объединить несколько языков в один. Что вы делаете, если один и тот же токен имеет разные значения на разных языках? Подобный ситуации:

  • и ^ возведение в степень, как в BASIC, или побитовое XOR, как в C?
  • и || логический или как в C, или конкатенация строк, как в SQL?
  • что это 1 + "2"? Это число преобразуется в строку (давая "12"), или строка преобразуется в число (давая 3)?

есть ли какой-либо язык или переводчик в существовании, которое может управлять этим вид гибкого устный перевод?

на другом форуме я услышал историю компилятора (IIRC, для FORTRAN), который будет компилировать любой программа независимо от синтаксических ошибок. Если бы у вас была линия

= Y + Z

компилятор распознает, что переменная отсутствует, и автоматически преобразует оператор в X = Y + Z, независимо от того, был ли у вас X в вашей программе или нет.

у этого программиста было соглашение о запуске блоков комментариев с линия дефисов, вот так:--13-->

C ----------------------------------------

но однажды, они забыли ведущие C, и компилятор задохнулся, пытаясь добавить десятки переменных между тем, что он считал операторами вычитания.

"гибкий разбор" не всегда хорошая вещь.