Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > ZackMercury

Оценить эту запись

Генетический алгоритм. Часть 3 - Класс Population

Запись от ZackMercury размещена 19.06.2017 в 15:40

Переменные поколения.

В нашем случае, когда наша особь существует во времени, нужно ограничить особь временными рамками.
Сейчас я считаю, что 10 секунд будет достаточно для того, чтобы особь могла добраться до цели. Если же поставить больше, чем особи нужно, чтобы добраться до цели, алгоритм будет совершать лишние действия, чтобы потратить лишнее время, либо обходить не по прямой, а по дуге.

Код AS3:
public class Population extends Sprite 
{
	private var generationLifetime:Number = 10;
}
Также будем считать номер поколения для отчётности.

Код AS3:
public var generation:int = 0;
Количество популяции

Код AS3:
public var populationCount:int = 200;
Будем выводить минимальное расстояние при окончании жизни популяции в текстовое поле.

Код AS3:
public var minDistance:Number = Number.MAX_VALUE;
Наконец, сам массив особей:

Код AS3:
private var population:Vector.<Entity> = new Vector.<Entity>();
Механика.

Нам необходимо знать время жизни текущей популяции, чтобы знать, когда нам нужно остановить её жизнь и отбирать родителей для новой популяции.

Код AS3:
public var lifetime:Number = 0;
Нам нужно также знать целевую точку, к которой мы будем приближаться.

Код AS3:
private var target:Point = new Point(400, 50);
Нам также можно посчитать сумму весов, чтобы не считать её дважды при селекции каждой особи.

Код AS3:
private var totalWeights:Number;
Ну и где-то нам нужно хранить препятствия, поэтому:

Код AS3:
private var rects:Vector.<Rectangle> = new Vector.<Rectangle>();
Основные методы класса Population

Начнём мы, конечно же, с конструктора.

Код AS3:
public function Population()
{
	super();
	addEventListener(Event.ADDED_TO_STAGE, init);
}
Теперь разберём код обработчика добавления на сцену

Код AS3:
private function init(e:Event):void 
{
	removeEventListener(Event.ADDED_TO_STAGE, init);
 
	rects.push(new Rectangle(200, 300, 150, 20)); //добавляем 2 препятствия
	rects.push(new Rectangle(200, 100, 250, 20));
 
	for (var i:int = 0; i < populationCount; i ++)
	{
		population.push(new Entity()); //создаём populationCount новых особей
		population[i].x = Main.W / 2;
		population[i].y = Main.H - 100;
		population[i].mutate(); //разнообразим наше население
		addChild(population[i]); 
	}
 
	graphics.beginFill(0xFF2222); 
	graphics.drawCircle(target.x, target.y, 3); //рисуем целевую точку
	for (i = 0; i < rects.length; i ++)
		graphics.drawRect(rects[i].x, rects[i].y, rects[i].width, rects[i].height); //рисуем препятствия
	graphics.endFill();
}
Теперь метод обновления кадра.

Код AS3:
public function update(deltaS:Number):void
{
	if (deltaS > 0.1) //небольшой трюк для обработки ускорения и лагов, а также выход из неактивного состояния
	{
		var numEnters:int = deltaS / 0.1; //считаем кол-во частей по 100 мс в разнице между кадрами
		for (var i:int = 0; i < numEnters; i ++)
			update(0.1); //обновляем столько раз с частями по 100 мс
		update(deltaS - 0.1 * numEnters); //обновляем с остатком мс
		return; //выходим из функции
	}
 
	for (var i:int = 0; i < population.length; i ++) 
	{
		population[i].update(deltaS); //обновляем население
		for (var j:int = 0; j < rects.length; j ++) //удаляем тех, кто столкнулся с препятствиями
			if (rects[j].contains(population[i].x, population[i].y))
			{
						removeChild(population[i]);
						population.splice(i, 1);
						break;
			}
	}
	lifetime += deltaS; 
	if (lifetime > generationLifetime) //если жизнь поколения больше установленной нами
	{
		lifetime = 0; //сброс
		calcFitness(); //считаем для каждой особи соответствие (fitness)
 
		totalWeights = 0; //считаем сумму всех весов
		for each(var e:Entity in population)
		{
			totalWeights += e.fitness;
			removeChild(e);
		}
 
 
		var e1:Entity = pickOne(); //отбираем родителей нового поколения
		var e2:Entity = pickOne(); 
 
		population = new Vector.<Entity>();
		for (var i:int = 0; i < populationCount; i ++)
		{
			var child:Entity = e1.clone(); //создаём новую особь с днк особи 1
			child.crossbreed(e2); //скрещиваем её с особью 2
			child.mutate(); //вызываем случайные мутации
			addChild(child);
			child.x = stage.stageWidth / 2;
			child.y = stage.stageHeight - 100;
			population.push(child);
		}
		generation ++;
	}
}
Полный листинг кода класса Population

Код AS3:
package com.zackmercury.test 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	/**
	 * ...
	 * @author ZackMercury
	 */
	public class Population extends Sprite 
	{
		public var populationCount:int = 200;
 
		private var population:Vector.<Entity> = new Vector.<Entity>();
		public var generation:int = 0;
		private var generationLifetime:int = 10;
		public var lifetime:Number = 0;
		public var minDistance:Number = Number.MAX_VALUE;
 
		private var target:Point = new Point(400, 50);
 
		private var totalWeights:Number;
		private var rects:Vector.<Rectangle> = new Vector.<Rectangle>();
 
		public function Population()
		{
			super();
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			rects.push(new Rectangle(200, 300, 150, 20));
			rects.push(new Rectangle(200, 100, 250, 20));
 
			for (var i:int = 0; i < populationCount; i ++)
			{
				population.push(new Entity());
				population[i].x = 640 / 2;
				population[i].y = 480 - 100;
				population[i].mutate();
				addChild(population[i]);
			}
 
			graphics.beginFill(0xFF2222);
			graphics.drawCircle(target.x, target.y, 3);
			for (i = 0; i < rects.length; i ++)
				graphics.drawRect(rects[i].x, rects[i].y, rects[i].width, rects[i].height);
			graphics.endFill();
		}
 
		private function calcFitness():void
		{
			for (var i:int = 0; i < population.length; i ++)
			{
				var pos:Point = new Point(population[i].x, population[i].y);
				if (Point.distance(pos, target) < minDistance) minDistance = Point.distance(pos, target);
				population[i].fitness = Math.pow(1 / Point.distance(pos, target), 8);
			}
		}
 
		private function pickOne():Entity
		{
			var i:int = 0;
			var r:Number = Math.random();
			while (r > 0)
				r -= population[i++].fitness / totalWeights;
			i--;
			return population[i];
		}
 
		public function update(deltaS:Number):void
		{
			if (deltaS > 0.1)
			{
				var numEnters:int = deltaS / 0.1;
				for (var i:int = 0; i < numEnters; i ++)
					update(0.1);
				update(deltaS - 0.1 * numEnters);
				return;
			}
 
			for (var i:int = 0; i < population.length; i ++)
			{
				population[i].update(deltaS);
				for (var j:int = 0; j < rects.length; j ++)
					if (rects[j].contains(population[i].x, population[i].y))
					{
								removeChild(population[i]);
								population.splice(i, 1);
								break;
					}
			}
			lifetime += deltaS;
			if (lifetime > generationLifetime)
			{
				lifetime = 0;
				calcFitness();
 
				totalWeights = 0;
				for each(var e:Entity in population)
				{
					totalWeights += e.fitness;
					removeChild(e);
				}
 
 
				var e1:Entity = pickOne();
				var e2:Entity = pickOne();
 
				population = new Vector.<Entity>();
				for (var i:int = 0; i < populationCount; i ++)
				{
					var child:Entity = e1.clone();
					child.crossbreed(e2);
					child.mutate();
					addChild(child);
					child.x = stage.stageWidth / 2;
					child.y = stage.stageHeight - 100;
					population.push(child);
				}
				generation ++;
			}
		}
	}
 
}
Класс Main

Код AS3:
package com.zackmercury.test
{
	import com.bit101.components.InputText;
	import com.bit101.components.Label;
	import com.bit101.components.PushButton;
	import com.bit101.components.Slider;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.getTimer;
	/**
	 * ...
	 * @author ZackMercury
	 */
	public class Main extends Sprite 
	{
		public static const W:int = 640, H:int = 480;
 
		private var lastTick:int = 0;
		private var population:Population;
		private var lbl:Label;
		private var speed:Number = 1;
 
		public function Main() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			addEventListener(Event.ENTER_FRAME, update);
			population = new Population();
			addChild(population);
 
			lbl = new Label(this, 0, 0, "");
			var edit1:InputText = new InputText(this, 10, 45, population.populationCount.toString(), function(e:Event)
			{
				population.populationCount = (int(edit1.text)>0)?int(edit1.text):3;
			});
			var speedSlider:Slider = new Slider(Slider.HORIZONTAL, this, 10, 65, function(e:Event):void
			{
				speed = speedSlider.value;
			});
 
			speedSlider.maximum = 50;
			speedSlider.minimum = 1;
			speedSlider.value = 1;
 
		}
 
		private function update(e:Event = null):void 
		{
			var currTick:int = getTimer();
			var deltaS:Number = (currTick - lastTick) / 1000;
			population.update(deltaS * speed);
			lastTick = currTick;
			lbl.text = "Min distance:" + population.minDistance.toString() + "\n" + "Generation:" + population.generation + "\n" + "Lifetime:" + Math.round(population.lifetime*100)/100;
		}
	}
}
Здесь я использовал библиотеку MinimalComps.
MinimalComps_0_9_10.rar

Содержание
Всего комментариев 41

Комментарии

Старый 20.06.2017 12:09 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Кто-то должен это сказать: без демок все это превращается в какой-то скучный ноучный труд. Это же блог. Даешь по swf-ке на каждый раздел!
Старый 20.06.2017 12:14 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Zebestov, спасибо, в будущем постараюсь исправиться.
Старый 21.06.2017 12:00 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Что ты хочешь получить от этого алгоритма в итоге?
Старый 21.06.2017 12:31 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Ну, конкретно от этого я уже получил всё, что хотел В итоге я получу необходимые навыки в последовательном путешествии к эволюции нейросетей.
Старый 22.06.2017 06:10 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
А, то есть это просто для автоматическкого обучения нейронной сети. Я просто особо не углублялся в эту тему)
А какую нейронку хочешь использовать? Гугловскую?
Старый 22.06.2017 10:14 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Нет конечно, я буду сам писать код для сети.
Старый 22.06.2017 10:37 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Если есть готовые, зачем изобретать велосипед?
Старый 22.06.2017 10:42 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
С такой логикой и генетический алгоритм ни к чему, в DeepMind ведь используется Back propagation/Gradient Descent вместо эволюционных алгоритмов и ещё куча всего, уже давно написаного.
Или ты хочешь, чтобы я ничего не публиковал на эту тему? Ведь всё уже написано.
Обновил(-а) ZackMercury 22.06.2017 в 11:49
Старый 22.06.2017 12:04 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Пожелание: ML это не штуки для "новичков", подразумевается, что код уже писать люди умеют.
Давай демки SWF'ки и более краткий, но ёмкий псевдо-код или вообще просто описание, зачем и почему.
Старый 22.06.2017 13:48 Ёлочка вне форума
Ёлочка
 
Аватар для Ёлочка
ZackMercury, не слушай их! Они тебе просто завидуют! Пиши ещё да побольше!
Старый 22.06.2017 13:57 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Psycho Tiger, псевдокод уже тысячу раз написан, а охватить я хочу и новичков as well.
Чем больше людей крутится вокруг темы, тем интересней результаты мы сможем получить на выходе.
У новичков тоже могут появиться гениальные идеи
И да, ML непростая тема, но стоит постараться.
Но я добавлю псевдокод тоже, спасибо.
Обновил(-а) ZackMercury 22.06.2017 в 14:56
Старый 22.06.2017 18:54 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
С такой логикой и генетический алгоритм ни к чему, в DeepMind ведь используется Back propagation/Gradient Descent вместо эволюционных алгоритмов и ещё куча всего, уже давно написаного.
Или ты хочешь, чтобы я ничего не публиковал на эту тему? Ведь всё уже написано.
С такой логикой ты и операционку свою должен сначала написать, потом IDE, потом уже все остальное)
Просто некоторые вещи нет смысла писать с нуля. К таким вещам я отношу многие фреймворки. Но, конечно же, другое дело, когда готовые фреймворки тебе по каким-то причинам не подходят.
Ты не психуй Я поддерживаю твои начинания. Просто было интересно зачем тебе своя реализация нейронных сетей
Старый 22.06.2017 19:03 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Я ведь могу писать расширения(приложения) для ОС, я приблизительно знаю, как всё устроено и работает, я знаю, как работают фреймворки(тоесть, я мог бы написать им замену), но с нейронными сетями всё иначе, я не знаю, как они работают и как можно их улучшить. Настало развеять все сомнения, следовательно, разобраться в том, как работают нейронные сети. Сделать это проще всего написав всё с нуля.
Старый 22.06.2017 19:43 Ёлочка вне форума
Ёлочка
 
Аватар для Ёлочка
Цитата:
С такой логикой
С такой логикой и жить нет никакого смысла! Ведь люди уже жили до нас! Зачем повторяться?
Старый 23.06.2017 06:48 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
Сделать это проще всего написав всё с нуля.
На as3 писать будешь?

Цитата:
С такой логикой и жить нет никакого смысла! Ведь люди уже жили до нас! Зачем повторяться?
Вот именно поэтому, на тему смысла жизни существует так много философских трактатов)
Старый 23.06.2017 09:53 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Да, на AS3.
Старый 23.06.2017 13:56 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
Мне кажется, тебе стоит что-то вроде питона взять для таких целей.
Старый 23.06.2017 17:56 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
Мне кажется, тебе стоит что-то вроде питона взять для таких целей.
На питоне и так куча реализаций. Но каких-то существенных плюсов, в данной ситуации, я не вижу. Для него будет проще на ас3 написать, чем сначала изучить питон, а потом уже браться за нейронные сети
Старый 24.06.2017 12:35 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Перейти в интерпретируемый язык вместо транслируемого? Зачем?
Даже если я немного помню основные аспекты Python, чем он лучше?
Мне уж удобней на С++ писать, чем на Python.
Старый 24.06.2017 14:23 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Недавно кое-что надумал брутфорснуть. Так вот закончилось тем, что JavaScript работал существенно быстрей AIR, который в свою очередь работал быстрей Flash в релизном SA плеере. Так что ;)
Старый 24.06.2017 21:10 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Интересно, кому будет не лень ставить Python для загрузки и просмотра демок?
P.S. это не Node.js был, случайно? Насчёт браузерного сомнения есть. Хотя всякое может быть, всё же AVM писали индусы из Adobe.
Обновил(-а) ZackMercury 24.06.2017 в 23:15
Старый 26.06.2017 08:23 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
Недавно кое-что надумал брутфорснуть. Так вот закончилось тем, что JavaScript работал существенно быстрей AIR, который в свою очередь работал быстрей Flash в релизном SA плеере. Так что
Это давно известно. JS работает в среднем в 4 - 5 раз быстрее флеша. Где-то на са сайте OpenFL есть JS и флеш демки одних и тех же программ. Разница в скорости колоссальная, в пользу JS ессесно)
Цитата:
P.S. это не Node.js был, случайно? Насчёт браузерного сомнения есть. Хотя всякое может быть, всё же AVM писали индусы из Adobe.
Не не, речь именно о браузерном. JS для браузера уже намного круче флеша, а с новыми стандартами EcmaScript уже поддерживаются классы (хотя пока фейковые, ибо не все браузеры поддерживают полноценные)
Старый 26.06.2017 12:46 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Да, речь о браузерном JavaScript.
Старый 26.06.2017 19:30 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Перейти в интерпретируемый язык вместо транслируемого?
Не в тему, но любопытно: транслируемый значит компилируемый?


И да, питон я не люблю, но он лучше AS3 примерно всем.
Старый 26.06.2017 21:22 Korchy вне форума
Korchy
 
Аватар для Korchy
Цитата:
питон я не люблю, но он лучше AS3 примерно всем.
Приходится сейчас писать на питоне как раз.
Код AS3:
var a:String = 'Hello';
for (var a:uint = 0; a < 10; a++) {
	trace(a);
}
trace(a);
на выходе получаем "13 Error: A conflict exists with definition a in namespace internal"

Код:
a = 'Hello'
for a in range(10):
    pass
print(a)
на выходе получаем:
"9"

в общем, мне не кажется, что python лучше AS3 ((
Старый 26.06.2017 22:44 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Цитата:
транслируемый значит компилируемый?
Точно не скажу, но часто видел словосочетание "трансляция в байт-код", в том числе на странице вики Java.
На странице Википедии AS пишется "компиляция в байт-код".
Возможно, это взаимозаменяемые, но я бы хотел различать программы, выполняемые через байт-код и через машинный код, поэтому я не нашёл ничего лучше, как использовать "транслируемые".

Код:
a = 'Hello'
for a in range(10):
    pass
print(a)
одна из причин не любить скриптовые языки - ужасно с точки зрения отладки.
Старый 27.06.2017 06:02 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
в общем, мне не кажется, что python лучше AS3 ((
Чем? Тем что есть блочная видимость переменных? Слабоват аргумент, не?
Хотя как по мне, так это очередное сравнение горячего и соленого.
Старый 27.06.2017 09:51 Korchy вне форума
Korchy
 
Аватар для Korchy
Цитата:
Тем что есть блочная видимость переменных?
Тем, что стрелять по ногам в питоне гораздо проще. Это я привел краткий пример. А когда подобное разнесено на три страницы кода, додумывать почему на выходе получается совсем не то, что ожидалось не очено приятно.
А цикл вообще не считается официальным блоком.
Старый 27.06.2017 14:08 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
но я бы хотел различать программы, выполняемые через байт-код и через машинный код,
А зачем? Абстракции и были созданы для того, чтобы программист их не различал.
Цитата:
одна из причин не любить скриптовые языки - ужасно с точки зрения отладки.
Ну как бы ээ.. Причём тут скриптовый язык? Отсутствие строгой типизации? Если речь про то, что при компиляции эта "проблема" (проблема ли?) вылезет наружу, то любой линтер укажет на проблему в реальном времени при написании кода (ШОК).
Если говорить за "реальную" жизнь, а не в таких синтетических примерах, то:
1) Три страницы кода, что шарят одну локальную переменную – вот это "не очень приятно", а не то что переменную можно полностью переопределить.
2) "Стрелять по ногам проще" это в принципе плохая идиома. Есть сделка: гибкость против "безопасности". Инициализируя и меняя длину массивов мало кто думает о таком побочном эффекте, как выделение памяти. В каких-то "исключительных" случаях это настолько опасно, что может заставить ОС убить программу, но в подавляющем большинстве это настолько удобно не думать об этом, что мы и не думаем.
3) `a` – это ужасное имя для переменной. Выдавая "нормальные" имена очень сложно получить конфликт где-бы то ни было.
4) Чем "жирнее" простыня кода – тем больше на неё уходит тестов. Не поверю, что ни один тест не завалится, если у "важной" переменной вдруг неожиданно изменится значение на другое.
Старый 27.06.2017 16:18 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
Тем, что стрелять по ногам в питоне гораздо проще. Это я привел краткий пример. А когда подобное разнесено на три страницы кода, додумывать почему на выходе получается совсем не то, что ожидалось не очено приятно.
Использовать одинковые имена переменных для переменных разного типа, или даже просто служащих разным целям, ровно как и односложные названия переменных - это уже сам по себе очень плохой подход. Тут даже область видимости ни при чем. Мне лично иногда хочется отрубить руки тем кто пишет вот так:
Код AS3:
BufferedReader br = bew BufferedReader()
Array a = []..
... и т.д.
и с этим кодом потом приходится работать
Старый 27.06.2017 16:24 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
caseyryan, фишка в том, что ты иногда можешь не заметить, как используешь одинаковые имена переменных, а потом ищи, в чём проблема.
Как вот вчера я пытался parent у наследника Sprite объявить, забыв про свойство DO.
Старый 27.06.2017 19:45 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
caseyryan, фишка в том, что ты иногда можешь не заметить, как используешь одинаковые имена переменных, а потом ищи, в чём проблема.
У меня так не бывает. Я давно себе привычку выработал создавать разные переменные для разных задач. Сейчас же не век 8-битных технологий, где за каждый кусочек памяти бились
Старый 28.06.2017 09:32 Korchy вне форума
Korchy
 
Аватар для Korchy
Ну, давайте синтетический пример разбирать. За несоответствие нотациям еще поругать мжно ) Естественно в реальной ситуации, откуда был взят пример, был другой код и переменные назывались не "а" и не "b". И зачем тогда в других языках сделаны подобные проверки, раз все решается тестами и стилем? Даже если "я бы никогда", такое вполне может сделать другой программист, код которого придется разбирать вам. Впрочем, ок, питон - няшка и все такое )
Старый 28.06.2017 10:23 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Всё решается линтером, который укажет на возможную ошибку, а ошибка это или нет – решать уже тому, кто пишет код.
В этом вся и разница – в гибкости и тем, что можно вытворять в питоне, но нельзя в АС3.
Я вообще Ruby люблю. Что там можно наворотить вообще ни в какое сравнение не идёт с питоном, но эта гибкость позволяет вытворять потрясающие штуки.
Старый 28.06.2017 11:57 Korchy вне форума
Korchy
 
Аватар для Korchy
А я по си грущу. Возможно современные тенденции гибкости просто не для такого слоупока, как я )
Старый 28.06.2017 12:27 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Гибкость то такое Типизированные языки гораздо легче читаются(не считая Pascal/Delphi) + гораздо быстрее выполняются
Старый 28.06.2017 14:16 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
ZackMercury, ты уверен что ты хоть когда-нибудь писал на не типизированных языках?
Тем не менее, я понял о чём ты.
Pascal/Delphi - он прекрасно читается (субъективно), но так-же многословен как и AS3.
Ну и в целом - "легче читаются" - я б очень поспорил. C++ со всем его многообразием конструкций читается очень тяжело, в свою очередь тот-же JS, Python и PHP мне "заходят" моментом.
Старый 28.06.2017 14:23 ZackMercury вне форума
ZackMercury
 
Аватар для ZackMercury
Ну, С++ читается тяжело не потому, что он типизированный, а из-за своеобразной логики его авторов.
Давайте лучше поговорим о Java, или представим, что в JS вдруг появилось полноценное ООП и типизация.
Вы бы предпочли остаться на нетипизированном JS, или перешли бы на типизированный?
Старый 28.06.2017 14:26 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
ZackMercury - JS и так типизированный) Я ж тебе написал выше.

UPD:

Языки бывают типизированные и не типизированные. C не типизированными языками "в быту" мало кто сталкивается. Типизированные, в свою очередь делятся на статические и динамические, явные и неявные, строгие и нестрогие.

Судя по всему, типизированным ЯП ты называешь язык с явной статической типизацией, например C++ или C#. JS - же, является неявным динамически типизированным языком, как и Python, как и Ruby (с последним могу ошибаться, Тигра, думаю меня поправит).
Обновил(-а) FlashRus 28.06.2017 в 14:55
Старый 28.06.2017 15:30 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Всё так.

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

Попробуйте ради интереса, по хардкору, пописать на лиспе с месяцок, а затем взять любой современный функциональный язык с "более прикладным" применением. (плагины для емакса не в счёт ). Так вот, и, собственно, напишите что-нибудь, что паралелится, и потом то же самое на сях. Прочтите и подумайте, что читать проще. С удивлением обнаружите, что функциональщина что раньше казалась нечитаемой и сложной стала очень проста, работает очень быстро, паралеллится по "дефолту", а в паралелльное исполнение на эмперативной языке вызывает слёзы и желание открыть кофешоп, чтобы больше такого не видеть.
Старый 28.06.2017 16:07 caseyryan вне форума
caseyryan
 
Аватар для caseyryan
Цитата:
И зачем тогда в других языках сделаны подобные проверки, раз все решается тестами и стилем?
Зачем вообще сделаны другие языки? Можем начать с этого.
У всех свои особенности. А на python можно игру для браузера запилить?
А JS взять. Там тоже у var такая же область видимости как в as3. Для этого в новых версиях придумали let. Получается, что JS тоже хуже, чем python.
Это все к тому, что неправильно это, говорить что язык лучше, опираясь только на какой-то простенький пример с областью видимости переменной
Цитата:
Не совсем, я имел в виду оба явных статически и динамически типизированные, например, С++, AS3, C#, Java, и неважно, строгая ли типизация или нестрогая. Читать намного проще.
Читать не проще. Проще посмотреть свойства нединамических объектов, так как они известны еще до компиляции.
 

 


Часовой пояс GMT +4, время: 11:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.