Как и многие из вас, ребята, я часто пишу на нескольких языках. И когда дело доходит до планирования материала (или даже ответа на некоторые вопросы SO), я на самом деле думаю и пишу на каком-то неопределенном гибридном языке. Хотя меня учили делать это с помощью блок-схем или диаграмм, подобных UML, в ретроспективе я нахожу "мой" язык псевдокода имеет компоненты C
, Python
, Java
, bash
, Matlab
, perl
, Basic
. Кажется, я бессознательно выбираю идиому, наиболее подходящую для выражения понятия/алгоритма.
Общие идиомы могут включать в себя Java-подобные фигурные скобки для области видимости, интерпретации pythonic-списка или отступов, С++-подобный наследование, С# -строчные лямбды, матлаб-подобные срезы и операции с матрицами.
Я заметил, что людям очень легко понять, что я делаю, и очень легко людям разумно перевести на другие языки. Конечно, этот шаг включает рассмотрение угловых случаев и моменты, когда каждый язык ведет себя по-своему.
Но на самом деле большинство этих языков разделяют подмножество ключевых слов и функций библиотеки, которые обычно ведут себя одинаково: функции математики, имена типов, while
/for
/if
и т.д. Очевидно, что я должен исключить многие "странные" языки, такие как lisp, производные APL, но...
Итак, мои вопросы:
-
Существует ли код, который распознает язык программирования текстового файла? (Несомненно, это должна быть менее сложная задача, чем деревья синтаксиса eclipse или функция google для перевода языка, правильно?) На самом деле, синтаксис синтаксиса SO делает что-то вроде этого?
-
Возможно ли теоретически создать один интерпретатор или компилятор, который распознает, какой язык идиомы вы используете в любой момент и (возможно, "разумно" ) выполняет или переводит в исполняемую форму, И флаги угловых случаев, когда мой синтаксис неоднозначен в отношении поведения. Непосредственные трудности, которые я вижу, включают в себя: знание, когда нужно переключаться между зависимыми от отступа и зависящими от фигуры режимами, распознавая смешные операторы (например,
/li >*pointer
vs*kwargs
) и зная, когда использовать список против представлений, подобных массиву. -
Существует ли какой-либо язык или интерпретатор, который может управлять подобным гибким интерпретацией?
-
Я пропустил очевидное препятствие на пути к этому?
изменить
Спасибо всем за ваши ответы и идеи. Я планирую написать основанный на ограничениях эвристический переводчик, который мог бы, возможно, "решить" код для предполагаемого значения и перевести на реальный код на Python. Он будет замечать ключевые слова из многих распространенных языков и будет использовать синтаксические подсказки для устранения неоднозначности человеческих намерений - таких как интервалы, скобки, необязательные вспомогательные слова, такие как let
или then
, контекст того, как используются переменные и т.д., А также знание общих (например, имена капитала, я для итерации и некоторое упрощенное ограниченное понимание наименования переменных/методов, например, содержащих слово get
, asynchronous
, count
, last
, previous
, my
и т.д.), В реальном псевдокоде переменное именование так же информативно, как и сами операции!
Используя эти подсказки, он создаст предположения относительно реализации каждой операции (например, индексирование на основе 0/1, когда следует исключить или проигнорировать исключения, какие переменные должны быть const/global/local, где начинать и заканчивать выполнение, и какие биты должны быть в отдельных потоках, обратите внимание, когда числовые единицы соответствуют/нуждаются в преобразовании). Каждое предположение будет иметь определенную определенность - и программа будет перечислить допущения для каждого утверждения, поскольку она уговорит то, что вы пишете во что-то исполняемое!
Для каждого предположения вы можете "уточнить" свой код, если вам не нравится первоначальная интерпретация. Проблемы с библиотеками очень интересны. Мой переводчик, как и некоторые IDE, будет читать все определения, доступные из всех модулей, использовать некоторые статистические данные о том, какие классы/методы используются наиболее часто и в каких контекстах, и просто угадать! (добавив примечание к программе, чтобы сказать, почему она догадалась как таковая...) Я думаю, она должна попытаться выполнить все и предупредить вас о том, что ей не нравится. Он должен разрешить что-либо, но дайте знать, что такое несколько альтернативных интерпретаций, если вы неоднозначны.
Конечно, это будет некоторое время, прежде чем он сможет управлять такими необычными примерами, как пример @Albin Sunnanbo ImportantCustomer
. Но я дам вам знать, как я поеду!