LINUX.ORG.RU
ФорумTalks

Что есть в паскале, чего нет в современных C++ ?

 , , ,


0

3

Сабж. Существуют ли в Free Pascal и Delphi конструкции, которые нельзя заменить простыми макросами, чтобы программа компилировалась GCC и работала? Помимо read/readln, write/writeln и аналогичных функций для работы со стрингами.

Интересуюсь просто так, поэтому не в Development.

Пока вспомнили:
with, котрый deprecated, но пока нормально компилируется и работает.
Модули.
case. Простейшие вещи из виртовского паскаля работают и в switch, но новые фичи вроде стрингов сделать не так просто.
Длина строки в нулевом байте.
Некоторые операции над строками.

Отдельного упоминания заслуживает Hedgewars, где для контроля качества конвертируют код из FP в C++ и применяют Coverity. Ещё не смотрел.

★★★★★

Последнее исправление: question4 (всего исправлений: 5)

Ответ на: комментарий от Napilnik

Нельзя пропатчить компилятор и разрешить имена на русском?

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

Замучаешься этот код разбирать.

да, тоже решение не ахти

next_time ★★★★★
()
Ответ на: комментарий от no-such-file

Нет не так. Лепишь транслятор паскаль -> си.

Ну и кошмар же там будет в коде. С тем же успехом можно сделать транслятор C++ --> С.

Napilnik ★★★★★
()
Ответ на: комментарий от next_time

почему только на русском? нужно ещё и на украинском и на китайском и на арабском.

Да потому что русского пока вполне хватает, а китайцы подсмотрят реализацию и слепят для себя сами.

и это всё должно быть изначально в компиляторе, безо всяких патчей

И ЯП, и компьютеры нужны были свои, со своей архтрекрурой, но много плолимеров прополимерено с тех пор - теперь только патчи, а дальше видно будет.

Napilnik ★★★★★
()
Ответ на: комментарий от Napilnik

Ну и кошмар же там будет в коде. С тем же успехом можно сделать транслятор C++ --> С.

Вроде же с этого ООП в Си и начиналось. Всё через макросы поверх Си.

question4 ★★★★★
() автор топика
Ответ на: комментарий от atrus

Зато на case метод Даффа не реализуется. Хотя этот метод один сплошной хак. :)

Почитал как его из XFree86 убрали. Почему компиляторы так плохо оптимизируют switch?

question4 ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Сравнение с чаром:

if s = 'a' then

Здесь s может быть как строкой, так и char. Автоматическое приведение к типу PChar. Сложение двух PChar-ов:

var a, b, c: PChar;
...
a:= 'a';
b:= 'bc';
c:= a + b;

Не понял, это должно или не должно работать?

question4 ★★★★★
() автор топика
Ответ на: комментарий от Napilnik

в паскале операсор case удобный и хорошо спроектированный, после него сишный switch заставляет плеваться

Спасибо, про реализацию case для стрингов макросами совсем забыл.

question4 ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Шикарно, у нас в проекте hedgewars есть транслятор для движка с паскаля на си. Получающийся код запихивали в coverity, много полезного надиагностировалось.

Спасибо! Вот и самый полный ответ на мой незаданный вопрос. А как отсеиваете ошибки транслятора?

question4 ★★★★★
() автор топика
Ответ на: комментарий от mystery

Никто как бы сейчас тебе не запрещает писать код на С++ используя Сишный стиль.

Как бы тебе всякие не рассказывали, из С++ Си никуда не делся.

a1batross ★★★★★
()
Ответ на: комментарий от next_time

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

1С — хороший язык для обучения?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Какие такие ошибки транслятора? Транслятор совершенен! Шутка, конечно, но ошибок именно транслятора практически нет. Есть ошибки в реализации части паскалевского rtl, они тоже ловятся статическим анализатором. Транслятор же довольно лёгкий получился, подмножество паскаля, спользуемое нами, довольно хорошо переносится на си.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

var
  a,b,c: PChar;
begin
  a := 'a';
  b := 'ab';
  c := a + b;
{ Error: Operation "+" not supported for types "PChar" and "PChar" }

  {$H+ AnsiStrings on}
  c := PChar(concat(a, b));
{ AnsiString -> PChar: ok }

  writeln(c);
end.
Deleted
()
Ответ на: комментарий от question4

Почему компиляторы так плохо оптимизируют switch?

Потому что процессоры смогли в конвейер и потребовали сократить число переходов, а адрес перехода по возможности сделать предсказуемым задолго до самого перехода.

atrus ★★★★★
()
Ответ на: комментарий от question4

значит, он лучше подходит для обучения в русскоговорящих странах, чем паскаль

next_time ★★★★★
()
Ответ на: комментарий от atrus

Сам виноват, что задаю риторические вопросы.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

про реализацию case для стрингов макросами совсем забыл.

А разве такое С++ уже умеет?

Case A of
1,4,100,5..20: ;
End;

И вообще, ты пытаешься сделать не то, нужен наоборот - транслятор _в_ паскаль, чтобы можно было подарить людям код набитый кодовыми обезьянами за мешок орехов.

Napilnik ★★★★★
()
Ответ на: комментарий от Deleted

Гм, спасибо за поправку. Отчего-то полагал, что такое возможно.

Тогда упомянутые уже тут switch/case по строкам, по диапазонам. Некоторая хитрость при перевода в си такого кода:

var b: byte
...
for b:= 0 to 255 do ...;

unC0Rr ★★★★★
()
Ответ на: комментарий от Napilnik

А разве такое С++ уже умеет?

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

question4 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Множества уже упоминали? Как с этим у цпп?

Через перечислимые типы выразить можно? Если не требуются ни бинарная совместимость, ни автоматическая проверка.

question4 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.