Как узнать язык программирования на котором написана программа

Содержание

Аннотация: В данной лекции рассматривается задача определения систем программирования. Строится простейшее определение семантики языка программирования в виде интерпретатора, задающего операционную семантику на примере подмножества языка Лисп

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

Обычно при разработке системы программирования различают три уровня: синтаксис , семантика и прагматика реализуемого языка. Разграничение уровней носит условный характер, но можно констатировать, что синтаксис определяет внешний вид программ, семантика задает класс процессов, порождаемых программами, а прагматика реализует процессы в рамках конкретных условий применения программ. При изучении парадигм программирования центральную роль играет семантика , а синтаксис и прагматика используются как вспомогательные построения на примерах. Венская методика определения языков программирования с помощью операционной семантики, использующей концепции программирования при спецификации систем программирования, удобна для сравнения парадигм программирования [ [ 74 ] ].

Как узнать какой язык программирования тебе подходит?

Венский метод (ВМ) определения языков программирования был разработан в 1968 году в Венской лаборатории IBM под руководством П. Лукаса на основе идей, восходящих к Дж. Маккарти [ [ 74 ] , [ 75 ] ]. Благодаря хорошо разработанной концепции абстрактных объектов, позволяющей концентрировать внимание лишь на существенном и игнорировать второстепенные детали, Венский метод годится для описания и машин, и алгоритмов, и структур данных, особенно при обучении основам системного программирования. По мнению В.Ш. Кауфмана Венский метод вне конкуренции в области описания абстрактных процессов, в частности, процессов интерпретации программ на языках программирования. Согласно концепции абстрактных объектов ( абстрактный синтаксис , абстрактная машина , абстрактные процессы) интерпретирующий автомат содержит в качестве компоненты состояния управляющую часть, содержимое которой может изменяться с помощью операций, подобно прочим данным, имеющимся в этом состоянии [ [ 53 ] ].

Модель автомата с состояниями в виде древовидных структур данных, созданного согласно Венской методике для интерпретации программ, является достаточно простой. Тем не менее она позволяет описывать основные нетривиальные понятия программирования, включая локализацию определений по иерархии блоков вычислений, вызовы процедур и функций, передачу параметров. Такая модель дает представление понятий программирования, полезное в качестве стартовой площадки для изучения разных парадигм программирования и сравнительного анализа стилей программирования.

Определение языка программирования (ЯП) по Венской методике начинается с четкого отделения существа семантики от синтаксического разнообразия определяемого языка [ [ 74 ] ]. С этой целью задается отображение конкретного синтаксиса (КС) ЯП в абстрактный ( АС ), вид которого инвариантен для семейства эквивалентных языков.

Отличие интерпретируемого языка программирования от компилируемого для самых маленьких и нубов.

КС =></p><p>АС

Семантика ЯП определяется как универсальная интерпретирующая функция (ИФ), дающая смысл любой программе, представленной в терминах АС . Такая функция использует определенную языком схему команд — языково ориентированную абстрактную машину (АМ), позволяющую смысл программ формулировать без конкретики компьютерных архитектур.

ИФ: АС =></p><p>АМ

Выбор команд абстрактной машины представляет собой компромисс между уровнем базовых средств языка и сложность их реализации на предполагаемых конкретных машинах (КМ), выбор которых осуществляется на уровне прагматики.

АМ =></p><p>КМ

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

Синтаксис программ в языке программирования сводится к правилам представления данных, операторов и выражений языка. Начнем с выбора абстрактного синтаксиса на примере определения небольшого, но функционально полного подмножества языка Лисп [ [ 75 ] ].

Конкретный синтаксис языков программирования принято представлять в виде простых БНФ (Формул Бекуса-Наура). Данные языка Лисп — это атомы, списки и более общие структуры из бинарных узлов — пар, строящихся из любых данных:

::= ::= | | ::= | ( . ) — список
2.1. Синтаксис данных языка Лисп

Это правило констатирует, что данные — это или атомы, или списки из данных.

/Три точки означают, что допустимо любое число вхождений предшествующего вида объектов, включая ни одного./

Согласно такому правилу () есть допустимое данное. Оно в языке Лисп по соглашению эквивалентно атому Nil .

Такая единая структура данных вполне достаточна для представления сколь угодно сложных программ. Дальнейшее определение языка Лисп можно рассматривать как восходящий процесс генерации семантического каркаса, по ключевым позициям которого распределены семантические действия по обработке программ. Позиции распознаются как вызовы соответствующих семантических функций .

Другие правила представления данных нужны лишь при расширении и специализации лексики языка (числа, строки, имена особого вида и т.п.). Они не влияют ни на общий синтаксис языка, ни на строй его понятий, а лишь характеризуют разнообразие сферы его конкретных приложений.

Абстрактный синтаксис программ является утончением синтаксиса данных, а именно — выделением подкласса вычислимых выражений (форм), т.е. данных, имеющих смысл как выражения языка и приспособленных к вычислению. Внешне это выглядит как объявление объектов, заранее известных в языке, и представление разных форм, вычисление которых обладает определенной спецификой.

Операционная семантика языка определяется как интерпретация абстрактного синтаксиса, представляющего выражения, имеющие значение . Учитывая исследованность проблем синтаксического анализа и существование нормальных форм, гарантирующих генерацию оптимальных распознавателей программными инструментами типа YACC -LEX, в качестве абстрактного синтаксиса для Лиспа выбрано не текстовое, а списочное представление программ. Такое решение снимает задачу распознавания конструкций языка — она решается простым анализом первых элементов списков. Одновременно решается и задача перехода от конкретного синтаксиса текстов языка к абстрактному синтаксису его понятийной структуры. Переход получается просто чтением текста, строящим древовидное представление программы.

Читайте также:
Программа испытаний устройства пример

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

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

::= | | ( . ) | (IF ) ::= (QUOTE ) ::= ::= ::=
Пример 2.2. Синтаксис выражений подмножества языка Лисп

Переменная — это подкласс идентификаторов, которым сопоставлено многократно используемое значение , ранее вычисленное в подходящем контексте. Подразумевается, что одна и та же переменная в разных контекстах может иметь разные значения.

Таким образом, класс форм — это объединение класса переменных и подкласса списков, начинающихся с QUOTE, IF или с представления некоторой функции.

Форма — это выражение , которое может быть вычислено.

Форма, представляющая собой константу, выдает эту константу как свое значение . В таком случае нет необходимости в вычислениях, независимо от вида константы . Константные значения могут быть любой сложности, включая вычислимые выражения. Чтобы избежать двусмысленности, предлагается константы изображать как результат специальной функции QUOTE , блокирующей вычисление. Представление констант с помощью QUOTE устанавливает границу, далее которой вычисление не идет. Константные значения аргументов характерны при тестировании и демонстрации программ.

Если форма представляет собой переменную, то ее значением должно быть данное, связанное с этой переменной до момента вычисления формы. ( Динамическое связывание, в отличие от традиционного правила, требующего связывания к моменту описания формы, т.е. статического связывания .)

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

Аргументы представляются формами. Это означает, что допустимы композиции функций. Обычно аргументы вычисляются в порядке вхождения в список аргументов. Позиция » аргумент » выделена для того, чтобы было удобно в дальнейшем локализовать разные схемы обработки аргументов в зависимости от категории функций . Аргументом может быть любая форма, но метод вычисления аргументов может варьироваться. Функция может не только учитывать тип обрабатываемого данного, но и управлять временем обработки данных, принимать решения по глубине и полноте анализа данных, обеспечивать продолжение счета при исключительных ситуациях и т.п.

Источник: intuit.ru

Как определить язык программирования, на котором написана программа?

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

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

Но иногда расширение файла может быть скрытым, либо имеет смешанное расширение, что затрудняет процесс определения языка программирования. В таком случае можно использовать специальные сервисы, которые анализируют код программы и выдают информацию о языке, в котором эта программа была написана.

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

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

В целом, определение языка программирования – это не сложная задача. Главное – это знать, какие инструменты и методы лучше всего использовать в каждой конкретной ситуации.

Определение языка программирования

Что такое язык программирования?

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

Как определить язык программирования?

Существует несколько способов определения языка программирования, на котором написана программа:

  1. Расширение файла – это один из самых простых и быстрых способов определения языка программирования. Например, если файл имеет расширение «.py», то это, вероятно, программа, написанная на языке Python.
  2. Исходный код – также можно определить язык программирования, изучив код программы. Каждый язык программирования имеет свои уникальные конструкции, ключевые слова и специфические стили кодирования.
  3. Среда разработки – многие языки программирования имеют свои собственные среды разработки, которые используются для написания и отладки программного кода. Информация о языке программирования может быть найдена в настройках среды разработки.

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

Что такое язык программирования?

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

Возможности языка программирования

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

Функциональные языки программирования ориентированы на обработку математических и логических операций. Они используются для работы с большими данными и могут быть сложными в использовании, но обеспечивают быстрое выполнение задач обработки данных. Такие языки как Haskell, Erlang и Clojure.

Объектно-ориентированные языки программирования более гибкие и просты в использовании, так как эти языки позволяют разрабатывать программы в виде объектов, каждый из которых имеет свои свойства и методы. Некоторые языки программирования, такие как Java, Python или Ruby, являются объектно-ориентированными.

Выбор языка программирования

Выбор языка программирования зависит от требуемых функциональных возможностей, надежности, доступности инструментов и библиотек, использования других приложений или операционных систем. Необходимо учитывать, что некоторые языки заточены под определенные платформы, например, Swift является исключительно языком для разработки iOS-приложений.

Независимо от выбора языка программирования, разработка программ требует соответствующего знания языка и полного понимания задачи. Это позволяет программисту использовать язык программирования на всю его мощь и создавать надежные и эффективные приложения.

Как определить язык программирования?

Изучите расширение файла

Первым делом, чтобы определить язык программирования, на котором написана программа, нужно изучить расширение файла. К примеру, если расширение файла .py, то программа написана на Python.

Проанализируйте синтаксис

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

Используйте онлайн-сервисы

Онлайн-сервисы также могут помочь определить язык программирования. Существуют много сервисов, которые осуществляют распознавание языка программирования, по загруженным файлам.

Читайте также:
Интересные программы на python код

Изучите документацию

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

Инструменты для анализа кода

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

Статические анализаторы

Статические анализаторы кода позволяют находить ошибки и несоответствия в коде без его запуска. Некоторые из них, такие как Pylint для языка Python или ESLint для JavaScript, предоставляют функции определения языка и проверки корректности синтаксиса.

Декомпиляторы

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

Определение MIME-типов

Многие веб-серверы и браузеры определяют тип контента (MIME-тип) на основе расширения файла. Например, файл с расширением «.php» определяется как скрипт на языке PHP. Однако, можно использовать библиотеки и сервисы, такие как filext.com, для более точного определения типа файла.

  • Статические анализаторы
  • Декомпиляторы
  • Определение MIME-типов

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

Какие особенности имеют разные языки программирования

Java

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

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

Python

Python – это простой в использовании высокоуровневый язык программирования. Один из его главных преимуществ – это легкость чтения и понимания, а также высокая скорость разработки, так как программы на Python довольно короткие и требуют меньше кода, чем на других языках.

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

C++

C++ – язык программирования общего назначения, который используется в основном для создания системного и прикладного программного обеспечения. Одним из главных преимуществ C++ является скорость работы программ. Однако, из-за относительно сложного синтаксиса, код на C++ может занимать много строк.

C++ используется для создания игр, программного обеспечения операционных систем, браузеров и многих других программ.

JavaScript

JavaScript – язык программирования, который используется в основном для создания интерактивных веб-страниц. JavaScript является объектно-ориентированным языком программирования и использует многопоточность, что позволяет веб-страницам выполнять несколько процессов одновременно.

JavaScript также используется для создания веб-приложений, онлайн-игр, мобильных приложений, а также для создания интерфейсов взаимодействия веб-сайтов с клиентами.

Как выбрать язык программирования для создания проекта

Определите цель проекта

Перед тем, как начать создавать проект, определите его цель. В зависимости от нее выбирайте язык программирования. Например, если ваша цель — создать веб-сайт, то выберите язык программирования для веб-разработки, такой как HTML, CSS, JavaScript или PHP.

Оцените свои навыки

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

Исследуйте требования к проекту

Обязательно изучите требования к создаваемому проекту. Некоторые проекты могут требовать использования определенных языков программирования. Например, разработка игр на десктопе может потребовать знания C++, а разработка мобильных приложений — Java или Swift.

Оцените доступность ресурсов

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

Оцените последствия выбора

И последнее, но не менее важное — оцените последствия выбора языка программирования. Каждый язык программирования имеет свои преимущества и недостатки. Некоторые языки проще в изучении, другие — более мощные, но сложнее в использовании. Выбирайте языки программирования, соответствующие вашим требованиям и возможностям.

Вопрос-ответ:

Как можно быстро определить язык программирования, на котором написана программа?

Если у вас есть доступ к исходному коду программы, то можно взглянуть на расширение файла. Например, для языка программирования Python расширение файла обычно .py. Также можно обратить внимание на синтаксис кода, каждый язык программирования имеет свои уникальные конструкции. Если у вас нет доступа к исходному коду, то можно воспользоваться программными средствами, такими как File command в Linux или TrID в Windows.

Может ли программа быть написана на нескольких языках программирования?

Да, программа может быть написана на нескольких языках программирования. Например, веб-приложение может быть написано на JavaScript для фронтенда и на Python для бэкенда. Также бывает, что различные модули программы могут быть написаны на разных языках программирования.

Можно ли изменить язык программирования, на котором написана программа?

Да, можно изменить язык программирования, на котором написана программа, но это может быть очень сложно и трудоёмко. Если у вас есть исходный код на первоначальном языке программирования, то вы можете переписать его на другой язык. Возможно, придется изменять алгоритмы и структуры данных, если они не поддерживаются в новом языке. Также может потребоваться переписать библиотеки или зависимости, используемые в программе. В общем, это может занять много времени и ресурсов.

Источник: poselok-polesje.ru

Как узнать на каком языке написана программа

Today a piece of software code is available in the public domain in several forms. Also, every large enterprise today has many software applications developed using multiple programming languages.

The number of programming languages exceeds 500+ and each programming language follows a specific structure. It is always difficult to identify the programming language from a piece of code especially if it is available without a file extension.

Every programming language today consists of set of keywords and a standard language syntax. What if we could find a way to model this knowledge using a machine learning model, which can understand a piece of code and predict the programming language based on the code contents?

Disclaimer: I’ll only be providing the key-concepts and algorithms in this blog post, and will not be going in-depth into the back-end codebase (github link for codebase is already provided in the end of this blog).

Preparing the source dataset

Before we set sail on this adventure, we need to collect enough code snippet samples that our machine learning model can be trained and tested successfully.

Читайте также:
Задачи игровой программы для детей

We can do so by scraping the below websites, which log a tremendous amount of code snippets on daily basis.

How to know in which language/technology program (.exe) is written?

How to understand if exe/dll is written in C++/.Net/Java or in any other language. I tried to use Dependency walker but not able to get required information.

7 Answers 7

(reposting my SO answer to a similar question)

In many cases it is possible to identify the compiler used to compile the code, and from that, the original language.

Most language implementations include some kind of runtime library to implement various high-level operations of the language. For example, C has the CRT which implements file I/O operations ( fopen , fread etc.), Delphi has compiler helpers for its string type (concatenation, assignment and others), ADA has various low-level functions to ensure language safety and so on. By comparing the code of the program and the runtime libraries of the candidate compilers you may be able to find a match.

IDA implements this approach in the FLIRT technology. By using the signatures, IDA is able to determine most of the major compilers for DOS and Windows. It’s somewhat more difficult on Linux because there’s no single provider of compiler binaries for it, so signatures would have to be made for every distro.

However, even without resorting to the runtime library code, it may be possible to identify the compiler used. Many compilers use very distinct idioms to represent various operations. For example, I was able to guess that the compiler used for the Duqu virus was Visual C++, which was later confirmed.

Как определить на чем написана программа?

Да, но обычно не напрямую, должны быть биндинги к библиотеке. Т.е. например, если из ненативной программы нужно работать с zip файлами, для использования zip.dll должен существовать биндинг к этой библиотеке на этом языке (класс на java, в питоне это модули и т.д.). Хотя, некоторые языки позволяют напрямую использовать сишные библиотеки.

Но в любом случае, например программа на VB, например, обязательно использует какие-то специальные библиотеки, зависимость от которых явно указывает что программа на VB, аналогично с другими языками. То есть, можно исследуя зависимости от библиотек, выяснить, написана ли программа на C или C++.

Есть ли способ узнать, на каком языке была написана программа?

У меня есть настольная программа, которую я скачал и установил. Он запускается из файла .exe.

Есть ли какой-нибудь способ узнать из файла .exe, какой язык программирования использовался для написания программы?

Есть ли какие-нибудь инструменты, чтобы помочь с этим?

Какие языки можно определить, а какие нет?

Хорошо, вот две вещи, которые я ищу:

Эта программа IsDelphi от Брюс МакГи найдет все приложения, созданные с помощью Delphi, Delphi для .Net или C ++ Builder, которые находятся на вашем жестком диске.

11 ответов

Я понимаю ваше любопытство.

Вы можете определить приложения Delphi и C ++ Builder и их SKU, просмотрев несколько конкретных ресурсов, которые добавляет компоновщик. В частности, RC Data DVCLAL и RC DATA PACKAGEINFO. XN Resource Editor значительно упрощает эту задачу, но может подавиться сжатым EXE.

Компрессоры EXE немного усложняют дело. Они могут скрывать или шифровать содержимое ресурсов. Программы, сжатые с помощью UPX, легко идентифицировать с помощью HEX editor, потому что первые 2 раздела в заголовке PE имеют имена UPX0 и UPX1. Вы можете использовать приложение, чтобы распаковать их.

Приложения, скомпилированные с помощью .Net, обнаружить несложно. Последние версии Delphi даже включают в себя функцию IsAssembly, или вы могли бы сделать небольшой анализ в заголовке PE. Ознакомьтесь с функцией IsManaged в IsDelphi.

Сложнее определить, какой язык .Net использовался. По умолчанию VB.Net включает ссылку на Microsoft.VisualBasic, а приложения VCL.Net включают ссылки на конкретную версию Borland. Однако VCL.Net перестает функционировать в пользу Delphi Prism, и вы можете добавить ссылку на сборку VB на любой управляемый язык.

Я не смотрел некоторые приложения, которые используют сигнатуры для идентификации компилятора, поэтому не знаю, насколько хорошо они работают.

Надеюсь, это поможет.

Хороший дизассемблер, плюс, конечно, отличное понимание базовой архитектуры ЦП, часто могут помочь вам определить используемые библиотеки времени выполнения. Если исполняемый файл не был тщательно «лишен» символов и / или замаскирован иным образом, имена символов, видимые в библиотеках времени выполнения, часто будут давать вам подсказки на языке программирования, потому что стандарты разных языков определяют разные имена, а поставщики компиляторов и сопутствующих библиотеки времени выполнения обычно очень строго соблюдают эти стандарты.

Конечно, вы не добьетесь этого без знания различных возможных языков и их библиотечных стандартов — и если автор кода намеревался замаскировать информацию, им это тоже не сложно сделать.

Если у вас есть большой набор примеров из известных компиляторов, я думаю, это будет отличное приложение для машинного обучения. Я считаю, что здесь уместно так называемое «обучение с учителем». К сожалению, я почти ничего не знаю по этой теме — только то, что я слышал впечатляющие результаты, представленные на конференциях.

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

Предполагая, что это приложение для Windows .

Признает ли Reflector сборку .NET? Тогда это MSIL, 99% либо VB, либо C #, но вы, скорее всего, никогда не узнаете, какой именно, и это не имеет значения.

Нужен ли интпредставитель (например, Java?)? Тогда это Java (или другой интерпретатор.)

Проверьте, какие библиотеки DLL времени выполнения требуются.

Требуются ли DLL-библиотеки времени выполнения VB? Поздравляем, VB из VisualStudio 6.0 или более ранней версии.

Требуются ли для этого библиотеки Delphi? Поздравляю, Дельфи.

Вы зашли так далеко? C / C ++. Предположим, C ++, если он не требует msys или cygwin dll, и в этом случае C имеет вероятность 25%.

Поздравляем, это должно быть верным для подавляющего большинства программного обеспечения Windows. Это, вероятно, на самом деле вам не поможет, так как на всех этих языках можно сделать много одинаковых вещей.

Похожие публикации:

  1. Как забанить читера в кс
  2. Как зайти в сетевое окружение
  3. Как уменьшить панель задач в windows 11
  4. Как установить будильник на телефоне

Источник: amdy.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru