Планирую большую серию статей по FPC/Lazarus
Модератор: Модераторы
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Планирую большую серию статей по FPC/Lazarus
Решил я размахнуться на большую серию статей. Но прежде, чем оформлять материал именно в статьи для сайта, думаю обкатать его в виде заметок в своем блоге. Было бы замечательно если бы появились замечания, пожелания и т.д.
Общая концепция: аудитория — не новички в программировании как таковом (для совсем начинающих, как мне кажется, уже достаточно материала), но, возможно, люди, ни разу не видевшие Free Pascal. Охват материала — максимальный, какой смогу (скажем, 3d-графика и мультимедиа — не мои темы). Степень углубления определится по ходу дела.
Ссылки:
Новые записи будут появляться по тегу «fpcnotes». Надеюсь на комментарии.
Общая концепция: аудитория — не новички в программировании как таковом (для совсем начинающих, как мне кажется, уже достаточно материала), но, возможно, люди, ни разу не видевшие Free Pascal. Охват материала — максимальный, какой смогу (скажем, 3d-графика и мультимедиа — не мои темы). Степень углубления определится по ходу дела.
Ссылки:
Новые записи будут появляться по тегу «fpcnotes». Надеюсь на комментарии.
Последний раз редактировалось Иван Шихалев 26.08.2012 22:05:43, всего редактировалось 2 раза.
Причина: Добавил новые ссылки в правильном порядке
Причина: Добавил новые ссылки в правильном порядке
Иван Шихалев писал(а):В устаревших версиях компилятора 1.x, которые можно попытаться найти на p-зеркалах в интернете, поскольку на официальном p-сервере
странные символы (Firefox 7.0.1, Chromium 14.0.818.0 - win32 xpsp2; Firefox 7.0.1, Chromium 15.0.871.0 - Ubuntu 10.04 x86).
Иван Шихалев писал(а):Итого: вы можете, используя Free Pascal и/или Lazarus, писать, как проприентарные
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Спасибо. Fixed.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
Иван Шихалев писал(а):Спасибо. Fixed.
Не совсем Fixed
Код: Выделить всё
RunTime Library (RTL): Reference Guide [9]Код: Выделить всё
[5] Официальный p-серверКод: Выделить всё
[9] RunTime Library (RTL): - Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
В вводной статье можно было несколько слов сказать про версии какие где брать и чем отличаются, смысле что есть стабильные версии и есть ежедневные версии.
Также пару слов можно сказать про то как получать самую последнюю версию и как ее собирать на основных платформах.
Новичков на freepascal/lasarus это может изначально смутить, не разобравшись с начальными действиями человек может потерять интерес.
На начальном этапе можно указать на самые ключевые настройки, от которых зависит успешность компиляции.
Также пару слов можно сказать про то как получать самую последнюю версию и как ее собирать на основных платформах.
Новичков на freepascal/lasarus это может изначально смутить, не разобравшись с начальными действиями человек может потерять интерес.
На начальном этапе можно указать на самые ключевые настройки, от которых зависит успешность компиляции.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
alexey38 писал(а):В вводной статье можно было несколько слов сказать про версии какие где брать и чем отличаются, смысле что есть стабильные версии и есть ежедневные версии.
Также пару слов можно сказать про то как получать самую последнюю версию и как ее собирать на основных платформах.
Новичков на freepascal/lasarus это может изначально смутить, не разобравшись с начальными действиями человек может потерять интерес.
но ведь автор...
Общая концепция: аудитория — не новички в программировании как таковом (для совсем начинающих, как мне кажется, уже достаточно материала
А так, очень полезное начинание, и я думаю (надеюсь) разрастется в нормальную, ПОЛНУЮ доку с добавлениями, исправлениями, обменом опытом и багами
Наш ответ Википенделю
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
alexey38 писал(а):В вводной статье можно было несколько слов сказать про версии какие где брать и чем отличаются, смысле что есть стабильные версии и есть ежедневные версии.
С этим согласен, спасибо за замечание.
alexey38 писал(а):Также пару слов можно сказать про то как получать самую последнюю версию и как ее собирать на основных платформах.
Это не для вводной.
alexey38 писал(а):Новичков на freepascal/lasarus это может изначально смутить, не разобравшись с начальными действиями человек может потерять интерес.
Новичкам лучше пользоваться последней стабильной версией. Ночные сборки и SVN — для тех, кто понимает, что делает.
alexey38 писал(а):На начальном этапе можно указать на самые ключевые настройки, от которых зависит успешность компиляции.
Это какие, например?
Да, одна заметка — не равно одна статья. Статья — скорее всего, три–четыре заметки. Версии, установка, зависимости и т.д., по всей видимости опишу отдельной заметкой типа «Перед началом работы», которая в итоге войдет во вводную статью вместе с тем, что уже есть.
Добавлено спустя 3 минуты 27 секунд:
Little_Roo писал(а):и я думаю (надеюсь) разрастется в нормальную, ПОЛНУЮ доку
Все-таки это не дока. Для полной доки надо переводить офиц. доки с поддержанием актуальности (что, кстати, само по себе не трудно, поскольку их исходники лежат в SVN, соответственно, все изменения прекрасно отслеживаются, проблема тут в стартовом переводе).
Добавлено спустя 10 часов 49 минут 50 секунд:
Вторая заметка:
Добавлено спустя 1 минуту 20 секунд:
Вторая заметка — не продолжение первой статьи, а начало второй. В продолжение первой, как сказано выше, планируется рассказ о версиях, установке и проч.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Пара замечаний по второй части:
- Требование наличия внешнего ассемблера зависит от платформы. Для x86 внутренний ассемблер реализован, а для того же ARM - нет, поэтому внешний ассемблер таки необходим.
- Можно получить листинг в "привычном" формате, добавив ключ -Amasm (вместе с -al). Собрать его masm-ом скорее всего не получится, но для чтения сойдет.
- Строки типа ShortString не завершаются нулевыми байтами. В приведенном примере компилятор зачем-то добавил его к литералу, но полагаться на это в общем случае нельзя. А вот строки остальных типов (ansistring,widestring,unicodestring) - завершаются нулем всегда и гарантированно.
- В состоянии {$h+} литералы компилируются как ansistring, а если они содержат символы >127, то как unicodestring (строго говоря, так было до последних изменений с Дельфи-подобными строками. После них это утверждение может поменяться).
- Требование наличия внешнего ассемблера зависит от платформы. Для x86 внутренний ассемблер реализован, а для того же ARM - нет, поэтому внешний ассемблер таки необходим.
- Можно получить листинг в "привычном" формате, добавив ключ -Amasm (вместе с -al). Собрать его masm-ом скорее всего не получится, но для чтения сойдет.
- Строки типа ShortString не завершаются нулевыми байтами. В приведенном примере компилятор зачем-то добавил его к литералу, но полагаться на это в общем случае нельзя. А вот строки остальных типов (ansistring,widestring,unicodestring) - завершаются нулем всегда и гарантированно.
- В состоянии {$h+} литералы компилируются как ansistring, а если они содержат символы >127, то как unicodestring (строго говоря, так было до последних изменений с Дельфи-подобными строками. После них это утверждение может поменяться).
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Sergei I. Gorelkin писал(а):- Требование наличия внешнего ассемблера зависит от платформы. Для x86 внутренний ассемблер реализован, а для того же ARM - нет, поэтому внешний ассемблер таки необходим.
Ну, я почти так и написал... Впрочем, исправлю на более явное утверждение.
Sergei I. Gorelkin писал(а):- Можно получить листинг в "привычном" формате, добавив ключ -Amasm (вместе с -al). Собрать его masm-ом скорее всего не получится, но для чтения сойдет.
На amd64 — нельзя. Я попытался.
Код: Выделить всё
Warning: Assembler output selected "MASM" is not compatible with "Linux for x86-64"
Warning: "AS" assembler use forcedБыло мне ответом.
Sergei I. Gorelkin писал(а):Строки типа ShortString не завершаются нулевыми байтами. В приведенном примере компилятор зачем-то добавил его к литералу, но полагаться на это в общем случае нельзя.
Опаньки. Исправлю.
Sergei I. Gorelkin писал(а):В состоянии {$h+} литералы компилируются как ansistring
Хм. Сейчас полезу проверять — дело в том, что ключ -Sh не поменял ничего...
Добавлено спустя 2 минуты 32 секунды:
Проверил. Ничего не поменялось и с {$h+}
Добавлено спустя 9 минут 32 секунды:
Sergei I. Gorelkin писал(а):а если они содержат символы >127, то как unicodestring
При условии, что явно указана кодировка источника. Иначе — то же ShortString получается.
Кстати, никак не могу получить строку без завершающего нуля из литерала... И мне кажется, что его добавление само по себе было б вполне оправданно — чтобы быстрей работали конструкции вида PChar('lalala')...
Добавлено спустя 1 минуту 21 секунду:
Иван Шихалев писал(а):Ну, я почти так и написал...
Ан нет, сорри, буду исправлять.
Добавлено спустя 59 минут 25 секунд:
Уточнил про ассемблер и UnicodeString, добавил предупреждение о том, что внутренние представления могут меняться, и полагаться на них нельзя...
Добавлено спустя 3 минуты 20 секунд:
PS. Кстати, интересно, что литералы ShortString помещаются в секцию .rodata, тогда как UnicodeString — в .data. Хотя оно и логично — сама-то строка меняться не будет, а вот счетчик ссылок...
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Иван Шихалев писал(а):На amd64 — нельзя. Я попытался.Код: Выделить всёWarning: Assembler output selected "MASM" is not compatible with "Linux for x86-64"Warning: "AS" assembler use forcedБыло мне ответом.
Это в линуксе нельзя, потому что там нет проприетарного ml64. В винде - можно. А вообще он при запуске с ключом -h пишет, помимо всего прочего, список поддерживаемых ассемблеров.
Иван Шихалев писал(а):Хм. Сейчас полезу проверять — дело в том, что ключ -Sh не поменял ничего...Добавлено спустя 2 минуты 32 секунды:Проверил. Ничего не поменялось и с {$h+}
Вот бардак... Не так давно исследовали этот момент, выяснили, что в режиме {$h+} все операции со строками вычисляются как ansistring, даже shortstring1:=shortstring2+shortstring3, причем это очень непросто исправить. Ну раз я неправ, значит неправ.
Иван Шихалев писал(а):Кстати, никак не могу получить строку без завершающего нуля из литерала... И мне кажется, что его добавление само по себе было б вполне оправданно — чтобы быстрей работали конструкции вида PChar('lalala')...
Приведение shortstring к pchar запрещено (хотя выражение @s[1] компилируется), а выражение pchar('литерал') создаст в ассемблерном листинге строку с нулем в конце, но без байта длины в начале.
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Sergei I. Gorelkin писал(а):Это в линуксе нельзя, потому что там нет проприетарного ml64. В винде - можно.
Ок, обязательно учту, когда соберусь писать про связи с ассемблером. Пока же я его использовал только как иллюстративный материал.
Sergei I. Gorelkin писал(а):Вот бардак...
Ну, я на SVN-транке все делаю... Там без бардака никак
Добавлено спустя 7 минут 36 секунд:
Sergei I. Gorelkin писал(а):создаст в ассемблерном листинге
Мда... Сейчас немного поэкспериментировал...
Код: Выделить всё
program Test;
const
a = 'Hello, World!';
var
p : PChar;
s : shortstring;
n : ansistring;
begin
p := a;
s := a;
n := a;
end.Создает три копии самой строки в различных форматах... Не, оно, конечно, понятно, но как-то неэкономно...
Добавлено спустя 4 часа 36 минут 31 секунду:
Sergei I. Gorelkin писал(а):Не так давно исследовали этот момент, выяснили, что в режиме {$h+} все операции со строками вычисляются как ansistring, даже shortstring1:=shortstring2+shortstring3, причем это очень непросто исправить.
Видимо исправили:
Код: Выделить всё
# [9] a := 'Hello, ';
movq $U_$P$TEST_$$_A,%rdi
movq $_$TEST$_Ld1,%rdx
movq $255,%rsi
call fpc_shortstr_to_shortstr
# [10] b := ' World!';
movq $U_$P$TEST_$$_B,%rdi
movq $_$TEST$_Ld2,%rdx
movq $255,%rsi
call fpc_shortstr_to_shortstr
# [11] c := a + b;
movq $U_$P$TEST_$$_B,%rcx
movq $U_$P$TEST_$$_A,%rdx
movq $U_$P$TEST_$$_C,%rdi
movq $255,%rsi
call fpc_shortstr_concata, b и c — типа ShortString;
Добавлено спустя 1 минуту 21 секунду:
Да, это при {$h+}, впрочем, при {$h-} — ровно то же самое.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Иван Шихалев писал(а):Видимо исправили:
Я уж было обрадовался, но истина, как обычно, оказалась посередине. Две переменные действительно дают результат типа shortstring (даже если слева от присвоения находится переменная типа ansistring, т.е. при сложении двух строк по 250 символов рез-т будет обрезан), переменная + литерал - то же самое, но если литерал поставить первым, результат вычисляется как ansistring:
Код: Выделить всё
{$H+}
var
a,b: shortstring;
begin
b:='world';
a:='hello '+b;
end;
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Мда. Занятно. А вообще, работа со строками сейчас активно изменяется? Имеет смысл в ней поковыряться и описать, или овчинка выделки не стоит — все равно все скоро поменяется?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
На мой взгляд, пока лучше подождать.
