Личные инструменты

Портал:Ниасилили/PureBasic

Материал из Lurkmore

Перейти к: навигация, поиск
Эта статья находится на доработке.
Эта статья всё ещё не взлетела и не соответствует нынешним реалиям /lm/. Если 31.12.2011 не наступит решительного улучшения, статья подлежит безоговорочному уничтожению.
Модераторам: сжечьвыпуститьДата последней правки страницы: 30.10.2011

PureBASIC (пур, пурик, ПБ) — надстройка над фасмом, своеобразный язык программирования подчеркнуто среднего уровня, ведущий свои корни с AmigaOS. Меметичен, в первую очередь, активным форсом на быдлопроектах вроде ответов@mail.ru и гуглответов. Задайте там вопрос вроде: «мне 14 лет, я страдаю аутизмом и приступами паники, меня бьют в музыкальной школе и у меня не хватает денег на WoW, поэтому я хочу написать свой; с чего начать?» — и обязательно получите ссылку от агентов ZOG, удачно использующих тягу растущего организма к непонятному. Таким макаром уже набралось порядочное комьюнити детей, решающих бесполезные задачи бесполезным инструментом. Семантически, бейсиком не является — часть Basic в названии лишь намекает на некоторое сходство синтаксисов. Впрочем, взамен есть возможность ёбли с указателями, так что можно невозбранно использовать родные низкоабстрактные сервисы операционных систем и прочие задротские штучки. Проприетарен и весьма платен, но в этой стране как обычно.

Содержание

[править] Примеры форса

Достаточно зайти на страничку самого упоротого пиараста на сервисе мэйла и увидеть 9000 ответов одного и того же шаблона. Второй вариант «Скачай PureBasic и сделай», без объяснений, как именно. Встречается на любой вопрос формата «как сделать что-то»: как написать бота, что нужно для игры жанра «Гонки», как изменить exe файл, как создать вирус pinch, как сварить кофе.

Само собой, Пурик это язык самый лучший, перспективный, используемый, продвинутый, популярный, универсальный, да и вообще, весь проект мэйлру написан на нём. Наводит на логичный вопрос (который регулярно поднимается и на самом ресурсе, но ответов не получает), действительно ли это агент ZOG, излишне жирный тролль или просто малолетний долбоёб?

ЧСХ при вопросе уже взятых в рабство людей «помогите, как на пурике сделать это» невозбранно шлёт задавать вопросы на форум, где поциенты делятся друг с другом разнообразными велосипедами, сваренными в гараже специально для самого лучшего, но обделённого большинством необходимых для прикладного программирования функций, языка.
Следующий абзац людям непрограммистам (или хотя бы быдлокодерам) лучше не читать.

Анонимус, поюзавший данный ЯП из ознакомительного интереса после близкого знакомства с Делфи, плюсами, шарпом, VB и скриптовой мелочью вроде JS, гарантирует, что на уровне прикладного программирования пурик не даёт никаких глобальных приимуществ. Отмечается, что: В среду впилен движок Ogre (чисто для увеличения в хелпе количества функций, которыми «владеет» язык), впилены WinAPI (Не на уровне ссылок на библиотеки, а хардкодом, в результате чего часть из них тупо не работает).
Несмотря на это, первый пункт позволяет везде кричать, что пурик идеально подходит для написания игр (Хотя Огр движок не является игровым), а второй, что для работы с API он так же самый лучший (Хотя апишки можно подключить в любом языке, но добавление одной неработающей по умолчанию API функции в Пурике, ввиду синтаксиса, займёт пяток строк, по сравнению с одной строкой в любом другом языке). Количество методов/событий для любого визуального объекта стремится к нулю — в Делфи или Шарпе для объекта кнопки (Button) есть пятнадцать событий, в Пурике — одно, что, опять же, делает язык абсолютно не приспособленым к прикладному программированию.

Есть пара достоинств (не перекрывающее всех недостатков) у данного языка — простой синтаксис создания динамических визуальных объектов и возможность обработки их, как одного массива. Возможно, есть и ещё что-то, но глубокому изучению языка мешает то, что он отвращает большинство людей, которые могли бы его грамотно продвигать по двум причинам:
1. В названии есть слово Basic.
2. Он настолько убого форсится, что вызывает неконтролируемое отвращение не только у людей, кто не знает, с какой стороны включать монитор, но даже у тех, кто уже давно на нём кодит.

Данная статья на уютненьком так же изначально была чистой акцией рекламы, PureНехристь даже не постеснялась причислить своего идола к небыдлокодерским ЯП в соответствующей статье (уже выпилено). Посему, всё, что написано ниже, особой ценности не несёт, но может быть интересна с позиции, как надо пиарить язык программирования фразами типа на уровне «можно использовать не только цифры, но и буквы и всё это даже с клавиатуры!».

[править] Основные особенности

  • Кросс-платформенность (Win(32/64), Linux(32/64), MacOS, заброшенная версия для Амиги)
  • Компилятор почти никогда не делает то, о чем его не просят. Даже поддержку плагинов для нестандартных форматов данных надо впиливать вручную.
  • Благодаря вышеуказанному, число редкостно всем нужных вещей в .EXE неудержимо стремится к 0, делая его относительно небольшим (2KБ минимум).
  • Нет ООП[1]. И не будет. Никогда. Создатели PB являются ярыми противниками этой концепции, так как она противоречит здравому смыслу ассемблерщика. Но это не мешает использовать интерфейсы для ООП-подобного программирования.
  • Компилятор в начале делает ассемблерный листинг, который и предается FAsm’у. Процесс может быть перехвачен спец. параметром командной строки, что дает возможность вручную подкорректировать сгенерированный код.
  • Местами идущее вразрез с логикой стремление к чистоте синтаксиса.
  • Слиты вместе понятия подпрограммы и функции: процедура всегда что-то возвращает[2] и вызывается только со скобками.
  • Платен, на что в этой стране всем похуй.
  • Переменные и поля структур могут иметь те же названия, что и типы.
  • Язык не поддерживает тип Any, и даже из встроенных библиотек эта полу-ООП’шная ересь потихоньку выкорчевывается, ибо не сурово.

[править] Хорошее

  • Есть макрокоманды, причем даже с поддержкой опциональных параметров.
  • Есть Inline-assembler (что и неудивительно, при такой-то организации). Можно даже напрямую передавать директивы фасму.
  • Старательно поощряется прямой доступ к памяти: указатели на все, вызовы по адресу памяти, разнообразные Peek/Poke.
  • Допускается рекурсивный вызов макрокоманды (с некоторыми ограничениями).
  • Структуры и интерфейсы поддерживают наследование.
  • Изначально впилена поддержка всевозможных API без необходимости оные отдельно объявлять.
  • Широкий круг встроенный библиотек на все случаи жизни: от многопоточности до 3D-звука.
  • Мультимедийные библиотеки работают как под DX (4, 7, 9), так и под OGL. На выбор.
  • Имеются подсистемы — легко создаваемые override-пакеты библиотек.
  • Совместим с QBasic’ом. Ну, слегка. То есть почти никак.
  • Есть константные перечисления (Enumerations) с задаваемым шагом и возможностью получать\изменять текущее значение счетчика.
  • Есть аналог IncBin’а и процедуры для загрузки ресурсов (не всех) из памяти.
  • Прототипы (указатели на функции) и интерфейсы могут быть полями структуры.
  • Имеется возможность условной компиляции, в том числе и в виде конструкции Select..Case
  • Имеется спец. оператор FakeReturn, повзоляющий проэмулировать выход из подпрограммы (с сопутствующим сбросом адреса возврата) при этом в ней оcтавшись. Полезно для особо головокружительных трюков, вроде GoTo между разными подпрограммами.
  • Имеются псевдооператоры With..EndWith (для работы со структурами и интерфейсами).
  • Опционально включаемая поддержка Unicode.
  • Поддерживается Win95.
  • Можно делать нормальные (не ActiveX) DLL.

[править] Плохое

  • Нету перегрузки процедур. Ну какбы нет, прототипы в какой-то мере способны решить эту проблему.
  • Нет поддержки пространств имен\модулей.
  • Не поддерживает инкрементальной компиляции.
  • Не поддерживается определение макрокоманды из другой макрокоманды.
  • Из-за особенностей реализации With…EndWith не работает в макросах.
  • Нет возможности узнать тип переменной после ее определения. Изменить, впрочем, тоже нельзя. Рождённое однажды живо до смерти, плачь, сраный ООПешник.
  • Якобы насаждаемая идеология «делай, что хочешь» частенько пресекается параноидальным отладчиком.
  • Передачу параметра по указателю надо оформлять вручную (или через макросы).
  • Определенные проблемы с совместимостью версий, из-за которых с недавних пор выпилена доставлявшая документация по внутренностям библиотек.
  • Без сторонних средств (TailByte, к примеру) нельзя делать статические библиотеки.
  • Фимозность организации некоторых библиотек: так, Movie под Вендой зачем-то использует DirectShow, в результате чего оно совершенно непригодно для работы с MP3.
  • Нельзя определить факт неиспользования подсистемы. SubSystem("") всегда равно #False.
  • Перечисления не поддерживают степенной шаг.
  • Поддерживаются только С- и Std- конвенции вызова.
  • Операторы бинарной логики не применимы к числам с плавающей точкой, причем компилятор в этом отношении особенно упорен и стоит до конца.
  • Черезжопная поддержка определения статического импорта (проще сидеть на прототипах).
  • Черезжопная поддержка ActiveX, лечится сторонними средствами и/или кучей макросов.
  • Нельзя грабить корованы. Но плохому танцору сами знаете что мешает)) Все можно, только осторожно))

[править] Примеры программ

Hello World:

MessageRequester("title","Hello World!")
MessageBox_(0,"Hello World!","title",0)
OpenConsole()
PrintN("Hello World!")
Input()
;не забудьте включить Inline ASM в Compiler options
;а нах ? компилится и без него.
;тащемта, без него компилится благодаря восклицательному знаку перед командами.
;Спасибо, Кэп !
Procedure asmhello()
!extrn "__imp__MessageBoxA@16" as MessageBox:dword
! PUSH 0
! PUSH _caption
! PUSH _message
! PUSH 0
! CALL [MessageBox]
! RET
!_caption db "title",0
!_message db "Hello World!",0
EndProcedure
asmhello()

99 Bottles of beer (с музыкой):

Procedure PlaySong(Music.s, Duration)
Define *X.Character, *ToFix = @Music + MemoryStringLength(@Music)
For *X = @Music To *ToFix Step SizeOf(Character)
Select *X\C
Case 'A' : Beep_(220, Duration)
Case 'D' : Beep_(147, Duration)
Case 'E' : Beep_(165, Duration)
Case 'F' : Beep_(185, Duration)
Case 'G' : Beep_(196, Duration)
Case '0' : Delay(Duration)
EndSelect
Next
EndProcedure
 
#A = " bottle(s) of beer"
#C = " on the wall"
Define B.i, BStr.s
OpenConsole()
ConsoleTitle("99" + #A)
For b = 99 To 1 Step -1 : BStr = Str(B)
PrintN(" " + BStr + #A + #C + ",")  : PlaySong("GGGDDDGGGG00", 125)
PrintN(" " + BStr + #A + ".")  : PlaySong("AAAEEEA0000", 125)
PrintN(" Take one down, pass it around,")  : PlaySong("GFFFFFFFFFF00", 125)
PrintN(" " + Str(b - 1) + #A + #C + "." + #CRLF$) : PlaySong("DDDDEFGGGG00", 125)
Next b
CloseConsole()

[править] Некоторые примеры реального использования

[править] Ссылки

[править] Примечания

  1. Есть препроцессоры, написанные пользователями.
  2. Регистр EAX не задушишь и не убьешь