Это не проблема. Есть способы запаковать все необходимые файлы вместе с интерпретатором в один контейнер и получить exe файл.
И какой будет размер исполняемого файла?
Quote (bum)
В *nix системах это вообще не проблема, поскольку там интерпретатор питона обычно всегда присутствует в системе
Но на большенстве компов установлена винда! И не стоит забывать про юзверей, котрые владеют тока мышкой и не додумаются что для проги нужен интерпретатор! А таких, сами понимаете, не мало!
Quote (bum)
exe файлов там нет.
Ага, там исполняемое файло без расшиерния.
Quote (bum)
Это может быть просто только с программами на уровне Hello World.
Вот вам пример, по сложнее хеловорда. Оконная прога - текстовый редактор. Его исходик без модификаций можно скомпилировать под Windows x86, Windows x64, Linux x86, Linux x64, MacOS X Intel, MacOS X PowerPC и AmigaOS http://pure-basic.narod.ru/docs/MultiOS.html
Сообщение отредактировал PBPROG - Четверг, 02 Сентября 2010, 20:28
Но на большенстве компов установлена винда! И не стоит забывать про юзверей, котрые владеют тока мышкой и не додумаются что для проги нужен интерпретатор! А таких, сами понимаете, не мало!
Можно в конце-концов простенький скрипт для командной оболочки, тогда бедный просто два раза кликнет по нему мышкой... И добавить ссылку на этот скрипт в главное меню... Это не так сложно...
Quote (PBPROG)
Вот вам пример, по сложнее хеловорда. Оконная прога - текстовый редактор. Его исходик без модификаций можно скомпилировать под Windows x86, Windows x64, Linux x86, Linux x64, MacOS X Intel, MacOS X PowerPC и AmigaOS
Code
CompilerIf #PB_Compiler_OS = #PB_OS_Windows здесь должен быть код специально для Windows CompilerElse здесь должен быть код для других платформ CompilerEndIf
Имелось в виду "НЕ ИСПОЛЬЗУЯ ДИРЕКТИВЫ КОМПИЛЯТОРА"... А то, что ты показал это тупо "разный код для разных платформ" и не катит... Это всёравно, что писать новый код...
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
Имелось в виду "НЕ ИСПОЛЬЗУЯ ДИРЕКТИВЫ КОМПИЛЯТОРА"...
В том коде использована кроссплаторменная библиотека функций, не API конкретной платформы. Теперь по существу. Вот весь код:
Code
; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор. Procedure LoadFile(File.s) If ReadFile(0, File) ; Открытие файла. FileSize=Lof(0) ; Определение размера файла в байтах. FormatFile=ReadStringFormat(0) ; Определение кодировки файла (Ascii, UTF8 или Unicode). *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла. ReadData(0, *mem, FileSize) ; Копирование данных из файла в память. SetGadgetText(1, PeekS(*mem,FileSize, FormatFile)) ; Преобразование кодировки и загрузка текста в редактор. FreeMemory(*mem) ; Освобождение памяти. CloseFile(0) ; Закрытие файла. StatusBarText(1,0,File) ; Отображение пути к файлу в строке состояния. Else MessageRequester("Ошибка", "Не удалось открыть файл") EndIf EndProcedure
; Эта процедура сохраняет данные из редактора в файл. Procedure SaveFile() ; Создание стандартного окна сохранения файла. File.s=SaveFileRequester("Сохраняем файл","","Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*",0) If File<>"" If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла File=File+".txt" ; добавляем его EndIf If CreateFile(0,File) ; Создание файла на диске Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text CompilerIf #PB_Compiler_OS = #PB_OS_Linux ; Это код для операционки Linux WriteStringFormat(0, #PB_Unicode) ; Запись в файл специальной метки, сообщающей что кодировка Unicode FormatFile=#PB_Unicode CompilerElse ; Это код для операционок Windows, MacOS и AmigaOS FormatFile=#PB_Ascii CompilerEndIf WriteString(0, Text, FormatFile) ; Запись текста в файл в требуемой кодировке CloseFile(0) ; Закрытие файла. Else MessageRequester("Ошибка", "Не удалось сохранить файл") EndIf EndIf EndProcedure
ProgPath.s=GetPathPart(ProgramFilename()) ; Получаем путь к исполняемому файлу
Gosub LoadSetting ; Вызов подпрограммы, читающей настройки программы из файла SettingEdit.ini
If Window_X<2 : Window_X=100 : EndIf If Window_Y<2 : Window_Y=100 : EndIf
; Открытие главного окна OpenWindow(1,Window_X,Window_Y,Window_Width,Window_Height,"Текстовый редактор",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_Invisible) SmartWindowRefresh(1,1) ; Активация функции, уменьшающей мерцания окна при изменении его размеров
If CreateMenu(0,WindowID(1)) ; Создание главного меню MenuTitle("Файл") MenuItem(1,"Открыть"+Chr(9)+"Ctrl+O") MenuItem(2,"Сохранить"+Chr(9)+"Ctrl+S") MenuBar() MenuItem(3,"Выход") MenuTitle("Формат") MenuItem(4,"Шрифт") MenuHeight=MenuHeight() ; Высота меню EndIf
If CreateToolBar(1,WindowID(1)) ; Создание панели инструментов ToolBarStandardButton(1, #PB_ToolBarIcon_Open) ToolBarToolTip(1,1,"Открыть файл") ToolBarStandardButton(2, #PB_ToolBarIcon_Save) ToolBarToolTip(1,2,"Сохранить файл") ToolBarHeight=ToolBarHeight(1) ; Высота панели инструментов EndIf
If CreateStatusBar(1,WindowID(1)) ; Создание строки состояния AddStatusBarField(#PB_Ignore) ; Создание одного раздела на всю строку состояния StatusBarHeight = StatusBarHeight(1) ; Высота строки состояния EndIf
CompilerIf #PB_Compiler_OS = #PB_OS_Linux ; Код для Linux EditorX=2 ; Верхняя позиция редактора в окне CompilerElse EditorX=ToolBarHeight+2 ; Верхней позиция редактора смещена вниз на высоту панели инструментов CompilerEndIf ; Собственно редактор текста EditorGadget(1,1,EditorX, Window_Width-2, Window_Height-StatusBarHeight-MenuHeight-ToolBarHeight-4) SetGadgetColor(1,#PB_Gadget_FrontColor, $950121) ; Цвет текста SetGadgetColor(1,#PB_Gadget_BackColor, RGB(237, 255, 246)) ; Фон
LoadFont(1, FontName.s, FontSize, FontStyle) ; Шрифт для редактора SetGadgetFont(1,FontID(1))
File.s=ProgramParameter() ; Командная строка переданная программе при старте If File<>"" And FileSize(File)>=0 ; Передан путь к файлу LoadFile(File) ; Загружаем файл EndIf
; Активация функций, позволяющих открывать файл просто перетащив его в окно программы EnableWindowDrop(1, #PB_Drop_Files, #PB_Drag_Link) EnableGadgetDrop(1, #PB_Drop_Files, #PB_Drag_Link)
HideWindow(1,0) ; Отображение окна
Repeat ; Главный цикл Repeat - Until
Event=WaitWindowEvent() ; Получаем идентификатор события в программе
If Event=#PB_Event_SizeWindow ; Размер окна изменился ; Изменение размеров редактора ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(1)-2, WindowHeight(1)-StatusBarHeight-MenuHeight-ToolBarHeight-2)
ElseIf Event=#PB_Event_WindowDrop Or Event=#PB_Event_GadgetDrop ; На окно перетащали файл If EventDropAction()=#PB_Drag_Link File=EventDropFiles() ; Получаем путь к файлу If FileSize(File)>=0 ; Файл существует LoadFile(File) ; Загружаем файл EndIf EndIf
ElseIf Event=#PB_Event_Menu ; Событие в меню Menu=EventMenu() ; Определение выбранного пункта меню Select Menu Case 1 ; Пункт "Открыть" File.s=OpenFileRequester("Открываем файл","","Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*",0) If File<>"" LoadFile(File) EndIf
Case 2 ; Пункт "Сохранить" SaveFile()
Case 3 ; Пункт "Выход" Break
Case 4 ; Пункт "Шрифт" If FontRequester(FontName.s, FontSize,0,0, FontStyle) FontName=SelectedFontName() FontSize=SelectedFontSize() FontStyle=SelectedFontStyle() LoadFont(1, FontName, FontSize, FontStyle) SetGadgetFont(1,FontID(1)) EndIf
EndSelect EndIf
Until Event=#PB_Event_CloseWindow ; Прерывание главного цикла при закрытии окна Gosub SaveSetting ; Вызов подпрограммы, сохраняющей настройки программы ф файле SettingEdit.ini End
SaveSetting: ; Подпрограмма сохраняющая в файле SettingEdit.ini настройки программы If CreatePreferences(ProgPath+"SettingEdit.ini") PreferenceGroup("Window") WritePreferenceLong("Window_X", WindowX(1)) WritePreferenceLong("Window_Y", WindowY(1)) WritePreferenceLong("Window_Width", WindowWidth(1)) WritePreferenceLong("Window_Height", WindowHeight(1)) PreferenceGroup("Editor") WritePreferenceString("FontName", FontName) WritePreferenceLong("FontSize", FontSize) WritePreferenceLong("FontStyle", FontStyle) ClosePreferences() EndIf Return
Если вы внимательно посмотрите, то поймете что в данном случае, можно вовсе обойтись без директив условной компиляции.
Условная компиляция есть в процедуре SaveFile для выбора кодировки сохраняемого файла. Если сохроанять только в юникоде или Ascii, то можно исключить директиву условной компилятции. Далее, если использовать шрифт по умлочанию, то можно исключить еще одну диективу условной компиляции.
То есть, условная компиляция тут по большому счету не нужна, просто, на разных платформах по умолчанию используется разная кодировка тектовых файлов и разные имена шрифтов. Если на это забить, то в проге не будет условной компиялции кода.
PBPROG, однако это не решает проблему перекомпиляции... ( ведь для того чтобы перенести код под другую платформу его надо перекмпилировать... )
Честно я уже не понимаю, что конкретно мы обсуждаем... Преимущества интерпретируемости или же преимущества какого-то конкретного ЯП...
Добавлено (02.09.2010, 21:40) --------------------------------------------- PBPROG, до меня тока ща дошёл смысл вашего ника =) Теперь понятно почему вы так отстаиваете басик...
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
ведь для того чтобы перенести код под другую платформу его надо перекмпилировать...
Это ложится на плечи разработчика и не является большой проблемой - юзеры получат самостоятельные скомпилированые исполняемые файлы для интерисующей их платформы. А в случае, интерпретации, поиск интерпретатора под нужную платформу - проблема юзеров.
С современными объемами жестких дисков это не имеет значения. Кроме того тот же py2exe не копирует полный дистрибутив питона, а берет из него только те файлы которые реально нужны. Большинство юзеров лишние съеденные 20-30Мб места на диске даже не заметят. Ведь никого же не смущает когда программы от Microsoft или Autodesk тянут за собой тонны файлов сомнительной важности.
Quote (PBPROG)
Но на большенстве компов установлена винда! И не стоит забывать про юзверей, котрые владеют тока мышкой и не додумаются что для проги нужен интерпретатор! А таких, сами понимаете, не мало!
Не на большинстве компов, а на большинстве десктопных компов. Есть разница. Кроме того, я же говорю, что есть способы все запаковать в одну папку (включая интерпретатор). Юзер запускает setup.exe, запускается инсталлятор, в конце получаете иконку в меню Пуск-Программы. Если все работает из коробки, то какая юзеру разница на чем программа написана? Ему нужны какие-то сакральные знания об интерпретаторе чтобы кликнуть по иконке?
Quote (PBPROG)
Ага, там исполняемое файло без расшиерния. smile
Не поверите, в *nix расширение файла не имеет никакого значения. За возможность запуска файла как программы отвечает соответствующий флаг в правах доступа. Если при этом файл не бинарный, а текстовый, то система ожидает в первой строке ссылку на интерпретатор. В этом случае, чтобы сделать питоновский файл запускаемым в Linux, достаочно просто вписать в первую строку #!/usr/bin/python и потом выполнить что-то вроде chmod +x file.py.
Quote (PBPROG)
Это ложится на плечи разработчика и не является большой проблемой - юзеры получат самостоятельные скомпилированые исполняемые файлы для интерисующей их платформы.
Не является большой проблемой? Сильно сказано.
Впрочем наверное действительно как-то темапошла не в то русло.
Сообщение отредактировал bum - Четверг, 02 Сентября 2010, 22:14
С современными объемами жестких дисков это не имеет значения.
Не у всех есть быстрый безлимитный инет чтобы скачать "лишних" несколько десятков метров! Проще и быстрее скачать скомпилированую прогу, размером, несколько сотен килобайт!
Quote (bum)
Не поверите, в *nix расширение файла не имеет никакого значения. За возможность запуска файла как программы отвечает соответствующий флаг в правах доступа
Я это знаю. А в никсах, скомпилированые исполняемые файлы почти всегда без расширения.
Quote (bum)
Не является большой проблемой? Сильно сказано.
Ну не проблема это. Ну потрачу на одну минуту больше - скомпилирую прогу под нужную платформу. Что сложного?
Не у всех есть быстрый безлимитный инет чтобы скачать "лишних" несколько десятков метров! Проще и быстрее скачать скомпилированую прогу, размером, несколько сотен килобайт!
Наша проблема в том, что мы говорим о какой-то сферической программе в вакууме. Уже пошло обсуждение и Интернета. Не знаю, у меня дома 4Мбит безлимит, и на мобиле 1Гб предоплаченого трафика на месяц, да и в центре города во многих кафе есть WiFi. Помоему доступ к Интернету уже несколько лет как совсем не проблема. Это где сейчас скачать лишние несколько десятков метров накладно?
Quote (PBPROG)
Ну не проблема это. Ну потрачу на одну минуту больше - скомпилирую прогу под нужную платформу. Что сложного?
Да не бывает такого. Требование кросплатформенности резко увеличивает затраты на разработку. Да, это реально, но не нужно говрить, что это уж просто. Конечно кроссплатформенные фреймворки (Qt, wxWidgets, GTK) упрощают разработку, но они все равно не страхуют от всех проблем.
Сообщение отредактировал bum - Четверг, 02 Сентября 2010, 23:59