Neki
Интересующийся
Offline
|
|
« : 03-01-2016 17:29 » |
|
PureBasic это новая версия языка программирования бейсик с широкими возможностями. Стандартная библиотека содержит множество функций (примерно 1500) различной направленности, такой как GUI (графический интерфейс – окна, кнопки, таблицы и пр.), 2D и 3D, растровая и векторная графика, базы данных, регулярные выражения, функции криптографии (AES, Base64, CRC32, MD3, SHA1, SHA2, SHA3 и др.), функции работы с интернетом, в т. ч. протоколами TCP, UDP (поддерживается IPv4 и IPv6), а также с HTTP/HTTPS, FTP, E-MAIL и функций обработки исключений в релизных программах с указанием места ошибки (имя исходного файла, номер строки и причина ошибки), функции работы с ZIP, 7z, TAR (gz и bzip2) архивами др. функции. Это далеко не полный список. Ознакомится со всеми функциями, а также с особенностями языка и его IDE можно в онлайн справке. http ://purebasic.com/documentation/index.html Язык довольно прост и по большей части интуитивно понятен. Он очищен от "мусора" присутствующего в традиционном бейсике и в него добавлены новые, конструкции существенно упрощающие программирование, например такие как ассоциативный массив, двусвязный список, пространства имен и др. Доступны все Windows API функции. Чтобы не возникало конфликта имен с функциями стандартной библиотеки, у API добавлен нижний пробел между именем функции и открывающей скобкой. Пример вызова функции MessageBox. MessageBox_(0, "Текст", "Заголовок", #MB_ICONINFORMATION) Будет у функции окончание A или W зависит от настроек компиляции (ASCII либо Unicode). Язык сочетает низкий порог вхождения (легкодоступен для понимания) и широкие возможности, которые практически ничем не ограничены. Они близки к .NET подобным языкам, но при этом, код компилируется в натив (неуправляемый код) и доступны ассемблерные инструкции, в которых кроме базового набора допустимы также MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX и 3DNow!, EM64T и AMD64. Такой обширный набор поскольку в процессе компиляции исходного файла задействован компилятор ассемблера FASM и доступны почти все его возможности, в т. ч. макрокоманды, выполняемые во время компиляции. Среда разработки достаточно удобна и состоит из редактора кода (с подсветкой синтаксиса, автодополнением, сверткой кода и т. д.), визуального редактора форм, отладчика (можно выбрать интегрированный, консольный либо же внешний) у которого среди прочих возможностей доступна отладка по сети. Среда многоязычна и среди прочих присутствует русский язык. Он выбирается в настройках. Цепочка следующая: меню Файл (File) --> Настройки (Preferences) --> Язык (Language). Компилятор создает 32 и 64 разрядные приложения и библиотеки (зависит от настроек компиляции) которые имеют небольшой размер и не зависят от сторонних библиотек кроме системных, по умолчанию присутствующих в Windows. После небольшой модификации файлов среды разработки, возможно создание драйверов режима ядра для Windows. В виду простоты и возможностей языка его можно порекомендовать как для обучения в качестве первого языка, так и для профессиональной разработки софта. Он очень удобен для создания программ, таких как инжекторы, хуки системных функций и пр. Среда разработки не требует установки и будет работать с любого носителя информации допускающего чтение, запись и исполнение файлов. Запускать следует кликнув по файлу PureBasic Portable.exe. Пара скриншотов среды разработки. Ссылка для скачивания среды программирования PureBasic. https://www.dropbox.com/s/zld5l3f5z89jni4/PureBasic%205.40%20LTS%20Windows%20x86%20x64%20Portable.rarЗеркало 1. http://rghost.net/7rpfgnVl8Зеркало 2. http://turbobit.net/iqbfdbsus5o5.html
|
|
« Последнее редактирование: 04-01-2016 13:25 от RXL »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 03-01-2016 17:51 » |
|
В виду простоты и возможностей языка его можно порекомендовать как для обучения в качестве первого языка, так и для профессиональной разработки софта. Поддерживаются ли более современные парадигмы, чем структурная (при беглом просмотре документации не обнаружил)? Если нет, в чем состоит образовательная ценность языка (не говоря о профессиональной)? Пока даже не берем в расчет однозначное мнение Дейкстры по сабжу: Практически невозможно научить хорошо программировать студентов, ориентированных первоначально на БЕЙСИК: как потенциальные программисты они умственно оболванены без надежды на исцеление. Он очень удобен для создания программ, таких как инжекторы, хуки системных функций и пр. Назовите, пожалуйста, хотя бы одно преимущество в данной области перед тем же C, например.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #2 : 03-01-2016 18:18 » |
|
Поддерживаются ли более современные парадигмы, чем структурная Основная парадигма это структурно-процедурная. При необходимости ООП прикручивается макросами или препроцессором. Но процедурной достаточно для многих проектов. В том же Windows API и OpenGL чистая процедурщина без ООП и никто не жалуется. Пока даже не берем в расчет однозначное мнение Дейкстры по сабжу: Ответ есть в вики. https://ru.wikipedia.org/wiki/Бейсик В ответ на критику адепты Бейсика замечают, что критики приписывают языку те негативные стороны, которые следовало бы отнести к его неправильному применению. Недостатки Бейсика (если иметь в виду ранние диалекты) проявляются при попытке профессиональной разработки на нём сложных и крупных программ и при использовании его как базового языка для обучения программистов, но ни для одного их этих применений данный язык не предназначался; его основной задачей было предоставить студентам-непрограммистам возможность после минимального обучения самостоятельно писать простейшие программы для собственных нужд, чтобы не отвлекать на эту работу специалистов. Этой задаче язык вполне соответствует.
Если же говорить о современных диалектах и реализациях Бейсика, то они настолько далеко ушли от первоначальной формы языка, что всё вышесказанное вряд ли можно считать относящимся к ним. Современные диалекты Бейсика являются достаточно структурированными языками, они сопоставимы по возможностям с такими языками, как Си, Паскаль и т. п. Короче говоря, Дейкстра это писал об ранних версиях бейсика, к которым PureBasic не относится. В нем нет всех тез недостатков которые были во времена его высказывания. Назовите, пожалуйста, хотя бы одно преимущество в данной области перед тем же C, например. Ну например проще. На словах это не объяснить. Если хотите можете написать небольшую программу на C, которую я переведу на PureBasic и тогда можно будет их сравнить.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #3 : 03-01-2016 18:56 » |
|
При необходимости ООП прикручивается макросами или препроцессором. Посмотрел макросредства в документации, но не сообразил, каким образом, например, реализовать полиморфное поведение классов-наследников. Можете показать на простом примере (базовый класс, дочерний класс, единственный полиморфный метод)? Но процедурной достаточно для многих проектов. В том же Windows API и OpenGL чистая процедурщина без ООП и никто не жалуется. Не вполне понятен аргумент. Возьмем, к примеру, какой-либо из наиболее ходовых паттернов GoF, скажем, Composite. Как его реализовать средствами сабжа, чтобы при этом никто не пожаловался? То же касается SOLID, GRASP и подобных инструментов проектирования. Если хотите можете написать небольшую программу на C, которую я переведу на PureBasic и тогда можно будет их сравнить. https://forum.shelek.ru/index.php/topic,3152.msg56723.html#msg56723 - совсем небольшая функция, иллюстрация к опубликованной на форуме статье. Можно попробовать размяться на ней, там всего несколько строк, причем никакой объектной, функциональной и прочих продвинутых парадигм, чистая покрытая мхом структурщина. Функция настолько проста, что даже в комментариях не нуждается. Сохраним ясность кода после перевода? Ну и еще, раз уж была всуе упомянута пригодность сабжа для профессиональной разработки, как в данной среде дела обстоят со средствами тестирования? Исходим из аксиомы, что профессиональный подход к написанию софта без должного тестирования - пустой звук.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 03-01-2016 19:27 » |
|
Dale, Зря ты так. Билли и Пол тоже начинали с бейсика. И чего сейчас имеют и изрбрели. Правда времена были другие. 1975 год на дворе и компьютер Альтаир.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Qulac
Постоялец
Offline
|
|
« Ответ #5 : 03-01-2016 20:01 » |
|
Neki, лучшая реклама ЯП это IDE для него, которая написана на нем самом.
|
|
|
Записан
|
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #6 : 03-01-2016 20:51 » |
|
Посмотрел макросредства в документации, но не сообразил, каким образом, например, реализовать полиморфное поведение классов-наследников. Речь шла о простой реализации ООП без наворотов... Не вполне понятен аргумент. ООП может быть реализовано на базе функций. Многие Windows API функции (например CreateWindowEx) возвращают указатель на область памяти, данные которой можно считать объектом. совсем небольшая функция Функция слишком элементарная и ее упростить не получится (разве что изменив алгоритм). Речь шла о другом. О конструкциях языка упрощающих программирование. Допустим для хранения данных необходимо дерево, частный случай, хранение информации обо всех файлах во всех подпапках заданной папки. В PureBasic его можно сделать из структуры содержащей двусвязный список. Structure Files Name.s ; Имя файла Size.q ; Размер файла EndStructure
Structure Tree DirName.s ; Имя папки. List Files.Files() ; Список файлов текущей папки. List Dirs.Tree() ; Список вложенных папок текущей папки. EndStructure Каждый элемент двусвязного списка "Dirs" содержит экземпляр структуры "Tree", который в свою очередь имеет двусвязный спискок "Dirs" и дак далее. Вложенность ограничена лишь доступным объемом памяти для процесса. Пример заполнения дерева в глубину. s.Tree ; Создание экземпляра структуры.
AddElement(s\Dirs()) AddElement(s\Dirs()\Dirs()) AddElement(s\Dirs()\Dirs()\Dirs()) AddElement(s\Dirs()\Dirs()\Dirs()\Dirs())
; И так далее
ClearStructure(s, Tree) ; Освобождение всех ресурсов, занимаемых данными структуры. Наиболее удобно заполнять с помощью рекурсии. Код сканирующий выбранную папку и сохраняющий данные обо всех файлах всех подпапкок, а затем отображающий их в консоли. Structure Files Name.s ; Имя файла Size.q ; Размер файла EndStructure
Structure Tree DirName.s ; Имя папки. List Files.Files() ; Список файлов текущей папки. List Dirs.Tree() ; Список вложенных папок текущей папки. EndStructure
Procedure ScanDir(*s.Tree, AllDir.s) ; Сохранение структуры указаной папки If *s=0 ProcedureReturn EndIf id = ExamineDirectory(#PB_Any, AllDir, "*.*") If id While NextDirectoryEntry(id) If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory ; Папка Dir.s = DirectoryEntryName(id) If Dir<>"." And Dir<>".." If AddElement(*s\Dirs()) *s\Dirs()\DirName = Dir ScanDir(*s\Dirs(), AllDir+Dir+"\") ; Рекурсивный вызов процедуры EndIf EndIf Else ; Файл If AddElement(*s\Files()) *s\Files()\Name = DirectoryEntryName(id) *s\Files()\Size = DirectoryEntrySize(id) EndIf EndIf Wend
FinishDirectory(id) EndIf EndProcedure
Procedure View(*s.Tree, Pos) ; Отображение в консоли структуры папки. If *s=0 ProcedureReturn EndIf PrintN(Space(Pos)+*s\DirName+" (папка)") Pos+4 ForEach *s\Files() ; Отображение списка файлов текущей папки. PrintN(Space(Pos)+*s\Files()\Name+" ("+*s\Files()\Size+") байт") Next ForEach *s\Dirs() ; Отображение всех подпапок текущей папки. View(*s\Dirs(), Pos) ; Рекурсивный вызов процедуры Next EndProcedure
OpenConsole() s.Tree ; Создание экземпляра структуры.
s\DirName = PathRequester("Выберите папку для сканирования", "") If s\DirName ScanDir(s, s\DirName) View(s, 0) Else PrintN("Папка не выбрана") EndIf
ClearStructure(s, Tree) ; Освобождение всех ресурсов, занимаемых данными структуры.
Print("Нажмите Enter для закрытия программы") Input() Все это сделано без явного выделения и освобождения памяти что уменьшает вероятность ошибок и утечки памяти. К сообщении прикрепил исходник и компилированную программу. Neki, лучшая реклама ЯП это IDE для него, которая написана на нем самом IDE написана на PureBasic, но я не считаю это чем-то выдающимся.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #7 : 03-01-2016 21:07 » |
|
Билли и Пол тоже начинали с бейсика. И чего сейчас имеют и изрбрели. И что же они изобрели-то, интересно? Семейство ОС Windows NT, сделанное руками той самой команды, которая ранее делала ОС VAX/VMS для легендарного суперминикомпьютера? Или, может, платформу .NET, ради которой сманили Андерса Хейлсберга из Борланда, который (Борланд) после этого вообще слил свою линию систем разработки и уполз в другом направлении? Эта сладкая парочка - очень удачливые бизнесмены в мире софта, этого не отнять; но вот по части изобретений - совсем негодный пример. Правда времена были другие. 1975 год на дворе и компьютер Альтаир. Вот-вот, и я именно об этом. Что там у нас на календаре нынче? И паровая машина в свое время была на острие прогресса, только где она нынче... Хотя, конечно, для фанатов стим-панка культовая вещь. Возможно, и предмет обсуждения также найдет свою нишу. Добавлено через 42 минуты и 54 секунды:Речь шла о простой реализации ООП без наворотов... Тогда у меня плохая новость: не бывает "простой реализации ООП без наворотов". ООП базируется на трех слонах: инкапсуляция, наследование, полиморфизм. Лишаем его хотя бы одной опоры - получаем жалкого, малопригодного для реальных задач инвалида. ООП может быть реализовано на базе функций. Многие Windows API функции (например CreateWindowEx) возвращают указатель на область памяти, данные которой можно считать объектом. С таким же основанием можно, скажем, меня считать Дартом Вейдером. В смысле - считать-то данные объектом никому не запретишь, но толку с этого минимум. "Настоящий" объект, во-первых, прячет свое состояние, чтобы обеспечить его целостность (инкапсуляция), а не выставляет свои данные напоказ через указатель. Во-вторых, объект умеет реагировать на посылаемые ему сообщения определенным образом. Ни того, ни другого набор байтов в оперативной памяти не умеет. Про наследование с полиморфизмом тут и вовсе говорить нечего. На самом деле можно использовать объектно-ориентированное проектирование с последующей реализацией кода на процедурном языке (те, кто интересуется темой, видел соответствующую книгу в моей подборке публикаций), но это отнюдь не путь Windows API. Все это сделано без явного выделения и освобождения памяти что уменьшает вероятность ошибок и утечки памяти. В этом месте программисты на Java, C# etc. прервут чтение и побегут искать в энциклопедиях, что означает совершенно незнакомая им фраза "утечка памяти". IDE написана на PureBasic, но я не считаю это чем-то выдающимся. Тут солидарен на 100%. К счастью, прошли времена, когда выращенные на перфокартах программисты млели от какого-нибудь турбопаскаля 1.0. Сегодня редактором текста с кнопочкой для компиляции трудно кого-либо удивить. Инструменты выбирают по другим критериям.
|
|
« Последнее редактирование: 03-01-2016 21:50 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #8 : 04-01-2016 12:41 » |
|
В этом месте программисты на Java, C# etc. прервут чтение и побегут искать в энциклопедиях В отличие от этих языков, PureBasic компилирует программу в машинный код, а не в промежуточный.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 04-01-2016 13:09 » |
|
Кстати, продукт-то коммерческий. На лицо реклама. Или, неожиданно, Full-версия стала бесплатной?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dale
|
|
« Ответ #10 : 04-01-2016 16:15 » |
|
В отличие от этих языков, PureBasic компилирует программу в машинный код, а не в промежуточный. И что это меняет по существу? Из-за этого на этих языках сложнее программировать? Или потребителю труднее запустить этот код на выполнение? Главное, что проблема утечек памяти, причину которой искать обычно не так просто, перестала существовать. Если для этого где-то внутри появился промежуточный код, кого это волнует? Лично меня - нисколько, реализуйте как угодно, лишь бы работало быстро и стабильно. Кстати, продукт-то коммерческий. На лицо реклама. Или, неожиданно, Full-версия стала бесплатной? Фигасе, за это еще и деньги платить нужно??? Свят-свят... Этот аспект я и не заметил. Совсем весело.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #11 : 04-01-2016 17:01 » |
|
И что это меняет по существу? По существу, для некоторых задач управляемый код не подходит. В основном это низкоуровневые операции, типа перехвата функций, глобальных хуков и много чего другого. Или из Java или C# кода возможно получить нативную, процедурную DLL, у которой отсутствуют зависимости от java-машины или JIT-компилятора? Фигасе, за это еще и деньги платить нужно??? Стоимость лицензии индивидуального разработчика (79 евро) вообще смешная на фоне цены на другие среды разработки, скажем Embarcadero RAD Studio. Лицензия покупается один раз, а все вновь выпускаемые версии, доступны в виде бесплатных обновлений.
|
|
« Последнее редактирование: 04-01-2016 17:05 от Neki »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #12 : 04-01-2016 17:27 » |
|
Насчет утечек памяти, в С++ с применением Boost.SmartPointer тоже можно забыть об утечках памяти. Кстати часть умных указателей уже перенесли в стандартную библиотеку. Компиляторы как правило компилируют в машинный код процессора. Так что я не вижу примушество PוureBasic перед С++11. Плюс ко всему. При соблюдении некоторых условий написания кода, программы получаются кроссплатформенными. Java этим тоже может похвастаться. PureBasic судя по всему Wx86 only. И паровая машина в свое время была на острие прогресса, только где она нынче... Я бы не горячился с такими высказываниями. Цифры отсюда. Выработка электроэнергии в 2013 году АЭС 17,1% от обшего объема. По Европейской части вообше 42 %. Как это не парадоксально, но это паровая машина в чистом виде. На 2010 годы Гидроэлектростанции вырабатывают около 18-19 %. Тут нету паровых машин. Геотермальная, ветровая и солнечная энергетика очень маленький процент. Все остальнеое остается на ТЭЦ. Также паровые машины
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #13 : 04-01-2016 17:56 » |
|
Насчет утечек памяти, в С++ с применением Boost.SmartPointer тоже можно забыть об утечках памяти. Будет ли код также прост для понимания? Не снизят ли производительность эти "умные указатели"? Так что я не вижу примушество PוureBasic перед С++11 Код проще и понятней, это не преимущество? PureBasic судя по всему Wx86 only. На скрине в начале темы видно что в этой сборке компилятор для Windows x86 и x64. Но существуют версии для Linux (x86 и x64) и MacOS X (x86 и x64). А также уже не поддерживаемые версии для MacOS PowerPC и AmigaOS. Стандартная библиотека функций кроссплатформенная.
|
|
« Последнее редактирование: 04-01-2016 17:58 от Neki »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #14 : 04-01-2016 18:11 » |
|
Neki, Сейчас большинство устройств, это не x86. А ARM. Все смартфоны и большинство таблетов. Насчет скорости. Сейчас как раз читаю книжку по Boost. В одной из первых глав, расказываюших про умные указатели, как раз есть пример, где тупо пересоздается указатель около трех миллионов раз. У меня этот код выполняется 0,5 секунды. Причем компьютер у меня 4 летней давности. И тогда он был "рабочей лошадкой". #include <boost/shared_ptr.hpp> #include <iostream> #include <ctime>
int main() { boost::shared_ptr<int> p; std::time_t then = std::time(nullptr); for (int i = 0; i < 3000000; ++i) p.reset(new int{i}); std::time_t now = std::time(nullptr); std::cout << now - then << '\n'; } Кстати, скажи, где тут усложнение читаемости? Да и указатель заточен на мультипоточность.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #15 : 04-01-2016 19:09 » |
|
Вить, 3 млн раз — это не только указатель изменяется, но и new + delete. Не чистый эксперимент.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #16 : 04-01-2016 19:16 » |
|
Ром, этот указатель можно расшаривать. И он считает количество ссылок на него. Т.е. получается, что + еше и пересоздание механизма расшаривания.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Dale
|
|
« Ответ #17 : 05-01-2016 00:26 » |
|
Я бы не горячился с такими высказываниями. Цифры отсюда. Выработка электроэнергии в 2013 году АЭС 17,1% от обшего объема. ... Как это не парадоксально, но это паровая машина в чистом виде. "Я бы не горячился с такими высказываниями" (С). Паровая машина Уатта (та самая, классическая) и сегодняшняя турбина - две ну очень большие разницы. Но в данной теме не суть важно. По существу, для некоторых задач управляемый код не подходит. В основном это низкоуровневые операции, типа перехвата функций, глобальных хуков и много чего другого. Или из Java или C# кода возможно получить нативную, процедурную DLL, у которой отсутствуют зависимости от java-машины или JIT-компилятора? Нет, нельзя, поскольку это языки высокого уровня и предназначены совсем для других задач. Для низкоуровневых операций специально заточен низкоуровневый язык C, который, в свою очередь, чрезвычайно неэффективен (в смысле трудоемкости проектирования, а не качества результирующего кода) в тех областях, где C# и Java - как рыба в воде. IMHO это вполне естественно, когда для каждого вида работ используется специальный инструмент; "швейцарские карманные ножики" на 150 предметов профессионалами не используются. Функция слишком элементарная и ее упростить не получится (разве что изменив алгоритм). Неожиданный поворот. До этого речь шла о выразительности нового языка, которая существенно превосходит таковую для классического C. Я всегда полагал, что простой алгоритм можно переписать на более выразительном языке (например, с Фортрана на Паскаль) как минимум без потери ясности, и менять сам алгоритм при этом не потребуется. Более того, раз уж речь зашла о низкоуровневых манипуляциях, ожидал, что аналог копирования строк не уступит в элегантности сишному варианту: while (*t++ = *s++); Ладно, раз на простых вещах не получается, давайте возьмем фрагмент чуть побольше: (click to show) #include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h>
void error(char* msg) { fprintf(stderr, "%s: %s\n", msg, strerror(errno)); exit(1); }
int open_socket(char* host, char* port) { struct addrinfo *res; struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (getaddrinfo(host, port, &hints, &res) == -1) error("Can't resolve the address"); int d_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (d_sock == -1) error("Can't open socket"); int c = connect(d_sock, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); if (c == -1) error("Can't connect to socket"); return d_sock; } int say(int socket, char* s) { int result = send(socket, s, strlen(s), 0); if (result == -1) fprintf(stderr, "%s: %s\n", "Error talking to the server", strerror(errno)); return result; }
int main(int argc, char* argv[]) { int d_sock; d_sock = open_socket("en.wikipedia.org", "80"); char buf[255]; sprintf(buf, "GET /wiki/%s http/1.1\r\n", argv[1]); say(d_sock, buf); say(d_sock, "Host: en.wikipedia.org\r\n\r\n"); char rec[256]; int bytesRcvd = recv(d_sock, rec, 255, 0); while (bytesRcvd) { if (bytesRcvd == -1) error("Can't read from server"); rec[bytesRcvd] = '\0'; printf("%s", rec); bytesRcvd = recv(d_sock, rec, 255, 0); } close(d_sock); return 0; } (скопипастил фрагмент из букваря по C для начинающих, подвернувшегося под руку). Если результат на ЧистоВасике выразительностью превзойдет сишный оригинал, можно сказать, что усилия не потрачены впустую. (Все примеры специально привожу на C, поскольку честнее сравнивать процедурные языки между собой, не вовлекая в сравнение более развитые парадигмы).
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zubr
Гость
|
|
« Ответ #18 : 05-01-2016 06:02 » |
|
Имхо, спор слепого с глухим. С практической точки зрения: Если я использую в своей работе C, C++, мне нет никакого смысла изучать васик, так как нужный мне функционал, я прекрасно получаю из вышеуказанных языков. Если я новичок, и изучив васик, мне все равно придется изучать C-образные языки, ну хотя бы потому, что: 1. Врядли в профессиональной деятельности удастся всю жизнь просидеть на одном васике как инструменте и на одних типовых задачах. 2. В большинстве разработок код пишется не с нуля, а используется уже готовый и зачастую он сишный. Такова вот селяви.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #19 : 05-01-2016 09:47 » |
|
Да никакой это не спор, а просто попытка раскрутить продуктик. Причём слабая. Уважаемый Neki, в данном контексте было бы полезно и ооочень интересно привести список компаний (раз есть корпоративная лицензия) пользующихся Вашим (если я правильно понял) продуктом, а ещё лучше их отзывы. Также полезны примеры программного обеспечения, созданного с его применением. Его характеристики, область применения, преимущества перед аналогичным ПО, созданным с использованием других средств разработки. А пока я так и не понял, зачем он нужен? А так... Ну IDE на нём, "и фсё?" (с) Так это же "чистое искусство" - т.е. программирование ради программирования. Все приводимые Вами аргументы - слабое "подтягивание" до неких, уже существующих, стандартов. Причём не совсем удачное. Ну зачем нужен ещё один "уродец" ООП, или, как Вы выразились: "ООП без наворотов", ведь есть уже, например, MFC: и под виндой, и с поддержкой (native) Win API. А вобще, это всё так и дышит несерьёзностью. Назовите, пожалуйста, хотя бы одно преимущество в данной области перед тем же C, например. Ну например проще. На словах это не объяснить. Если хотите можете написать небольшую программу на C, которую я переведу на PureBasic и тогда можно будет их сравнить. И что? совсем небольшая функция Функция слишком элементарная и ее упростить не получится (разве что изменив алгоритм). Речь шла о другом. О конструкциях языка упрощающих программирование. Вы не только не ответели на вопрос, а ещё и привели какой-то код, который якобы что-то упростил... Чесслово напоминает анекдот, когда студент выучил всё только про огурцы, а потом отвечал про них на любой поставленный вопрос. Добрый (ИМХО излишне) Dale, предоставил Вам последний шанс. В противном случае, эта тема будет рацениваться как реклама, со всеми вытекающими последствиями.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #20 : 05-01-2016 12:59 » |
|
Неожиданный поворот. До этого речь шла о выразительности нового языка, которая существенно превосходит таковую для классического C. Если этот код тупо переписать на другой ЯП, то выразительности это не добавит. ожидал, что аналог копирования строк не уступит в элегантности сишному варианту: Копирование строк. Str1.s = "Hello World!" ; Первая строковая переменная Str2.s ; Вторая строковая переменная
Str2 = Str1 ; Копирование строки.
MessageRequester("", Str2) ; Отображение строки на экране Ладно, раз на простых вещах не получается, давайте возьмем фрагмент чуть побольше: Эту задачу возможно решить парой строк кода (использованы функции из стандартной библиотеки). InitNetwork()
*Buff = ReceiveHTTPMemory("en.wikipedia.org") If *Buff MessageRequester("", PeekS(*Buff, -1, #PB_UTF8)) FreeMemory(*Buff) EndIf
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #21 : 05-01-2016 14:25 » |
|
Если этот код тупо переписать на другой ЯП, то выразительности это не добавит. То есть Вы утверждаете, что сам язык никак не может повлиять на выразительность написанной на нем программы? Заметьте, я не настаивал, чтобы это непременно было сделано тупо. Если, к примеру, фрагмент кода переписать с FORTRAN-IV на Pascal или Algol-60 (не тупо), ничего не меняя по сути в самом алгоритме, код тем не менее будет читаться гораздо легче исключительно благодаря особенностям самих языков. Я уже не говорю про тот же ассемблер, который тоже может делать то же самое; но как он это делает и как это потом читать... Копирование строк. Собственно копирование в данном случае не было самоцелью. На C тоже можно вызвать библиотечную функцию strcpy. Речь шла исключительно о языковых средствах для низкоуровневой эффективной манипуляции байтами (как было обещано в начале темы), об их компактности и выразительности. Ожидал увидеть демонстрацию косвенной адресации, средств инкремента/декремента указателей и т.п., а увидел в общем ничто. Эту задачу возможно решить парой строк кода Таки весь фрагмент заменить реально парой? Не похоже, либо тут действительно сильная магия. IMHO тема близка к исчерпанию, пора подвести итог. Мне он видится таким. Если уж речь зашла об инструменте для профессиональной разработки софта , давайте мыслить профессиональными категориями. Жизненный цикл софта достаточно продолжителен (по крайней мере, успешного софта), кто сомневается, может развеять сомнения, изучив стандарт ISO/IEC 12207. Собственно кодирование занимает в нем от силы процентов 10 (хотя я больше уверен в цифре 5). Гораздо больше и времени, и средств отнимают процедуры управления качеством, в частности, верификация/валидация кода. Если представленный продукт обладает инструментами для управления качеством кода (статический анализатор, профилировщик, утилиты для сбора основных метрик, среда функционального или хотя бы только модульного тестирования etc), то у него, возможно, есть будущее и потенциальные профессиональные пользователи (хотя я и разделяю скептицизм большинства откликнувшихся в теме, но все же даже у Стаса Михайлова есть своя аудитория, так что однозначное категоричное "нет" говорить все же не буду). Все языки, пригодные для профессиональной разработки, эти инструменты имеют. Если таких инструментов нет и в ближайшем будущем не планируются их появление, то это просто игрушка для дилетантов, которым не хватило фантазии найти лучшее применение для 79 евро. У кого-то есть другое мнение? Коммерцию/рекламу отбросим в сторону, за достойный инструмент действительно не грех заплатить.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #22 : 05-01-2016 16:51 » |
|
Таки весь фрагмент заменить реально парой? Да, и он будет работать корректнее вашего варианта. Потому что попытка зайти на en.wikipedia.org через 80 порт приведет к переадресации на http s://en.wikipedia.org/wiki/Main_Page и порт 443. В вашем коде это не учитывается, а функция ReceiveHTTPMemory это корректно обрабатывает и выдаст код страницы. профилировщик, утилиты для сбора основных метрик, среда функционального или хотя бы только модульного тестирования Профилировщик входит в состав отладчика, наряду с другими инструментами, например такими как Purifier следящий чтобы код не обращался к памяти вне допустимых границ. Скриншоты Меню отладчика Профилировщик, показывает частоту выполнения каждой строки кода. Просмотр регистров процессора с возможностью модификации. Просмотр содержимого стека с отображением локальных переменных. История вызовов процедур. Число вывозов процедур. Просмотр переменных. Но удобнее это делать в коде наведя курсор мышки на переменную. Для тестирования предназначена утилита PureUnit, находящаяся в папке SDK. Из ее описания. PureUnit allows automated unit testing for PureBasic code with similar concepts to other xUnit frameworks like JUnit. The basic idea of unit testing is the creation of a set of tests that can run without user interaction so they can be repeated many times during the development process to ensure that the code still does what it is supposed to do.
The main reason for the creation of PureUnit was the testing of (user-)libraries for PureBasic, but it can be used to test code written in PureBasic itself just as well. Caused by the fact that the goal is testing without user interaction, PureUnit is not intended for testing entire application or a finished program, but rater for testing the parts of a program like individual functions which can be executed separately from the rest of the program to verify their correctness. (for example an includefile with commonly used functions etc).
PureUnit consists of a set of keywords (in the form of macros) to write the actual test code and a tool which will analyze the code to extract information, compile and run the test code and report the status back to the user. The tool comes with a commandline interface for use in makefiles or scrips and a user interface for convenient testing directly from the PureBasic IDE for example.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #23 : 05-01-2016 21:39 » |
|
Профилировщик, показывает частоту выполнения каждой строки кода. А затраченное время? Без этого оценка весьма поверхностна. Число вывозов процедур. Туда же. История вызовов процедур. Не припомню, чтобы это мне когда-нибудь было нужно. Профилировщик мне дает информацию о каждой функции, кем она была вызвана и сколько затрачивалось времени. Вот это — полезная информация.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
Dale
|
|
« Ответ #25 : 05-01-2016 23:32 » |
|
История вызовов процедур. Не припомню, чтобы это мне когда-нибудь было нужно. Это тоже ценная информация, при использовании автоматического тестирования позволяет выявить непокрытые тестами области. Вообще в процессе обсуждения, должен признаться, мое первоначальное мнение о продукте существенно изменилось в лучшую сторону. Конечно, "серебряной пулей" он не является, революцию в кодировании не совершит, и я вряд ли стану его использовать сам или рекомендовать моим ученикам. Но и совершенно никчемной игрушкой он тоже не выглядит. Итак, реальные минусы: 1. Базовый язык (субъективно). Все-таки семейство Basic переживает не лучшие времена. Хотя, следует отдать должное, вымирать тоже не торопится: и в семье .NET без него не обошлось, и даже для микроконтроллеров версии имеются, причем имеют своих сторонников. 2. Процедурная парадигма (объективно). Лет 30 с небольшим назад процедурный язык имел шансы потягаться за место под солнцем с основными конкурентами - Pascal и C. Их убийцей, конечно, не стал бы, но какую-то определенную нишу занял бы наверняка. Сегодня отсутствие средств ООП ставит крест на использование таких мощных средств проектирования, как ООА, UML, паттерны проектирования, да и гибкие технологии существенно завязаны на объектность. Не знаю, какова нынче доля рынка разработки хуков и подобных вещей, но полагаю, что крайне невелика. Плюсы, которые я разглядел: 1. Обширная библиотека. Ситуация, когда не нужно писать код, а достаточно просто вызвать нужную функцию из библиотеки, не может не радовать. 2. Кроссплатформенность. О ней многие говорят, но мало кто реально обеспечивает. В данном аспекте несколько огорчает отсутствие поддерржки Android, поскольку от гламурного мира Mac я весьма далек, а вот бюджетные гаджеты использую активно. 3. Наличие реально полезных инструментов, особенно XUnit. Если разработчики портируют еще и нечто типа Gherkin, можно всерьез претендовать на профессиональный подход. В общем, бурного восторга и эйфории так и не испытал, но определенное уважение появилось.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Neki
Интересующийся
Offline
|
|
« Ответ #26 : 06-01-2016 12:26 » |
|
Также полезны примеры программного обеспечения, созданного с его применением. Создатель инсталляторов InstallForge и еще один вариант Bytessence Install Maker. Плеер GreenForce-Player. Торрент качалка pbTorrent Чем-то похож на µTorrent скрины. Игра гонки Pure Racer графика оставляет желать лучшего, но при размере файлов игры 3.5 МБ она вполне приемлемая.
|
|
|
Записан
|
|
|
|
|