Как и многие из вас, ребята из SO, Я часто пишу на нескольких языках. А когда дело доходит до планирования (или даже ответа на некоторые вопросы SO), я действительно думаю и пишу на каком-то неопределенном гибридном языке. Хотя раньше меня учили делать это с помощью блок-схем или UML-подобных диаграмм, оглядываясь назад, я обнаружил, что «мой» язык псевдокода содержит компоненты C
, Python
, Java
, bash
, Matlab
, perl
, Базовый
. Кажется, я неосознанно выбираю идиому, лучше всего подходящую для выражения концепции / алгоритма.
Общие идиомы могут включать в себя скобки в стиле Java для области видимости, понимания питонических списков или отступов, наследование в стиле C ++, лямбды в стиле C #, срезы в стиле Matlab и операции с матрицами.
Я заметил, что это ' На самом деле людям довольно легко понять, что я пытаюсь сделать, и довольно легко людям разумно перевести на другие языки. Конечно, этот шаг включает рассмотрение крайних случаев и моментов, когда каждый язык ведет себя своеобразно.
Но в действительности большинство этих языков разделяют подмножество ключевых слов и библиотечных функций, которые, как правило, ведут себя одинаково - математические функции, имена типов, while
/ для
/ if
и т. Д. Ясно, что мне пришлось бы исключить многие «странные» языки, такие как lisp, производные APL, но ...
Итак, мои вопросы:
Существует ли уже код, распознающий язык программирования текстового файла? (Конечно, это должна быть менее сложная задача, чем синтаксические деревья eclipse или Google Translate ' s функция угадывания языка, верно?) На самом деле, делает ли выделитель синтаксиса SO что-либо подобное?
Возможно ли теоретически создать единственный интерпретатор или компилятор, который распознает, какую языковую идиому вы используете в любой момент и (возможно, «разумно») выполняется или преобразуется в работоспособную форму. И помечает угловые случаи, когда мой синтаксис неоднозначен в отношении поведения. Непосредственные трудности, которые я вижу, включают: знание того, когда следует переключаться между режимами, зависящими от отступов и скобок, распознавание забавных операторов (например, * указатель
vs * kwargs
) и знание, когда использовать list vs представления в виде массивов.
Существует ли какой-либо язык или интерпретатор, что может управлять таким гибким переводом?
Не упустил ли я очевидное препятствие на пути к этому?
Спасибо всем за ваши ответы и идеи. Я планирую написать эвристический транслятор на основе ограничений, который мог бы потенциально «решать» код для предполагаемого значения и переводить в реальный код Python. Он будет замечать ключевые слова из многих распространенных языков и будет использовать синтаксические подсказки для устранения неоднозначности намерений человека, такие как интервалы, скобки, необязательные вспомогательные слова, такие как let
или , затем
, контекст того, как переменные ранее использованные и т. д., плюс знание общих соглашений (например, заглавные имена, i для итераций, и некоторое упрощенное ограниченное понимание именования переменных / методов, например, содержащих слово get
, асинхронный
, подсчет
, последний
, предыдущий
, мой
и т. Д.). В реальном псевдокоде именование переменных так же информативно, как и сами операции!
Используя эти подсказки, он будет создавать предположения относительно реализации каждой операции (например, индексирование на основе 0/1, когда следует перехватывать или игнорировать исключения, какие переменные должны быть const / global / local, где начинать и заканчивать выполнение , и какие биты должны быть в отдельных потоках, обратите внимание, когда числовые единицы совпадают / нуждаются в преобразовании). Каждое предположение будет иметь определенную достоверность - и программа будет перечислить предположения для каждого оператора, так как она превращает то, что вы пишете, в нечто исполняемое!
Для каждого предположения вы можете «прояснить» свой код, если ты не Мне нравится первоначальная интерпретация. Вопрос с библиотеками очень интересен. Мой переводчик, как и некоторые IDE, будет читать все определения, доступные для всех модулей, использовать некоторую статистику о том, какие классы / методы используются наиболее часто и в каких контекстах, и просто угадайте! (добавление примечания к программе, чтобы объяснить, почему она так догадалась ...) Думаю, она должна попытаться выполнить все и предупредить вас о том, что ей не нравится. Он должен разрешить все , но дать вам знать, каковы несколько альтернативных интерпретаций, если вы не двусмысленны.
Конечно, пройдет какое-то время, прежде чем он сможет справиться с такими необычными примерами, как @Albin Sunnanbo Важный пример клиента
. Но я дам тебе знать, как у меня дела!