Зарегистрироваться | Поиск |
Результаты опроса: К какому типу Вы относите язык X++ ? | |||
К компилируемому | 15 | 45.45% | |
К интерпретируемому | 11 | 33.33% | |
Затрудняюсь ответить | 7 | 21.21% | |
Голосовавшие: 33. Вы ещё не голосовали в этом опросе |
|
Опции темы |
20.04.2009, 17:01 | #1 |
Боец
|
К какому типу языка Вы относите X++ ?
Родилось здесь
|
|
20.04.2009, 18:21 | #2 |
NavAx
|
Думаю, что ближе всего что это интерпретатор компилирующего типа. Проголосовал.
Цитата:
Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина). Достоинством таких систем является большее быстродействие выполнения программ (за счёт выноса анализа исходного кода в отдельный, разовый проход, и минимизации этого анализа в интерпретаторе). Недостатки — большее требование к ресурсам и требование на корректность исходного кода. Применяется в таких языках, как PHP, Python, Perl (используется байт-код[источник?]), а также в различных СУБД (используется p-код[источник?]).
|
|
20.04.2009, 18:39 | #3 |
Роман Долгополов (RDOL)
|
Цитата:
Не существует чисто "компилируемых" и "интерпретируемых" языков. Существуют компиляторы и интерпретаторы. Да, некоторые проще реализуются в виде интерпретаторов, но и только. Вот спрошу с чего вы взяли С++ компилируемый? С того что на него чаще обращали внимание разработчики компиляторов? Ну так никто не мешает написать интерпретатор для С++. А уж написание компиляторов с бейсика это любимая практическая задача при обучении теории компиляторов. Так что все зависит от конкретной реализации. И ничто не мешает в одной реализации использовать и компилятор и интерпретатор. В аксапте исходный код на Х++ заранее целиком преобразуется в нечто промежуточное, которое потом исполняется машиной внутри аксапты без обращения к исходному коду. Т.е компиляция есть. Просто компиляция не в машинный код, а промежуточный Вот простой пример, доказывающий что при исполнении исходники не юзаются никаким боком создаем baseEnum baseenumtest, в нем Element1, enumvalue = 0 пишем джоб X++: static void Job24(Args _args) { ; info(int2str(baseenumtest::Element1 +0)); } обязательно закрываем редактор кода идем и меняем enumvalue на 1 запускаем наш джоб из аот (ctrl-o). именно из аот, при запуске из редактора сначала случится компиляция и что мы види в инфологе? Правильно, 0 компилируем джоб, и снова запускаем. в инфологе отображатся 1 PS. Ответил компилятор, хотя все три варианта правильные |
|
|
За это сообщение автора поблагодарили: Megacrusher (1), belugin (3). |
20.04.2009, 19:07 | #4 |
Участник
|
Спор чисто терминологический. Сейчас в основном принято компилятором называть также то, что в википедии называется "Итерпретатором третьего типа" (сначала компиляция в байткод, потом интерпретация или компиляция байткода). По крайней мере, так считают авторы таких языков: Java, C#, F#, Scala и т.д. даже питон.
|
|
20.04.2009, 20:47 | #5 |
Участник
|
Холиварить, так холиварить.
Не совсем. В компилируемых реализациях нельзя выполнить строку, как кусок кода на исходном языке. В компилируемых реализациях нельзя на лету поменять выполняемый код на исходном языке (только на языке хоста - обычно в машинных кодах). В Аксапте есть: 1. runbuf, который позволяет выполнить произвольную строку на ИСХОДНОМ языке Х++ 2. Семейство Dict* классов, которое позволяет изменить исполняемый код на исходном языке в run-time. Кроме того, в Аксапте нет выделенного этапа линковки. Линковка - это преобразование p-кода в язык хоста (Этот этап так характерен для компиляторов). После линковки внесение изменений в код на исходном языке невозможно в компиляторах (только перелинковка). |
|
20.04.2009, 20:55 | #6 |
Участник
|
Цитата:
только не компиляция, а трансляция в p-код как раз то, что программист не управляет явным образом процессом компиляции и говорит о том, что Аксапта не компилятор. |
|
20.04.2009, 21:27 | #7 |
Moderator
|
А какие из компилируемых языков, кроме C++ (и его наследника D) сейчас активно используются?
Я знаю компиляторы Scheme (http://en.wikipedia.org/wiki/Stalin_...mplementation) и http://en.wikipedia.org/wiki/Chicken...implementation)), которые, кстати позволяют делать все то, что написал mazzy: Цитата:
В компилируемых реализациях нельзя выполнить строку, как кусок кода на исходном языке.
В компилируемых реализациях нельзя на лету поменять выполняемый код на исходном языке (только на языке хоста - обычно в машинных кодах). Компилятор Haskell (http://ru.wikipedia.org/wiki/Glasgow_Haskell_Compiler), в общем то, тоже промежуточный код на C генерит, хотя заявлено, что может сразу создавать код в машинных кодах. Вроде и все, если не рассматривать узкоспециализированные Lisp машины. Все прочее - .Net, Java, Ruby, Python, Erlang, Lua компиляторами не является. |
|
20.04.2009, 22:18 | #8 |
Участник
|
Цитата:
Цитата:
В компилируемых реализациях нельзя на лету поменять выполняемый код на исходном языке (только на языке хоста - обычно в машинных кодах).
В Аксапте есть: 1. runbuf, который позволяет выполнить произвольную строку на ИСХОДНОМ языке Х++ 2. Семейство Dict* классов, которое позволяет изменить исполняемый код на исходном языке в run-time. Цитата:
Кроме того, в Аксапте нет выделенного этапа линковки. Линковка - это преобразование p-кода в язык хоста (Этот этап так характерен для компиляторов). После линковки внесение изменений в код на исходном языке невозможно в компиляторах (только перелинковка). Я говорю, спор - терминологический. ваш "компилятор" = мой "компилятор в машинный код". Мой "компилятор" = Объединение(ваш "компилятор", ваш "интерпретатор комипилирующего типа") |
|
20.04.2009, 22:30 | #9 |
Участник
|
Цитата:
The javac tool reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files http://msdn.microsoft.com/en-us/libr...wd(VS.71).aspx The C# compiler can be invoked at the command line by typing the name of its executable file (csc.exe) on the command line. You may need to adjust your path if you want csc.exe to be invoked from any subdirectory on your computer. http://erlang.org/doc/apps/compiler/index.html The Compiler application compiles Erlang code to byte-code. The highly compact byte-code is executed by the Erlang emulator. Более того http://haskell.org/haskellwiki/Yhc/J...Brief_overview The ycr2js program reads the binary core file specified (.yca or .ycr), and performs conversion of Haskell functions compiled into Core to their Javascript representation storing the generated Javascript code in a file. Resulting Javascript may be embedded on a (X)HTML page to be loaded into a Web browser. |
|
20.04.2009, 22:32 | #10 |
Участник
|
интересно, что вот тут используемые нами термини разведены как два отдельных значения одного и того же слова
|
|
20.04.2009, 22:42 | #11 |
Moderator
|
Это компиляция в некий промежуточный байт-код. Согласен, что граница размыта, так как даже откомпилированной C-программе нужен рантайм для ее запуска, но все такие она есть.
В общем то, в байт-код и Python компилит, а если мы и Erlang будем называть его компилятором, то, mazzy, о боже, я не только динамически строку кода могу выполнить, но и весь код приложения "на лету" подменить, не прерывая работы пользователей. |
|
20.04.2009, 23:42 | #12 |
Administrator
|
Цитата:
Наверное более правильно было бы ответить "Затрудняюсь" - т.к. а) на мой взгляд - "компилируемый" - легче для понимания "а как это работает" б) "интерпретируемый" - более правильно было бы ответить (если подходить к вопросу терминологически). Но проработав с VBA - где код программы можно менять прям в рантайме - я психологически не могу отнести Аксапту к интерпретируемому языку. А компилируемый - мне ближе Программист также управляет процессом компиляции как и в каких-нибудь С++ или дельфи, где есть интегрированная среда разработки, которая весь процесс компиляции и линковки (и создания exe-шника) делает за программиста, который нажимает всего одну кнопку (как в аксапте). Просто в Аксапте вызов этой кнопки еще "зашит" на сохранении кода в редакторе. Это я к тому, что неделание в явном виде линковки еще не говорит о том, что язык некомпилируемый. runbuf вызывает код.. Но ведь нет никаких гарантий что исходный код не транслируется в p-код в этом случае (равно как и доказательств трансляции)! Более того - есть утверждение - что отладчик не работает из-под runBuf. Может это следствие того, что трансляция все-таки какая-никакая а есть? Классы же Dict* лишь позволяют в рантайме запустить тот или иной объект. Их наличие не говорит о том - запускают они исходный код или p-код. Поэтому - их наличие - тоже не доказательство интерпретируемости языка. Резюме: Голосую за "компилируемый"
__________________
Возможно сделать все. Вопрос времени |
|
20.04.2009, 23:57 | #13 |
Участник
|
Цитата:
Сообщение от belugin
интересно, что вот тут используемые нами термини разведены как два отдельных значения одного и того же слова
и interpreted language Цитата:
interpreted language
A programming language that requires an interpreter in the target computer for program execution. Contrast with native executable. See interpreter and interpreted. |
|
21.04.2009, 00:02 | #14 |
Участник
|
Только в байт-код (p-код) всю жизнь не компилировалось, а транслировалось.
Компиляция - это все-таки в язык хост-машины. Скорее да. |
|
21.04.2009, 00:12 | #15 |
NavAx
|
2 mazzy, 2 belugin :
Вот вы прям схватлись не на жизнь а на смерть. Попробую вас рассудить ... Мне кажется стоит себе ответить на следующие вопросы. Выполняет ли Ax роль компилятора? Выполняет ли Ax роль интерпретатора? Я считаю что она выполняет обе роли. Просто роль компилятора нужна лишь для корректной трансляции в p-код, а все остальное время выполнят роль интерпретатора. Так что лично для моего понимания компиляция в Ax выполняет вспомогательную роль. Отрубите ключами разработку и получится у вас сугубо интерпретатор. Будете только скомпилированное приложение копировать ручками и будет счастье... А вообще то спор какой то бессмысленный имхо |
|
21.04.2009, 02:17 | #16 |
Дмитрий Ерин
|
Можно я тоже немного побухчу про терминологию?
Мое мнение, что язык программирования - всего лишь множество лексем и синтаксических правил, определяемых его грамматикой. А семантические правила я бы отнес в ведение транслятора, несмотря на многочисленные определения в википедии, относящие их к языку... Подтверждением этому служит тот факт, что зачастую одна и та же написанная на "С" программа, дает разные результаты на разных трансляторах. И вообще, компилятор и интерпретатор - это не тип языка, а тип транслятора (о чем немного другими словами уже упомянул dn в начале ветки), то есть вопрос в теме поставлен некорректно... X++ - это язык. Просто язык программирования. А вопрос заключается в том, к какому типу относится транслятор X++, то есть ядро DAX. В такой формулировке ответил "затрудняюсь" Имхо, более правильным был бы ответ "компилятор + виртуальная машина". ЗЫ: К сожалению, слёту не могу вспомнить название и автора одной старой-старой книги, в которой эта тема очень доходчиво изложена (на языке вертится Грин, но не уверен...). А Википедии я бы не очень доверял в некоторых вопросах |
|
|
За это сообщение автора поблагодарили: db (3). |
21.04.2009, 09:28 | #17 |
Участник
|
Еще со школы - после компиляции должен получиться НЕЗАВИСИМО исполняемый код от среды разработки! Сам считаю, что компилируемый яп должен получать программный код, который потом можно дизассемблировать и получить листинг на языке ассемблера! По этому определению даже Java интерпретатор, а уж X++ и подавно! Но если считать, что компиляция - это перевод всей программы в любой пи-код (байт-код) то это интерпретаторы компилируемого типа!
|
|
21.04.2009, 10:02 | #18 |
Moderator
|
Я вот начинал учится программировать еще на MSX-Basic, а потом чуток с фортом побаловался,дык с тех пор для меня интерпретатор - это нечто в чем:
1. Можно остановить программу, поменять кусочек кода (скажем - вставить строку внутрь исполняющегося в данный момент цикла), а потом продолжить выполение этой программы. 2. Аналогичным образом - можно в случае возникновения runtime-ошибки просто подправить ручками значения переменных. То есть - поделили на ноль случайно - можно пока не разбираться, а просто впендюрить не-ноль в нужную переменную. 3. Заметную часть операторов можно исполнять в режиме командной строки. Написал чего-то типа print 45*SIN(29) и тут же получил результат. То есть - я проголосовал за то что X++ компилятор, просто потому что ни одного из привычных мне плюсов интерпретатора я в нем не вижу |
|
21.04.2009, 10:19 | #19 |
Участник
|
Ну если считать по возможности менять значения переменных по ходу отладки, то тогда С++ можно назвать интерпретатором. В Visual C++ это можно в момент отладки делать. в C# уже нельзя.
|
|
21.04.2009, 10:21 | #20 |
Участник
|
Там говорилось о runtime-ошибках
|
|