LINUX.ORG.RU

История изменений

Исправление segfault, (текущая версия) :

Строго говоря, нет. Или объясни мне, чем на раст легче портировать с паскаля, чем с си. Ты же ведь помнишь, с чего спор начинался?

Паскалевские базовые непримитивные типы, такие как строки и массивы отлично ложатся в rust-овые. Вплоть до автоматической трансляции кода. Работы с указателями в проектах на паскале практически не встретишь (все же, язык высокого уровня), а где попадется - пихаем в unsafe.

В С же, строки обычно представлены указателями на ноль-терминированную строку. И указывают они не обязательно в начало буфера со строкой. Арифметика указателей часто имеет место. Сконвертить это в str или String без вмешательства человека и глубокого понимания происходящего невозможно. С массивами те же проблемы + длина, обычно прилепленная отдельной переменной. Ищем и интегрируем ее опять вручную. Массивы предопределенной длины - отдельные заморочки с прибиванием длины к типу и sizeof. Ну и на последок самое вкусное: повсеместные алокации памяти разными способами. Суем в контейнеры? А область видимости?

Можно, конечно, тупо все протранслировать в работу с указателями, но тогда это будет один большой unsafe{...}, и для интеграции с нормальным кодом на rust понадобятся прослойки, конвертирующие форматы.

Исходная версия segfault, :

Строго говоря, нет. Или объясни мне, чем на раст легче портировать с паскаля, чем с си. Ты же ведь помнишь, с чего спор начинался?

Паскалевские базовые непримитивные типы, такие как строки и массивы отлично ложатся в rust-овые. Вплоть до автоматической трансляции кода. Работы с указателями в проектах на паскале практически не встретишь (все же, язык высокого уровня), а где попадется - пихаем в unsafe.

В С же, строки обычно представлены указателями на ноль-терминированную строку. И указывают они не обязательно в начало буфера со строкой. Арифметика указателей часто имеет место. Сконвертить это в str или String без вмешательства человека и глубокого понимания происходящего невозможно. С массивами те же проблемы + длина, обычно прилепленная отдельной переменной. Ищем и интегрируем ее опять вручную.

Можно, конечно, все протранслировать втупую, но тогда это будет один большой unsafe{...}, и для интеграции с нормальным кодом на rust понадобятся прослойки, конвертирующие форматы.