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