LINUX.ORG.RU

Вышла очередная референсная реализация компиляторов языков D1 и D2

 ,


1

3

10 июля стала доступна для загрузки очередная референсная реализация компиляторов языков D1 и D2. Как повелось с предыдущего выпуска, готовы пакеты для Ubuntu, Fedora, и openSUSE, как 32-х, так и 64-хбитные.

Некоторые нововведения:

  • введены атрибуты @safe, @property, сделан автоматический интерфейс для @safe, pure, nothrow;
  • В inline assembler добавлена поддержка инструкций SSSE3;
  • добавлены новые предупреждения о свойствах, подлежащих удалению, часть свойств объявлены удалёнными;
  • расширены ядро языка и стандартная библиотека, в частности, добавлены core.sys.posix.netdb, td.array.uninitializedArray, std.array.minimallyInitializedArray;
  • часть функций, в первую очередь в модулях std.string и std.uni, была переименована для соответствия с разработанными правилами именования, старые названия частично сохранены для совместимости, но будут удалены из последующих версий;
  • добавлена возможность использовать логические переменные в качестве ключей в ассоциативных массивах, ранее с этою целью можно было использовать только целые числа и строки.

Авторы также рапортуют об устранении 127 ошибок различной природы.

Подробный список изменений можно посмотреть на официальном сайте.

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

★★★★★

Проверено: Shaman007 ()
Последнее исправление: adriano32 (всего исправлений: 1)

Александреску признался http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&art... что не смог осились навороченные коллекции из скалы и сделать в D аналогичные.блин, но я их осилить тоже не могу. получается у меня вместе с александреску нет способностей к программизъму?

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

>Здраво же рассуждая, использовать ЛЮБЫЕ Сипиписные «таймбомбы» - это заранее срать в проект. Ди предназначен ДЛЯ ЗАМЕНЫ, а не интеграции. С++ - это слабое звено, на котором порвётся вся программа.

Что-то вам срр совсем не нравится :), не надо делать вид что смена языка поможет не делать ошибок :). «Таймбомбы» вы отлично и на Д напрогаете :)

anonymous
()

Кто хочет ебилдов для Генты? d-overlay @ assembla.org не обновлялся уже примерно год, если их просто скопировать под новым номером версии в локальный оверлей, то вылазят проблемы при сборке... так что я написал свои. Скопируйте в свой локальный оверлей в нужное место. USE-флаги: bits32 bits64 — если не установлены, автодетектятся (но можно задать вручную), prebuild — не собирать из исходников, брать уже собранное из zip-архива

MYOVERLAY=/usr/local/portage ; mkdir -p $MYOVERLAY/{dev-lang/dmd,dev-libs/phobos,app-admin/eselect-dmd,dev-lang/ldc} ; cat > $MYOVERLAY/dev-lang/dmd-2.054.ebuild << EOF

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

DESCRIPTION="Reference compiler for the D programming language"
HOMEPAGE="http://www.digitalmars.com/d/"
SRC_URI="http://ftp.digitalmars.com/${PN}.${PV}.zip"

LICENSE="DMD"
SLOT="2"
KEYWORDS="~x86 ~amd64"
IUSE="bits32 bits64 prebuild"
EAPI="2"

RESTRICT="mirror"

DEPEND="sys-apps/findutils
	!dev-lang/dmd-bin:2
	app-arch/unzip"
RDEPEND="dev-util/dmd-common
	amd64? ( app-emulation/emul-linux-x86-compat )"
PDEPEND="app-admin/eselect-dmd
	=dev-libs/phobos-${PV}"

S="${WORKDIR}/${PN}2/src"
		
		
BITNESS=0

pkg_setup() {
		BITNESS=0
		use bits32 && ! use bits64 && BITNESS=32
		use bits64 && ! use bits32 && BITNESS=64

		if [[ ${BITNESS} == 0 ]]; then
			if use amd64; then
				BITNESS=64
				ewarn "USE amd64 is set, guessing 64 bits..."
			elif use x86; then
				BITNESS=32
				ewarn "Guessing your system is lame 32 bits..."
			else
				die "USE flag bits32 or bits64 should be set, only one of them."
			fi
		fi
		
		if use prebuild; then
			ewarn "USE prebuild: using prebuild dmd from linux/bin${BITNESS}, ${BITNESS} bits... "
		else
			ewarn "Will compile dmd from sources for  ${BITNESS} bits... "
		fi
}


src_unpack() {
	unpack $A
	cd dmd2
#	rm -rf html osx linux windows samples README.TXT license.txt
	rm -rf html osx windows samples README.TXT license.txt
	cd src/dmd
}

src_compile() {
# DMD
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	if use prebuild; then
		## use prebuild dmd from ziparchive at
		# linux/{bin${BITNESS},lib${BITNESS}}


		DMD_PATH=${S}/../linux/bin${BITNESS}
		PHOBOS_PATH=${S}/../linux/lib${BITNESS}
		## NOTE: PHOBOS is build from dev-libs/phobos:2
	else
		## force compilation dmd from source, ${BITNESS} bits
		cd "${S}/dmd"
		ln -s . mars						 ## v2 -- whether it needed at all?
		make -f posix.mak   MODEL=${BITNESS}                         ## v2 -- dunno why needs this at all
		make -f linux.mak   MODEL=-m${BITNESS} || die "make failed"  ## v2
		# make -f linux.mak MODEL=${BITNESS}   || die "make failed"  ## v1 -- warn for inconsistency
		DMD_PATH="${S}/dmd"
	fi

	# druntime
	cd "${S}/druntime/"
	(
		ewarn "Compiling druntime..."
		PATH=${DMD_PATH}:$PATH make -f posix.mak MODEL=${BITNESS}
	)
}

src_install() {
# Compiler
	newbin "${DMD_PATH}/dmd" dmd2.bin || die "Install failed"

	## trying to  guess proper dmd.conf
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	newbin "$DMD_CONF" dmd2-dmd.conf || eqawarn "dmd.conf from $DMD_CONF is not found :("

### NOTE: /usr/bin/dmd.conf is symlink to dmd2-dmd.conf, managed by eselect-dmd
######### /usr/bin/dmd      is symlink to dmd2.bin,      managed by eselect-dmd
#######################  

### prebuild libs
### See also: ${S}/dmd2/../linux/{bin64,lib64}/
###            bin64: dmd, dmd.conf
###            lib64: libphobos2.a


# druntime
	dolib.a "${S}/druntime/lib/libdruntime.a" || die "Install failed"
	dodir /usr/include/druntime
	mv "${S}/druntime/import"/* "${D}/usr/include/druntime/"


#libphobos
##	
	eqawarn "Now you should install =dev-libs/phobos-${PV} "

}
EOF

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

cat > $MYOVERLAY/dev-lang/dmd-1.069.ebuild << EOF

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

DESCRIPTION="Reference compiler for the D programming language"
HOMEPAGE="http://www.digitalmars.com/d/"
SRC_URI="http://ftp.digitalmars.com/${PN}.${PV}.zip"

LICENSE="DMD"
SLOT="1"
KEYWORDS="~x86 ~amd64"
IUSE="bits32 bits64 prebuild"
EAPI="2"

RESTRICT="mirror"

DEPEND="sys-apps/findutils
	!dev-lang/dmd-bin:1
	app-arch/unzip"
RDEPEND="dev-util/dmd-common
	amd64? ( app-emulation/emul-linux-x86-compat )"
PDEPEND="app-admin/eselect-dmd
	|| ( dev-libs/tango =dev-libs/phobos-${PV} )"

#S="${WORKDIR}/${PN}/src/dmd"
S="${WORKDIR}/${PN}/src"

BITNESS=0

pkg_setup() {
		BITNESS=0
		use bits32 && ! use bits64 && BITNESS=32
		use bits64 && ! use bits32 && BITNESS=64

		if [[ ${BITNESS} == 0 ]]; then
			if use amd64; then
				BITNESS=64
				ewarn "USE amd64 is set, guessing 64 bits..."
			elif use x86; then
				BITNESS=32
				ewarn "Guessing your system is lame 32 bits..."
			else
				die "USE flag bits32 or bits64 should be set, only one of them."
			fi
		fi
		
		if use prebuild; then
			ewarn "USE prebuild: using prebuild dmd from linux/bin${BITNESS}, ${BITNESS} bits... "
		else
			ewarn "Will compile dmd from sources for  ${BITNESS} bits... "
		fi
}

src_unpack() {
	unpack $A
	cd dmd
#	rm -rf html osx windows linux samples README.TXT license.txt
	rm -rf html osx windows 	  samples README.TXT license.txt
	cd src/dmd
	ln -s . mars
}

src_compile() {
# DMD
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	if use prebuild; then
		## use prebuild dmd from ziparchive at
		# linux/{bin${BITNESS},lib${BITNESS}}

		DMD_PATH=${S}/../linux/bin${BITNESS}
		PHOBOS_PATH=${S}/../linux/lib${BITNESS}
		## NOTE: PHOBOS is build from dev-libs/phobos:2
	else
		## force compilation dmd from source, ${BITNESS} bits
		cd "${S}/dmd"
		# ln -s . mars
		# make -f posix.mak MODEL=${BITNESS}                           ## v1 -- no posix.mak in dmd v1 sources 
		# make -f linux.mak   MODEL=-m${BITNESS} || die "make failed"  ## v2
		make -f linux.mak MODEL=${BITNESS}   || die "make failed"      ## v1 -- warn for inconsistency
		DMD_PATH="${S}/dmd"
	fi
}


src_install() {
## same as  dmd-2.054.ebuild, just dmd1 instead of dmd2


# Compiler
	newbin "${DMD_PATH}/dmd" dmd1.bin || die "Install failed"

	## trying to  guess proper dmd.conf
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	newbin "$DMD_CONF" dmd1-dmd.conf || eqawarn "dmd.conf from $DMD_CONF is not found :("

### NOTE: /usr/bin/dmd.conf is symlink to dmd1-dmd.conf, managed by eselect-dmd
######### /usr/bin/dmd      is symlink to dmd1.bin,      managed by eselect-dmd
#######################  

### prebuild libs
### See also: ${S}/dmd/../linux/{bin64,lib64}/
###            bin64: dmd, dmd.conf
###            lib64: libphobos.a


# druntime -- no druntime for dmd v1


#libphobos
##	
	eqawarn "Now you should install =dev-libs/phobos-${PV} "

}

## turn off old crap from old ebuild. use as in dmd-2.054.ebuild from above instead


src_install_oldJUNK() {
	# Generate config file
	cat > dmd.conf << HERE

[Environment]

# Currently, flags are passed directly by dmd.dmdx family scripts in /usr/bin
# DFLAGS=-I/usr/include/phobos1 -L-L/lib
HERE

	insinto /etc
	doins dmd.conf

	newbin "${S}/dmd" dmd1.bin || die "Install failed"
}

EOF

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

cat > $MYOVERLAY/app-admin/eselect-dmd/eselect-dmd-20111307.ebuild << EOF

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

DESCRIPTION="Manages configuration for DMD versions and libraries"
HOMEPAGE="http://www.assembla.com/wiki/show/d-overlay"
SRC_URI=""

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 arm hppa ppc ppc64 sparc x86"
IUSE=""

RDEPEND=">=app-admin/eselect-1.0.2"

src_install() {
	insinto /usr/share/eselect/modules
	newins "${FILESDIR}/dmd.eselect-${PVR}" dmd.eselect || die
}
EOF

mkdir -p $MYOVERLAY/app-admin/eselect-dmd/files cat > $MYOVERLAY/app-admin/eselect-dmd/files/dmd.eselect-20111307 << EOF

# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: $

DESCRIPTION="DMD version and library configuration"
MAINTAINER="cy@ngs.ru"
## 20111307 hacked by tweak
SVN_DATE='$Date: $'
VERSION=$(svn_date_to_version "${SVN_DATE}" )

find_targets() {
	ls -1 ${ROOT}/usr/bin/dmd.dmd* | sed 's/.*\.//'
}

find_target() {
	target=${1}
	if is_number "${target}" ; then
		targets=( $(find_targets ) )
		target=${targets[$(( ${target} - 1 ))]}
	fi
	echo -n ${target}
}

check_script() {
	target=$(find_target ${1})
	if ! [[ -e ${ROOT}/usr/bin/dmd.${target} ]] ; then
		die -q "This doesn't seem to be a correct configuration"
	fi
}

remove_script() {
	rm ${ROOT}/usr/bin/dmd 2> /dev/null
	##
	rm ${ROOT}/etc/dmd.conf 2> /dev/null
	 
}

set_script() {
	target=$(find_target ${1})
	
	fla=${target:0:4}

#	echo "target=$target, fla=${fla}"
	ln -s "${ROOT}/usr/bin/dmd.${target}" "${ROOT}/usr/bin/dmd"
	rm -f "${ROOT}/usr/bin/dmd.conf.${target}"
	ln -s "${ROOT}/usr/bin/${fla}-dmd.conf" "${ROOT}/usr/bin/dmd.conf.${target}" 
	rm -f "${ROOT}/etc/dmd.conf"
	ln -s "${ROOT}/usr/bin/dmd.conf.${target}" "${ROOT}/etc/dmd.conf"
	# or skip empty /etc/dmd.conf such as
	#
#cat > /etc/dmd.conf.XXX << EOF  
#[Environment]
#
# Currently, flags are passed directly by dmd.dmdx family scripts in /usr/bin
# DFLAGS=-I/usr/include/phobos1 -L-L/lib
#EOF

}
### list action

## {{{ 
describe_list() {
	echo "List available configurations"
}

do_list() {
	targets=( $(find_targets ) )
	write_list_start "Available configurations:"
	if [[ -n ${targets[@]} ]] ; then
		local i
		write_numbered_list "${targets[@]}"
	else
		write_kv_list_entry "(none found)" ""
	fi
}

### set action

describe_set() {
	echo "Set a new configuration"
}

describe_set_parameters() {
	echo "<configuration>"
}

describe_set_options() {
	echo "configuration : library-compiler pair number"
}

do_set() {
	if [[ -z ${1} ]] ; then
		# no parameter
		die -q "You didn't tell me what configuration I need to set"
	fi

	check_script "${1}"

	remove_script

	if ! set_script "${1}" ; then
		die -q "Couldn't set a run script"
	fi

}

### show action

describe_show() {
	echo "Show current configuration"
}

do_show() {
	target=$(readlink ${ROOT}/usr/bin/dmd | sed 's/.*\.//' )
	write_list_start "Current configuration:"
	write_kv_list_entry "$target" ""
}

## }}}

# vim: ts=4 sw=4 noet fdm=marker
EOF

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

cat > $MYOVERLAY/dev-libs/phobos-2.054.ebuild << EOF


# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

EAPI="2"

DESCRIPTION="The Phobos standard library for DMD"
HOMEPAGE="http://www.digitalmars.com/d/"
SRC_URI="http://ftp.digitalmars.com/dmd.${PV}.zip"

LICENSE="DMD"
RESTRICT="mirror strip binchecks"
SLOT="2"
KEYWORDS="~x86 ~amd64"
IUSE="bits32 bits64 prebuild"
EAPI="2"

DEPEND="=dev-lang/dmd-${PV}"
RDEPEND="${DEPEND}"

S="${WORKDIR}/dmd2/src"

BITNESS=0

pkg_setup() {
		BITNESS=0
		use bits32 && ! use bits64 && BITNESS=32
		use bits64 && ! use bits32 && BITNESS=64

		if [[ ${BITNESS} == 0 ]]; then
			if use amd64; then
				BITNESS=64
				ewarn "USE amd64 is set, guessing 64 bits..."
			elif use x86; then
				BITNESS=32
				ewarn "Guessing your system is lame 32 bits..."
			else
				die "USE flag bits32 or bits64 should be set, only one of them."
			fi
		fi
		
		if use prebuild; then
			ewarn "USE prebuild: using prebuild phobos from linux/lib${BITNESS}, ${BITNESS} bits... "
		else
			ewarn "Will compile phobos from sources for  ${BITNESS} bits... "
		fi
}

src_unpack() {
	unpack $A
	cd dmd2
#	rm -rf html osx linux windows samples README.TXT license.txt
	rm -rf html osx windows samples README.TXT license.txt
}

src_compile_orig() {
# DMD
	cd "${S}/dmd"
	ln -s . mars
	make -f linux.mak || die "DMD compilation failed"
# druntime
	cd "${S}/druntime/"
	(
		export PATH="${S}/dmd:${PATH}"
		export HOME="$(pwd)"
		make -f posix.mak
		cp ../lib/libdruntime.a ..
	)
# Phobos
	mkdir -p "${WORKDIR}/dmd/src/lib"
	cd "${S}/phobos"
	echo '#!/bin/sh' > dmd
	echo '/usr/bin/dmd2.bin -I/usr/include/druntime $*' >> dmd
	chmod u+x dmd
	export PATH=.:$PATH
	make -f linux.mak || die "Phobos compilation failed"
# clean up
	find . -name "*.asm" -print0 | xargs -0 rm -v
	find . -name "*.mak" -print0 | xargs -0 rm -v
	find . -name "*.txt" -print0 | xargs -0 rm -v
	find . -name "*.ddoc" -print0 | xargs -0 rm -v
	find . -name "*.c" -print0 | xargs -0 rm -v
}

anonymous
()
Ответ на: комментарий от anonymous
src_compile() {
# DMD
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	if use prebuild; then
		## use prebuild dmd from ziparchive at
		# linux/{bin${BITNESS},lib${BITNESS}}

		DMD_PATH=${S}/../linux/bin${BITNESS}
		PHOBOS_PATH=${S}/../linux/lib${BITNESS}
		## NOTE: PHOBOS is build  in this ebuild
	else
		## force compilation dmd and phobos from source, ${BITNESS} bits
		##  we could cheat a bit -- build phobos with previous dmd2,
		## i.e. /usr/bin/dmd2.bin, but please don't  mess versions dmd2/phobos2

		## i.e.: phobos-2.054 won't build with dmd-2.053

		cd "${S}/dmd"
#		ln -s . mars						 ## v2 -- whether it needed at all?
		make -f posix.mak   MODEL=${BITNESS}                         ## v2 -- dunno why needs this at all
		make -f linux.mak   MODEL=${BITNESS} || die "DMD compilation failed"  ## v2
		# make -f linux.mak   MODEL=${BITNESS} || die "DMD compilation failed"  ## v1
		DMD_PATH="${S}/dmd"

		# druntime
		cd "${S}/druntime/"
		(
			ewarn "Compiling druntime..."
			PATH=${DMD_PATH}:$PATH make -f posix.mak MODEL=${BITNESS}
			#cp ../lib/libdruntime.a ..
			cp ./lib/libdruntime.a ..
		)

		# Phobos

		cd "${S}/phobos/"
		ewarn  "Compiling phobos..."
		(
			PATH=${DMD_PATH}:$PATH make -f posix.mak MODEL=${BITNESS} || die  " Phobos compilation failed"
		# clean up
			find ${S}/phobos -name "*.asm" -print0 | xargs -0 rm -v
			find ${S}/phobos -name "*.mak" -print0 | xargs -0 rm -v
			find ${S}/phobos -name "*.txt" -print0 | xargs -0 rm -v
			find ${S}/phobos -name "*.ddoc" -print0 | xargs -0 rm -v

			## hey, leave ddoc please? use doc maybe
			find ${S}/phobos -name "*.c" -print0 | xargs -0 rm -v
		)
		PHOBOS_PATH="${WORKDIR}/dmd2/src/phobos/generated/linux/release/${BITNESS}"
	fi

}

src_install() {
# lib
	dolib.a  ${PHOBOS_PATH}/libphobos2.a || die "Install libphobos2.a failed"
	#dolib.a "${WORKDIR}/dmd2/src/phobos/generated/posix/release/${BITNESS}/libphobos2.a" || die "Install libphobos2.a failed"

# includes
	rm -rf "${S}/phobos/generated"
	dodir /usr/include/phobos2
	mv "${S}/phobos"/* "${D}/usr/include/phobos2/"

# Config
	dobin "${FILESDIR}/dmd.dmd2-phobos"
}

EOF

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

cat > $MYOVERLAY/dev-libs/phobos/phobos-1.069.ebuild << EOF


# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils

EAPI="2"

DESCRIPTION="The Phobos standard library for DMD"
HOMEPAGE="http://www.digitalmars.com/d/"
SRC_URI="http://ftp.digitalmars.com/dmd.${PV}.zip"

LICENSE="DMD"
RESTRICT="mirror strip"
SLOT="1"
KEYWORDS="~x86 ~amd64"
IUSE="bits32 bits64 prebuild"

#S="${WORKDIR}"
S="${WORKDIR}/dmd/src"

DEPEND="=dev-lang/dmd-${PV}"
RDEPEND="${DEPEND}"

BITNESS=0

pkg_setup() {
		BITNESS=0
		use bits32 && ! use bits64 && BITNESS=32
		use bits64 && ! use bits32 && BITNESS=64

		if [[ ${BITNESS} == 0 ]]; then
			if use amd64; then
				BITNESS=64
				ewarn "USE amd64 is set, guessing 64 bits..."
			elif use x86; then
				BITNESS=32
				ewarn "Guessing your system is lame 32 bits..."
			else
				die "USE flag bits32 or bits64 should be set, only one of them."
			fi
		fi
		
		if use prebuild; then
			ewarn "USE prebuild: using prebuild dmd from linux/bin${BITNESS}, ${BITNESS} bits... "
		else
			ewarn "Will compile phobos from sources for  ${BITNESS} bits... "
		fi
}

src_unpack() {
	unpack $A
}

src_compile() {
# DMD
	DMD_CONF=${S}/../linux/bin${BITNESS}/dmd.conf
	if use prebuild; then
		## use prebuild dmd and phobos from ziparchive at
		# linux/{bin${BITNESS},lib${BITNESS}}

		DMD_PATH=${S}/../linux/bin${BITNESS}
		PHOBOS_PATH=${S}/../linux/lib${BITNESS}
		## NOTE: PHOBOS is build from this ebuild 
		mkdir -p  "${S}/dmd/linux/lib"
		cp ${PHOBOS_PATH}/libphobos.a "${S}/dmd/linux/lib"

	else
		## force compilation dmd from source, ${BITNESS} bits
		cd "${S}/dmd"
		ewarn "Compiling dmd ..."
		# ln -s . mars
		# make -f posix.mak MODEL=${BITNESS}                           ## v1 -- no posix.mak in dmd v1 sources 
		# make -f linux.mak   MODEL=-m${BITNESS} || die "make failed"  ## v2
		make -f linux.mak MODEL=${BITNESS}   || die "DMD make mailed"      ## v1 -- warn for inconsistency
		DMD_PATH="${S}/dmd"

		##force compilation phobos from source
		cd "${S}/phobos/"
		ewarn "Compiling phobos..."
		(
			PATH=${DMD_PATH}:$PATH make -flinux.mak MODEL=${BITNESS}
			PHOBOS_PATH="${S}/phobos/lib${BITNESS}"
			mkdir -p  "${S}/dmd/linux/lib"
			cp ${PHOBOS_PATH}/libphobos.a "${S}/dmd/linux/lib"
		
			# Clean up
			make -flinux.mak MODEL=${BITNESS} clean
			cd "${S}/dmd"
			find . -name "*.mak" -print0 | xargs -0 rm -v
			find . -name "*.c" -print0 | xargs -0 rm -v
			find . -name "*.h" -print0 | xargs -0 rm -v
			find . -name "*.txt" -print0 | xargs -0 rm -v
			find . -name "*.obj" -print0 | xargs -0 rm -v
			find . -name "*.ddoc" -print0 | xargs -0 rm -v
			find . -name "*.asm" -print0 | xargs -0 rm -v

		)
	fi
}
src_install() {
	# Includes
	mkdir -p  "${D}/usr/include/phobos1"
	dodir usr/include/phobos1
	mv ${S}/phobos/* "${D}/usr/include/phobos1/" || die "install failed"

	# Lib
	dolib.a dmd/linux/lib/libphobos.a

	dobin "${FILESDIR}/dmd.dmd1-phobos"
}
EOF

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

cat > $MYOVERLAY/dev-lang/ldc/ldc-9999.ebuild << EOF



# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit cmake-utils mercurial

DESCRIPTION="LLVM D Compiler"
HOMEPAGE="http://www.dsource.org/projects/ldc"

LICENSE="BSD"
SLOT="0"
KEYWORDS="~x86 ~amd64 ~ppc ~sparc"
IUSE=""
EAPI="2"

RDEPEND=">=sys-devel/llvm-2.6
		|| ( dev-libs/libelf dev-libs/elfutils )"
DEPEND=">=dev-util/cmake-2.6-r1
		dev-libs/libconfig
		${RDEPEND}"
PDEPEND="dev-libs/tango[ldc]"

S=${WORKDIR}/ldc

src_unpack() {
#	mercurial_fetch http://hg.dsource.org/projects/ldc ldc
##	mercurial_fetch http://bitbucket.org/lindquist/ldc ldc
	mercurial_fetch https://bitbucket.org/lindquist/ldc ldc
}

src_compile() {
	if ! [ "${LLVM_REV}" ]; then
		source /etc/env.d/*llvm*
	fi
	cmake -D CMAKE_CXX_FLAGS:STRING="-DLLVM_REV=999999" -D CMAKE_INSTALL_PREFIX="${D}usr" ./ || die "cmake failed"
	emake || die "make failed"
}


src_install() {
	# Compiler binary
	dobin bin/ldc
	dobin bin/ldmd

	# Generate config file
	cat > ldc.conf << HERE
// See http://www.hyperrealm.com/libconfig/ for syntax details.

// Special macros:                                                                                                        
// %%ldcbinarydir%%
//  - is replaced with the path to the directory holding the ldc executable

// The default group is required
default:
{
    // 'switches' holds array of string that are appends to the command line
    // arguments before they are parsed.
    switches = [ 
        "-I${ROOT}usr/include/tango",
        "-I${ROOT}usr/include/tango/tango/core/rt/compiler/ldc",
        "-L-L${ROOT}lib",
        "-d-version=Tango",
        "-defaultlib=tango-ldc",
        "-debuglib=tango-ldc"
    ];  
};
HERE

	insinto /etc
	doins ldc.conf
}
EOF

Этот ебилд может сработать, если sys-devel/llvm нормально собирается. В моём случае нужно было прописывать -ldl, собирал отдельно по фазам, смотрел, что не работает, вылазила на последнем этапе ошибка линковки. Пришлось лезть в link.txt, сгененированный cmake, смотреть строчку компиляции финального ldc и руками туда прописывать -ldl, рестартовать сборку по фазам через ebuild ldc-9999.ebuild compile install qmerge . Этот патч можно делать автоматизированно в ебилде, хотя лучше проследить, чтобы sys-devel/llvm правильно собирался — тогда ничего патчить не придётся, и -ldl будет уже в llvm.

Ещё, по аналогии с этим ебилдом (это с d-overlay с исправленным URL bitbucket ) можно сделать ldc2. ldc2 лежит там же на bitbucket рядом, поищите поиском.

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

TODO:
1. отладить dev-lang/ldc-9999.ebuild
2. написать dev-lang/ldc2-9999.ebuild по аналогии
3. написать dev-lang/gdc-9999.ebuild по аналогии, репозиторий на bitbucket проект goshawk
4. вычистить из dev-lang/{dmd,phobos} закомментированное и старое (*_orig)
5. написать dev-libs/tango-9999.ebuild. То ли paludis глючит, то ли svn+http://svn.dsource.org/projects/tango/trunk — там вроде старая версия лежит, не обновляется. См. для примера из d-overlay

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

Для оффтопика на гитхабе есть портированные примеры из книжки Ч. Петцольда «Программирование под Windows», http://dblog.aldacron.net/2011/06/21/petzold-ported/ — портировано с C на D.

С C++ библиотеками, например, Qt ситуация немного грустная — вроде бы есть QtD и даже работает, но вот то, что оно реализовано через QtJambi, примерно как Qt для Java... на 15 М С++ либ примерно 15М D биндингов через обёртки C++-to-C, C-to-D и наоборот, D-to-C, C-to-C++. Грустно всё это.

Можно было бы реализовать это всё по-другому. Например, слинковать C++ и D рантайм в одном конечном бинарнике, и добавить в эту солянку C рантайм, который будет их инициализировать/освобождать ресурсы в нужном порядке. Чтобы реализовать в D нечто вроде extern(C++) по аналогии с тем, как реализовано в D extern(C). А все конвертации и обёртки засунуть в CTFE функции на D, чтобы они по-максимуму выполнялись не в рантайме+задача врапперов в маршалинге C++ и D значений, а во время компиляции, через СTFE (+ задача врапперов в синхронизации констант, подставленных через CTFE в рантаймы разных языков, то есть, минимизация всякого маршалинга между рантаймами через CTFE макросы).

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

> Я тут just for fun пилю компилятор диалекта Lisp на D, и сканер (лексический анализатор) выдаёт скорость порядка 13 Мб/с, в то время как сишная версия - 23 Мб/c, притом что сишную я писал раза в четыре дольше, постоянно матерясь и изобретая велосипеды, уже встроенные в D. Ну, и объём кода сканера: D - 410 строка, C - 595 строк.

ссылку, сестра, ссылку??? исходники проекта откроешь?

А то был года 2-4 назад компилятор схемы, scheme4d писался человеком из команды А. Столярова на основе идей IntelLib C++ ( ЛИСП через С++ макросы, со схемой и D даже проще получалось). Рабочий, только недопиленный — похоже автор курсовую написал, сдал и забросил.

Кстати, из лиспов проще реализовать не Common Lisp, а ISLISP, ISO Lisp : http://www.islisp.org — спека куда как проще, и сам диалект проще для встраивания.

А парсер какой, ручной recursive descent parser? Полезно было бы допилить ANTLR генератор на базе Явовсковго target StringTemplate, в этом смысле D и Java схожи или PEG-парсер, запихнув парсер в CTFE ( или даже, написать клон OMeta как IronMeta/ C#Meta , только на D) — парсер значительно проще и наглядней, правда скоростью не очень блещет, но это приемлемый tradeoff.

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

> да, просто почему-то считал, что конвертация C -> D будет совсем тривиальной и автоматической, хотя наверное она таковой и может быть, просто не докрутили еще

ну не совсем. Примерно как с C -> C++. См в newsgroup или на гитхабе заметки человека, портировавшего примеры из книжки Ч. Петцольда с C на D.

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

> Вопрос: У меня есть so с классом, написан на с++. Как мне его использовать из Д?

Ответ: Никак.


Ответ неверный. Наводящие
вопрос1: «как мне использовать С++ класс из C»?
вопрос2: «что находится в C runtime library и C++ runtime library и выполняется _ДО И ПОСЛЕ_ вызова main() (например, инициализация конструкторов/вызов деструкторов)»
вопрос3:" как использовать, например, С из например, Ocaml и наоборот, Ocaml из C"?
вопрос4: вопрос3 + заменяем С на С++, вопросы совместимости С++/С, callin/callout интерфейс.
вопрос5: реализация ООП на vtable и реализация других объектных систем, например GObject/Vala или Objective-c
вопрос6: бинарное ABI C/C++, манглинг, одна программа — несколько рантаймов.

Ответ1: нужно проинициализировать С++ рантайм и вызывать нужный манглированный символ С++ как символ С.

Дальнейшие ответы — сам догадайся.

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

> Не думаю, что Джаба вообще уместна в контексте языка Ди.

Уместна-уместна. D немного ближе к Java, чем к С++, например, реализация множественного наследования (на это наткнулись в QtD, когда портировали, в итоге решили не изобретать велосипед и взять QtJambi).
Например, проект DWT, D widget Toolkit — портированный SWT из Java. Начался с того, что Java-исходники переписывали на D1/tango, получился минимальный «типа-Java» рантайм, реализованный на D. В итоге, примеры на DWT выглядят точно так же, как примеры на SWT, код клиентский — идентичен с точностью до отличий в реализации DWT/SWT.
Так что большинство Java кода при таком рантайме заработает на D. Кстати, есть AOT компиляторы Java вроде Excelsior Jet, выдают результат, похожий на D, тоже гуи хелловорды на 15М (статически прилинкованная JVM).

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

> Поясняю: Язык Д1 - просто язык Д1, старая версия, обращать на неё внимание не надо. Основная работа ведётся по Д2.

ну, язык это не только язык, но и стд. библиотеки. Когда-то tango сильно выигрывала у фобоса по реализованной функциональности, см. те же вебсервера, разбор XML и т.п. Так что D1/phobos был игрушечной конфигурацией для хелловордов, D1/tango — основной рабочей, D2/phobos — новая надежда для концептуально верных хелловордов. D2/tango не работало, потому что нужно было из D2/phobos выделить минимальный рантайм.
Сейчас его выделили (druntime), и теоретически, можно пытаться портировать tango с D1/phobos на D{1,2}/druntime и собрать D2/tango.
Практически, народу мало, не знаю кто этим сейчас занимается, и что вообще сейчас происходит с развитием Tango.

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

> Алгол-60 разрабатывался и довольно долго существовал исключительно в виде спецификаций (БНФ).

ну какой-то из алголов (алгол-68 после выхода Вирта из комитета и выкидыша Algol/W?) существовал вообще в виде W-грамматик, и не был формализован, хотя парсер был и работал.
Спецификации не было, а парсер был и работал.

Возможно, АДА?
Также, BitC — но это очередной выкидышЪ.

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

и вызывать нужный манглированный символ С++ как символ С.

это уё.ный костыль, за который отправлять на урановые рудники.

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

> На кодогенератор силы тратят они, что сей генератор у них ДАВНО УЖЕ ЕСТЬ потому что. Читай «Дигиталмарс Си компилер».
Нет никаких глупых апломбов - это вы сами придумали врага и сами с ним отважно боретесь.

практичный компилятор, практичный подход. «Слепили из того что было», из готового С++ компилятора (который кстати, один из самых быстрых). Минусы, грабли и костыли такого подхода: завязка на свой линкер OPTLINK, он-то быстрый, но OMF формат и глюки, исходники OPTLINK недоступны, на ассемблере и потеряны, h3r3t1c и QtD плюются от глюков OPTLINK, и т.п.

ДМ просто пишет хороший компилер, остальные тюлени вяло кидаются огрызками.


Хороший — в смысле, быстро работает, и код не самый медленный. Но, вот возьми например gdc из goshawk (gcc 4.6 ) или ldc (llvm). Там 10500 оптимизаций, и в этом плане возможно они оптимизируют лучше. Luca, который пилит свой сборщик мусора, что-то там сравнивал, по качеству оптимизаций — на его бенчмарках выходило, что код, собранный ldc работал быстрее, чем собранный DMD.

Хотя, если ты про D2/Phobos, то тут выбора почти и нет, ldc2 на bitbucket в непонятно каком экспериментальном состоянии. Кстати, попробуй его собрать, и собрать им свой код на D2/Phobos, накатать какой-то бенчмарк и прогнать тесты, всё-таки в LLVM побольше оптимизаций будет. Интересно, насколько ldc2 сейчас сырой по сравнению с DMD2.

По-настоящему круто, ИМХО, будет, когда gdc/goshawk во-первых, портируют на последний актуальный GCC, а во-вторых, когда и если, они его перепишут в виде плагина GCC (примерно, как сделан dragonegg из clang/llvm: gcc -fplugin=.../dragonegg.so helloworld.cxx , только чтобы этот плагин работал с plain vanilla gcc без патчей. А то собирать весь gcc ради одного gdc каждый раз из HG как-то ломает, а вот кабы оно было плагином — совсем другое дело).

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

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

в стандартном D рантайме (object.di в Phobos или аналогичный в Tango) классы и объекты — сущности первого порядка с typeinfo. Можно вытащить typeinfo из класса, и подставить в mixin. Можно это сделать в CTFE, а можно сделать рефлексией в рантайме.

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

memcpy тоже можно использовать хитро, если знать как оно работает. надеюсь понимаешь о чём я.

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

> D understands how C++ function names are «mangled» and the correct C++ function call/return sequence. [/quote] только вот проблема в том, что name mangling is compiler business. Как компилятор Д узнает, какую схему использует компилятор с++? В общем случае это сделать нельзя, можно только предложить поддержку какого-то конкретного компилятора, или нескольких компиляторов.

и такая поддержка уже написана. Гугли demangle.d, demangle.c, патчи дебаггера gdb для поддержки D.

Короче, я вам про бинарную совместимость хочу сказать. Если у меня есть библиотека на с++, как я могу её использовать из Д? Никак. Мне надо делать сишный врапер к ней. Или же пользоватся костылями, что не есть хорошо.

cишный враппер приходится делать, потому что сишное ABI — стабильно и стандартизировано, а С++ ABI меняется с точностью до компилятора С++ и рантайма. Если его, рантайм и конпелятор, зафиксировать, то остаётся только слинковать 2 рантайма в 1 бинарник (или даже 3 рантайма, D, C++ и C-шный с main, который инициализирует/освобождает ресурсы для нужных рантаймов в нужном порядке.). Остаются вопросы : как вызвать из D кода С++ код? Ответ: D-to-C, C-to-C++. Первое есть в компиляторе, во втором делаем манглинг/деманглинг С++ символа во время CTFE, получаем нужный символ, вызываем его из Си, вызываем Си код из Ди, оптимизируем и сворачиваем константы и т.п. Конечно, остаются тонкие моменты с порядком инициализации конструкторов, исключений и т.п. частей рантайма.

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

>> И ФП в нем какое-то странное.

Ди ни разу не ФП, можете считать его «ООЯ с элементами ФП».


на тему «странного ФП в D» можно почитать бложик Bartosz Milewsky — там он про ФП, монады и функторы для С++ пишет. И объясняет, чем в этом смысле D лучше C++ (транзитивность константности и т.п.)

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

> Что-то не получается загуглить Tango для D2. Можно ссылочку?

А вот ХЗ, что там сейчас происходит с разработкой танго. Вроде бы druntime в фобосе уже выделили, ХЗ, переписали ли танго под него. Если переписали, теоретически может и заработает, практически пробовать надо.

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

> на dsource.org ОДИН живой проект

Большинство было брошено еще 6 лет назад. То ли на какой другой ресурс свинтили, то ли разочаровались в языке.


что-то делается на bitbucket: ldc, ldc2, gdc.
github, гуглокод — искать надо, что-то конкретное (библиотеки, хелловорды, примеры из книжек (Петцольд, NeHM OpenGL tutorial, игрушки) и т.п.).

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

> А вот размеры винтельного рынка это уже материи в которые я не лезу поскольку меня интересует поддержка x86, Sparc и ARM. И что в результате, один проект писать под x86 на D а потом все переписывать на плюсы поскольку под другие платформы это чудо не собирает? Вопрос риторический конечно.

gdc, ldc

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

Открою, когда допилю до минимально юзабельного состояния, а сейчас из-за бага в DMD/Phobos пилю потихоньку версию на C, чтобы скучно не было (на https://github.com/burjui/Micron). Когда с багом разберусь, сишную версию подзаброшу, а Dшную запилю в репу.

Парсер ручной, рекурсивный, но это вполне премлемо пока что - скорость приличная, объём кода смешной (~200 строк). Потом переделаю на bison или ANTLR, если это что-то даст (:

Вообще, я всю эту ерунду затеял ради микроконтроллеров, и сам «диалект» предполагаю оснастить статической типизацией с автовыведением типов (как auto в D) , ибо на 16 МГц кристалле каждый такт на счету, и динамика не к месту, так что от CL там будет самый минимум. По большому счёту, всё это ради няшных CL-макросов '(^_^)

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

>Можно это сделать в CTFE, а можно сделать рефлексией в рантайме.

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

Кстати, а в D2 есть линеаризация иерархии наследования как в Scala?

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

> Парсер ручной, рекурсивный, но это вполне премлемо пока что - скорость приличная, объём кода смешной (~200 строк).

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

кстати, в D можно активно пользоваться slice array, не копировать строки туда-сюда. Вот в Tango XML парсер так работает, довольно быстрый: http://dotnot.org/blog/archives/2008/03/12/why-is-dtango-so-fast-at-parsing-xml/



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

> Потом переделаю на bison или ANTLR, если это что-то даст (:

просто ANTLR target для D не пилили еще с ANTLR 2.7, а сейчас в ANTLR 3 оно на StringTemplate, и его довольно просто написать, можно за основу взять ANTLR Java или C# target :))

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

Теоретически самый быстрый — LALR парсер, например, GOLD parser builder http://www.devincook.com/goldparser/ (оно есть для D : http://www.semitwist.com/goldie/  — раньше «IDE» для тестирования грамматик было только под винду, сейчас можно пробовать GRMC http://www.semitwist.com/goldie/Tools/GRMC/ ).

Чем оно интересно в контексте D: парсинг на шаблонах CFTE , во время компиляции
http://www.semitwist.com/goldie/APIOver/StatVsDyn/ http://www.semitwist.com/goldie/SampleApps/CalculatorStatic/

а вообще интересно было бы что-то вроде OMeta изобразить: http://tinlizzie.org/ometa/ http://lambda-the-ultimate.org/node/2477

варианты для C#: OMeta# http://ometasharp.codeplex.com/ и IronMeta http://ironmeta.sourceforge.net/ ( C# 2.0, лямбды, LINQ?)

зачем это всё надо — лирика: http://news.ycombinator.com/item?id=846028 http://www.moserware.com/2008/04/towards-moores-law-software-part-3-of-3.html

http://www.moserware.com/2008/06/ometa-who-what-when-where-why.html http://www.moserware.com/2008/07/building-object-oriented-parasitic.html http://www.moserware.com/2008/08/meta-fizzbuzz.html http://jagregory.com/writings/getting-started-with-ometa/

но блин, это ж полный OVERKILL будет :))
хотя если уж на C# 2.0 с лямбдами поизвращались, то уж на D это всё можно запихнуть в CTFE шаблоны :))

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

> Вообще, я всю эту ерунду затеял ради микроконтроллеров, и сам «диалект» предполагаю оснастить статической типизацией с автовыведением типов (как auto в D) , ибо на 16 МГц кристалле каждый такт на счету, и динамика не к месту, так что от CL там будет самый минимум. По большому счёту, всё это ради няшных CL-макросов '(^_^)

глянь сюды: http://nakkaya.com/2011/06/29/ferret-an-experimental-clojure-compiler/ — компилятор лиспа в С++ для целевого arduino на Clojure. C++ простой, для микроконтроллеров (уже оксюморон, блин) :))

а чтоб сразу под микроконтроллеры на GDC не писать? какой mcu, GCC под него есть, кстати? http://wiki.osdev.org/GDC_Cross-Compiler http://www.digitalmars.com/d/archives/digitalmars/D/gdc_nokia_arm-_-gnueabi_4...
вот с phobos/druntime может быть засада :))

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

> D2/tango не работало, потому что нужно было из D2/phobos выделить минимальный рантайм.

Сейчас его выделили (druntime), и теоретически, можно пытаться портировать tango с D1/phobos на D{1,2}/druntime и собрать D2/tango.


FIX: для Tango + Phobos нужно пробовать Tangobos и экспериментальный форк tango для D2 git://supraverse.net/tango.git, но он вроде как полгода не обновлялся.
да что-то и само танго не очень часто обновляется, только фиксят сборку под новый dmd1.
неужели можно наконец закапывать?

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

Я ещё читаю про линеаризацию иерархии в Scala и пытаюсь осмыслить пример с миксинами, как это должно выглядеть в D, чтобы попроще (можно пример кода на С++ или Scala?), хотя быстрый ответ не гарантирую.

Миксины в D это особая уличная магия: миксины в обычном смысле http://en.wikipedia.org/wiki/Mixin template mixin http://www.digitalmars.com/d/2.0/template-mixin.html + шаблоны с подстановкой строк и широкое использование CTFE — string mixin http://www.digitalmars.com/d/2.0/mixin.html (макросы вроде #define, но могут вызывать любые функции времени компиляции http://www.digitalmars.com/d/2.0/function.html )

плюс есть traits http://www.digitalmars.com/d/2.0/traits.html http://www.digitalmars.com/d/2.0/phobos/std_traits.html плюс информация о типах
http://www.digitalmars.com/d/2.0/phobos/object.html
http://www.digitalmars.com/d/2.0/phobos/std_typetuple.html http://www.digitalmars.com/d/2.0/phobos/std_typecons.html http://www.digitalmars.com/d/2.0/expression.html#typeidexpression

плюс (или умножить на), вычисление CFTE в шаблонах во время компиляции.

пример кода: — можно смотреть те же goldie StaticLang, или библиотеку meta:
http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/mi... http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/ct... http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/un... http://www.dsource.org/projects/semitwist/browser/trunk/src/semitwist/util/re...

библиотека meta: http://www.dsource.org/projects/meta
примеры: http://www.dsource.org/projects/meta/browser/trunk/meta/Demangle.d — CTFE деманглер D символов (деманглер С++ символов для GCC на C где-то видел на сайте GCC).

пример с рефлексией и typeinfo
http://dsource.org/projects/dmocks/browser/reflect/reflect/RuntimeTraits.d
http://dsource.org/projects/dmocks/browser/reflect/reflect/typeinfoex.d

пример с RhinoMocks/IoC
http://www.dsource.org/projects/dmocks/wiki/DConstructor http://www.dsource.org/projects/dmocks

http://www.dsource.org/projects/dmocks/wiki/Examples

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

Да шаблон map из std.algorithm кривой код генерит. Я ещё пока не разобрался, это в шаблоне дело или в компиляторе, хотя больше похоже на последнее. Если кратко, то map пытается получить доступ к данным по адресу 0x1, а скармливаю я ему массив объектов самописного класса. Вот сижу, пытаюсь минимальный исходник с воспроизводимым багом вычленить, дабы замылить разрабам (или самому пофиксить).

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

Пожалуй даже мне самому стоит его пофиксить, иначе какой из меня писатель компиляторов? :D

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