PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Создатель программ


Создатель программ

Сообщений 61 страница 90 из 103

61

daiomik написал(а):

На Fasm или PB

Если писать на Fasm'е, то потребуется несколько лет + ещё несколько на отлов ошибок - на ассемблере писать сложно, т. к. это язык низкого уровня, близкий к машинному!
Если сделать на PB, то размер будет больше чем при использовании ассемблера, но зато сделаешь всё намного быстрее.
Думаю будет меньше 500 КБ.

Мне кажется что оптимальный вариант PB + ассемблерные вставки, для увеличения скорости компиляции.

PS.
Компилятор PB (PBCompiler.exe) имеет размер всего 200 КБ, а остальное вспомагательные компоненты.

0

62

Пётр написал(а):

Если сделать на PB

почитал я топики, посты, темы, а конкретных подсказок как сделать это на PB не нашел. Конечно кто будет писать и разъяснять (не квиталий точно  :) ). Понятно, что для начала нужно механизм изучить общий..Но именно в PB с чего начать то можно? Даже само пустое окно или диалоговое окно - это уже прогресс...

0

63

daiomik написал(а):

Но именно в PB с чего начать то можно

Изучи работу с файлами (раздел File), работу со строками (раздел String) и работу с памятью (рездел Memory).
Этими функциями будешь пользоваться чаще всего.
Ведь что делает компилятор? Он открывает файл с исходным текстом, и парсит его ища, ключевые слова, константы, математические операции и т. д и создаёт исполняемый файл.

daiomik написал(а):

Даже само пустое окно или диалоговое окно - это уже прогресс

Для этого как минимум, нужно хорошо знать API, асссемблер и машанный код (если не будет использоватся Fasm).

В первом после этой темы есть интерпретатор, создающий окно.

0

64

Пётр написал(а):

есть интерпретатор

Переписал его в компилятор, точнее, в транслятор в код пурика.
После запуска, интерпретация происходить не будет, в место этого, рядом с исходником появистся файл "файл.pb".
Если транслировать не в код пурика, а в ассемблер, и передавать результат FASM'у чтобы он создал исполняемый файл то получится пристейший компилятор.

Код:
NewList l.s() ; Создаем лист, где будем хранить каждую строчку исходного кода 

Dim TEMP.s(20) ; Создаем массив для хранения временных записей (он нужен для вызова функций из DLL) 

OpenFile(0,"файл.txt") ; Открываем исходник и считываем текст построчно 
Repeat 
  AddElement(l.s()) 
  l.s()=ReadString(0) 
Until Eof(0) 
CloseFile(0) 

CreateFile(2,"файл.pb")

For t=0 To CountList(l())-1 ; первый проход 
  SelectElement(l(),t) ; проверяем каждую строчку на факт наличия директив перво проходной обработки 
  Select LCase(Left(Trim(l()),3)) 
    Case "cmd" ; тут предоставлена только одна директива - константная замена (следует помнить, что в интерпретируемых языках данные и исходный код есть одно и то-же) 
      b.s=Trim(ReplaceString(l(),"cmd","")) ; отделяем часть кода содержащую параметры директивы 
      a.s=StringField(b.s,0," ") ; подхватываем первый параметр - имя константы 
      b.s=Trim(ReplaceString(b.s,a.s,"")) ; обрезаем оставшийся код для получения значения подстановки 
      For m=0 To CountList(l())-1 ; производим замену константы во всём коде на её значение 
        SelectElement(l(),m) 
        l()=ReplaceString(l(),a.s,b.s) 
      Next m 
      SelectElement(l(),t) 
      DeleteElement(l()) ; удаляем строчку содержащею константу, ибо она нам больше не нужна 
  EndSelect ; домашнее задание: сделать поддержку меток для переходов (Подсказка: метка - это та-же константа, но ее значение автоматический устанавливается парсером и равно номеру текущей строчки) 
Next t 


For t=0 To CountList(l())-1 ; второй проход 
  SelectElement(l(),t) 
  Select LCase(StringField(Trim(l()),0," ")) ; определяем комманду 
    Case "call" ; функция вызова dll процедуры 
      a.s=Trim(ReplaceString(l(),"call","",1)) ; отщепляем параметры функции 
      a.s=ReplaceString(a.s,Chr(13),"") ; отщепляем нежелательные системные символы 
      a.s=ReplaceString(a.s,Chr(10),"")  
        WriteStringN(2,"OpenLibrary(0, "+Chr(34)+StringField(a.s,1,",")+Chr(34)+")")
        Command.s=""
        m=3
        cmd.s=Trim(StringField(a.s,2,",")) ; запоминаем имя процедуры
        Repeat ; время считать все параметры вызываемой процедуры 
          b.s=Trim(StringField(a.s,m,",")) 
          If b.s<>"" 
              Command+", "+b
          EndIf 
          m=m+1 
        Until b="" ; если параметров нет - выйти из цикла 
        If Command
          WriteStringN(2," CallFunction(0, "+Chr(34)+cmd+Chr(34)+Command+")")
        EndIf
        WriteStringN(2,"CloseLibrary(0)")
    Case "jmp" ; Вторая команда - прыжок через Х строк или безусловный относительный переход 
      a.s=Trim(ReplaceString(l(),"jmp","",1)) ; отделили единственный параметр 
      t=t+Val(Trim(a)) ; применили смещение 
  EndSelect ; ДОМАШНЕЕ ЗАДАНИЕ: сделать аналогичную функцию для условного перехода 
Next t 

CloseFile(2)

0

65

Пётр написал(а):

Если транслировать не в код пурика, а в ассемблер, и передавать результат FASM'у

То есть получается PB будет средним звеном между кодом и Fasm-ом. И я так понимаю, что когда PB будет транслировать код результат FASM'у, то он просто будет перегонять (переделовать) код с PB под FASM, а FASM в свою очередь компилить..Правильно?

0

66

daiomik написал(а):

И я так понимаю, что когда PB будет транслировать код результат FASM'у, то он просто будет перегонять (переделовать) код с PB под FASM, а FASM в свою очередь компилить..Правильно

Да, примерно так.
Но если есть желание разобратся со структурой исполняемых файлов, формата PE и с машинным кодом, то можно сразу создавать исполняемый файл, не используя FASM.

0

67

Пётр написал(а):

Но если есть желание разобратся со структурой исполняемых файлов, формата PE и с машинным кодом, то можно сразу создавать исполняемый файл, не используя FASM.

Что для этого нужно, какие проги и литература?

0

68

Проги (кроме PB) не нужны, а нужна только литература, причём много!
Для начала

структура формата PE
машинный код процессоров Intel

0

69

Вообщем то структура понятна:программа на диске и в памяти, заголовок (старый (под дос), новый) и секции ресурсов..Собственно как на PB создать такой PE формат?  Какие команды API и тп....Ведь чисто теоретически уже и компилировать не нужно в PB, ведь мы и создаем уже готовый..

0

70

daiomik написал(а):

..Собственно как на PB создать такой PE формат?

Создаём пустой файл с расширением EXE, с помощью функции CreateFile, а затем функциями WriteByte, WriteCharacter, WriteData, WriteLong, WriteQuad и др, создаём сам исполняемый файл, структуры PE.

Здесь есть пример Very Simple Compiller, создающий исполняемый файл СОМ формата для DOS.
PE намного сложнее...

0

71

В принципе с одной стороны не сложно, но с другой необходимо учесть все компоненты и всю структуру PE. Если все грамотно организовать, то получается приложение для создания exe будет иметь очень мелкий размер, так как в таком приложении будет отсутствовать компилятор..Так почему все передовые технологии и системы (я имею ввиду компиляторы и языки программирования) не используют прямое создание PE??

0

72

daiomik написал(а):

Так почему все передовые технологии и системы (я имею ввиду компиляторы и языки программирования) не используют прямое создание PE??

Обычно они как раз испоьзуют прямое создание EXE.
Процесс преобразования исходника в исполняемый файл называется компиляцией.
В пурике используется FASM по видимуму из-за то, он кроссплатформенный и проще использовать готовое решение в виде FASM'а, чем разбиратся со структурой исполняемых файлов для Windows, Linux, MacOS X и AmigaOS.

0

73

Пётр написал(а):

разбиратся со структурой исполняемых файлов для Windows, Linux, MacOS X и AmigaOS.

эмм..то есть если я создам таким способом exe в Windows, то он не будет у меня работать в Linux?

0

74

daiomik написал(а):

то есть если я создам таким способом exe в Windows, то он не будет у меня работать в Linux

В линуксе программы из винды можно запускать только под вайном (эмулятр винды).
Там все по другому не так как в винде!

0

75

Петр, раз у PB компилятор FASM используется, значит можно же обойтись как то без дополнительных библиотек весом в 20 Мб (которые в PB). Если предположить что изначально пишется правильный код в пурике и не надо его подправлять и изменять на ошибки, тогда просто его кормишь фазму и все..

0

76

daiomik написал(а):

как то без дополнительных библиотек весом в 20 Мб

Программировать будет очень сложно.
Представь.
Нет ни одной функции (в т. ч. API), ни констант, ни структур, короче ничего нет, кроме нескольких операторов языка.
На простойшую задачу - создание окна, надо будет потратить как минимум час, вручную объявляя все API функции, константы, структуры (ещё нужно знать что они из себя представляют).

Библиотеки нужны для программирования в более конфортных условиях, чтобы не отвлекатся по пустякам.

PS.
FASM код пурика не понимает! Ему нужно скармливать ассемблерный код.

0

77

Мдя..не легкое это дело..самому сложно очень, даже не знаешь откуда подступить. И методы реализации тоже разные: вникать в структуру PE, при чем для каждой системы разная или же тупо составлять свою структуру с PB для Wasm. То есть получается в данной ситуации только 2 этих выхода...

0

78

Наконец я разобрался как использовать компилятор FASM.. И так, такой вопрос. Петр приводил код как скармливать компилятору PB исходный код. Я немного переделал его под FASM и получилось так:

Код:
Procedure CreateExe()
  PathCompiler.s="f:\exampleFasm\FASM.EXE" ; Путь к компилятору
  SourceFile.s="f:\exampleFasm\hello.ASM" ; Исходник
  OutEXE.s="f:\exampleFasm\Proga.exe" ; Где создать исполняемый файл
  
  If FileSize(GetPathPart(PathCompiler)+"FASMW.EXE")>0
    DeleteFile(GetPathPart(PathCompiler)+"FASMW.EXE")
  EndIf
  
  RunProgram(PathCompiler, SourceFile, GetPathPart(PathCompiler), #PB_Program_Wait)

If FileSize(GetPathPart(PathCompiler)+"FASMW.EXE")>0
 If CopyFile(GetPathPart(PathCompiler)+"FASMW.EXE", OutEXE) 
   MessageRequester("", "Программа успешно скомпилирована", #MB_OK|#MB_ICONINFORMATION)
 EndIf
EndIf
EndProcedure

собственно вопрос: для чего нам нужны эти строчки:

Код:
If FileSize(GetPathPart(PathCompiler)+"FASMW.EXE")>0
    DeleteFile(GetPathPart(PathCompiler)+"FASMW.EXE")
  EndIf

и зачем удялять файл?
Далее прокомментируйте это:

Код:
If FileSize(GetPathPart(PathCompiler)+"FASMW.EXE")>0
 If CopyFile(GetPathPart(PathCompiler)+"FASMW.EXE", OutEXE) 
   MessageRequester("", "Программа успешно скомпилирована", #MB_OK|#MB_ICONINFORMATION)
 EndIf
EndIf

Вообщем - то суть я понял и даже все работает, просто хочу понять процедуру передачи  (скормки) исходников

0

79

daiomik написал(а):

собственно вопрос: для чего нам нужны эти строчки

Чтобы удалить ранее скомпилированый исполняемый файл.

daiomik написал(а):

Далее прокомментируйте это

Это копирование файла в заданую папку. Например, в папку с исходным текстом.

0

80

ясно спасибо..

0

81

Я что то запутался с атрибутами, которые нужно передавать любому компилятору. Например для FASM что нужно передать?
RunProgram(PathCompiler, SourceFile, GetPathPart(PathCompiler), #PB_Program_Wait)
И зачем тут #PB_Program_Wait??

0

82

daiomik написал(а):

И зачем тут #PB_Program_Wait

Что без этого не работает?

0

83

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

0

84

Найди описание FASM'а.

0

85

Пётр написал(а):

Найди описание FASM'а.

не в этом дело..Просто я уже имею готовый исходник на ассемблере, но пытаюсь его через PB передать компилятору FASM, находящемуся в папке с прогой и ничего не выходит. Вот код, но я толком не пойму что он делает. Скорее всего не правильно как то передаю данные:

Код:
Compiler=RunProgram("FASM.EXE", File$+".asm", "c:\fasm\EXAMPLES\primer\", #PB_Program_Open|#PB_Program_Read)
      If Compiler
        While ProgramRunning(Compiler)
          If AvailableProgramOutput(Compiler)
            Output$ + ReadProgramString(Compiler) + Chr(13)
          EndIf
        Wend
        Output$ + Chr(13) + Chr(13)
        Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
        CloseProgram(Compiler) ; Close the connection to the program
      EndIf
      MessageRequester("Output", Output$)

Подскажите что не так?

0

86

На другом форуме Квиталей подсказал, что возможно путь выходящего файла не указан. Как и где его указать в команде RunProgram()??
Разобрался с компилятором. Если кому интересно параметры задаются вот так, через пробел:

Код:
Parameter$= File$+".asm"+" "+File$+".exe"
RunProgram("C:\fasm\FASM.EXE",Parameter$, "")

Отредактировано daiomik (15.08.2010 12:34:30)

0

87

daiomik написал(а):

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

Так я и пишу что найди описание рабты с компилятором FASM, чтобы правильно передавать ему данные.

0

88

Петр, то есть создатели PB просто переводят код пурика в код ассемблера?? То есть они полностью знают его синтаксис получается?

0

89

daiomik написал(а):

то есть создатели PB просто переводят код пурика в код ассемблера

Да, именно это и делают.
А исполняемые файлы создаёт FASM.

0

90

Но вот только я не пойму. Используется же FASM, но вот из официального архива FASM-а компилятор весит  84 кб, а в папке с PB по мима этого же файла есть еще и pbcompiler.exe, который весит 280 кб. Так зачем же он нужен, если есть компилятор FASM?

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Создатель программ