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

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

Общие идиомы могут включать в себя скобки в стиле Java для области видимости, понимания питонических списков или отступов, наследование в стиле C ++, лямбды в стиле C #, срезы в стиле Matlab и операции с матрицами.

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

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

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

  1. Существует ли уже код, распознающий язык программирования текстового файла? (Конечно, это должна быть менее сложная задача, чем синтаксические деревья eclipse или Google Translate ' s функция угадывания языка, верно?) На самом деле, делает ли выделитель синтаксиса SO что-либо подобное?

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

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

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

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

Спасибо всем за ваши ответы и идеи. Я планирую написать эвристический транслятор на основе ограничений, который мог бы потенциально «решать» код для предполагаемого значения и переводить в реальный код Python. Он будет замечать ключевые слова из многих распространенных языков и будет использовать синтаксические подсказки для устранения неоднозначности намерений человека, такие как интервалы, скобки, необязательные вспомогательные слова, такие как let или , затем , контекст того, как переменные ранее использованные и т. д., плюс знание общих соглашений (например, заглавные имена, i для итераций, и некоторое упрощенное ограниченное понимание именования переменных / методов, например, содержащих слово get , асинхронный , подсчет , последний , предыдущий , мой и т. Д.). В реальном псевдокоде именование переменных так же информативно, как и сами операции!

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

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

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

17
задан Sanjay Manohar 16 September 2010 в 19:45
поделиться