среда, 12 октября 2011 г.

FPC-Notes: «Hello, World!»

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.pp1), скомпилировать командой fpc hello и запустить. См. консольный фрагмент — если вы работаете в Linux или FreeBSD, результат должен быть похож. Да и в других системах отличия не особо существенны. Еще тут может выпасть предупреждение от компоновщика — на него внимания обращать не надо. Получилось? Теперь будем разбираться, что именно.

Читать далее »

6 комментариев:

  1. > Вернемся к нашим баранам...

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

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

    Вот меня всегда (класса с 9-10, наверное) бесило, кстати, что у Паскалей очень много синтаксических фич, которые для пользовательского кода недоступны. Псевдо-процедуры с переменным числом параметров, перегрузка операторов (имеющаяся для строк и множеств) и т.д.

    > Теперь становится очевидным известное из документации ограничение для непосредственно указываемых строк в 255 байт.

    Т.е. строковые литералы всё ещё реализуются как ShortString, я правильно понял? И вдобавок, как ASCII? Зря, зря...

    А вообще интересно было читать, давно я не сталкивался с Паскалем. Буду ждать продолжения.

    ОтветитьУдалить
  2. 1. Про секции я буду писать подробно и отдельно. Здесь не хотелось на этом останавливаться.

    2. Псевдо-процедуры остались в наследство с 70х годов прошлого века, когда стандартная библиотека считалась частью языка, и никто особо не заморачивался, что она на самом языке не выражается. Впрочем, тогда вообще какой-то логической стройностью не особо заморачивались.

    3. По крайней мере во Free Pascal литералы реализуются как ShortString. При этом строковую константу большего размера объявить можно — как сумму таких литералов.

    Что касается ASCII — так это более чем логично, что исходник находится в однобайтовой кодировке (впрочем, вполне работает с UTF-8, но размер литерала ограничивается все равно в байтах, а не символах), а литералы вынуждены быть в кодировке исходника.

    ОтветитьУдалить
  3. > Впрочем, тогда вообще какой-то логической стройностью не особо заморачивались.

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

    > При этом строковую константу большего размера объявить можно — как сумму таких литералов.

    И что случится, если строка получится больше 255 байт? Обрежется или переконвертируется в длинную строку? И если обрежет UTF-8, то потенциально обрежет посреди символа?

    ОтветитьУдалить
  4. Так и FPC прекрасно бутстрапится. То, что вместо функции оператор — это другой вопрос. Ну и переменное число аргументов тут не поможет. На «Hello, World!» этого не заметно, но на самом деле WriteLn() — это переменное число вызовов, т.е. внутренние fpc_write_нечто() вызываются для каждого аргумента (и зависят от его типа).

    Строковый литерал больше 255 символов просто не скомпилируется, зачем что-то обрезать? А константа, полученная из литералов сложением, будет описана как AnsiString.

    ОтветитьУдалить
  5. > То, что вместо функции оператор — это другой вопрос.

    ОК, сформулирую иначе: невозможно написать то, что принято называть "стандартной библиотекой языка Pascal" (включая read/readln/write/writeln) на языке Pascal.

    > на самом деле WriteLn() — это переменное число вызовов

    Я когда-то крякал программы на TurboPascal-е, сталкивался =)

    > А константа, полученная из литералов сложением, будет описана как AnsiString.

    Хорошо, спасибо.

    ОтветитьУдалить
  6. Я немного проапдейтил абзац про строки — там есть тонкости...

    ОтветитьУдалить