Boo vs. C# vs JavaScript

Программирование на Юнити.

Re: Boo vs. C# vs JavaScript

Сообщение ffinder 03 фев 2010, 22:48

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

в микропримерчике дана ситуация с тремя вложенными циклами. вот её-то строчки на Бу показывают отлично. это тот минимум, меньше которого "шо занадто - то нездраво".
доводя мысль до абсурда - можно всю программу на С# записать в одну строку - и что? читать ее будет абсолютно не возможно.

PS: ругаться зачеркнутым матом тоже не особенно хорошо.
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение george3 03 фев 2010, 23:11

ffinder, ребятам надо показать полезный им Unity-код, в котором будет видно преимущество, не абстрактный.
Можно показать работу с замыканиями, генераторами, нетипизированными объектами и способами их создания - но они вряд ли это оценят, ибо работают на
"скриптовом" уровне, где подобные вещи возможно и не нужны. а вот упростить Шарп код где вертеть массивы матриц в пятке методов - может и оценят.
george3
UNец
 
Сообщения: 27
Зарегистрирован: 04 ноя 2009, 17:45

Re: Boo vs. C# vs JavaScript

Сообщение ffinder 03 фев 2010, 23:41

ну, про замыкания я бы и сам не отказался посмотреть
а вот нетипизированные объекты думаю даже я в контексте игростроения не оценю. всё-таки специфика геймдева - жесткая статика. чем быстрее и предсказуемее - тем лучше.
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение Kann 03 фев 2010, 23:59

Вообще по моему вы полезли в дебри и устраиваете холивар, ибо в реальности для людей не первый день знакомых с программированием все ваши доводы в пользу Буу будут побоку, в большей степени, так как эти люди уже имеют сформированное представление о языках программирования и сами понимают что для них удобнее в использовании, а вот для новичков все ваши (замыкания и нетипизированные обьекты) как НЛО, и несколько не приближает их к использованию Буу как первого языка для обучения, лучше всего приводите примеры на базе справки Юнити, если уж хотите привлеч новичков на сторону Буу, так как по моему все кто первый раз встречает Юнити, лезет в справку, а там собственно господствует Жаба, и совсем чуток C#.
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Boo vs. C# vs JavaScript

Сообщение george3 04 фев 2010, 00:19

>>ну, про замыкания я бы и сам не отказался посмотреть
дык, замыкания = фунцкция в функции. прелесть этого в том, что ты можешь собрать нужную функцию и вернуть ее для работы.
или собрать ее и использовать ее внутри функции в разных местах, чтобы код не раздувать, вот напр. из моего 3D обработчика:

Код: Выделить всё
def link_throw_node(n as GraphNode, pos as Vector3):
"""   
проверить, чтобы не было прямо под ним через уровень связи
"""
   search_link = do(arg as GraphNode):
      
      if arg.position.x == pos.x and arg.position.z == pos.z and\
         pos.y - arg.position.y > 1:
            
         return true       
      //по диагонали
      delta_level = pos.y - arg.position.y
      
      if delta_level > 1 and (Abs(pos.x - arg.position.x) == delta_level\
         or Abs(pos.z - arg.position.z) == delta_level):
         
         return true
         
   if n.arg != GraphNode.no_val:
      
      return true if search_link(nodes[n.arg])
                           
   if n.master != GraphNode.no_val:
      
      return true if search_link(nodes[n.master])



как нетрудно заметить тут search_link - замыкание. прелесть их в том, что они "видят" переменные окружающей функции, поэтому при их изменении следующий вызов
отработает уже с новыми значениями. не надо передавать много параметров, замыкание от этого избавляет, = ускорение выполнения.

>>а вот нетипизированные объекты думаю даже я в контексте игростроения не оценю. всё-таки специфика геймдева - жесткая статика. чем быстрее и предсказуемее - тем лучше.
если правильно использовать - быстродействие не страдает, гибкость вырастает. вот я помню как в одном проекте у меня была концепция динамических свойств. любых.
чтобы на лету присобачить или выкинуть. так вот boo позволил мне обойтись примерно таким:
Код: Выделить всё
class Dynamic:
  props = List of Property()

  def AddProperty(prop as Type):
    props.Add( prop() )

в Шарпе ессно такое не пройдет, там надо быть профи, чтоб знать, какие мегафункции вызвать для создания из типа, и где они запрятаны.

опять же в Unity вроде тоже динамические свойства (реконфигурируемые), поэтому там и понадобился свой язык(UnityScript), который обеспечит эту динамику. Бу это поддерживал
изначально, Шарп только в последней версии добавили (слизали). так что если с умом, то можно все. ;;)
george3
UNец
 
Сообщения: 27
Зарегистрирован: 04 ноя 2009, 17:45

Re: Boo vs. C# vs JavaScript

Сообщение gnoblin 04 фев 2010, 00:30

Показывайте-показывайте.
Мне очень интересно :ymdaydream: .

А отсутствие скобочек в трех вложенных циклах меня не сильно радует...
Именно это может быть дело вкуса?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение Neodrop 04 фев 2010, 00:34

ffinder писал(а):доводя мысль до абсурда - можно всю программу на С# записать в одну строку - и что? читать ее будет абсолютно не возможно.

Это абсолютно невозможно.
Вот-вот в этой теме начнёте какашками кидаться? :-?
Так я удалю её, чтобы небыло соблазна. Спасибо скажем первому, кто начнёт метание.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение gnoblin 04 фев 2010, 00:41

george3, спасибо за примеры :-bd .

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

2) А так я могу сделать просто взяв ArrayList...
Тоже неудачный \ не-до-конца-развитый пример?

Может быть чтобы оценить фишки питона надо почитать книжку про него...
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение george3 04 фев 2010, 00:50

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

1.создание из типа. имеем произвольный a = System.Type, создаем объект obj = a()
2. добавляем в него динамическое свойство temperature. т. е. obj.AddProperty(temperature)
3. пишем obj.temperature = 20F (компилятор должен скушать)
4. сериализуем obj и после корректно десериализуем.
это я имел у виду.
george3
UNец
 
Сообщения: 27
Зарегистрирован: 04 ноя 2009, 17:45

Re: Boo vs. C# vs JavaScript

Сообщение gnoblin 04 фев 2010, 14:28

Второй пример понял, спс.

Про замыкание... да нету там мохнатых яиц с делегатами (в контексте вот этого конкретного примера, по-крайней мере) :).

Буду ждать проекты-примеры на Бу, в общем :ymparty:
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение george3 04 фев 2010, 15:13

>>да нету там мохнатых яиц с делегатами (в контексте вот этого конкретного примера, по-крайней мере)
какие делегаты без контекста класса? короткие описания (не сильно мохнатые) появились только в последней версии шарпа.
делегаты - частный случай замыканий, в общем они шарпом не поддерживались, до последней версии.
примеры будут если будет проект интересный.
george3
UNец
 
Сообщения: 27
Зарегистрирован: 04 ноя 2009, 17:45

Re: Boo vs. C# vs JavaScript

Сообщение george3 04 фев 2010, 22:40

в принципе подумал, вот код, реализующий эту концепцию на Boo, чтобы не думали, что мы с ffinder-ом просто с жиру бесимся..
свойства могут сразу ассоциироваться с несколькими программными свойствами, напр. у меня свойство свет имеет яркость и направление,
свойство может иметь методы, это все описывает само свойство. а потом просто, одной командой добавляется к объекту.
свойство может закидываться(регистрироваться, удаляться, автоматом разумеется) в разные системо-генерящие или следящие системы, т. е. свойство трусость будет реагировать на появление
инородного движущегося объекта бегством, сила трусости определяет насколько большим и близким, или агрессивным должен быть объект
чтобы начать бегство.
Код: Выделить всё
class ActiveProperty:
"""
активное (функциональное) свойство для установки параметров
"""   
   static properties = Dictionary[of string, Type]()      
   
   static def update_list_from(assembly as Assembly):
   """
   обновить список
   """
      for type in assembly.GetTypes():
      
           if type.IsSubclassOf(ActiveProperty):
          
               properties[type.Name] = type
              
   static def constructor():
   """
   регистрация подтипов ActiveProperty
   """               
      update_list_from(Assembly.GetExecutingAssembly())
          
   static def Create(name as string):
   """
   создает свойство данного типа
   """
      type as Type
      
      if properties.TryGetValue(name, type):
         
         return type() as ActiveProperty
         
      raise Exception('Unknown property name: ${name}!')
         
   master as Simple   //объект-хозяин   
   
   important = true //значимость свойства для синхронизации
   
   public value as object //значение      
   
   def register(obj as Simple, name as string, val):
   """
   инициализация на внутренние значения
   """
      master = obj
      
      value = val
      
      master.AddProperty(name, { return value}, assign)
      
      return self
      
   virtual def register(obj as Simple) as ActiveProperty:
   """
   инициализация значением val - возвращает self,
   если успешно установлено, иначе null
   """
      master = obj            
            
      
   virtual def unregister(obj as Simple):
   """
   удаление со сцены
   """
      raise Exception('Empty method call!')
      
      return self
      
   virtual def assign(val):
   """
   возвращает true, если успешно установлено
   """
      if important:
         
         Service.network.push(master.id, GetType().Name, val, value)
      
      value = val
      
      return true      
      
class camera_property(ActiveProperty):   
"""
свойство камеры в сцене
"""
   camera as Camera      
   
   direction as Vector3   
   
   def register(obj as Simple) as ActiveProperty:
   """
   инициализация значением val - позиция   
   """   
      super(obj)
      
      Service.video.CreateCamera()
      //использует уже созданную камеру (раннее создание камеры вынуждает)
      camera = Service.video.camera   
      
      value = camera.Position
      
      direction = camera.Direction            
      //обработчики
      Service.control.reaction4(obj, camera_frame, event_type.frame_start)
      
      Service.control.reaction4(obj, camera_keyboard, event_type.keyboard_down)            
      
      master.AddProperty('camera', {return self}, null)
      
      master.AddProperty('position', {return value}, assign)            
      
      master.AddProperty('direction', {return direction}, assign_dir)                  
      
   def unregister(obj as Simple):
      
      Service.control.del_reaction(obj, camera_frame, event_type.frame_start)
      
      Service.control.del_reaction(obj, camera_keyboard, event_type.keyboard_down)            
      
   def assign(val):
      
      super(val)
      
      camera.Position = val
      
   def assign_dir(val):
      
      direction = val
      
      camera.Direction = val


теперь универсальный реконфигурируемый объект
Код: Выделить всё
class Simple(IQuackFu, IComparable[of Simple]):
"""объект в виртуале"""
   public status = status_object.normal
      
   public type_id as string //GUID ресурса объекта
   
   public id as int        // глобальный идентификатор  объекта в мире
                // при перемещении в другой мир id будет другой
   public name as string   // читаемое имя
   
   properties as (Type)
   
   world as World //где находится            
   
   //активные свойства (стабильные, конечные)
   transient proper_dict as Dictionary[of string, property_handlers]
   
   //значения полей для сохранения
   property_data as Dictionary[of string, object]:
      
      get:
         res = Dictionary[of string, object]()
         
         for pd in proper_dict:
            
            obj = pd.Value.Get()
            
            if not obj isa ActiveProperty:
            
               res[pd.Key] = obj                              
               
         return res         
      set:
         inspire_properties() #сначала создать
         
         for v in value:
            
            proper_dict[v.Key].Set(v.Value)
            
   def inspire_properties():
   """
   связать свойства
   """      
      proper_dict = Dictionary[of string, property_handlers]()
      
      for pname in properties:
         
         (pname() as ActiveProperty).register(self)         
   
   def CompareTo(other as Simple):
      
      if status != other.status:
      
         return status.CompareTo(other.status)
      
      return GetHashCode().CompareTo(other.GetHashCode())               
   
   def reaction(r as reaction_func, e as event_type):
   """
   установить реакцию
   """
      Service.control.reaction4(self, r, e)
   
   def AddProperty(name as string,G as getProp,S as setProp):
   """добавить субсвойство или свойство"""   
      if proper_dict.ContainsKey(name):
         
         raise Exception('Свойство ${name} уже зарегистрировано!')
         
      proper_dict[name] = property_handlers(G,S)
   
   def QuackGet(name as string, args as (object)) as object:   
      
      prop as property_handlers
      
      if proper_dict.TryGetValue(name, prop):
         
         proper_name = name
         
         return prop.Get()               
         
      raise Exception("Unknown property: ${name}!")   
   
   def QuackSet(name as string, args as (object), value as object) as object:   
      
      prop as property_handlers
      
      proper_name = name
      
      if not proper_dict.TryGetValue(name, prop):
                  
         raise Exception("Unknown property: ${name}!")            
      else:
         prop.Set(value)
         
      return true
      
   def QuackInvoke(name as string, args as (object)):
      
      pass
      
   def constructor():
      
      world = Service.world
      
   def constructor(_name as string, *prop_names as (Type)):
   """
   первым может идти имя объекта, дальше свойства
   """
      name = _name
      
      properties = prop_names
      
      world = Service.world
      
      world.register(self)
      
      inspire_properties()


теперь как создаются, используется
Код: Выделить всё
Simple('DyLight', light_property).position = Vector3(20, 80, 50)
..
Simple('Actor', behavior_standart, mutant).position = Vector3(30, 100, 50)
..
virtobject('Actor').run.position(10,10,50)




P.s. это вытяжка кода из совершенно рабочего прототипа движка, использующего Ogre, для демонстрации крутости Boo ну и себя конечно
может показаться странным использовать динамический объект для камеры, у меня стояла задача построить все на динамических объектах.
чтобы и самому убедиться, что такое будет работать быстро и без проблем
george3
UNец
 
Сообщения: 27
Зарегистрирован: 04 ноя 2009, 17:45

Re: Boo vs. C# vs JavaScript

Сообщение warr11r 05 фев 2010, 02:16

Zaicheg писал(а):
warr11r писал(а):Буку вроде Sharp Develop подсвечивает.
И если в этом я прав, то там вполне удобно проектонавигироваться.

Кстати, это вроде по теме:
http://boolangstudio.codeplex.com/


Zaicheg, а можно ли еще и ЖС к ВС прицепить? При такой унификации я бы забил на УД.
Мудрость - это когда начинаешь понимать, что все время занимаешься какой-то х...ней.
Изображение
Аватара пользователя
warr11r
UNITрон
 
Сообщения: 310
Зарегистрирован: 06 июн 2009, 03:21
Откуда: Украина, Ровно
  • ICQ

Re: Boo vs. C# vs JavaScript

Сообщение ffinder 05 фев 2010, 15:18

george3, а зачем мы тут кому-то что-то доказываем? причем еще отбиваемся от нападок. какая нам-то от этого выгода? не хотят - как хотят.
ffinder
UNITрон
 
Сообщения: 192
Зарегистрирован: 26 мар 2009, 17:35
  • Сайт

Re: Boo vs. C# vs JavaScript

Сообщение Tolking 05 фев 2010, 16:47

Респект!
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Пред.След.

Вернуться в Скрипты

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

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