LINUX.ORG.RU

Перевод статьи о переносимости ПО

 , , переносимость,


0

0

Существует хорошая статья о разработке переносимого ПО - "Fighting the Lemmings", автор Martin Husemann. Давно хотел её перевести, и вот, наконец, дошли руки.

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

В статье описываются типичные проблемы, возникающие при разработке переносимого кода, а также способы их решения. Рекомендуется к прочтению тем, кто пишет ПО для систем, отличных от x86.

>>> Подробности

Вроде бы как неплохо...

beloz
()

СУПЕР! ЧУВСТВУЮ Я, ГРЯДЁТ, ГРЯДЁТ ВЕНДЕКАПЕЦЦЦ!!!!

anonymous
()

Почитаешь такую статью и сразу понимаешь, что если есть требование переносимости, то асм/С/С++ использовать не стоит и Java придумали не зря.

DOKA
()

Оно про Йаву?

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

>>Почитаешь такую статью и сразу понимаешь, что если есть требование переносимости, то асм/С/С++ использовать не стоит и Java придумали не зря.

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

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

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

Первый вопрос типа: "У вас какая версия ЖВМ?" :)

iZEN ★★★★★
()

> Рекомендуется к прочтению тем, кто пишет ПО для систем отличных от x86.

Да им не очень надо, они и так знают. А вот "леммингам", пишущим только для x86, как раз и рекомендуется. :)

const86 ★★★★★
()

> Цитата из статьи: "В наши дни все пишут под Linux и всё работает на машинах с архитектурой i386."

Реально не знал. :)

Gizur
()

Fighting the Lemmings? Тысячи леммингов таки ошиблись? :)

Quasar ★★★★★
()

Вот только к сожалению код переносимый=тормозной! Ну ладно, когда дело касается ОС или приложений, которые заведомо расчитаны на выполнение на разных платформах, но если человек пишет приложение под СВОИ нужды? Денег ему за это не платят и тут как говориться "у меня работает, а если вам надо переносимость - переносите - мне это не интересно." По моим личным наблюдениям - как только какой-то проект делают переносимым на другие платформы так сразу размер взлетает до небес, быстродействие существенно падает, количество багов возрастает в геометрической прогресии, а время выхода новых релизов увеличивается в разы. У меня даже поговорка была: "один из способов угробить проект - сделать его переносимым!" Так что перед тем как делать переносимый код, неплохо бы вначале подумать - а оно вообще мне надо?

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

Каких только отмазок не сочинят -- лишь бы не делать правильно.

anonymous
()

Статья замечательная. Автору - респект, переводчику зачёт.

---
С Уважением,

BuG2BuG
()
Ответ на: комментарий от anonymous

> У меня даже поговорка была: "один из способов угробить проект - сделать его переносимым!"

Значит это поделка, а не проект. Отличие в том, что поделка нужна только автору и/или конторе, где он работает (ну или одному, но очень большому заказчику, ради которого стоит корячиться - например, ГАС "Выборы" тоже поделка). А проект рано или поздно понадобится кому-то другому, и этот другой захочет его использовать в окружении, отличном от того, где проект разрабатывался изначально.

anonymous
()

Хыхы. Что у меня есть. :)

server1% uname -a
NetBSD server1.freeshells.ch 3.0.2_PATCH NetBSD 3.0.2_PATCH (GENERIC) #1: Wed Nov 15 23:01:03 MET 2006 bjn@server1.freeshells.ch:/usr/src/sys/arch/sparc64/compile/GENERIC sparc64
server1%

---
С Уважением,

BuG2BuG
()
Ответ на: комментарий от anonymous

>У меня даже поговорка была: "один из способов угробить проект - сделать его переносимым!" Так что перед тем как делать переносимый код, неплохо бы вначале подумать - а оно вообще мне надо?

вантузятники, делпхи-программисты что вы забыли на лоре?

black7
()

Хорошая статья.. вот только

>А теперь, все дружно отыскали систему NetBSD/sparc64 и, как только ваше программа заработает на основной целевой системе, портируйте её ещё и туда. ;--}

Где взять шелл на NetBSD/sparc64?! :-))

php-coder ★★★★★
()
Ответ на: комментарий от anonymous

>Отличие в том, что поделка нужна только автору и/или конторе, где он работает У нас разное мнение о том, что такое поделка. И уж в любом случае именно автору решать стоит ли ему геморится с переносимостью или нет. Есть приложение решающее КОНКРЕТНУЮ задачу, где нет смысла воротить переносимость, чтобы кто-то когда-то мог это использовать ещё где-то. Как я уже писал: "вам нужна переносимость? переносите!"

anonymous
()

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

Имхо, в статье описывается либо кривизна проектирования системных библиотек вызовов, либо попытка обуть рыбу в ботинки (тупо собрать код для одной платформы под другую).

Это - если максимально обще. Если более конкретно - это плач девелопера NetBSD. ;))

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

> NetBSD ... работает на пятидесяти четырёх различных системных архитектурах, характеризующихся семнадцатью машинными архитектурами, которые в свою очередь охватывают пятнадцать процессорных семейств.

И на всех, по-видимому, одинаково хреново и убого...

LamerOk ★★★★★
()

В помощь для переводчика. не осилившего фразу: You are allowed to cast to the ``right'' type of an object when assigning via a pointer, so the compiler assumes all variables of the casted-to type might have changed.

Предлагаю подумать над следующим примером:

:/tmp[1]{1}$ cat test2.c
#include <stdio.h>

void f(int *i,long *l) {
printf("1.v=%ld\n",*l);
*i=11;
printf("2.v=%ld\n",*l);
};

int main() {
long b=10;
f((int*)&b,&b);
printf("3.v=%ld\n",b);
};
:/tmp[1]{1}$ gcc -O2 test2.c -o test2
:/tmp[1]{1}$ ./test2
1.v=10
2.v=10
3.v=11
:/tmp[1]{1}$

gena2x ★★★
()
Ответ на: комментарий от php-coder

> Где взять шелл на NetBSD/sparc64?! :-))

Ждем пока допиял qemu?

gena2x ★★★
()

>Вот только к сожалению код переносимый=тормозной!... Ммда... А мужики-то не знают!(С) Взять Nedit например. http://www.nedit.org/

anonymous
()

Переносимоепокопец?

anonymous
()
Ответ на: комментарий от gena2x

>Предлагаю подумать над следующим примером:

подумал. но что-то каменый цветок не выходит.

$ cat test.c
#include <stdio.h>

void f(int *i,long *l) {
printf("1.v=%ld\n",*l);
*i=11;
printf("2.v=%ld\n",*l);
};

int main() {
long b=10;
f((int*)&b,&b);
printf("3.v=%ld\n",b);
};
$ gcc -O2 test.c -o test
$ ./test
1.v=10
2.v=11
3.v=11
$ uname -a
Linux 305-01 2.6.15-28-386 #1 PREEMPT Wed Jul 18 22:50:32 UTC 2007 i686 GNU/Linux
$ gcc --version
gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

ps я так понимаю вы хотели сказать, что в силу разных обстоятельств (оптимизация компилятора, архитектура) повлияют на порядок выполнения операций? или я где-то что-то недоглядел/недочитал/недопонял?

ale ★★
()
Ответ на: комментарий от php-coder

тебе персональную шестую звезду <strike>в жопу чтоб светила ярче</strike>за количество бессмысленных комментов. первый раз вижу мудака с *****/ лор сговняли совсем. тьфу. быдлушник.

anonymous
()
Ответ на: комментарий от ale

Гм... Просто не очень удачный пример наверное, но я старался попроще.

:/local/xfs/list_4_40_17_0v2{1}$ uname -a
Linux ... 2.6.9-42.0.10.ELsmp #1 SMP Tue Feb 27 08:38:56 CST 2007 i686 athlon i386 GNU/Linux

:/local/xfs/list_4_40_17_0v2[1]{1}$ gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3)

:/local/xfs/list_4_40_17_0v2{1}$ ./test2
1.v=10
2.v=10
3.v=11

Там же:
:/tmp# gcc --version
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
ruspbd20516:/tmp# ./test2
1.v=10
2.v=10
3.v=11

[root@vm11 tmp]# uname -a
Linux vm11 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:14 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

[root@vm11 tmp]# gcc --version
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[root@vm11 tmp]# ./test2
1.v=10
2.v=10
3.v=11

Странно...

>я так понимаю вы хотели сказать, что в силу разных обстоятельств (оптимизация компилятора, архитектура) повлияют на порядок выполнения операций? или я где-то что-то недоглядел/недочитал/недопонял?

Не это я хотел сказать. Я хотел сказать, что в некоторых услових компилятор при оптимизации считает, что есть вы записали что-то в *a, где a - int*, то short b при этом не меняется.

Если посложнее, то читайте тут:
http://mail-index.netbsd.org/tech-kern/2003/08/11/0001.html
http://www.cellperformance.com/mike_acton/2006/06/understanding_strict_aliasi...
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Optimize-Options.html#index-fstri...

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

У меня пример заработал как у gena2x.

$ uname -a Linux ... 2.6.18-4-686 #1 SMP Wed May 9 23:03:12 UTC 2007 i686 GNU/Linux $ gcc --version gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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

>тебе персональную шестую звезду <strike>в жопу чтоб светила ярче</strike>за количество бессмысленных комментов. первый раз вижу мудака с *****/ лор сговняли совсем. тьфу. быдлушник.

Погоди с обвинениями, тут один такой клоун. Сгниёт == уберут.

Дай посмеяться ;-)

anonymous
()
Ответ на: комментарий от php-coder

>Где взять шелл на NetBSD/sparc64?! :-))

у ксюши в писе или у палины в попе

но ни та ни та тебе теперь не дадут

весь инет насмешил бугога :-D

ходят слухи ты гей=кодер

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

>не))) -- первая замуж вышла, а вторая__прочухает__как он хуй достанет)))

да :-)) первая или вторая бабы пыха писали в инете шо типа он не моецца. Фши, глисты, гавно выстригает ножницами. Сейчас поисчу где это было. Или ну его нах. Итак нафлудили. :-)) Что там со статьёй у нас?

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

Мужики харе флудить. Про php_codera все итак знают. Не будем о мудаках. В LJ его уже никто не читает, заебало. Так не гадьте дополнительно, итак хватает и все вынуждены его бред здесь читать. -- Кого веселит а кого раздражает, но все культурно молчат. Имхо, нет смысла. Так что не будем гадить дополнительно;-)

anonymous
()
Ответ на: комментарий от php-coder

Где твоё рыло, там дохера флуда. Уебон.

anonymous
()
Ответ на: комментарий от gena2x

>Не это я хотел сказать. Я хотел сказать, что в некоторых услових компилятор при оптимизации считает, что есть вы записали что-то в *a, где a - int*, то short b при этом не меняется.

ну я так и написал "оптимизация компилятора", ну а про то, что у меня не как у всех людей, то "Linux ...__SMP__...." может это оно?

у Pkun'а тоже ядрышко SMP.

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

> если есть требование переносимости, то асм/С/С++ использовать не стоит и Java придумали не зря.

у меня программы написанные на Qt4 (c++) работают в win и линуксе. ЧЯДНТ

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

>> Цитата из статьи: "В наши дни все пишут под Linux и всё работает на машинах с архитектурой i386."

> Реально не знал. :)

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

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

подумал я именно то -- посмотри на скольких платформах работает qt4 (не только x86) и на что я отвечаю

vadiml ★★★★★
()

"...При использовании оптимизации компилятор ``не заметил'', что значение *l изменилось. Если же строку ``*i = 11;'' заменить на ``*(long *)i = 11;'', то компилятор сделает предположение, что могли измениться все значения по указателям, имеющим тип long * (тип к которому приводили), и соответственно при использовании *l будет получено уже новое значение (``2.v=11'')."

а если указатели объявить restricted:

void f(int * __restrict i, long * __restrict l) {

то компилятор решит ничего не предполагать и будет оставаться в заблуждении в любом случае ;).

http://www.ddj.com/cpp/184401313

http://www.lysator.liu.se/c/restrict.html

filin ★★
()

спасибо за перевод, про свистопляску с приведением указателей при вводе-выводе не знал

filin ★★
()

Дочитал до первого бреда - дальше не стал.

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