Примеры кода на 39 эзотерических языках программирования

Какой язык выбрать для освоения?

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

Например, для анализа данных применяются Python и R, «короли» веб-разработки — PHP и JavaScript, работа в банковских системах и госструктурах не обойдется без Java, ААА-игры создаются на C++ и C# и так далее.

Наиболее перспективные сферы разработки программного обеспечения:

  • искусственный интеллект;
  • «интернет вещей» и встраиваемые системы;
  • Data Science;
  • мобильные приложения;
  • блокчейн.

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

Implementations

Although it is trivial to make a naive brainfuck interpreter, writing an optimizing compiler or interpreter becomes more of a challenge and amusement much like writing programs in brainfuck itself is: to produce reasonably fast result, the compiler need to piece together the fragmentary instructions forced by the language. Possible optimizations range from simple run-length peephole optimizations on repeated commands and common loop patterns like , to more complicated ones like dead code elimination and constant folding.

In addition to optimization, other types of unusual brainfuck interpreters have also been written. Several brainfuck compilers have been made smaller than 200 bytes – one is only 100 bytes in x86 machine code.

Технические характеристики

BrainfuckPC

  • Общее число реле: 578 штук
  • Общее число логических элементов: 157 штук
  • Разрядность шины адреса: 16 бит
  • Адресация: пословная
  • ОЗУ: 128Кбайт (64 Кслов)
  • Разрядность шины данных: 16бит/8бит
  • Тактовая частота (текущая/максимальная): 25Гц/40Гц
  • Потребляемая мощность: 70Вт
  • Габаритные размеры: 110х650х140мм
  • Масса: 15кг

Состав компьютера

Рис.6: Основные узлы релейного компьютера.Рис.7: Комплект блоков и модулей релейного процессора, готовый к установе на раму.Рис.8: Модули D-триггеров проверяются на работоспособность.Рис.9: Рама собрана из листового 2мм алюминия, из-под лазерной резки. На фото — уже сваренная и загрунтованная рама, готовая к покраске.Рис.10: Итоговый вид индикаторной области. В процессе изготовления.Рис.11: Программатор. 16 линий адреса, 16 линий данных, питание, земля и линии чтения записи. Итого 36 контактов.

  1. Загрузить программу в ОЗУ, ибо каждый раз при включении питания делать это вручную с помощью тумблеров банально лень, хотя и такая возможность присутствует.
  2. Следить за состоянием некоторого региона памяти и отображать его на светодиодной матрице 32х16.

Рис.12: Структурная схема периферии процессора.

Демонстрация работы и текущий статус

вплоть до 31,4 трлн знаковнекий алгоритм расчета написанный на brainfuckРис.13: Время, затрачиваемое на вывод N знаков числа Pi после запятой.

Рис.14: — Пи=3! — Как грубо!Рис.15: Он явно знает про ту шутку, что в условии военного положения пи может доходить до четырех.Рис.16: Время, затрачиваемое на вывод очередного знако после запятой при вычислении дроби.

To be continued…

  • Новая плата памяти, на которой установлены только микросхемы ОЗУ и обвязка к ним. Схема платы памяти есть, печатная плата — еще не разведена. В домашних условиях ее будет лень делать (довольно плотная двухсторонка), посему включу эту плату в заказ, когда буду заказывать платы для пары других проектов — механических часов на реле и пневмоскопа.
  • Вместе с новой платой памяти придут стрелочные индикаторы, нормальный крепеж терминального дисплея и самостоятельная логика обновления светодиодной панели.
  • Программатор, вернее, разработка прошивки для него. Вообще, при наличии старой платы памяти он избыточен, но так как разъем программирования в наличии — уже можно загружать программу и им.
  • Логика тактирования. Тут я совсем ленивая жопа, ибо там буквально обвязать 3 логических модуля. Это обязательно сделаю к фестивалю в конце мая.
  • Инструкция чтения из консоли. Она завязана на логику тактирования (в синхронном режиме работы компьютер должен останавливать работу и ждать прихода данных).
  • Отправить заявку в книгу рекордов Гиннеса… Как на самый быстрый релейный процессор и одновременно самый медленно-считающий. 16 миллиФлопс это вам не «Шубу в трусы заправлять» (из комментариев на youtube).

репозитории на GitHubИ еще — 25–26 мая в Москве, на территории «Хлебозавода», пройдет первый фестиваль крафтовых производств и DIY-культуры Antifactory. Я там буду присутствовать с релейным компьютером и релейный контроллер автополива тоже привезу. Вход на мероприятие свободный, так что будете в эти дни в Москве — не упустите шанс увидеть моего релейного монстра вживую. Если довезу в целости и сохранности — обязательно продемонстрирую в работе.

[править] Употребление

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

  • Нечитаемости программ
  • Неудобства или непродуманности синтаксиса

Перл — это тот же brainfuck, только автор его, почему-то, воспринимает серьезно. Может, конечно, это он так издевается, и тащится от того, что мир подхватил его версию brainfuck и строчит на нем да фанатеет…

Неудобства инструмента разработки

— Нормальному программисту не важно на чем и под какую платформу писать…— Брейнфак под дос.

Мазохизма

—…если вы настоящий мазохист-извращенец, если вам нравится преодолевать непреодолимое и выполнять невыполнимое, то ваш выбор — это BAT-скрипты.— С машиной Тьюринга (или с BrainFuck, что почти то же самое) не сравнить…

Примера, чем чревато излишнее упрощение

— В российских школах будут преподавать программирование на Delphi и C++Builder.— …слава богу, хоть не лисп…— Надо вообще на COBOL’е или на FORTRAN’е учить. Хотя, самый простой, конечно Brainfuck.

Мозгокрутных логических задач, не имеющих практической ценности

Brainfuck. Задача для детей дошкольного возраста. Забудь то, чему тебя учили в школе. Детишки дошколята решают ее в среднем за 3 минуты.
8809=6; 7111=0; 2172=0; 6666=4; 1111=0; 3213=0; 7662=2; 9312=1; 0000=4; 2222=0; 3333=0; 5555=0; 8193=3; 8096=5; 7777=0; 9999=4; 7756=1; 6855=3; 9881=5; 5531=0.
2581=? (спойлер: )

Насмешки при сравнении языков программирования

— Пых-пых что-то достал, хочется чего-то нового, с большими возможностями…
…— Ну автору сабжа же нужно «что-то новое, с большими возможностями». Вот brainfuck ему как раз и подойдет. Утрамбует его моск немножко. Научиться яснее выражать свои мысли, и мы ему быстрее сможем помочь.

REBOL: Relative Expression Based Object Language

Как вы думаете, что общего между песнями “Livin La Vida Loca”, “Mambo No. 5″ и языком REBOL? Все они взлетели на вершину славы в 1999 году, продержались там около месяца и благополучно потеряли звание «крутых».

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

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

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

Пример программы

Программа на языке Brainfuck, печатающая «Hello World!»:
++++++++++>+++++++>++++++++++>+++>+<<<<->++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.

Разбор программы:

Подготовка в памяти (с ячейки 1) массива значений, близких к ASCII-кодам символов, которые необходимо вывести (70, 100, 30, 10), через повторение 10 раз приращения ячеек на 7, 10, 3 и 1, соответственно
присваивание ячейке 0 (счетчику) значения 10
повторять, пока значение текущей ячейки (ячейки 0) больше нуля
приращение ячейки 1 на 7
приращение ячейки 2 на 10
приращение ячейки 3 на 3
приращение ячейки 4 на 1
возврат к ячейке 0 (счетчику), и его уменьшение на 1
вернуться к началу цикла
Получение кодов букв и их вывод
Вывод «Н». Получение кода «H» (72) из 70 в ячейке 1 и вывод
Вывод «e». Получение кода «e» (101) из 100 в ячейке 2 и вывод
Вывод «ll». Получение кода «l» (108) из 101 в ячейке 2 и вывод дважды
Вывод «o». Получение кода «o» (111) из 108 в ячейке 2 и вывод
Вывод пробела. Получение кода пробела (32) из 30 в ячейке 3 и вывод
Вывод «W». Получение кода «W» (87) из 72 в ячейке 1 и вывод
Вывод «o». Код «o» (111) уже находится в ячейке 2, просто его выводим
Вывод «r». Получение кода «r» (114) из 111 в ячейке 2 и вывод
Вывод «l». Получение кода «l» (108) из 114 в ячейке 2 и вывод
Вывод «d». Получение кода «d» (100) из 108 в ячейке 2 и вывод
Вывод «!». Получение кода «!» (33) из 32 в ячейке 3 и вывод
Вывод кода перевода строки (10) из ячейки 4

В принципе, печать «Hello World!» можно реализовать проще, но программа будет в три с лишним раза больше, чем приведённый выше оптимизированный вариант:

+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.

Архитектура релейного компьютера

+Рис.4: Архитектура релейного компьютера в работе. Стадия загрузки новой инструкции сменяется стадией ее исполнения.

Набор инструкций

Рис.5: Набор инструкций релейного компьютера

  • Инструкция NOP — игнорируется.
  • Инструкция CTRLIO — особая инструкция, поведение которой кодируется битовой маской полезной нагрузки. В первую очередь она реализует команды записи в консоль и чтения из консоли (в синхронном или асинхронном режимах). Во-вторых, она позволяет выставить 16-разрядный или 8-разрядный режим работы машины. Ну и в-третьих, с помощью инструкции CTRLIO.HALT можно остановить работу машины. Самое смешное, что биты маски
    неблокирующие. Можно выставить их хоть все сразу, но поведение машины будет неопределено.
  • Инструкция ADD — операция работы с ячейкой данных. Изменяет значение в ячейке на величину константы. При этом, бит.12 — знаковый бит и копируется в биты 13-15. Поэтому инструкция 0x2ffe превращается в операцию *AP += 0x0ffe, а инструкция 0x3ffe — в *AP += 0xfffe. Операция вычитания заменяется сложением с отрицательным числом.
  • Инструкция ADA — реализует операцию AP+=const и позволяет перемещаться по памяти.
  • Инструкции JZ и JNZ — условные. В зависимости от Z-флага позволяют либо совершить прыжок на несколько инструкций вперед или назад, либо остаться на месте. В зависимости от режима работы машины — 16 или 8 бит, состояние Z-флага определяется либо младшим байтом данных либо словом целиком.

Example and benchmark

Files:

  • Brainfuck (input): mandelbrot.b.txt
  • C (output): mandelbrot.c
  • Java (output): mandelbrot.java
  • Python (output): mandelbrot.py

Benchmark:

Unoptimized Optimized
C, -O0 17.20 s 2.77 s
C, -O1 1.09 s 0.64 s
C, -O2 1.02 s 0.66 s
C, -O3 1.05 s 0.66 s
Java 41.40 s 19.20 s
Python 490.00 s 190.00 s

All benchmarks above were performed on an Intel Xeon E3-1270 3.40 GHz CPU (single-threaded). The non-optimized source codes are not published because they are uninteresting. Numbers are reported to 3 significant figures. Software-wise, GCC 4.8.2, Oracle Java 1.7.0_51, CPython 2.7.6, and Linux 3.12.6 x86-64 were used.

Note that the speed comparison is not fair because the C code has no bounds checking and can easily trigger undefined behavior, whereas the Java and Python programs are bounds-checked, safe, and deterministic.

ALGOL 68: ALGOrithmic Language 1968

Язык получил звание «самой великолепной комбинации успеха в теории и провала на практике» среди языков программирования. ALGOL 68 – язык, созданный в качестве альтернативы существовавшему уже на тот момент ALGOL 60. Это детище печально известного сообщества «бунтарей», у которых отлично получалось вызывать в программистской среде сплетни и агрессию по отношению к себе. Хотя язык сам по себе сейчас практически не используется, он служит вечным напоминанием потомкам о том, как не надо делать «креатив». ALGOL 68 был первым языком (и, надо признаться, и по сей день остается одним из очень немногих), официальная спецификация которого появилась раньше, чем реализация. Правда, спецификация эта
была совершенно нечитабельной и немедленно принесла проекту репутацию чересчур «навороченного».

То, что ALGOL 68 и в самом деле был сложным, громоздким и содержал в себе множество загадочных операторов, так же верно, как и то, что это был первый действительно универсальный язык. Именно он стал «идейным вдохновителем» для создателей С и Bourne Shell. Благодаря ALGOL 68 параллельная обработка данных упростилась до такой степени, что даже современные языки типа Java и С++ до сих пор не добрались до его уровня.

ALGOL 68 скоропостижно скончался, так и не успев толком пожить. Благодаря невнятности спецификации членам комитета разработчиков ничего не стоило утопить проект еще до того, как люди смогли реально оценить его достоинства и недостатки.

PowerBuilder

Подождите кривить лицо, изображая свое отношение к этому слову. Поверьте, что PowerBuilder (он же «PB») все еще используется в сотнях организаций по всему миру. Но даже самые ярые его приверженцы вынуждены согласиться, что сейчас значимость PowerBuilder уже совсем не та, что в 1996 году.
PowerBuilder был создан как простой в применении графический клиент-серверный инструмент, поддерживающий соединение с наиболее известными реляционными базами данных (к примеру, Oracle). В целом, проект достиг огромного успеха, что позволило компании-учредителю Powersoft выйти в свет.

PowerBuilder был атакован одновременно с трех сторон. Интернет-бум, появление Delphi и возвышение Visual Basic – это три фактора, ставших началом его конца. Средства начали уходить на web-проекты на Visual Basic, «дельфийцев» стало значительно больше, чем людей, знающих PowerBuilder… Приговор был подписан.

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

History

In 1992, Urban Müller, a Swiss physics student, took over a small online archive for Amiga software. The archive grew more popular, and was soon mirrored around the world. Today, it is the world’s largest Amiga archive, known as Aminet.

Müller designed Brainfuck with the goal of implementing it with the smallest possible compiler, inspired by the 1024-byte compiler for the . Müller’s original compiler was implemented in machine language and compiled to a binary with a size of 296 bytes. He uploaded the first Brainfuck compiler to Aminet in 1993. The program came with a «Readme» file, which briefly described the language, and challenged the reader «Who can program anything useful with it? :)». Müller also included an interpreter and some quite elaborate examples. A second version of the compiler used only 240 bytes.

As Aminet grew, the compiler became popular among the Amiga community, and in time it was implemented for other platforms.

P′′: Brainfuck’s formal «parent language»

Except for its two I/O commands, Brainfuck is a minor variation of the formal programming language P′′ created by Corrado Böhm in 1964, which in turn is explicitly based on the Turing machine. In fact, using six symbols equivalent to the respective Brainfuck commands , , , , , , Böhm provided an explicit program for each of the basic functions that together serve to compute any computable function. So the first «Brainfuck» programs appear in Böhm’s 1964 paper – and they were programs sufficient to prove Turing completeness.

The Infinite Abacus: Brainfuck’s «grand-parent» language

A version with explicit memory addressing rather without stack and a conditional jump was introduced by Joachim Lambek in 1961 under the name of the Infinite Abacus, consisting of an infinite number of cells and two instructions:

  • (increment cell X)
  • (decrement X if it is positive else jump to T)

He proves the Infinite Abacus can compute any computable recursive function by programming Kleene set of basic μ-recursive function.

His machine was simulated by Melzac’s machine modeling computation via arithmetic rather than logic mimicking a human operator moving pebbles on an abacus, hence the requirement that all numbers must be positive. Melzac, whose one instruction set computer is equivalent to an Infinite Abacus, gives programs for multiplication, gcd, nt prime number, representation in base b, sorting by magnitude, and shows how to simulate an arbitrary Turing machine.

Язык программирования Brainfuck

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

Инструкции языка Brainfuck

Весь синтаксис языка строится вокруг ОЗУ на 30 тысяч ячеек памяти с разрядностью 8 бит.

  • Двумя инструкциями и мы изменяем значение в текущей ячейке данных на единицу больше или меньше.
  • Двумя инструкциями и мы изменяем на единицу указатель на текущую ячейку данных, тем самым перемещаясь по памяти.
  • Еще две инструкции — и — позволяют нам организовать циклы. Все, что внутри скобок, является телом цикла. Вложенные циклы допускаются. Логика инструкции проста — если значение текущей ячейки данных не равно нулю, мы выполним одну итерацию цикла, если равно, то выходим из него.
  • Последние две инструкции — и . Они позволяют вывести значение текущей ячейки в терминал или ввести его с устройства ввода в ОЗУ. Это позволяет писать интерактивные программы.

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

Haskell

По сравнению с большинством «провальных» представителей нашего списка, Haskell можно назвать довольно популярным языком. Но несмотря на толпу его фанатов (маленькую, но сильную и, главное, очень громкую), Haskell всю свою жизнь был языком-неудачником.

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

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

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

Актуальные языки

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

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

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

Однако рейтинги и топы в интернете могут иметь статистические погрешности. Индексы TIOBE и PYPL ориентируются только на поисковые запросы: первый — на их количество, а второй — на то, как часто люди гуглят тот или иной язык. На самом деле узнать, сколько разработчиков в мире используют Python, R или Ruby, непросто — для этого придется провести очень масштабное и сложное исследование. Если вы знаете, как это сделать, напишите в комментариях.

Мы предложили бы ориентироваться на ежегодный отчет GitHub, где указывается 15 наиболее популярных на этой платформе языков. Пусть выборка включает в себя только проекты с открытым исходным кодом и не охватывает 100% профессиональной области, она все же более близка к истине. По этим данным рейтинг за 2017 год:

Еще один внушающий доверие рейтинг — опрос разработчиков на StackOverfow:


Полное исследование здесь

Здесь тоже лидируют JavaScript и относящиеся к frontend языки разметки HTML и CSS.

РЦВМ-2 Buzzy

Изначально за основу этой машины я взял микроконтроллерную архитектуру MSP430. Это полноценная 16-разрядная архитектура с единым адресным пространством для кода и данных. Здесь всего 27 инструкций, из них 11 — математические операции АЛУ. 16 регистров общего назначения, ортогональная система доступа к памяти — что может быть лучше?

Принципиальная схема АЛУ проекта РЦВМ-2 для 1 бита

На рисунке выше представлена принципиальная схема АЛУ будущего компьютера для одного бита. Каждый прямоугольный блок — это простейший логический элемент на базе одного или нескольких реле. С одной стороны, выглядит несложно — много однотипных элементов. С другой стороны, на один бит требуется 36 реле — или 576 реле на 16-разрядное АЛУ. С учетом 16 регистров по 16 бит каждый, кучи логики, защелок, декодера инструкций и т.д. общее количество реле, требуемое для осуществления этой задумки, быстро перевалило за три тысячи. И тут на помощь пришел Brainfuck.

Низкоуровневые и высокоуровневые

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

Усложнение программ привело к тому, что люди уже не могли эффективно писать их на устаревшем языке ассемблера. В 1970-е годы разработчики создали первый высокоуровневый язык, многим известный Fortran, который используется и сейчас — в основном в научных разработках и вычислениях. В третьем и четвертом поколениях оформилось структурное программирование и появились функциональные языки: это, например, C, Pascal, Lisp, Scala, Erlang, F#, Haskell и другие.

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

Интерпретатор Brainfuck

Perl

Пример интерпретатора Brainfuck, написанный на языке Perl:

#!/usr/bin/perl
open F, shift;
@code = grep {/><]/} split '', <F>;
for (my $_ = ; $_ < @code; ++$_) {
  ++$cpu$i if $code$_ eq '+';
  --$cpu$i if $code$_ eq '-';
  --$i if $code$_ eq '<';
  ++$i if $code$_ eq '>';
  print chr $cpu$i if $code$_ eq '.';
  $cpu$i = ord <STDIN> if $code$_ eq ',';
  if ($code$_ eq ') {
      ++$brc;
      while ($brc) {
        ++$_;
        ++$brc if $code$_ eq '';
      }
    } else {
      next;
    }
  } elsif ($code$_ eq ']') {
    if (!$cpu$i]) {
      next;
    } else {
      ++$brc if $code$_ eq ']';
      while ($brc) {
        --$_;
        --$brc if $code$_ eq '';
      }
    --$_;
    }
  }
}

C++

Пример интерпретатора Brainfuck, написанный на языке C++:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

static char cpu30000];

int main(int argc, char **argv) {
    vector<char> acc;
    char ch;
    ifstream infile(argv1]);
    while (infile) {
        infile.get(ch);
        acc.push_back(ch);
    }
    infile.close();
    unsigned int j = ;
    int brc = ;
    for (int i = ; i < acc.size(); ++i) {
        if (acci == '>')
            j++;
        if (acci == '<')
            j--;
        if (acci == '+')
            cpuj++;
        if (acci == '-')
            cpuj--;
        if (acci == '.')
            cout << cpuj];
        if (acci == ',')
            cin >> cpuj];
        if (acci == ') {
                ++brc;
                while (brc) {
                    ++i;
                    if (acci == '')
                        --brc;
                }
            } else
                continue;
        } else if (acci == ']') {
            if (!cpuj])
                continue;
            else {
                if (acci == ']')
                    brc++;
                while (brc) {
                    --i;
                    if (acci == '')
                        brc++;
                }
                --i;
            }
        }
    }
}
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector