Новый улучшенный способ установки PascalABC.NET под linux

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

хорошо, постараюсь сделать запись в ближайшее время

Благодаря наводкам @zhurlik получилось запустить PascalABC.NET в Linux с помощью wine.

Компилятор работает без ошибок. В среде разработки не работает справка “Образцы кода” и требуются кое-какие доп. настройки. Остальное работает отлично (в том числе, процесс дебага, ссылки, подсказки, графические модули и т.д.).

Шаги:

  1. sudo apt install wine winetricks.
  2. winecfg → Библиотеки → в списке выбираем mscoree и указываем Сторонняя (Windows) → Нажимаем Применить, закрываем.
  3. winetriсks dotnet471. Процесс довольно длительный, друг за другом будет установлено несколько версий dotnet. Ошибки, в том числе об отсутствии Mono, можно игнорировать и смело жать Далее, Ок и т.д.
  4. Скачиваем PascalABC.NET StandardPack.
  5. wine ~/PascalABCNETSetup.exe (выбираем путь до файла установки) → Снимаем галочку с Microsoft .NET Frameword (мы его уже установили) → Выбираем куда устанавливать (лучше всего прямо на C:/, чтобы в пути не было пробелов) → После установки жмем Закрыть.
  6. wine ~/.wine/drive_c/PascalABC.NET/PascalABCNET.exe → Сервис → Настройки → Снимаем галочку с Выходные файлы генерировать в папку и Удалять EXE файл после выполнения. Иначе, после компиляции кода с ошибкой не получится скомпилировать его вновь после исправления, будет ошибка о том, что файл .exe уже используется другим процессом, хотя после перезапуска и отмены настроек всё стало работать нормально.
1 лайк
1 лайк

А есть ли какие-то планы для полноценной работы в линукс нативно без wine?

Что компилятор запускается через mono, я читал, но ведь компилятор не адаптирован под линукс, и половина всего не работает, нужно переписывать графические примитивы например на Gtk# вместо WPF или что-то подобное делать. И даже с консолью и кодировкой файлов исходников есть вопросы. Например, при выводе в консоль в линуксе через writeln, программа не должна в конце выплёвывать лишних \r, должно быть только \n.

Да и зависимость от mono — это тоже не особо хорошо. Хотя от неё вы, к сожалению, вряд ли сможете избавиться.

Планы есть. Но что вы имеете в виду? На сайте например описан рабочий алгоритм встраивания консольного компилятора в Geany. И в VS Code есть плагин PascalABC.NET - абсолютно рабочий. Устанавливай под Linux и программируй.

Есть планы переписать оболочку во что то кроссплатформенное.

Пока нет сильной нужды в этом - подавляющее большинство компьютеров дома - под Windows. И существенно меньшая часть - под IOS.

Что касается меня, то я преследовал лишь одну цель - как запустить PascalABC.NET на Linux для школьника. Получается, на данный момент, я нашел только следующие варианты:

  1. Virtualbox + Windows + PascalABC.NET (ресурсоемко, хотя все и работает)

  2. VS Code + mono + PascalABC.NET (все просто и казалось бы работает, но нету основных возможностей для школьной программы: робот и прочие графические модули)

  3. wine + PascalABC.NET (требует меньше ресурсов, чем 1 и больше возможносте, чем в 2, есть пару нерабочих моментов, на которые можно закрыть глаза)

Мой выбор остановился на 3, хотя если бы в пунтке 2 были решены вопросы по использованию материалов для обучения в школе, я бы выбрал 2.

1 лайк

2 сообщения были перенесены в новую тему: Free Pascal и надо ли переходить на него с PascalABC.NET

16 сообщений были перенесены в новую тему: Длинный троллинг про UTF-8 без BOM и Free Pascal

Сообщение было перемещено в эту тему: Длинный троллинг про UTF-8 без BOM и Free Pascal

Спасибо вам за эксперимент! Когда я пробовал эту связку лет восемь назад, Вайн слабо поддерживал дот-нет у себя внутри. Здорово, что времена поменялись!

У меня один вопрос: а зачем устанавливать Паскаль совмещённый с ДотНет (PascalABCNETWithDotNet40Setup.exe) если вы уже установили ДотНет с помощью вайнтрикс? Может быть, логичней было бы использовать инсталлятор без ДотНет?

@Ulysses Насколько, я помню, пробовал разные варианты и мог запутаться, что лучше и что хуже. По логике, конечно кто-то один должен установить необходимый дотнет, тем более, я не силен в них, но как я понял, для установки PascalABCNet уже нужен какой-то дотнет (4.0), а он уже в свою очередь доставляет следующую версию (4.7) необходимую для работы. Хотя, я могу ошибаться…

Хм, интересно, спасибо большое за ответ. Если найду минутку, попробую на своих машинах с Убунту и НиксОС.

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

Вот мои замечания по этому процессу и результату.

  1. Установка дотнета (шаг 3) во время установки очередной версии (всего оно их штук пять поставило, причём время от времени надо нажимать на кнопки инсталятов дотнета — морока) вошло в дедлок и исправно писало об этом в терминале: что так де и так, жду критическую секцию, но ничего не происходит, подожду ещё 60 секунд… и так бесконечно. После убийства и перезапуска началось примерно с того же места и успешно завершилось.

  2. Желательно указать версии wine с которыми пробовалось. Первая попавшаяся мне версия 6.0.6 оказалась несовместимой с каким-то из дотнетов, который он собирася ставить. Хорошо, что в репозитории оказалась и “staging” (экспериментальная) версия 7.0-rc5 – с ней-то и заработало. Ещё пробовал wine64 — 64-разрядную версию. Под ней не захотел дотнет ставиться.

  3. У меня не получилось найти графического приложения, которое бы работало. Пробовал недавно опубликованный Админом ray-tracer, ещё что-то из примеров с формами и с Graph3d (отдельно) — без толку. Текущая ценность этого способа установки, таким образом, какмне кажется, это только Робот и Чёртёжник. Так ли это у всех?

  4. Редактор работает не в идеальной форме: дрожжит курсор, исчезают открытые меню в панели меню, если долго выбирать нужный пункт, шрифты грустные (как обычно в Вайне). В режиме автодополнения кода если зайти в круглые скобки вызова функции и дождаться выпадающей подсказки по аргументам, всё замирает (нужно отключить режим автодополнения, чтобы всё вернулось).

  5. Кириллица во многих местах работает, но в некоторых нет.

В общем, если нужен Робот и Чертёжник, то да. По графике – интересно если что-то всё же работает. А так, VS Code плагин мне больше нравится, и Робот с Чертёжником туда было бы не так уж и трудно пернести, наверное. Впрочем переписать всё на что-то кросс-платформенное наверное лучшее приложение ресурсов.

1 лайк

А брать версию для Windows XP где дотнет уже встроен или ставить mono (вроде вайн его умеет подхватывать) не вариант?

Всё же ставить много версий дотнета как-то глупо.

Я думаю, что графические модули переписываются под что то кроссплатформенное. У меня после удаления из GraphABC нескольких вызовов WPF он кстати отлично заработал.

Насчет версий - версия NET 4.0 хотя и старая, но вполне рабочая - и наверняка её mono хорошо эмулирует. Так что можно ставить версию для Windows XP. В версии для NET 4.7 самое основное - это возможность работать с HighDPI.

То есть, надо специально заняться адаптацией под Линукс - были бы свободные руки и осознанная необходимость. В школах России стали активно выгребать Паскаль в пользу Python и C++ - по существу запрет на остальные языки. Так что вкладывать существенные силы в разработку не хочется.

А для себя мы всё это конечно подстроим и перепишем.

Не вижу никакой проблемы в том, что ставится несколько версий дотнета. Значительно большие проблемы описаны в последующих пунктах. Всё остальное, что вы пишите, это сырые идеи. Сверху дали пошаговое рабочее руководство – это было полезно. Если вы сможете сделать подобное и проверить, будет здорово.

Я бы не был настолько оптимистичен. Насколько я помню, ряд вещей не поддерживался годами иногда принципиально иногда просто потому что это очень сложно сделать. И тут уже не важно насколько старая версия .НЕТ. И ещё раз повторю, что установить НЕТ 4.7 не проблема на самом деле. Проблема в том, что всё равно что-то нереализовано, плюс редактор не вполне стабилен (скорее всего, из-за Вайна).

Я не оптимистичен. У меня не получилось установить по указанному алгоритму.

Общая проблема - wine слабо поддерживает wpf. Вообще удивительно, что она поддерживает. А в оболочке редактор и куча компонент - это все wpf

Моя попытка на arch linux:

  1. Добавил репу multilib в /etc/pacman.conf
  2. Установил пакеты “wine” и “winetricks”
  3. winetriсks dotnet48
  4. Скачал http://pascalabc.net/downloads/PascalABCNETSetup.exe
  5. wine PascalABCNETSetup.exe
  6. wine PascalABCNET.exe

GraphABC и GraphWPF запускаются без проблем.

Но шрифт по-умолчанию был не моноширный, поэтому поставил ttf-ms-fonts.

Screenshot from 2022-02-19 12-03-31

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


Попробовал external подпрограммы, но получаю BadImageFormatException что бы не делал. Тестировал с:

uses System;
uses System.Runtime.InteropServices;
{$platformtarget x64}

type
  punch_gc_callback = procedure(ptr: IntPtr);
  
  test = static class
    //[DllImportAttribute('my_lib')]
   static function copy_arr(a: array of integer; punch_gc: punch_gc_callback): IntPtr;
    external 'my_lib.so';
  end;
  
begin
  test.copy_arr(|1,2,3,4,5|, ptr->
  begin
   ptr.ToString('X16').Println;
  end);
end.

Библиотеку my_lib.so (16.5 КБ) сделал из файла my_lib.c:

#include <stdlib.h>
#include <string.h>

//__declspec(dllexport)
char * copy_arr(int* a, void (*punch_gc)(void*))
{
	char* res = malloc(20); // Выделяем 20 байт неуправляемой памяти
	punch_gc(a); // Вызываем ту подпрограмму, чей адрес сюда передали
	memcpy(res, a, 20); // Копируем 20 байт из "a" в "res"
	return res; // Плохо что неуправляемая память не освобождается, но в этом тесте не важно
}

Командой:

gcc -Wall -g -shared -m64 -o my_lib.so -fPIC my_lib.c

Дальше попробую переключится назад на винду и декомпилить .exe паскаля и рабочий .exe JBRider-а, подключающий ту же библиотеку:

using System.Runtime.InteropServices;

class Program
{
    delegate void punch_gc_proc(IntPtr ptr);
    
    [DllImport ("my_lib")]
    private static extern IntPtr copy_arr(int[] arr, punch_gc_proc proc);
    
    static void Main()
    {
        var a = new int[5] {1, 2, 3, 4, 5};
        copy_arr(a, ptr =>
        {
            Console.WriteLine("0x"+ptr.ToString("X16"));
        });
    }
}

P.S. А, возможно дело в wine, потому что из под wine у меня .dll библиотека подключается без проблем, а .so не хочет.

P.P.S. Ну да, если компилить из под wine - получается .exe, зависимый от wine и загружающий только .dll библиотеки. А если компилить консольным компилятором из под mono - .so библиотеки загружаются, но зато не работает IDE паскаля.

2 лайка