program Hello; begin WriteLn('Hello, World!') end.
$ fpc hello Target OS: Linux for x86-64 Compiling hello.pp Linking hello 5 lines compiled, 0.9 sec $ ./hello Hello, World! $
Начнем по традиции с простейшей программы, делающей хоть что-то... Кто сказал
«что-то полезное»? До чего-то полезного нам еще пилить и пилить. Достаточно
типовой «Hello, World!» можно увидеть во врезке. Теперь можно сохранить этот
текст в файл (например,
hello.pp
1),
скомпилировать командой fpc hello
и запустить.
См. консольный фрагмент — если вы работаете в Linux или FreeBSD, результат
должен быть похож. Да и в других системах отличия не особо существенны. Еще
тут может выпасть предупреждение от компоновщика — на него внимания обращать
не надо. Получилось? Теперь будем разбираться, что именно.
> Вернемся к нашим баранам...
ОтветитьУдалитьМожет быть, стоит поместить описание разных секций программы в виде комментариев прямо в код? Новичкам будет нагляднее, мне кажется
> Пока можно отметить, что синтаксис языка вообще не позволяет объявить процедуру такого типа.
Вот меня всегда (класса с 9-10, наверное) бесило, кстати, что у Паскалей очень много синтаксических фич, которые для пользовательского кода недоступны. Псевдо-процедуры с переменным числом параметров, перегрузка операторов (имеющаяся для строк и множеств) и т.д.
> Теперь становится очевидным известное из документации ограничение для непосредственно указываемых строк в 255 байт.
Т.е. строковые литералы всё ещё реализуются как ShortString, я правильно понял? И вдобавок, как ASCII? Зря, зря...
А вообще интересно было читать, давно я не сталкивался с Паскалем. Буду ждать продолжения.
1. Про секции я буду писать подробно и отдельно. Здесь не хотелось на этом останавливаться.
ОтветитьУдалить2. Псевдо-процедуры остались в наследство с 70х годов прошлого века, когда стандартная библиотека считалась частью языка, и никто особо не заморачивался, что она на самом языке не выражается. Впрочем, тогда вообще какой-то логической стройностью не особо заморачивались.
3. По крайней мере во Free Pascal литералы реализуются как ShortString. При этом строковую константу большего размера объявить можно — как сумму таких литералов.
Что касается ASCII — так это более чем логично, что исходник находится в однобайтовой кодировке (впрочем, вполне работает с UTF-8, но размер литерала ограничивается все равно в байтах, а не символах), а литералы вынуждены быть в кодировке исходника.
> Впрочем, тогда вообще какой-то логической стройностью не особо заморачивались.
ОтветитьУдалитьНу, вот Ритчи со товарищи очень были озабочены тем, чтобы их детище могло полностью бутстрапиться. Да и Вирт, вроде бы, к этому тяготел, а потом - раз - и сделал оператор вместо функции. Впрочем, это дела давно минувших дней. В нынешних версиях паскалей функции с переменным числом аргументов делать, кажется, можно.
> При этом строковую константу большего размера объявить можно — как сумму таких литералов.
И что случится, если строка получится больше 255 байт? Обрежется или переконвертируется в длинную строку? И если обрежет UTF-8, то потенциально обрежет посреди символа?
Так и FPC прекрасно бутстрапится. То, что вместо функции оператор — это другой вопрос. Ну и переменное число аргументов тут не поможет. На «Hello, World!» этого не заметно, но на самом деле WriteLn() — это переменное число вызовов, т.е. внутренние fpc_write_нечто() вызываются для каждого аргумента (и зависят от его типа).
ОтветитьУдалитьСтроковый литерал больше 255 символов просто не скомпилируется, зачем что-то обрезать? А константа, полученная из литералов сложением, будет описана как AnsiString.
> То, что вместо функции оператор — это другой вопрос.
ОтветитьУдалитьОК, сформулирую иначе: невозможно написать то, что принято называть "стандартной библиотекой языка Pascal" (включая read/readln/write/writeln) на языке Pascal.
> на самом деле WriteLn() — это переменное число вызовов
Я когда-то крякал программы на TurboPascal-е, сталкивался =)
> А константа, полученная из литералов сложением, будет описана как AnsiString.
Хорошо, спасибо.
Я немного проапдейтил абзац про строки — там есть тонкости...
ОтветитьУдалить