|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Ненормальное программирование в InterSystems Caché Обалдеть, всегда о таком в тайне мечтал - почему бы теоретически нельзя расширять язык COS произвольными вещами. Дмитрий настоящий зверюга - такую вещь раскопал! Ну, может для кого-то она и была очевидной, для меня оказалась открытием. Интересно, можно ли расширять уже стандартный кос другими макросами &html<> или <method language=NewLanguage>? Макросы типа $$$MyMacros не нравятся, это не то. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 09:42 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Блок А.Н. Ненормальное программирование в InterSystems Caché Да. Это отличная статья. Кто хочет реализовать поддержку серверного Javascript в Caché в студии оказывается может это сделать. Возможно это сложно (и даже невозможно), но попробовать стоит ) Более того - даем грант на реализацию полноценного JS в Студии по технологии DAiMor. Есть желающие? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 12:05 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Контрпример с неоднозначностью трансляции JavaScript -> MUMPS: var a = 123; var b = 456; alert( a + b); var a = "123"; var b = "456"; alert( a + b); ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 13:23 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
ну яКонтрпример с неоднозначностью трансляции JavaScript -> MUMPS: var a = 123; var b = 456; alert( a + b); var a = "123"; var b = "456"; alert( a + b);Я такое попытался решить в моем примере, если вижу + после или перед кавычкой, то меняю его на конкатенацию "_", но с переменными такое конечно не прокатит. да, на javascript, это сработает как конкатенация, а вот в cache такое конечно уже будет сложно обработать но, это был лишь пример о возможностях каше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 13:30 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
DAiMor, ну там гораздо менее тупо надо будет делать. Особенно, когда пойдет динамическое создание свойство и методов. Вообще, задачка интересная, жаль что я js знаю постольку поскольку. У меня вопрос в другом - а как транслировать в этот серверный cache-js существующие библиотеки каше? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 13:46 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Да, пример шикарен. А что если генерировать не код на MUMPS как кросстрансляцию, а код на MUMPS как обращение к внешнему движку JavaScript для исполнения оригинального кода? http://karataev.nm.ru/cache/ekscr.html ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 13:48 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
ну я, не, по-моему совсем не то будет. Как раз фишка в кАше - замесить несколько языков не через какие-то шлюзы, а прямо над данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 13:54 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
ну яДа, пример шикарен. А что если генерировать не код на MUMPS как кросстрансляцию, а код на MUMPS как обращение к внешнему движку JavaScript для исполнения оригинального кода? http://karataev.nm.ru/cache/ekscr.html проблем сделать такое тоже не вижу, я думал реализовать и подобный подход, правда я думал сделать с NodeJS, но решил что, тогда весь смак от этого пропадает, насчет скорости доступа к данным. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 14:48 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Блок А.Н.У меня вопрос в другом - а как транслировать в этот серверный cache-js существующие библиотеки каше?Да, это основная проблема, придумать конструкции не выходящие за рамки JS, но позволяющие их интерпретировать в COS функции, глобалы, обращение к классам и прочее. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 14:50 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Блок А.Н....гораздо менее тупо надо будет делать...Не могу даже представить себе требуемый уровень интеллекта, ибо в MUMPS/COS обе конструкции вполне законны: иset a="123"+"456", и set a="123"_"456"ИМХО (не только моё)), главное в языке - это семантика, поэтому предложенный путь реализации новых языков - лишь способ создания диалектов COS, не более того. При различиях в семантике упрёмся в ограничения ядра и будем вынуждены объявить новый язык "подмножеством языка X". Сами-то вы, уважаемые коллеги, станете писать на таком языке? Много ли программистов привлёк, к примеру, Cache' Basic? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 14:56 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Alexey MaslovМного ли программистов привлёк, к примеру, Cache' Basic?Если я не ошибаюсь, то запустить программу Cache' Basic не так просто как код на COS, поэтому наверно и не прижилось. Я не предлагаю, перейти на новый язык, и в любом случае как и написал в статье это не JS это CJS, он в любом случае будет сильно отличается если его реализовать полностью. А на счет привлечения, ну скажем так Basic, все равно не столь интересный язык, и на JS пишут постоянно людей все равно больше. И опять же про совместимость, в моем варианте ее вроде чуть больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 15:08 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
DAiMorЕсли я не ошибаюсь, то запустить программу Cache' Basic не так просто как код на COSОна компилируется в OBJ-код и точно так же запускается (по Do или как $$-функция). DAiMorНасчет привлечения, ну скажем так Basic, все равно не столь интересный язык, и на JS пишут постоянно людей все равно больше.Сегодня да, но в начале нулевых, когда появился Cache' Basic, это было не совсем так (зачем бы тогда они стали заниматься Basic-ом, не только же ради Multi-Value?). DAiMorИ опять же про совместимость, в моем варианте ее вроде чуть больше.В вашем варианте совместимость с COS всяко больше, т.к. вы компилируете в INT (BAS/MVB компилируются сразу в OBJ), что, конечно же, хорошо - твёрдая основа под ногами. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 15:30 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Alexey MaslovНе могу даже представить себе требуемый уровень интеллекта, ибо в MUMPS/COS обе конструкции вполне законны: иset a="123"+"456", и set a="123"_"456"А как вы будете в таком случае транслировать a+b? Это должна быть какая-то операция, учитывающая тип данных, да и само создание констант, переменных и присвоение их друг другу должно везде учитывать типы данных. Мне кажется, даже если такой язык реализовать, потеряем в скорости Alexey Maslovглавное в языке - это семантика, поэтому предложенный путь реализации новых языков - лишь способ создания диалектов COS, не более того. При различиях в семантике упрёмся в ограничения ядра и будем вынуждены объявить новый язык "подмножеством языка X".Ну вообще-то, семантика js и m разная. Alexey MaslovСами-то вы, уважаемые коллеги, станете писать на таком языке? Много ли программистов привлёк, к примеру, Cache' Basic?Я нет. Но задача интересна для меня не с практической точки зрения. А вот среди специалистов IS такие идеи бродят (иногда до "выкинуть М"). И когда Евгений подкинул такую идею, я сразу подумал "где-то я это уже слышал". А после того, как намекнул на грант, сомневаться, что для IS это "не просто так" уже не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 17:45 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Модераторы исполняют мои просьбы до того, как я их высказываю. Спасибо :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 17:48 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
В этом плане интересна интеграция sql и каше. И если для объектов был затронут движок, то sql реализован на чистом М. А поискать менее похожие языки, чем М и SQL еще надо постараться. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 17:53 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Кстати, еще интересный факт, пока сильно в него правда не углублялся, но в качестве редактора может быть еще и веб страница. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2014, 18:09 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Я может маленько тупенький, а может просто плохо знаю JS или плохо представляю его применение в качестве серверного языка. Киньте пару условных примеров, как может происходить открытие объектов или их сохрание? Вроде у JS объектов наличие какого-то там идентификатора не обязательно. От прямой работы с глобалами отказываемся или оставляем? В каком виде оставляем - в виде каше-вставок или в JS придумываем отображение какое-нибудь? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 19:12 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Блок А.Н.Я может маленько тупенький, а может просто плохо знаю JS или плохо представляю его применение в качестве серверного языка. Киньте пару условных примеров, как может происходить открытие объектов или их сохрание? Вроде у JS объектов наличие какого-то там идентификатора не обязательно. От прямой работы с глобалами отказываемся или оставляем? В каком виде оставляем - в виде каше-вставок или в JS придумываем отображение какое-нибудь? в качестве серверного языка, это nodejs, и давно вполне успешно работает и на большом количестве проектов Да в JS, ООП, несколько посредственное, объекты не требуют наличие идентификаторов Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
этот пример конечно всего не объясняет, поэтому лучше конечно покопать инет работа с глобалами может сводится к обращению как большому массиву в JS т.е. что-то типа этого Код: javascript 1. 2. 3.
может служить аналогом на COS Код: sql 1. 2. 3. 4. 5.
Для идентификаторов в JS, символ "^" первым не допустим, может быть только "_" или "$" поэтому его можно например заменить на один из этих двух например на "_", а "$" так и оставить за функциями ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 19:29 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Хм, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 20:24 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
Нет терпения дождаться официальной ( 14422425 ) поддержки JS наряду с COS/BAS/MVB? Вариант JS->INT->OBJ-> Caché virtual machine изначально более ущербен, чем JS->CallIn (C/C++, native code). PS: Пример кода на серверном javascript, взятый из очень ранней реализации/// This class introduces and demonstrates the server-side JavaScript facility. Class JavaScript.Tutorial Extends %RegisteredObject { Property SampleProperty As %String [ InitialExpression = "SamplePropertyValue" ]; /// JavaScript can be used as the implementation language for class or instance methods of cache objects. /// To use the facility, set the language keyword on the class or instance method to 'javascript'. This /// instructs Studio to syntax check the method body as JavaScript. In previous versions of Cache, methods /// with their language set to 'javascript' implicitly ran on the client. In current versions such methods /// have to be explicitly declared by using the new 'ClientMethod' or /// 'ClientClassMethod' method introducers. Heres an example. This method won't generate any server code and /// cannot be called on the server. ClientMethod Example1() [ Language = javascript ] { // alert() is a function built into the browser, its part of the browsers intrinsic object model alert('Hello JavaScript'); } /// This method is a regular method, so code will be generated and can be run on the server ClassMethod Example2() [ Language = javascript ] { // The server side javascript implementation has an intrinsic object model rooted in the 'Cache' object. // The Console object provides basic facilities to read and write to the console ( Terminal ). In this example // we write a string to the console Cache.Console.WriteLine("Hello JavaScript"); } /// This method demonstrates passing multiple arguments to Cache.Console.WriteLine ClassMethod Example3() [ Language = javascript ] { // The Cache.Console.WriteLine() method can take a variable number of arguments. Each is written to the console // followed by a newline var x = "This",y="Multiple Arguments"; Cache.Console.WriteLine(x," is an example of ",y); } /// This method illustrates the difference between undefined in JavaScript and undefined in Cache ClassMethod Example4() [ Language = javascript ] { // Variables in javascript which are not assigned a value have the 'undefined' value. undefined is an object. // Cache does not have an undefined object so if these values are passed to cache either as method arguments // or return values from javascript methods, then Cache will treat them as undefined in the Cache sense var x; // undefined value if (x == undefined) { Cache.Console.WriteLine("x is undefined"); } var y = "defined"; // define value // Call the helper method with an undefined value. This also illustrates how to call a method in the same class. // In javascript for cache, the 'this' object inside a class method refers to the class itself, whilst an instance // method will refer to the particular instance ( more on this later ) this.HelperForExample4(x); // Call the helper method with a defined value this.HelperForExample4(y); } /// This is a helper method for example 4. Note that its written in COS and can be called from JavaScript ClassMethod HelperForExample4(pArgument) { If '$Data(pArgument) { Write "Passed Argument is undefined",! } else { Write pArgument,! } } /// This method illustrates the use of the Cache.Console.ReadLine() method ClassMethod Example5() [ Language = javascript ] { var x = Cache.Console.ReadLine(); Cache.Console.WriteLine(x); } /// This method illustrates the use of the intrinsic object Cache.Class. Think of the Class object as an 'accessor' for /// a Cache class. Cache classes appear as properties of the Cache.Class object. In the example below we are calling the /// Example4() class method on JavaScript.Tutorial. Also note the naming convention. In COS names may begin with a /// '%' character and may contain '.' characters within them. JavaScript doesn't allow those characters in names so we /// have to have a naming convention in JavaScript to refer to such COS names. In JavaScript we substitute '$' for '%' /// and '_' for '.' ClassMethod Example6() [ Language = javascript ] { Cache.Class.JavaScript_Tutorial.Example4(); } /// You can create new instances of Cache Classes by calling the %New() method on the class. Its very important to /// have a clear understanding of the lifetime of objects created from within the JavaScript environment as the behavior /// is different from Cache. When a object is created in this manner, the JavaScript environment 'owns' the object. It will /// determine when the object is going to go out of scope and its memory be reclaimed. This is due to JavaScripts deferred /// Garbage collection algorithm. If you don't care about the lifetime of objects then there is nothing special that has to /// be done, the JavaScript engine will take care of things for you. However, if you DO care about having a object go out of /// scope and have its %OnClose() method closed immediately then there is a special method that can be called. In JavaScript, /// this is the $$Close() method. Call this if you want JavaScript to force the %OnClose() to be called. ClassMethod Example7() [ Language = javascript ] { // Create an instance of JavaScript.Tutorial, %OnNew() callback ( see below ) will be called var instance = Cache.Class.JavaScript_Tutorial.$New(); // Write out the value of its SampleProperty Cache.Console.WriteLine(instance.SampleProperty); // Force the object to close, %OnClose() callback ( see below ) will be called instance.$$Close(); } /// Contrast this example with Example7. Here the object isn't closed and will only be closed when JavaScript garbage /// collects the object. If you close the terminal following Example8 you will see the %OnClose() method called before /// the process exits. ClassMethod Example8() [ Language = javascript ] { // Create an instance of JavaScript.Tutorial, %OnNew() callback ( see below ) will be called var instance = Cache.Class.JavaScript_Tutorial.$New(); // Write out the value of its SampleProperty Cache.Console.WriteLine(instance.SampleProperty); } /// You can also force ALL objects that are eligible for garbage collection to be collected by calling the /// %JavaScript.Runtime.%GarbageCollect() method ClassMethod Example9() [ Language = javascript ] { // Create an instance of JavaScript.Tutorial, %OnNew() callback ( see below ) will be called var instance = Cache.Class.JavaScript_Tutorial.$New(); // Write out the value of its SampleProperty Cache.Console.WriteLine(instance.SampleProperty); // Make instance elligible for collection instance = null; // Force a Garbage Collection Cache.Class.$JavaScript_Runtime.$GarbageCollect(); } /// This method illustrates an alternatve means of creating an object with the JavaScript 'new' command ClassMethod Example10() [ Language = javascript ] { // Create an instance with the JavaScript 'new' command var instance = new Cache.Class.JavaScript_Tutorial; // Write out the value of its SampleProperty Cache.Console.WriteLine(instance.SampleProperty); // Make instance elligible for collection instance = null; // Force a Garbage Collection Cache.Class.$JavaScript_Runtime.$GarbageCollect(); } /// This method illustrates how to open and update an instance of a persistent Cache Object. Note also enumeration of property /// names with the for/in syntax and indirect property value access with the [] syntax. ClassMethod Example11() [ Language = javascript ] { // Make sure Sample.Person is populated with sample data Cache.Class.Sample_Person.Populate(10); // Open instance number 1 var instance = Cache.Class.Sample_Person.$OpenId(1); // Display the properties for (var property in instance) { Cache.Console.WriteLine(property," = ",instance[property]); } // Expand the home address var address = instance["Home"]; for (var line in address) { Cache.Console.WriteLine(line," = ",address[line]); } // Update the name instance["Name"]="Buffy The Vampire Slayer"; // Save the object instance.$Save(); // Finished with this object instance.$$Close(); } /// Access to Cache globals is through the intrinsic Cache.Global object ClassMethod Example12() [ Language = javascript ] { // Clean up any pre-existing data Cache.Global.Kill("^JavaScript"); // Set some data, subscripts are specified by a JavaScript Array Cache.Global.Set("^JavaScript",["a"],"abba"); Cache.Global.Set("^JavaScript",["b"],"beatles"); Cache.Global.Set("^JavaScript",["c"],"clapton"); // Traversal is natural var global="^JavaScript", array = [""], key = Cache.Global.Order(global,array); while (key !="") { // We are removing the last value from the array and replacing it with the new key array.pop();array.push(key); // Test to see if data exists at this node if (Cache.Global.Data(global,array)%2) { // Yes it does, get it var data = Cache.Global.Get(global,array); // Display the data and key Cache.Console.WriteLine(key," = ",data); } else { // Just display the key Cache.Console.WriteLine(key); } // Get the next key key = Cache.Global.Order(global,array); } } /// This callback method is invoked by the <METHOD>%New</METHOD> method to /// provide notification that a new instance of an object is being created. /// /// <P>If this method returns an error then the object will not be created. /// <p>It is passed the arguments provided in the %New call. /// When customizing this method, override the arguments with whatever variables and types you expect to receive from %New(). /// For example, if you're going to call %New, passing 2 arguments, %OnNew's signature could be: /// <p>Method %OnNew(dob as %Date = "", name as %Name = "") as %Status Method %OnNew(initvalue As %CacheString) As %Status [ Private, ProcedureBlock = 1, ServerOnly = 1 ] { Write "Instance ",##this," of ",..%ClassName(1)," Created",! Quit $$$OK } /// This callback method is invoked by the <METHOD>%Close</METHOD> method to /// provide notification that the current object is being closed. /// /// <P>The return value of this method is ignored. Method %OnClose() As %Status [ Private, ProcedureBlock = 1, ServerOnly = 1 ] { Write "Instance ",##this," of ",..%ClassName(1)," Destroyed",! Quit $$$OK } } ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:41 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
servitНет терпения дождаться официальной ( 14422425 ) поддержки JS наряду с COS/BAS/MVB? Вариант JS->INT->OBJ-> Caché virtual machine изначально более ущербен, чем JS->CallIn (C/C++, native code).А в какой версии это можно проверить ? в 2014.1 ошибка компиляции ОШИБКА #5486: Неверное язык метода: JS.Test:Example11:javascript только ClientMethod, компилируется с языком javascript ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:59 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
DAiMorА в какой версии это можно проверить ?Пока ни в какой. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 11:02 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
servitНет терпения дождаться официальной ( 14422425 ) поддержки JS наряду с COS/BAS/MVB?Лично я и не жду, для меня эта задача пока из области разминки для мозга. А там поглядим :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 12:06 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
ну яКонтрпример с неоднозначностью трансляции JavaScript -> MUMPS: var a = 123; var b = 456; alert( a + b); var a = "123"; var b = "456"; alert( a + b);Что подтверждает вывод выше. С нативной поддержкой такой проблемы нет:Class test.demo [ Abstract ] { ClassMethod Test() [ Language = javascript ] { var a = 123; var b = 456; Cache.Console.WriteLine(a + b); a = "123"; b = "456"; Cache.Console.WriteLine(a + b); } }Результат: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 12:46 |
|
Ненормальное программирование
|
|||
---|---|---|---|
#18+
servit, А покажите другой код этого класса? Поддержка точно нативная? А поддержка создания методов есть? Кстати, откуда у вас эта версия каше? В WRC нет RC-версий. Вы имеете доступ к девелоперским версиям? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 13:20 |
|
|
start [/forum/topic.php?fid=39&msg=38646525&tid=1556884]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 275ms |
total: | 421ms |
0 / 0 |