Помощь - Поиск - Пользователи - Календарь
Полная версия: Помощь начинающему
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Faust VIII
Всем доброго времени суток! Решил ознакомится со столь удивительной вещью, как Pascal! Но проблема в том, что я не знаю с чего начать! По этому, я обращаюсь к великим гуру и прошу наставить на путь истинный. Все, что касается этой темы приветствуется.
P.S: Все, что надо для начало работы я скачал, мне нужен только учебный материал.
Федосеев Павел
Есть хорошая книга "Песни о Паскале" - там рассказывается от первых шагов со средой программирования.
http://oleg.derevenets.com/

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

Пока вы начинаете, подскажу ещё некоторые инструменты. Есть готовые бесплатные программы для форматирования исходных кодов. Я очень настоятельно рекомендую ими пользоваться. Из того, что доступно, можно взять JCF. Ссылки на пояснения Раз, два. И ещё, статья, почему это нужно http://www.gunsmoker.ru/2011/01/blog-post.html. И ещё, мне очень понравилась идея статьи http://www.gunsmoker.ru/2010/05/90.html.

Успехов.
Faust VIII
Цитата(Федосеев Павел @ 6.02.2016 18:29) *

Есть хорошая книга "Песни о Паскале" - там рассказывается от первых шагов со средой программирования.
http://oleg.derevenets.com/

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

Пока вы начинаете, подскажу ещё некоторые инструменты. Есть готовые бесплатные программы для форматирования исходных кодов. Я очень настоятельно рекомендую ими пользоваться. Из того, что доступно, можно взять JCF. Ссылки на пояснения Раз, два. И ещё, статья, почему это нужно http://www.gunsmoker.ru/2011/01/blog-post.html. И ещё, мне очень понравилась идея статьи http://www.gunsmoker.ru/2010/05/90.html.

Успехов.

Аригато, сенсей! good.gif
Faust VIII
Еще вопрос. А каким паскалем лучше пользоваться? Вообще, хочу написать на нем текстовый рогалик. так какой будет лучше всего для достижение моей мечты? Желательно на Windows 8.1 64x
OCTAGRAM
Хороший Паскаль называется Ада. На худой конец Delphi из тех, что поновее, хотя бы XE2. Про FPC ничего положительного сказать не могу за всё время работы с ним. Сильно на любителя.

И есть ещё варианты для компиляции в Web, такие, как DWScript, но он, наверное, не готов для новичков.
Faust VIII
Цитата(OCTAGRAM @ 6.02.2016 22:11) *

Хороший Паскаль называется Ада.

А можно продемонстрировать хоть одну игру на этом языке? Я читал об Аде ( название просто зашибись... ), ее минус - многословность. Вот хочу пример программы на этом языке, лучше всего игру.
Федосеев Павел
Лучший пистолет - который в руке. Чем можете пользоваться, на том и реализуйте.

По моему мнению, Delphi - хорошо, но он платный и дорогой. Поэтому, если выбирать паскаль на короткий и некоммерческий период, то - FreePascal. У него есть Delphi-подобная RAD - рисовалка окошек Lazarus. В Lazarus можно вести и консольные проекты. Для помощи в ответах на форуме лично я пользуюсь SciTE (настройки обсуждались на форуме и легко находятся поиском, а также в интернете), читал, что можно Notepad++, Code::Block.

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

Про рогалик впервые прочитал месяц назад на форуме FreeBASIC - http://free-basic.ru/g00.html. Что ещё раз подтверждает мысль из первого абзаца.
Faust VIII
Цитата(Федосеев Павел @ 7.02.2016 2:57) *

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

Спасибо, прочел, что в аде есть защита от таких как я smile.gif . Теперь ищу и нечего не нахожу. Настроение и настрой: mega_chok.gif
OCTAGRAM
Цитата(Faust VIII @ 6.02.2016 22:54) *
А можно продемонстрировать хоть одну игру на этом языке?


Например: http://snake.gnoga.com/
Чтобы посмотреть код, нужно открыть http://www.gnoga.com/source и выбрать snake-connection.adb. Главный цикл находится в процедуре Paint, код которой на момент написания начинался со строки 213.

Либо посмотреть по прямой ссылке http://sourceforge.net/p/gnoga/code/ci/mas...ection.adb#l213

Сапёр под Qt ещё один умелец запрограммировал: http://www.qtada.com/ru/applications.html

Цитата(Faust VIII @ 6.02.2016 22:54) *
Я читал об Аде ( название просто зашибись... ), ее минус - многословность.


Название там — женское имя (Ада Лавлейс Байрон, первый программист), и мне кажется, оно русское ухо не режет.

Когда я переходил с Delphi, то Delphi штампы потащил в Аду тоже. Если какой–то пакет with'ится, то у меня он и use–ался тоже обязательно. Перегрузкой унарного плюса баловался (впрочем, и сейчас так делаю). Помойку в переменных разводил. Но в целом проникся духом, и use пользуюсь избирательно, а Ada 2012 даёт более нормальный контроль за пространством имён, можно use type делать для типов вместо use для всего пакета, чтоб операции с ними были доступны, а остальное лишнее в пространство имён не сыпалось.

Дополнительные слова там — как рёбра жёсткости и элемент читаемости. Наступив на грабли, сам начнёшь чаще перестраховываться.

Местами, впрочем, и правда чего–то не хватает. for-loop и while-do автоматически создают блок команд, как бы экономя один begin и один var с переменной цикла, которую в Аде не нужно объявлять, как в строке 38, но если надо объявить дополнительные переменные или обработать исключение, то приходится добавлять declare-begin-end, как в строке 189, и эта экономия нивелируется, но в Delphi и FreePascal, например, такого вообще нет, приходится разводить помойку var вверху процедуры. Впрочем, в строке 189 программист тоже мог бы развести помойку, как в Delphi, объявив переменную перед begin процедуры и уменьшить уровень вложенности, убрав declare-begin-end, но это лишний раз показывает, что опытные программисты добровольно приходят к такому стилю кода. И я тут посчитал: даже если программист на Аде не развёл помойку, а на Delphi — развёл, то на Delphi всё равно будет длиннее на одну строку (в стандартном стиле).

В общем, как–то оно не жмёт в реальной жизни. Думаешь, как покрасивей и правильней, а не как покороче.


На моё отношение к FreePascal повлияли проблемы, описанные в статье Композиция, нормализация и уроды.

Цитата
Не уроды

И только одни люди поступили единственно возможным образом, отрезав уродам вышестоящих типов все пути к отступлению в туманный отказ. Они устроили в Java такой Освенцим, что остается только восхищаться и трепетать. Им, слава Б-у, стало ясно, что если всю эту радость не запихать американским программерам ректально и эксплицитно, бардак из wchar и char продолжится до 3000 года.

Да, увы, их UTF-16 включает только Basic Multilingual Plane (не хватает пары десятков тысяч Хан-кодпойнтов), но по сравнению с вышестоящим убожеством это невероятный прогресс.


Вот и в Delphi 2009 поступили как положено, переделав всё на Юникод, правда, к сожалению, всего лишь UTF-16. В Lazarus, насколько я помню, всё работает через однобайтовые string, которые в UTF-8, и это ещё куда ни шло. Но вот стандартная библиотека по–прежнему, похоже, работает с ANSI, и я, когда с файловыми путями манипуляции произвожу, смутно догадываюсь, что надо бы UTF-8 перекодировать в ANSI, иначе может не работать в большем количестве случаев. И от этой неуверенности мне неуютно. Хорошо бы там тоже везде остался Юникод. Не хватает диктатора, который бы отстранил всех несогласных и навёл порядок.

Что касается Ады, то там, с одной стороны, в библиотеках много, где однобайтовые строки, нарушая стандарт, несут в себе UTF-8. И находятся программисты, которые на Windows хранят там ANSI. Но с другой стороны, там есть самые безгеморройные UTF-32 строки, и в принципе можно просто перекодировать между UTF-8 и UTF-32 на границе вызовов процедур, написанных разными программистами. В этом нет такой гигантской проблемы, как от ANSI.

И, спасибо WinAPI, выжечь из программы всё, кроме Unicode, не так просто, как этому следовало бы быть. Проблемы идут из файлового I/O, который будет в ANSI или OEM, а версии с W там просто нет. Существуют пути обхода этой проблемы:
http://www.siao2.com/2010/10/07/10072032.aspx
http://www.siao2.com/2010/05/07/10008232.aspx

Но в библиотеки времени выполнения они не всегда попадают. В node.js попало. console.log() замечательно пишет Юникод что на Windows, что на Linux.

А в GNAT, FreePascal и даже в Delphi, насколько мне известно, не попало, так что ввод/вывод надо через обёртки делать, чтоб был Unicode везде.

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

Я же правильно понимаю, что игра будет в консоли отрисовывать игровое поле и управляться нажатиями клавиш?
Faust VIII
OCTAGRAM, Где найти компилятор для ады? И где вообще на ней писать?
OCTAGRAM
Как правильно заметили, в шапке есть некоторая информация на эту тему. Компилятор и IDE, которыми я пользуюсь, я скачиваю здесь.

Выбираю x86 (Windows), раскрываю GNAT Ada GPL 2015, там качаю и устанавливаю gnat-gpl-2015-x86-windows-bin.exe, затем качаю и устанавливаю Win32Ada GPL 2015. Я вообще много, чего ставлю, и через MSYS из исходников могу собрать, но ограничимся пока таким набором.

Редактирую я обычно попеременно в GPS (это IDE там такая) и в Far Manager, а если под Linux или Mac OS X — то в nano. Far Manager настоятельно рекомендую поставить.

Я собрал минимальную консольную программу, чтоб было, с чего начинать:

Нажмите для просмотра прикрепленного файла

Нужно открыть GPS, далее Edit » Preferences… » General » Character set поменять с Western/Latin-1 (ISO-8859-1) на Unicode UTF-8. После этого Project » Open … и выбрать Minimal_Console.gpr в том месте, где он распакован. Слева появится контейнер–проект под названием «Minimal_Console», в нём папка «.», если её развернуть, там несколько файлов, из них главный — это Minimal_Console.Main.adb. Если всё настроено нормально, то там будет видно русские буквы.

Собирать можно из IDE, Build Main — это выполнить, а Run Main — запустить, но запускаются они они там не в консоли Windows, а во вкладке, и обычно это удобно, но рисовать, как на консоли текстом, не получится. Поэтому либо отдельно запускать, либо через Far. Ну либо можно ещё запрограммировать принудительное создание консоли.

Что касается Far, нужно после установки сделать F9 » Options » Languages » Russian (Русский) » Russian (Русский), затем F9 » Параметры » Настройки программы просмотра » Кодовую страницу по умолчанию поменять на «65001| UTF-8» и так же для редактора: F9 » Параметры » Настройки редактора » Кодовую страницу по умолчанию поменять на «65001| UTF-8». Чтобы настройки сохранились, Shift-F9. На этом с настройкой Far более менее всё.

Компиляция из командной строки: gprbuild Minimal_Console.gpr

По изучению Ada можно посоветовать Адское программирование, либо то, что в шапке по ссылке «Ада–2012». Собственно стандарт Ада–2012 (на английском); а также перевод стандарта Ада–83.

В моём архиве я сделал, чтобы работал юникодный вывод строк, но не ввод, потому что из того проекта, откуда я вырезал, ввода из консоли не было, был только веб–сервер, который мог писать в консоль отладочные сообщения. Если нужно, можно подумать над тем, чтобы подключить библиотеку WinLineEdit, но я так понимаю, управление должно быть стрелками, так что работу над вводом надо как–то по–другому делать, через события консоли.
Федосеев Павел
Faust VIII, выбирайте любой язык - хуже не будет. Начнёте реализовывать рогалик, наберётесь опыта. В конце-концов, я изучал только Pascal, а когда понадобилось программировать PLC - изучил ещё LD (RLL Plus), ST, FBD, SFC, когда захотел поиграться с микроконтроллерами (для работы сделать приспособу на макетке) - изучил C (естественно, не весь, а только основные конструкции). Самостоятельно изучал Ada по книжке, но остановился на том из-за отсутствия интернета и компилятора в ту пору. Это я к тому, что все языки почти одинаковы. Разница проявляется лишь в "заточенности" на конкретные задачи.

OCTAGRAM, вы толкаете новичка на менее документированный путь - пруф. Ведь помимо ядра языка, в реальной жизни применяются готовые библиотеки (например, стандартный C/C++ богат этим, настолько, что старые реализации Pascal - просто голодранцы беспомощные). Это помимо не самой распространённости языка и тех, кто сможет помочь. Хотя по этой ссылке упоминается автор книги-учебника - А.Е. Гавва - Адское программирование, в которой рассмотрено почти всё, что нужно и по конструкциям и по организации работы.

Ещё, поделитесь, что подтолкнуло на переход к Ada - самостоятельный перебор инструментов, требование работодателя или что-то иное?
OCTAGRAM
Использовать таски я не рекомендую без прочтения хотя бы раздела книги Танненбаума «Операционные системы» или Р. Бара, было у него что–то как раз про многозадачность в языке Ада. А Delphi — это вообще копец! Такого примитива синхронизации, как условные переменные, долго не было в стандартном наборе, зато там вот эти самозавершающиеся потоки, с которыми пришлось повозиться в PayPRO. Ну не делается так по–хорошему. Правильно, что в Аде неудобно делать то, что пытался автор того поста.

Сам я в далёком 1996м году начинал изучать QBASIC, имея только скудную документацию на английском, которого нифига не знал. Сейчас, мне кажется, возможности гораздо выше. Не надо утрировать.

У меня были сильные неудовлетворённости от Delphi, его разработчики, тогда ещё Borland, никак не хотели делать то, что мне нужно, а в Аде я нашёл язык, который сделали как положено.
Faust VIII
Хмм, а теперь я совсем растерялся! Можно какое-нибудь сравнение, сходство, различия и прочее. Можно продемонстрировать какие-нибудь сложные программы, что-бы прям "ну ваще". Те же рогалики. Но можно так же и программы с выводом на экран. И главное, что надо:
Pascal:
1. Какие комплераторы использовать лучше и различия?
2. Какой Pascal лучше?
3. Преимущества перед Ada'й?
Ada:
1. Какие комплераторы использовать лучше и различия?
2. Какая Ada лучше?
3. Преимущества перед Pascal'ем?
OCTAGRAM
Среда разработки GPS для Ады написана на Аде. И та часть компилятора, которая обрабатывает Аду, тоже написана на Аде (оптимизацией занимается GCC, написанный на C). Это достаточно сложно? По мне, так да.

Играми, к сожалению, последний раз в 90х занимался, на Турбо Паскале под EGA графику. Но сейчас, если бы понадобилось делать, взял бы SDLAda, почитал доки по SDL и написал такое же, но на Ada. Нормальная практика — читать пример для одного языка программирования и писать на другом. Автор SDLAda в IRC сидит, можно у него при случае спросить, если что не понятно.

В текстовом режиме игру будет сделать проще, мне кажется.

Как общий принцип, то, как я уловил дух языков и сообществ вокруг них: Ада для инженеров, Free Pascal — для хакеров, Delphi — для базаданьщиков, что, впрочем, не мешает использовать их крест на крест. Так, я хаки на Аде тоже запросто делал, а для Delphi нашёл реализацию многострадальных условных переменных и если не мог писать на Ada, то хотя бы на Delphi писал многопоточный код как положено, а не как у юных хакеров.

Delphi (да и Lazarus) подкупают доступностью IDE, но с другой стороны, код, который эта IDE производит, реализует антипаттерн «божественный объект». Теоретически возможно на Delphi и FreePascal использовать другие графические движки, но я таких примеров знаю не много.

Ada во многих качествах близка к C++. И в положительных, и в отрицательных. Положительная сторона — это свобода в выборе графического движка, богатство библиотек, а обратная сторона — это то, что есть куча разношёрстных не стыкующихся друг с другом решений. Хотя в Delphi тоже есть переход от VCL к FireMonkey, два разных движка, но, сдаётся мне, они более близки друг к другу, чем то, что используется для создания графических программ на Ada. Лидерами тут являются GtkAda, на которой сделана среда разработки GPS, и QtAda Вадима Годунко. Они являются обёртками для Gtk+ и Qt, соответственно. Помню, было ещё что–то для интеграции с Tcl/Tk. Это из кроссплатформенных. В библиотеке OEM для графики применяется GWindows Дэвида Боттона, работать она будет только на Windows. Ещё есть чисто адская графическая библиотека Lumen, использующая OpenGL, но её готовность мне не известна. Если бы мне завтра нужно было делать графический интерфейс на Аде, я бы скрипнул зубами, но взял QtAda. Не люблю я Qt, но уж больно хорошо QtAda сделана.

Pascal сейчас, главным образом, представлен Embarcadero Delphi и FreePascal. Delphi более профессионален, но ценовая политика, конечно, удручает, и то сообщество, которое было, всё рассасывалось и рассасывалось. Очень хороший ход был раздать Turbo Delphi 2006 Explorer на шару всем желающим. Я, правда, не успел. Там нужен был ключ, который на сайте можно было получить в ограниченный период времени. И больше такого не было, зато появлялись запреты, например, в дешёвых версиях использовать базы данных. Идут по инерции и выжимают соки из того, что есть. Поддерживают Windows и Mac OS X, и делают это довольно хорошо. Есть у них ещё версии для Android и iOS, но там в чём–то уже другой язык, который, кстати, мне нравится больше. В мобильном Delphi есть долгожданный подсчёт ссылок для классов. Я его ждал–ждал, ждал–ждал, плюнул, перешёл на Аду, и лет через восемь оно таки появилось, но пока только в мобильной версии. И то появилось не потому что там откровение кому–то снизошло, а потому что Apple реализовал ARC (автоматический подсчёт ссылок) в LLVM, перенёс на LLVM свой Objective-C, а чтобы Delphi компилировать под iOS, в Embarcadero сделали переделали компилятор под LLVM и просто воспользовались тем ARC, который там уже был. Но в общем, при своей закостенелости, всё же сделали они много. Если скачать пиратский Delphi из p2p, этот продукт будет гораздо лучше, чем FreePascal, и в чём–то лучше, чем Ada. Всё более хороший компилятор Delphi для всё более узкого круга разработчиков, я бы так охарактеризовал эту ситуацию.

FreePascal — компилятор гораздо более консервативный, и разработчики у него что–то с чем–то. Ну, какие есть. Если разработчики Delphi, когда добавляют в язык новые возможности, оглядываются на Delphi, то разработчики FreePascal делают то, в чём усматривается влияние C++, и получается пакость. На Аду не оглядывался никто, а зря. Глядишь, что–то путное бы сделали в кой–то веки хоть кто–нибудь. Какое–то время между Delphi 7 (2001) и Delphi 2005 у Borland был кризис, да и потом их поштормило, то CodeGear, то теперь вот Embarcadero очередные владельцы. На какое–то время FreePascal перехватил инициативу инноваций, и у них и в самом деле был более крутой язык. С RAII что–то не заладилось ни у Delphi, ни у FreePascal, но у FreePascal хотя бы перегрузку операторов (плюс, умножить, больше, меньше и т. п.) сделали раньше, чем в Delphi. В Delphi это потом тоже сделали, кажется в 2006, но с другим синтаксисом, ближе к .NET, и получилось, на мой взгляд, лучше, чем в скопировавшем C++ FreePascal. Generic раньше появились во FreePascal. В Delphi они были только в 2009. И тоже, на мой взгляд, в Delphi сделаны лучше. Хотя без RAII они нормально работать не могут, на мой взгляд, но в Delphi 2009 отсутствие нормального RAII лучше скомпенсировано в контейнерах. В Delphi можно указать контейнеру обработчики событий изменения/извлечения/добавления, раз уж нельзя напрямую на сам тип навешивать RAII. Разработчики FreePascal и те, кто показывал примеры generic, делали примеры, где контейнер работает то с числами, то со строками, но вот как–то не чувствуется у них понимание, что для строк RAII навешивается магией компилятора, и работает это поэтому идеально, а для своего типа, хоть ты плачь, так же идеально сделать нельзя, а без этого какой интерес? Получаются контейнеры, которые нормально работают только с числами и строками.

Положительным качеством является то, что портирован под кучу платформ. Хотя у них тут с Адой не всё так однозначно. FreePascal портирован под мобильные платформы. У Ada я видел порт под Android на DragonLace, кто–то сделал, чтоб с FreeBSD можно было под Android разрабатывать, а вот из–под Windows, наверное, тоже можно собрать, но не собирал никто. Что касается iOS, один из сотрудников AdaCore похвастался, что они у себя собрали версию под iOS, но никому не дадут. Вроде как не нужна. С другой стороны, у Ada есть компиляторы в Java VM и .NET, а у FreePascal — нет. Это может пригодиться на хостингах, на которых можно размещать только управляемый код. Вот у Google, кажется, есть Google Apps, на котором только Java VM может работать, и даже вроде бесплатно можно было что–нибудь хостить, если вписаться в ограничения по памяти, жёсткому диску, обращений из сети и т. п.

У Delphi был компилятор Delphi.Net, но от языка Delphi он сильно отличался, например, там с бухты–барахты все строки стали неизменяемыми, и поэтому не было никакого преимущества, какое есть у одного языка, по–разному компилируемого. Я, конечно, понимаю, что когда работает счётчик ссылок, можно точно знать, является ли владелец строки первым и последним, и можно сделать строку уникальной, если нет, а при сборке мусора о владельцах в общем случае ничего не известно, но всё же, я вот ещё на языке Icon писал, и, хотя там тоже сборка мусора, но когда я работаю со строками, я этого никак не чувствую, там внутри всё само заменяется как надо, как если бы я писал на Delphi или Ada. Это значит, можно было и в Delphi.Net прозрачный переход сделать. Но не сделали.

Далее, FreePascal и Delphi реализуют языки, для которых они сами и являются законодателями. Для языка Ada, в отличие от них, есть международные стандарты ISO по годам: Ada-83, Ada-95, Ada-2005, Ada-2012. Для Паскаля, вообще говоря тоже был стандарт ISO, но Delphi и FreePascal от него ушли оооочень далеко, но если вдруг захочется компилятор Паскаля по стандарту ISO, один такой называется GNU Pascal (GPC).

Стандарт на язык Ада подразумевал, что будет множество реализаций, и сам стандарт обеспечит возможность менять производителя компилятора. Последний стандарт, для которого так оно и было, был Ada-95. Ada-2005 был реализован только в GNAT, а остальные компиляторы реализовали только отдельные возможности Ada-2005. С появлением стандарта Ada-2012 GNAT остался вне конкуренции, и возможности, которые в этот стандарт вошли (программирование по контракту, например), появились раньше стандарта в GNAT. Сам GNAT при этом полностью открыт. AdaCore раз в год выпускает GNAT GPL, скомпилированный сотрудниками своей компании. Те, кто купили у них GNAT Pro (при курсе доллара в 30 рублей минимальный заказ стоил 60000руб. за команду из 5 разработчиков), получали доступ к различным комбинациям кросскомпиляторов и некоторых платформ, под которые нет версии GPL. Ну, например, Mac OS X для Intel архитектуры одно время был типа эксклюзивом для версии Pro, а в GPL была только PowerPC, которая, впрочем, в Mac OS X для Интелов замечательно эмулировалась. При этом GNAT является неотъемлемой частью семейства компиляторов GCC. AdaCore отправляет свои улучшения в так называемый FSF GCC, но уже под лицензией GMGPL, не требующей открытия исходных кодов, и обычно все сторонние сборки GNAT основаны на коде из FSF GCC. Особо желающий может собирать из свежих исходников от GPL версии, их можно скачать с того же сайта, что и установщик.

Одна из таких сборок, основанная на FSF GCC — это TDM–GCC, ссылка на который есть в шапке. Но есть ещё в MinGW, MinGW64, Cygwin тоже сборки GNAT. Если под Linux Debian или Ubuntu установить apt-get install gnat, это будет тоже GNAT из FSF GCC. Под Mac OS X Intel году так в 2007м востребованы были сборки GNAT от Andrew Reynolds.

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

Из выбывших из состязания компиляторов примечателен AdaMagic от SofCheck. У них был прошедший сертификацию компилятор Ada 95 в C/C++. Они эту технологию давно не развивали и потом продали её MapuSoft'у, и кроме как у них, я сейчас не знаю, где её можно достать. Компилятор у них поддерживает Ada 95 с некоторыми возможностями Ada 2005, какими именно, не знаю. Среди интересных платформ вижу, тоже есть Android, зато нет iOS. Имея транслятор в C, наверное, компилировать в iOS было бы легче, но я не знаю наверняка. Скачал как–то, глянул, что там внутри. exe'шники никакой особой защитой не закрыты, я, наверное, мог бы их ломануть или написать кейген. Некоторые потенциально ключевые файлы типа библиотеки времени исполнения, зашифрованы, но не знаю, наколько это большое препятствие, сишные–то файлы на выходе транслятора присутствуют, можно и пересобрать. Для меня технология трансляции в C представляет интерес, так как было бы здорово транслировать в Asm.js, NaCl, FlasCC, WebAssembly, и чтобы всё это работало в браузере. Но там в любом случае надо будет что–то дорабатывать, к чему я не готов сейчас.

Впрочем, Максим Резник разработал A2JS, который может компилировать ограниченное подмножество Ada в JavaScript. A2JS входит в состав Матрёшки.

Сам SofCheck был куплен AdaCore, и у AdaCore эта технология тоже есть. Про AdaMagic нельзя ничего найти на сайте AdaCore, зато она упоминалась в блоге языка программирования ParaSail. Есть языки, реализующие программирование на зелёных потоках: Erlang, Limbo, Rust, Go. Такие языки, как ParaSail, Sparkel, Javallel и Parython — из той же серии, но со своими идеями. Из них Javallel похож на Java, Parython — на Python, Sparkel — на Ada, а ParaSail — помесь всех трёх. Все четверо компилируются в байто–код, который работает на общей виртуальной машине. Компилятор и виртуальная машина написаны, понятное дело, на Аде. Эксперименты с языком они там, похоже, не закончили, релиз не объявлен. Я сам пытался перенести что–нибудь с node.js, но быстро наткнулся на то, что в Sparkel из коробки нет HTTP, XML и JSON. Добавить их можно было бы, но уже по такому нюансу чувствуется, что язык пока экспериментальный.

Некий интерес могла представлять ObjectAda. Интересна она тем, что там было IDE со встроенным конструктором форм, наиболее близко к тому, что есть в Delphi. Но она тоже так и застряла на Ada 95 с небольшими дополнениями из Ada 2005. Где–то попадалась пиратская версия, но большого интереса, мне кажется, давно не представляет.
Faust VIII
Решил помучить Паскаль. Напишу пару игр/программ, возьмусь за Аду, может, информации побольше о ней появится. А так, кидайте все, что может помочь в начале. Думаю, многим новичкам это пригодится respect.gif
OCTAGRAM
На pascal.net.ru разбросаны комментарии про аналоги того или иного элемента синтаксиса имеет в Аде.
Например:
http://pascal.net.ru/for
http://pascal.net.ru/while
http://pascal.net.ru/begin
http://pascal.net.ru/Exit
http://pascal.net.ru/Integer
http://pascal.net.ru/array

Всё, что пишется про Паскаль, можно в уме переделывать на Аду.
Faust VIII
Как сделать окно вывода изображения на Паскале? Не просто вывода, а картинку, ну там типо карты и прочего. А и пока еще здесь, как создать модель/предмет/@, которой можно управлять. И как?
OCTAGRAM
Для какого из Паскалей? И если графика, то нужно графический движок выбрать.
Faust VIII
Цитата(OCTAGRAM @ 8.02.2016 18:22) *

Для какого из Паскалей?

турбо, просто вывести на экран какие-то символы, а еще и управлять одним из них
OCTAGRAM
Если в текстовом режиме, то через модуль Crt. Курсор по экрану перемещается процедурой GotoXY, затем на экран выводятся символы самым обычным Write. Графика в текстовом режиме рисуется символами псевдографики, их коды можно посмотреть в таблице 866. Чтобы получить символ с каким–то номером, можно воспользоваться функцией Chr, либо написать их номер после решётки. Переключать цвет можно при помощи TextColor и TextBackground. Перед началом игры имеет смысл переключить режим при помощи TextMode(C80 + Font8x8), чтобы знакоместо стало более квадратным, и можно было уместить больше информации на экране.

Не проверял, но что–то близко к этому должно нарисовать коробочку:

uses
Crt;

begin
GotoXY(2, 2);
Write(Chr(218) + Chr (196) + Chr (196) + Chr(191));
GotoXY(2, 3);
Write(Chr(179) + ' ' + Chr(179));
GotoXY(2, 4);
Write(Chr(179) + ' ' + Chr(179));
GotoXY(2, 5);
Write(Chr(192) + Chr (196) + Chr (196) + Chr(217));
end.


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

В этом цикле также должна быть задержка, чтобы время в игре шло более менее стабильно. Допустим, это будет Delay(100);

Также в цикле должны проверяться нажатия клавиш. Проверку нажатия клавиш можно сделать через if KeyPressed или while KeyPressed, и если есть нажатые клавиши, то считать их можно при помощи ReadKey. Первым делом надо сделать выход из игры по нажатию Esc. Если ReadKey = Chr(27), то присваиваем логической переменной из того, что выше, False, и программа вывалится из цикла.

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

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

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

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

И на этом вроде бы всё.

У меня, таким образом, набрались такие стадии:
  1. Отрисовка в буфер тайлов
  2. Отрисовка в буфер спрайтов
  3. Отрисовка из буфера на экран
  4. Пауза
  5. Обработка игровой механики спрайтов
  6. Обработка нажатых клавиш

Их можно менять местами, но в общем случае главные циклы в играх выглядят как–то так.
Федосеев Павел
Сделаю небольшое отступление.
В своём посте я привёл ссылку на книгу "Песни о Паскале" не просто так. А ещё и с явной мыслью не знакомить ТС с таким названием, как TurboPascal. На данный момент этот компилятор закончил жизненный цикл вместе с операционкой DOS. Совсем.
Удали его и потом помой руки с мылом.
Установи Free Pascal. На том же сайте есть документация, ознакомься со всеми pdf. Справка по составу стандартных модулей в rtl.pdf.
Вместо штатного CRT используй WinCRT из пакета http://math.ubbcluj.ro/~sberinde/wingraph/main.html. Да и WinGraph оттуда же.
Faust VIII
Цитата(Федосеев Павел @ 9.02.2016 0:45) *

А он как то отличается от Турбо Паскаля? Или набор команд другой?
Федосеев Павел
Если не лезть в свойства системы и не пытаться работать на низком уровне (создать свои CRT или Graph, работать со шрифтами консоли, используя прямые обращения к ОС) - то никакой разницы нет. Особенно, если в начале программы поставить {$mode TP}. Но если забыть и не поставить, то в 90% случаев будет работать.
Porting Turbo Pascal to Free Pascal

А! Есть разница. FPC родной для Windows, а Turbo работает в виртуальной машине, эмулирующей DOS.
OCTAGRAM
Насчёт жизненного цикла я бы не горячился. Кофейные автоматы и торговые терминалы супермаркетов смеются над вашими представлениями о жизненном цикле. Ну хоть в бюджетных организациях от FoxPro отошли почти везде.

Добиться на Turbo Pascal того, что нужно, тем не менее, вполне возможно.

У меня стоит в подписи английская пословица, хорошего перевода которой я не нашёл, но она примерно значит «Если хочешь добраться до вершины, нужно начинать с низов». В этом смысле некоторая польза от Turbo есть. Там очень мало синтаксического сахара, нет неявных указателей, многие угловатости реального CPU чувствуются через язык, но всё же не настолько много, как в C, где даже со строками толком не поработать поначалу.

Free Pascal и GNAT — это современные 32/64хбитные компиляторы. Для программиста наиболее заметно, что на них можно выделать большие куски памяти (Turbo Pascal может максимум выделить 65536 байт одним куском, но, правда, таких кусков может быть несколько), вплоть до Гигабайтов, хотя если много выделять, работать это хорошо не будет.

Turbo Pascal и его непосредственный преемник поднялись за счёт того, что были хорошо заточены под одну OS. И модуль Crt эту заточенность воплощает. В DOS можно было выбрать только одну кодировку, в РФ это 866ая, в одной кодировке только 256 символов. Кроме того, в DOS было 16 цветов фона и цвета символа.

Насколько мне известно, все реализации Crt тащат за собой все эти ограничения. И если для Turbo Pascal это простительно, то для современных языков программирования — нет.

Пользоваться современным компилятором — это ещё значит и учитывать особенности OS. Так, например, в консоли Windows обычно 16 цветов, но зато 65536 возможных символов, в том числе там больше символов псевдографики. А в консоли POSIX обычно 8 цветов, но зато у символов могут быть эффекты подчёркивания и/или жирности. И диапазон Unicode там полный, 17*65536, в 17 раз больше. А ещё там есть какой–то свой способ рисовать псевдографику, отличающийся от вывода юникодных символов, ведь Midnight Commander мог рисовать свои рамки хоть в КОИ–8, хоть в 1251 кодировке, хотя в этих кодировках не было псевдографики. Но если работать в Юникоде, то, возможно, нет разницы.

Кроме того, есть вариации терминалов с True Color диапазоном, то есть, миллионы цветов, но, впрочем, True Color консоль я видел и для Windows. Это сделано каким–то хаком.

По–разному в разных OS сделано изменение размеров консоли. В Windows программа имеет довольно большую власть над своим окном, может произвольно менять размеры. В Windows программа может прочитать любую область своей консоли. В POSIX программа ничего не может поделать с размерами своего окна. Но ей хотя бы сигналом уведомление приходит об изменении размеров, а в Windows, судя по тому, как это сделано в far /w, только опрашивая размеры окна по таймеру, можно узнать об изменениях. И содержимое окна в POSIX читать нельзя. Такие библиотеки, как ncurses, при запуске программы инициализируют текстовый буфер в памяти, держат его копию, и когда программа изменила текстовый буфер, сравнивают старый текстовый буфер с новым, находят отличия и выводят эти отличия на экран при помощи Escape–последовательностей. И программа может читать только из этого буфера в памяти, по–настоящему доступа к консоли нет.

Кстати, в одной текстовой игре «Dwarf fortress» поддержка этих отличий кончилась тем, что игра по умолчанию работает не в настоящем текстовом режиме, а в SDL'ном окне, в котором типа текстовый режим. Но её по–прежнему можно запускать и в текстовых окнах.

Пользоваться современным компилятором — значит, быть готовым работать с отличиями OS.

Но уж если выбирать современное, то лучше Ada, чем этот исторический аппендицит Free Pascal. У вас нет миллиона строчек кода на Паскале, ради которого вам был бы важен компилятор с идентичной Паскалю семантикой со всеми его ограничениями. Если вы хотите чему–то научиться, вам хоть как придётся много писать самому.

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

Либо оставаться в уютном мирке DOSBox.
Faust VIII
Я все понял, но мне бы прям материал, с которым можно начать работу. Лекций я в книжках начитался, просто дайте удочку и я пойду рыбачить smile.gif
OCTAGRAM
По консольным WinAPI справка на русском, например, здесь: http://vsokovikov.narod.ru/New_MSDN_API/Co...riteconsole.htm По модулю Crt была на сайте.

Как примерно организовать главный цикл, я написал.

На каком этапе затруднения?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.