Swift под Linux

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

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 17:35

Olej писал(а): Clang не находит GCC библиотеку libstdc++, но находит свою библиотеку libc++.
Это как-то, возможно, связано с множественными установками (gccgo, golang и мн.др.) и обновлениями системы (Mint 18.1 -> 18.3) ... возможно, с установками альтернатив...
Получается такая засада:
- в RPM-дистрибутиве Fedora всё с Clang замечательно, но не устанавливается Swift, потому что Apple подготовили его через задницу...
- в DEB-дистрибутиве Mint 18.3 Swift как исполняющая среда работает нормально, но компиляция не идёт из-за неполадок с Clang библиотек и путей

Чтобы не мудрить с поисками неисправности в Mint 18.3, ... :
1. устанавливаю чистую Mint 18.3, но в VirtualBox, см. Mint 18 и далее....
2. разворачиваю и выверяю там Clang и библиотеки...
3. разворачиваю там Swift...
4. тесты

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 19:16

Olej писал(а): 2. разворачиваю и выверяю там Clang и библиотеки...
Всё, что касается корректной установки Clang и всего ему требующегося, с проверкой работоспособности, подробно описано здесь: Clang.
Повторите всё то же самое - и будет вам счастье! :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 19:56

Olej писал(а):
Olej писал(а): 2. разворачиваю и выверяю там Clang и библиотеки...
Всё, что касается корректной установки Clang и всего ему требующегося, с проверкой работоспособности, подробно описано здесь: Clang.
Повторите всё то же самое - и будет вам счастье! :lol:
Переходим к 3-му пункту марлезонского балета ;-)
Olej писал(а): 3. разворачиваю там Swift...
Можно ли это сделать в RPM-дистрибутиве и как ... я теперь уже не знаю (пока не знаю?).
А в DEB-дистрибутиве начинаем с уточнения версии дистрибутива:

Код: Выделить всё

olej@olej-VirtualBox ~/2018_WORK $ uname -a
Linux olej-VirtualBox 4.10.0-38-generic #42~16.04.1-Ubuntu SMP Tue Oct 10 16:32:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Интерес здесь представляет 16.04.1 - это кодовая база, хотя это и не Ubuntu.
Скачиваем соответствующий архив:
Releases
Swift 4.0.3
Ubuntu 16.10 December 5, 2017
Ubuntu 16.04 December 5, 2017
Ubuntu 14.04 December 5, 2017
Альтернатив там совсем немного... как я предполагаю, с развитием версии Swift - 3 последних релиза Ubuntu. Или, может кому повезёт, и это заработает в другой версии...

Код: Выделить всё

[olej@dell Language]$ ls -l swift-4.0.3-RELEASE-ubuntu16.04.tar.gz 
-rw-rw-r-- 1 olej olej 167297070 фев  1 15:29 swift-4.0.3-RELEASE-ubuntu16.04.tar.gz
Архив так себе ... не маленький.
Разархивируем в любой каталог.

Код: Выделить всё

olej@olej-VirtualBox ~/Загрузки/Language $ tar -zxvf swift-4.0.3-RELEASE-ubuntu16.04.tar.gz 
swift-4.0.3-RELEASE-ubuntu16.04/usr/
...

Код: Выделить всё

olej@olej-VirtualBox ~/Загрузки/Language $ tree -L 2 swift-4.0.3-RELEASE-ubuntu16.04 
swift-4.0.3-RELEASE-ubuntu16.04
└── usr
    ├── bin
    ├── include
    ├── lib
    ├── libexec
    ├── local
    └── share

7 directories, 0 files
Переношу в рабочий каталог с коротким именем:

Код: Выделить всё

olej@olej-VirtualBox ~/Загрузки/Language $ mv swift-4.0.3-RELEASE-ubuntu16.04 ~/swift

Добавляем путь в $PATH ... любым способом, например, дописав в ~/.bashrc :

Код: Выделить всё

olej@olej-VirtualBox ~ $ tail -n2 .bashrc
export PATH=~/swift/usr/bin:$PATH
Запускаем новый терминал (вкладку):

Код: Выделить всё

olej@olej-VirtualBox ~ $ echo $PATH
/home/olej/swift/usr/bin:/home/olej/bin:/home/olej/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

olej@olej-VirtualBox ~ $ which swift
/home/olej/swift/usr/bin/swift

olej@olej-VirtualBox ~ $ swift --version
Swift version 4.0.3 (swift-4.0.3-RELEASE)
Target: x86_64-unknown-linux-gnu

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 20:33

Проверяем, в любом рабочем каталоге:

Код: Выделить всё

olej@olej-VirtualBox ~/2018_WORK/own.BOOKs/ManyLang/swift $ swift hello.swift 
Hello, world!
А теперь компиляция автономного приложения:

Код: Выделить всё

olej@olej-VirtualBox ~/2018_WORK/own.BOOKs/ManyLang/swift $ swiftc hello.swift -o hellosw 

olej@olej-VirtualBox ~/2018_WORK/own.BOOKs/ManyLang/swift $ ls -l hellosw 
-rwxrwxr-x 1 olej olej 10816 Фев  4 15:50 hellosw

olej@olej-VirtualBox ~/2018_WORK/own.BOOKs/ManyLang/swift $ file hellosw 
hellosw: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, not stripped

olej@olej-VirtualBox ~/2018_WORK/own.BOOKs/ManyLang/swift $ ./hellosw
Hello, world!

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 22:51

Olej писал(а):
Clang не находит GCC библиотеку libstdc++, но находит свою библиотеку libc++.
Удалось ... с большим трудом! :-( разобраться что здесь происходит! Фу-у-у-ух! ;-)
1. При экспериментах с языком Go apt-get установил последнюю версию 6.0 gccgo:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ gccgo --version
gccgo (Ubuntu 6.0.1-0ubuntu1) 6.0.0 20160414 (experimental) [trunk revision 234994]
Copyright (C) 2016 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.
2. При том, что основной компилятор GCC установлен в версии 5.4:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.6) 5.4.0 20160609
Copyright (C) 2015 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.

И как-то эти 2 версии почти одного и того же - намудрячили с путями и библиотеками...

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 22:56

Olej писал(а):И как-то эти 2 версии почти одного и того же - намудрячили с путями и библиотеками...
Как лечим?
1. Удаляю gccgo 6.0 :

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ apt remove gccgo
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Следующие пакеты устанавливались автоматически и больше не требуются:
  gccgo-6 libgo9
Для их удаления используйте «sudo apt autoremove».
Пакеты, которые будут УДАЛЕНЫ:
  gccgo
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 1 пакетов, и 0 пакетов не обновлено.
После данной операции, объём занятого дискового пространства уменьшится на 13,3 kB.
Хотите продолжить? [Д/н] y
(Чтение базы данных … на данный момент установлено 674363 файла и каталога.)
Удаляется gccgo (4:6-20160210-1ubuntu1) …
Обрабатываются триггеры для man-db (2.7.5-1) …
2. Устанавливаю (он мне таки нужен! ;-) ) gccgo согласованной версии 5.4:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ apt install gccgo-5
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Следующие пакеты устанавливались автоматически и больше не требуются:
  gccgo-6 libgo9
Для их удаления используйте «sudo apt autoremove».
Будут установлены следующие дополнительные пакеты:
  libgo7
Предлагаемые пакеты:
  gccgo-5-doc libgo7-dbg
НОВЫЕ пакеты, которые будут установлены:
  gccgo-5 libgo7
обновлено 0, установлено 2 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 19,5 MБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 107 MB.
Хотите продолжить? [Д/н] y
Пол:1 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgo7 amd64 5.4.0-6ubuntu1~16.04.6 [6.401 kB]
Пол:2 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 gccgo-5 amd64 5.4.0-6ubuntu1~16.04.6 [13,1 MB]
Получено 19,5 MБ за 7с (2.577 kБ/c)                                                                                                     
Выбор ранее не выбранного пакета libgo7:amd64.
(Чтение базы данных … на данный момент установлено 674359 файлов и каталогов.)
Подготовка к распаковке …/libgo7_5.4.0-6ubuntu1~16.04.6_amd64.deb …
Распаковывается libgo7:amd64 (5.4.0-6ubuntu1~16.04.6) …
Выбор ранее не выбранного пакета gccgo-5.
Подготовка к распаковке …/gccgo-5_5.4.0-6ubuntu1~16.04.6_amd64.deb …
Распаковывается gccgo-5 (5.4.0-6ubuntu1~16.04.6) …
Обрабатываются триггеры для libc-bin (2.23-0ubuntu10) …
Обрабатываются триггеры для man-db (2.7.5-1) …
Настраивается пакет libgo7:amd64 (5.4.0-6ubuntu1~16.04.6) …
Настраивается пакет gccgo-5 (5.4.0-6ubuntu1~16.04.6) …
Обрабатываются триггеры для libc-bin (2.23-0ubuntu10) …
3. Переустанавливаю (обновляю) GCC:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ apt reinstall g++
Следующие пакеты будут ПЕРЕУСТАНОВЛЕНЫ:          
  g++ 
Следующие пакеты будут УДАЛЕНЫ:
  gccgo-6{u} libgo9{u} 
0 пакетов обновлено, 0 установлено новых, 1 переустановлено, 2 пакетов отмечено для удаления, и 0 пакетов не обновлено.
Необходимо получить 1.504 Б архивов. После распаковки освободится 336 MБ.
Хотите продолжить? [Y/n/?] y
Получено: 1 http://archive.ubuntu.com/ubuntu xenial/main amd64 g++ amd64 4:5.3.1-1ubuntu1 [1.504 B]
Получено 1.504 Б в 0с (6.403 Б/с)
(Чтение базы данных … на данный момент установлено 674547 файлов и каталогов.)
Удаляется gccgo-6 (6.0.1-0ubuntu1) …
Удаляется libgo9:amd64 (6.0.1-0ubuntu1) …
Обрабатываются триггеры для man-db (2.7.5-1) …
Обрабатываются триггеры для libc-bin (2.23-0ubuntu10) …
(Чтение базы данных … на данный момент установлено 674196 файлов и каталогов.)
Подготовка к распаковке …/g++_4%3a5.3.1-1ubuntu1_amd64.deb …
Распаковывается g++ (4:5.3.1-1ubuntu1) на замену (4:5.3.1-1ubuntu1) …
Обрабатываются триггеры для man-db (2.7.5-1) …
Настраивается пакет g++ (4:5.3.1-1ubuntu1) …                                            
4. Убеждаемся:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ clang++ -xc++ -stdlib=libstdc++ hello.cc -o hellocc

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ swift hello.swift -o hellosw
Hello, world!
Фу-у-ух ... камень с души! ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 04 фев 2018, 23:04

Компиляция Swift:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ swiftc hello.swift -o hellosw

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ ls -l hello* | grep x
-rwxrwxr-x 1 olej olej  8392 Фев  4 21:33 hellocc
-rwxrwxr-x 1 olej olej 10816 Фев  4 21:34 hellosw

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ ./hellosw 
Hello, world!
Смотрю скорость (время) выполнения нагруженной программы в исполняющей системе и автономно компилированное приложение:

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ swiftc -O fibo_sw.swift -o fibo_sw

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ time ./fibo_sw 40
165580141
real	0m1.787s
user	0m1.781s
sys	0m0.004s

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ time swift fibo_sw.swift 40
165580141
real	0m1.937s
user	0m1.866s
sys	0m0.068s
Разницы почти нет ... небольшая разница - это дополнительная загрузка исполняющей системы + загрузка исходного кода + время компиляции перед запуском.
Вложения
fibo_sw.swift
(423 байт) 73 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 09 фев 2018, 13:03

Olej писал(а):Фу-у-ух ... камень с души! ;-)
Теперь можно перейти к разбирательством с кодом на Swift...
Но, поскольку это тема "Swift под Linux", то тут будут некоторые отличительные особенности (сложности) ... которые я уже ощутил ... "на шкуре" ;-) :
- в Linux нас не должно интересовать ничто, относящееся в Swift к MacOS, iOS ... к их среде Xcode ... вообще ничто, относящееся к инфрасреде Apple...
- 70% обсуждений, ответов на вопросы, форумных тем и т.д. относительно Swift - будут нас отсылать к средам Apple ... для нас это - флуд, это не соответствует нашим целям, и должно быстро фильтроваться...
- ещё 10-15% обсуждений и примеров кода будут увязывать код Swift с кодом Objective-C - это тоже всё для нас мусор.
- в Linux многие вещи в Swift будут специфичнее, чем они задумывались Apple: ввод-вывод с терминала, бесполезность той большой части Swift, которая касается представлений UTF-16 для Unicode (это делалось, думаю, в угоду Microsoft ... "и Огород, на случай если Крот придёт") и др. (я ещё не всё осмотрел)

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 09 фев 2018, 13:10

Olej писал(а): Теперь можно перейти к разбирательством с кодом на Swift...
Онлайн справочные руководства по языку, библиотекам и API для написания кода Swift (необходимые и, кажется, достаточные):

Документация языка программирования Swift на русском языке

Руководство по языку программирования Swift

Swift Standard Library
- вот этот последний, 3-й источник - это оригинальная англоязычная документация от Apple по библиотеке Swift.

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Swift под Linux

Непрочитанное сообщение Olej » 09 фев 2018, 13:31

Olej писал(а):
Olej писал(а):Фу-у-ух ... камень с души! ;-)
Теперь можно перейти к разбирательством с кодом на Swift...
1-я интересующая меня задача:
- ввод с терминала последовательности вещественных чисел...
- и занесение их в массив...
- с контролем ошибок ввода (не числовое значение)...
- с отработкой конца ввода, EOF - ^D ... по крайней не вываливаться на этом

Код: Выделить всё

/* вложенный многострочный комментарий
   /* https://developer.apple.com/documentation/swift/1641199-readline */
   /* var arr = readLine()!.characters.split(" ").map(String.init)     */
*/
while true {
   let line : String! = readLine()
   if nil == line { break } // EOF
   if line.count == 0 { break }
   let подстроки = line.split( whereSeparator: { $0 == " " } )
   var числа = [Double]()
   for элемент in подстроки {
      let x = Double( элемент )
      if x != nil {
         print( x!, terminator: " | " )
         числа.append( x! )
      }
      else {
         print( "Ups!", terminator: " | " )
      }
   }
   print()
   print( "\(числа.count) => \(числа)" )
}
print( "завершение ввода" )
Попутно проверил некоторые любопытные вещи:
- вложенные многострочные комментарии /* ... /* ... */ ... */ - что недопустимо в C/C++
- имена переменных и все другие идентификаторы - на любом языке, хоть на русском, хоть на китайском, хоть общепонятные греческие математические обозначения: ΩπμλωΨΣθαβγεϒ - как в языке Go

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ make ad
swiftc -O ad.swift -o ad

Код: Выделить всё

olej@nvidia ~/2018_WORK/own.BOOKs/ManyLang/swift $ ./ad
1 2 3 4
1.0 | 2.0 | 3.0 | 4.0 | 
4 => [1.0, 2.0, 3.0, 4.0]
1 a 2 b 3 c 4 d
1.0 | Ups! | 2.0 | Ups! | 3.0 | Ups! | 4.0 | Ups! | 
4 => [1.0, 2.0, 3.0, 4.0]
1234
1234.0 | 
1 => [1234.0]
завершение ввода
Вложения
ad.swift
(804 байт) 70 скачиваний

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей