Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как бы скоро не пришлось писать на Dart, TypeScript ... (https://javascript.ru/forum/offtopic/42980-kak-skoro-ne-prishlos-pisat-na-dart-typescript.html)

kobezzza 13.12.2013 13:17

Цитата:

Сообщение от nerv_ (Сообщение 286400)
Пожалуйста, расскажи мне о "впечатляющих перспективах развития JS" :)

Новшества добавляемые в ECMAScript6 - это заимствования из других языков, вроде Python и Ruby. Перенимать ещё многое можно.

Цитата:

Сообщение от nerv_ (Сообщение 286400)
Можешь перечислить 3 самые острые надуманные проблемы, которые "лечатся соглашениями", и еще 3, кот. нивелирует новый стандарт?

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

function Foo() {}
var foo = new Foo;

foo instanceof Foo; // true
Foo.prototype = {};

foo instanceof Foo; // false


Лечится соглашением: не делайте так, описывайте прототипы, как если бы вы описывали класс, т.е. статически и спокойно сравнивайте типы по instanceof.


В ECMA6 лечится сахаром в виде class

2) Отсутствие модулей приводит к захламлению глобального пространства.

Лечится соглашением: используйте анонимные самовызываемые функции, свойства объектов как пространства имён и паттерн "модуль".

В ECMA6 лечится сахаром module

3) Плохая поддержка автокомплита и статического анализа в ИДЕ, т.к. нет явной декларации типов.
Лечится соглашением об обязательном использовании JSDoc.

4) JavaScript жутко медленный, ужас!
Не складывайте строки с числами, не меняйте динамически прототипы во время исполнения, не вызывайте eval внутри eval и вы удивитесь, как быстро может работать ваш код.

5) Громоздкий старомодный синтаксис функций, функциональная область видимости.
ArrowFunction, let ...

Могу долго перечислять.

Цитата:

Сообщение от nerv_ (Сообщение 286400)
Мне, почему то, монополия JS не кажется жуткой. Жутким кажется 3+ языков в браузере, в кот. придется разбираться.

Зачем разбираться в 3-х?


Цитата:

Сообщение от nerv_ (Сообщение 286400)
правильная мысль, т.к. я могу писать в простом блокноте

Попиши на Яве или С# в блокноте. Явная декларация типов для того и создана, чтобы IDE могла вам помогать. В Dart тоже явная декларация типов, и тоже с целью поддержки в ИДЕ. Если ты не будешь пользоваться ИДЕ под Дарт, то тебя он будет только бесить.

kobezzza 13.12.2013 13:19

Цитата:

Сообщение от DjDiablo (Сообщение 286399)
Замыкания в Dart таки есть
Function say(String something) { // "Function" is an optional return type annotation
  return () => print(something);
}

void main() {
  var talk = say("How are you?"); // Function say(...) closes over variable talk. 
  talk(); // prints "How are you?"
}

Не уследил, когда последний раз игрался с ним - то не было:)

monolithed 13.12.2013 13:20

Цитата:

Сообщение от DjDiablo
А чем тебе asm.js не альтернатива elf ? (ну кроме веса конечно)

Как это вообще связано? ;)

DjDiablo 13.12.2013 13:27

Цитата:

Сообщение от monolithed (Сообщение 286406)
Как это вообще связано? ;)

Ну пиши на любом языке, потом компилируй в asm.js, подключай и используй. Или тебе прям elf формат нужен ?

kobezzza 13.12.2013 13:28

Цитата:

Сообщение от DjDiablo (Сообщение 286399)
Ну есть вообще то виртуальная dart машина, и сборка хромиум с интегрированной машиной. Другое дело что вряд ли она где то кроме хрома появится.

Я знаю, только где бенчмарки о сравнении скажем корректного JS (можно даже asm) и VM Dart?

Цитата:

Сообщение от DjDiablo (Сообщение 286399)
Проблемы языка не должна лечить IDE, и заменять конструкции языка комментами я бы не сказал что это ВАУ как правильно.

Многих раздражает писать явные декларации типов (ведь скриптовые языки часто юзаются в повседневных задачах, где эта многословность только мешается). Самым правильно решением имхо является как например в ActionScript 3: хочешь пиши, хочешь не пиши. Я не вижу преград, почему в JS не смогут добавить опциональную поддержку типов данных, т.е. новый язык для этого лепить не надо.

kobezzza 13.12.2013 13:48

nerv_, я ответил на твои вопросы, а теперь ты назови 3 фичи Дарта, которые не могут быть эволюционно добавлены ЖС и являются фатальным недостатком, из-за которого необходимо пилить новый язык, новую VM, новую IDE, новые фреймворки ?) Просто гугл любит повелосипедить :)

DjDiablo 13.12.2013 13:53

Цитата:

Сообщение от kobezza
Самым правильно решением имхо является как например в ActionScript 3: хочешь пиши, хочешь не пиши.

Угу клево мне тоже нравится. В typescript так, можно опускать тип.

Цитата:

я ответил на твои вопросы, а теперь ты назови 3 фичи Дарта, которые не могут быть эволюционно добавлены ЖС
Осмелюсь предположить что дело не в том чего нельзя добавить в JS а в том чего из него нельзя убрать. Действительно добавить можно что угодно, а вот выпилить мешает обратная совместимость.

kobezzza 13.12.2013 13:57

Цитата:

Сообщение от DjDiablo (Сообщение 286426)
Угу клево мне тоже нравится. В typescript так, можно опускать тип.

Там это немного криво сделано. Например я не могу сделать так:
Node.prototype.foo = function () {
};


Т.к. в стандартной либе ТС описан интерфейс Node и чтобы ввести новый метод, я должен сначала расширить тот интерфейс. Конечно можно удалить файл описания стандартных типов, но тогда лишимся автокомпилита.

Они говорят, что любой ЖС валиден ТС. Берём Mootools, подключаем без специального плагина и всё ломается :)

Ваще у ТС ещё много проблем. Когда он вышел я с радостью бросился его юзать, но через недели 2 положил на полку. Я не говорю, что он плохой, а просто он ещё слишком молодой, а когда я узнал про фичи ECMA6 то понял, что и не хочу с JS уходить.

Цитата:

Сообщение от DjDiablo (Сообщение 286426)
Осмелюсь предположить что дело не в том чего нельзя добавить в JS а в том чего из него нельзя убрать. Добавить можно что угодно, а вот выпилить мешает обратная совместимость.

'use strict'; 'use asm'; и т.д.

Так например уже выпилена возможность объявлять переменные без var, arguments.callee, with и т.д. и никто же не умер.

Дзен-трансгуманист 13.12.2013 14:10

Цитата:

Сообщение от DjDiablo
Осмелюсь предположить что дело не в том чего нельзя добавить в JS а в том чего из него нельзя убрать. Просто логически если подумать то добавить можно что угодно, а вот выпилить мешает обратная совместимость.

Цитата:

Сообщение от kobezzza
'use strict'; 'use asm'; и т.д.

Ну да, asm.js выпилил из языка почти всё, оставив очень ограниченное подмножество. Хотя ничего не мешает написать внутри модуля var a = 'b', всего-то валидация будет забракована и плюшек AOT-компиляции мы не получаем, но код все равно будет работать.
То есть, как бы расширение языка поперек, а не вдоль. Не столько эволюция базы, сколько агрегация субстандартов.

monolithed 13.12.2013 14:10

Цитата:

Сообщение от kobezzza
Новшества добавляемые в ECMAScript6 - это заимствования из других языков, вроде Python и Ruby

Советую всем наконец познакомиться с Lua :)

Цитата:

Сообщение от kobezzza
Не уследил, когда последний раз игрался с ним - то не было

Ага:

new List<int>.generate(10, (final int index) => index + index); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

monolithed 13.12.2013 14:15

Цитата:

Сообщение от DjDiablo
Ну пиши на любом языке, потом компилируй в asm.js, подключай и используй. Или тебе прям elf формат нужен ?

Зачем транслировать код из Lua в JS, а потом еще в ASM.js, который в свою очередь будет транслироваться в байт-код, если можно сразу получить байт-код? ;)

kobezzza 13.12.2013 14:17

Цитата:

Сообщение от monolithed (Сообщение 286435)
Зачем транслировать код из Lua в JS, а потом еще в ASM.js, который в свою очередь будет транслироваться в байт-код, если можно сразу получить байт-код? ;)

Ну смари, сидишь на работе, к тебе босс подходит и спрашивает: "почему ничего не делаешь?", а ты ему честно в ответ "я компилирую":D

monolithed 13.12.2013 14:26

Цитата:

Сообщение от kobezzza
Ну смари, сидишь на работе, к тебе босс подходит и спрашивает: "почему ничего не делаешь?", а ты ему честно в ответ "я компилирую"

Ты же не весь проект будешь пересобирать, а только какую-то динамическую библиотеку, предполагаю что это будет занимать не больше 2-х секунд.

А так сейчас, жизнь и без этого не сладка, учитывая всякеские html/css/js препроцессоры, линтеры, минификаторы, сборщики, и пр. штуки.

kobezzza 13.12.2013 14:36

Цитата:

Сообщение от monolithed (Сообщение 286437)
А так сейчас, жизнь и без этого не сладка, учитывая всякеские html/css/js препроцессоры, линтеры, минификаторы, сборщики, и пр. штуки.

Как и везде:) Мне Братишка рассказывал, как у них в Яве проекты собираются (разумеется я имею ввиду большие проекты с километровыми слоями интеграций xslt и прочего) и я понял, что у нас не всё так уж и плохо:)

DjDiablo 13.12.2013 14:38

Цитата:

Зачем транслировать код из Lua в JS, а потом еще в ASM.js,
Если ты сначало откомпилишь LUA в JS то в дальнейшем нет смысла делать из него asm.js :) Ибо все что написано на JS работает быстрее без компиляции в asm.js :)

Цитата:

если можно сразу получить байт-код?
Байт код для intel 32, или байткод для intel 64 ? И что делать с ARM архитектурой ?

Цитата:

Сообщение от kobezza
'use strict'; 'use asm'; и т.д.

Это вариант.

monolithed 13.12.2013 14:41

Цитата:

Сообщение от DjDiablo
Байт код для intel 32, или байткод для intel 64, а что делать с ARM архитектурой ?

В NaCl вроде с этим справились.

Цитата:

Сообщение от kobezzza
в Яве проекты собираются

Java это отдальный разговор :)

Дзен-трансгуманист 13.12.2013 14:51

Цитата:

Сообщение от DjDiablo
Байт код для intel 32, или байткод для intel 64 ? И что делать с ARM архитектурой ?

Байт-код, как правило, аппаратно независим. Это как язык, только для другой программы, а не для человека. Считай, готовый набор инструкций для компилятора или VM.

kobezzza 13.12.2013 14:55

В NaCL юзается LLVM. Я так понимаю, что он поддерживает множество платформ.

DjDiablo 13.12.2013 14:59

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 286448)
Байт-код, как правило, аппаратно независим. Это как язык, только для другой программы, а не для человека.

Насколько я знаю ELF под конкретную архитектуру компилируется.
А в NaCL юзается LLVM.

kobezzza 13.12.2013 15:04

А вот кстати, можете объяснить:
Про GCC (GNU Compiler Collection) я читал, что он работает по принципу: сначала транслирует в ассемблер, а затем в машинный код под конкретную архитектуру.

А как работает Clang? Т.е. он генерит байт код для LLVM? А что есть LLVM, т.е. некая VM которая по дефолту встроена в ОСь или что?

Дзен-трансгуманист 13.12.2013 15:11

Цитата:

Сообщение от kobezzza
сначала транслирует в ассемблер

:blink:
Интересно, почему не в хаскель? (иронизирую)

From Source to Binary: The Inner Workings of GCC

kobezzza 13.12.2013 15:16

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 286458)
:blink:
Интересно, почему не в хаскель? (иронизирую)

From Source to Binary: The Inner Workings of GCC

Прям ща держку книжку по С, издательство O`Realy (Дэвид Гриффитс, Дон Гриффитс), купил в этом году, в книжке описывается стандарт С11, C99 и Ansi C, как компилятор выбран именно GCC.

1) Прекомпиляция исходника: добавление заголовочных файлов указанных с помощью #include
2) Трансляция в ассемблер
3) Ассемблирование: генерирование объектного кода
4) Линковка: сбор всех файлов вместе

Я не думаю, что в O`Realy допустили бы столь грубую неточность.

Дзен-трансгуманист 13.12.2013 15:24

kobezzza,
А, ну как промежуточное звено перед объектным кодом, возможно.

kobezzza 13.12.2013 15:25

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 286466)
kobezzza,
А, ну как промежуточное звено перед объектным файлом, возможно.

Ну я бы не стал писать такие вещи, если бы сам о них не узнал из достоверных источников или не убедился на практике:)

Дзен-трансгуманист 13.12.2013 15:40

kobezzza,
Не, я немного не понимаю насчет, сложилось ли так исторически, или этот шаг строго необходим по другим причинам. Ибо сам с ассемблером не пересекался.
Может, я просто туплю сегодня. :)

monolithed 13.12.2013 16:11

Цитата:

Сообщение от kobezzza
Прям ща держку книжку по С, издательство O`Realy (Дэвид Гриффитс, Дон Гриффитс), купил в этом году, в книжке описывается стандарт С11, C99 и Ansi C, как компилятор выбран именно GCC.

Где ты это нашел?

В бы рекомендовал начать в такой последовательности:

The C++ Programming Language — Bjarne Stroustrup
C++ for Real Programmer — Jeff Alger
The Art of C++ — Herbert Schildt
Algorithms in C++ — Robert Sedgewick
Design Patterns: Elements of Reusable Object-Oriented Software — Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
C++ Gotchas. Aoiding Common Problems in Coding and Design — Stephen C. Dewhurst
C++ Templates: The Complete Guide — David Vandevoorde, Nicolai M. Josuttis
The CERT C Secure Coding Standard — Robert C. Seacord
More Effective C++: 35 New Ways to Improve Your Programs and Designs — Scott Meyers
Effective C++: 55 Specific Ways to Improve Your Programs and Designs — Scott Meyers
C++ Coding Standards — Herb Sutter, Andrei Alexandrescu
C++ Concurrency in Action: Practical Multithreading — Anthony Williams
Ну и со временем начать мониторить станадрат )

PS: на сколько я помню, в некоторых книгах есть неточности и опечатки, так что будьте внимательны и начинайте именно с первой.

kobezzza 13.12.2013 17:21

monolithed, мне был нужен С, а не С++:)

monolithed 13.12.2013 17:28

Цитата:

Сообщение от kobezzza
мне был нужен С, а не С++

Или тебе доставляет удовольствие искать в гуле как сконтанировать строку? :D

kobezzza 13.12.2013 17:37

Цитата:

Сообщение от monolithed (Сообщение 286487)
Или тебе доставляет удовольствие искать в гуле как сконтанировать строку? :D

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

GLSL - язык шейдеров, по сути С
Cuda C - возможность юзать GPU видюх NVidia
и т.д.

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

monolithed 13.12.2013 17:43

Цитата:

Сообщение от kobezzza
но выучить его достаточно просто.

А чем С++ не угодил, он же включает в себя С?
Или тебе нравится определять все переменные в начале функции? :D

kobezzza 13.12.2013 17:47

Цитата:

Сообщение от monolithed (Сообщение 286493)
А чем С++ не угодил, он же включает в себя С?

Ну по первых не всякий С - это С++, я уже сам лично в этом убедился, но это ладно, главное, что мне просто не нужен сейчас С++ (вернее нет времени) + как я уже говорил знание фишек С++ мне не поможет в GLSL, т.к. их там нет:)

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

kobezzza 13.12.2013 17:49

Цитата:

Сообщение от monolithed (Сообщение 286493)
Или тебе нравится определять все переменные в начале функции? :D

В С переменные можно объявлять где угодно:)

Дзен-трансгуманист 13.12.2013 17:57

Цитата:

Сообщение от kobezzza
но выучить его достаточно просто

Как выстрелить себе в ногу, ты точно быстро выучишь.
Но monolithed прав, на С++ это можно сделать куда более кроваво и изощренно. :D

monolithed 13.12.2013 18:22

Цитата:

Сообщение от kobezzza
В С переменные можно объявлять где угодно

C89/90 требуют этого.

А вот этот пример в C99, не скомпилится (без особых флагов):

for (int i = 0; i < 10; i++) { ...

Нужно так:
int i; 
for (i = 0; i < 10; i++) { ...

monolithed 13.12.2013 18:23

Цитата:

Сообщение от Дзен-трансгуманист
на С++ это можно сделать куда более кроваво и изощренно

Как говорит Страуструп, на С++ острелишь :D

kobezzza 13.12.2013 18:30

Цитата:

Сообщение от monolithed (Сообщение 286504)
C89/90 требуют этого.

На дворе С14:)
Твой пример у меня без всяких флагов работает, юзаю Clang для компиляции.

monolithed 13.12.2013 18:50

Цитата:

Сообщение от kobezzza
На дворе С14

Ты наверно имел виду С11 ?

Цитата:

Сообщение от kobezzza
Твой пример у меня без всяких флагов работает, юзаю Clang для компиляции.

Вероятно потому что:

➜ clang -v
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

kobezzza 13.12.2013 18:53

Цитата:

Сообщение от monolithed (Сообщение 286509)
Ты наверно имел виду С11 ?

Вышел же 14 стандарт, или это только для С++ ?
http://habrahabr.ru/post/184606/

monolithed 13.12.2013 18:55

Цитата:

Сообщение от kobezzza
Вышел же 14 стандарт, или это только для С++ ?

C++14 пока даже финального драфта нет, но Сlang и GCC49 уже поддерживают его большую часть.
Про С14 я не слышал.

Дзен-трансгуманист 13.12.2013 18:56

Цитата:

Сообщение от monolithed
Как говорит Страуструп, на С++ острелишь

Моя первая нога. Ща уже точно не помню, но примерно так...

CFile * OpenFile()
{
    CFile file("123.txt", CFile::modeRead);
    return &file;
}

void main(int argc, char *argv[]) 
{
    unsigned char * pData = new unsigned char[100];
    CFile * textFile = OpenFile();
    // тут еще какой-то код, вызовы)))))
    textFile->Read(pData, 100);
    // а тут по идее вывод в консольку... но только по идее
}

:lol:


Часовой пояс GMT +3, время: 23:55.