Отметьте языки программирования программа на которых может быть переведена в псевдокод

Обновлено: 05.07.2024

Это может быть непросто, если вы новый программист с самого начала мыслите как программист. Перевод идей приложений в реальный код требует некоторой практики.

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

Что такое псевдокод?

Псевдокод не написан на каком-либо конкретном языке программирования. Он написан простым английским языком, понятным и простым для понимания.

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

  • НАЧАЛО
  • ВХОД
  • READ / GET
  • PRINT / DISPLAY
  • CALCULATE / ОПРЕДЕЛИТЬ
  • УСТАНАВЛИВАТЬ
  • Инкремент / декремент
  • ПРОГРАММА
  • КОНЕЦ

Вот фрагмент того, как может выглядеть псевдокод для программы, которая просит вас ввести ваш любимый цвет и печатает ваш выбор.

Это довольно простой алгоритм, написанный в псевдокоде. Любой может прочитать и понять, что это пытается сделать. Как программист, все, что вам нужно сделать, это воплотить это в жизнь, используя любой язык программирования, на котором вы кодируете. Вот та же программа на JavaScript:

Эта программа использует синтаксис JavaScript

написать алгоритм. Если вы не знаете JavaScript, выяснить, что происходит, может быть немного сложно.

Псевдокод пишет алгоритм, языки программирования пишут синтаксис.

Чем полезен псевдокод?

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

Пример JavaScript легко прочитать, если вы знаете язык. Но что, если вы просто читаете это и пытаетесь определить логику? Конкретные термины, такие как window.prompt или console.log не рассказывать много об алгоритме.

Хорошие принципы программного обеспечения важны. Если вы интервью, чтобы стать инженером программного обеспечения

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

Как написать псевдокод

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

Давайте построим ключевые слова с помощью операторов псевдокода для построения алгоритмов.

Conditionals

Условные операторы имеют решающее значение для программирования. Эти операторы являются операторами IF или IF / ELSE, которые могут добавить логику в ваш код. Эти операторы написаны в псевдокоде с использованием:

Вот программа, которая выполняет простой оператор IF / ELSE, написанный в псевдокоде. Посмотрите, сможете ли вы определить, что этот код пытается сделать, просто прочитав.

Это довольно простая программа. Он запрашивает у пользователя число и делает что-то в зависимости от того, является ли число нечетным или четным.

итерация

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

Этот алгоритм предназначен для программы, которая будет печатать «Hello» 12 раз, что немного излишне, но показывает, насколько просто написать цикл в псевдокоде.

В то время как петли также пишутся очень легко

Еще один довольно простой алгоритм, использующий цикл while для вывода «Hello». Оба примера цикла имеют четкое начало и конец итерации.

Вы также можете написать так называемые циклы Do-While.

, Ключевые слова в псевдокоде отличаются: REPEAT и UNTIL.

Так же, как делать пока цикл, это будет выполнять действие, пока не будут выполнены определенные критерии. Как только оно выполнено, цикл завершится.

функции

Вы можете вызывать функции в псевдокоде.

Там не так много функций; они очень просты, и вы можете добавить любую логику, которая вам нравится.

Обработка ошибок

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

Вы можете обрабатывать ошибки и исключения, используя ключевое слово: ИСКЛЮЧЕНИЕ. Вот простой алгоритм, который ловит ошибку

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

Разработка программного обеспечения и многое другое

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

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

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

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

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

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

Вдобавок система команд виртуальной машины редко бывает очень сложной. Это на реальном процессоре обнулить регистр еах можно несколькими способами, например:

sub еах, еах; хоr еах, еах; and еах, еах; mov еах, 0.

А в виртуальной машине такая избыточность не имеет смысла.

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

В любом случае, для многих популярных транслируемых языков программирования были разработаны декомпиляторы, позволяющие получить если не точную копию оригинального исходного текста, то часто эквивалентный код, который может быть скомпилирован и будет работать так же, как оригинальная программа. В разных языках программирования количество информации, сохраняемой в оттранслированном тексте, может отличаться. В некоторых случаях сохраняются имена всех функций и переменных. Иногда могут быть извлечены даже номера строк исходного текста, где располагался тот или иной оператор, и имя исходного файла. Но может быть и так, что сохраняется только последовательность вызовов функций и употребления операторов, в то время как вся символическая информация об именах оказывается утраченной.

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

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

Одним словом, использование транслируемых языков программирования, допускающих частичную или полную декомпиляцию, — это далеко не лучший выбор для реализации защитных механизмов. Противник имеет возможность в самые короткие сроки получить доступ к исходным текстам всех исходных алгоритмов, чтобы попытаться найти уязвимость. А иногда противнику и вовсе удается убрать из декомпилированного текста все обращения к защитным функциям и заново скомпилировать программу.

Перевод статьи «How to write Pseudocode: A beginner’s guide».


Photo by Egor Milogrodskiy on Unsplash

Зачем вообще писать псевдокод?

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

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

Что такое псевдокод?

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

Есть ли альтернатива написанию псевдокода?

Да, есть и другие варианты. Вы можете пользоваться диаграммами UML, блок-схемами, а также языком ДРАКОН. Все это может быть использовано с теми же целями, но потребует больше ресурсов по сравнению с псевдокодом.

Операторы

Операторы это инструкции, предписывающие компьютеру выполнить определенное действие.

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

Математические операторы

Математические операторы — неотъемлемая часть разработки решения. Они позволяют нам производить различные манипуляции с хранимыми значениями. Вот как используются распространенные математические символы:

Ключевые слова

Ключевое слово это слово, «зарезервированное» за программой и имеющее специальное значение. Ключевые слова могут быть командами или параметрами. В каждом языке программирования есть свои ключевые (зарезервированные) слова. Они не могут использоваться в качестве имен для переменных.

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


Photo by ThisisEngineering RAEng on Unsplash

Условия

При разработке алгоритмов нам нужно оценивать выражения и делать так, чтобы инструкции выполнялись в зависимости от того, является ли значение выражения истиной или ложью (True или False).

Вот некоторые распространенные условия, используемые в псевдокоде:

IF — ELSE IF — ELSE

При помощи этих слов указывается, что инструкции должны быть выполнены при соблюдении определенных условий. (Сами слова в буквальном переводе означают IF — «если», ELSE IF — «еще если», ELSE — «в противном случае», THEN — «тогда, в таком случае», — прим. перев.). Условий при этом может быть несколько, как и переменных.

Вот if-блок с одним условием:

Вот if-блок с разделом else. ELSE позволяет запустить выполнение каких-то инструкций, если первое условие, заданное при помощи IF, не соблюдено.

Мы можем добавлять дополнительные условия для выполнения разных инструкций.

Case-структуры используются, если нужно проверить одну переменную на совпадение с несколькими условиями.

Вариант OTHERS опционален. Условия обычно бывают в виде чисел или букв.

Итерации

«Итерировать» означает повторять набор инструкций, чтобы получить последовательность результатов (для достижения какой-то цели).

Структура FOR

Цикл FOR принимает группу элементов и запускает код в цикле для каждого отдельного элемента.

Структура WHILE

Цикл WHILE похож на цикл FOR. Но цикл FOR это способ повторять блок кода до того момента, как определенное условие станет истиной. В отличие от цикла FOR, цикл WHILE длится, пока какое-то условие является истиной.

Чтобы цикл while не стал бесконечным, мы добавляем какую-то инструкцию для манипуляций со значением в каждой итерации. Например, значение может увеличиваться или уменьшаться.


Photo by Marília Castelli on Unsplash

Функции

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

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

Обертывание программ

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

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

Обработка исключений

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

Заключение

Для написания псевдокода нет каких-то технических правил. Главное — писать псевдокод так, чтобы людям было легко его читать, а ход программы был понятен.

Есть различные руководства по написанию псевдокода, более специфичного для какого-то определенного языка программирования. Например, есть правила стиля псевдокода для языков Fortran, Pascal, C, Basic.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Были попытки объединить языковые конструкции разных языков в «единый синтаксис». Это называлось языком 4GL и никогда не использовалось.

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

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

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

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

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

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

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

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

Интересным подходом был бы интерпретатор псевдокода типа «по ходу». То есть вы должны заранее установить язык, который будет использоваться, а затем он попытается преобразовать псевдокод в реальный код в реальном времени по мере ввода. Интерактивное средство можно использовать, чтобы прояснить неоднозначные вещи и разрешить исправления. Частью механизма может быть библиотека кода, которую преобразователь пытается сопоставить. Со временем он мог изучить и адаптировать свой перевод в зависимости от привычек конкретного пользователя.

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

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

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

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

Да, команда Unix file .

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

Насколько я могу судить, в SO есть универсальная подсветка синтаксиса, которая пытается комбинировать ключевые слова и синтаксис комментариев всех основных языков. Иногда ошибается:

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

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

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

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

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

У этого программиста было соглашение начинать блоки комментариев строкой дефисов, например:

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

«Гибкий парсинг» - не всегда хорошо.

Чтобы создать «интерпретатор псевдокода», может потребоваться разработать язык программирования, допускающий определяемые пользователем расширения его синтаксиса. Уже существует несколько языков программирования с этой функцией, например Coq, Seed7, Agda и рычаг. Особенно интересным примером является язык программирования Inform, поскольку его синтаксис по сути является «структурированным английским».

язык программирования Coq позволяет "синтаксические расширения", чтобы язык можно было расширить для синтаксического анализа новых операторов:

Notation "A /\ B" := (and A B).

Точно так же язык программирования Seed7 может быть расширен для анализа "псевдокода" с помощью " определений структурированного синтаксиса . " Цикл while в Seed7 определяется следующим образом:

syntax expr: .while.().do.().end.while is -> 25;

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

Читайте также: