Файл: Реферат по дисциплине Технологии и методы программирования на тему Интеграция языков программирования.docx

ВУЗ: Не указан

Категория: Реферат

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 65

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


К концу 50-х годов начали появляться языки программирования более высокого уровня, такие как Lisp, Fortran, ALGOL. В них уже не было точного соответствия между языковыми конструкциями и машинными командами. Преобразование строк исходного кода в последовательности двоичных команд осуществлялось компилятором. Со временем их число пополнилось языками  PL /1, Pascal, C, C++, Java. Все они менее эффективно используют аппаратуру по сравнению с языками ассемблера, но позволяет быстрее создавать приложения. В результате им удалось практически полностью вытеснить языки ассемблера при создании крупных приложении.  

2.2 Языки программирования более высокого уровня


Языки программирования системного уровня отличаются от ассемблеров, во-первых, тем, что они являются более высокоуровневыми, и, во-вторых, используют более строгий контроль типов. Термин “высокоуровневый” означает следующее: многие детали обрабатываются автоматически, а программисту для создания своего приложения приходится писать меньшее количество строк. В частности:

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

-   Последовательности вызова процедур генерируются автоматически; программисту нет необходимости описывать помещение аргументов функции в стек и их извлечение оттуда;

-   Для описания структур управления программист может использовать также ключевые слова, как if, while; последовательности машинных команд, соответствующие этим описаниям компилятор генерирует динамически.

2.3 Типизация   


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


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

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

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

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

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


2.4 Языки описания сценариев


Языки описания сценариев, такие как Perl, Python, Rexx, Tcl, Visual Basic и языки оболочек UNIX, предпологают стиль программирования, весьма отличныи от характерного для языков системного уровня. Они предназначаются не для написания приложении с “нуля”, а для комбинирования компонентов, набор которых создается заранее при помощи других языков. Например, Tcl, Visual Basic могут использоваться для построения пользовательских интерфеисов из имеющихся элементов управления, а языки описания сценариев для оболочек UNIX применяются для формирования “конвейеров” обработки потоков данных из набора стандартных фильтров. Языки описания сценариев часто применяются и для дополнения готовых компонентов новыми возможностями; однако эта деятельность редко охватывает создание сложных алгоритмов или структур данных, которые уже обычно бывают уже заложены в компоненты. Иногда языки описания сценариев даже называют связующими или языками системной интеграции.

Глава 3. Foreign function interface


FFI (Foreign function interface) — механизм, с помощью которого код, написанный на одном языке программирования, может вызывать подпрограммы или использовать утилитные средства из кода другом языке программирования.

Термин FFI возник в языке программирования Common Lisp, где есть явная спецификация способов взаимодействия кода с другими языками. Данный термин также используется официально в языках Haskell, Python и Perl. Другие языки могут применять другую терминологию: например, Java называет это “JNI” (Java Native Interface), а в ряде языков это называется “language bindings”.

Основная задача FFI — совместить семантику и соглашения о вызове процедур и функций в двух различных языках. Для реализации потребуется учесть особенности райнтайма и ABI в обоих языках. Есть несколько способов реализовать FFI:

Требовать, чтобы функции, которые можно вызвать из другого языка, были объявлены определённым образом. Например, такие требования выставляют Java, а также языки платформы .NET.

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

Использовать генератор кода, такой как SWIG
, который автоматически просканирует программный модуль на одном языке и сгенерирует библиотечную обёртку для его вызова из другого языка.

Механизм FFI может столкнуться с ограничениями, а именно:

1. Если один из языков использует сборку мусора, потребуется удерживать ссылки на объекты из второго языка, чтобы они не были внезапно удалены

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

3. Как минимум один из языков может работать в окружении виртуальной машины или интерпретатора

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


Заключение


Связать несколько языков программирования вместе в одной программе возможно, но это не совсем хорошая идея, так как при запуске программы на стороннем ПК надо быть уверенным, что у пользователя установлены нужные сервисы/зависимости/ПО, например, стоит ли JVM.

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

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

В ходе написания реферата были решены следующие задачи:

1. Проанализировать информацию, полученную в интернете.

2. Дать определение основным понятиям.

3. Описать механизм совмещения кодов, написанных на разных языках программирования.


Список интернет-ресурсов.


  1. https://netology.ru/blog/03-2022-programming-languages

  2. https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D1%8F%D0%B7%D1%8B%D0%BA%D0%BE%D0%B2

  3. https://blog.skillfactory.ru/samye-populyarnye-yazyki-programmirovaniya-2023-goda/

  4. https://habr.com/ru/post/722586/

  5. https://tproger.ru/translations/programming-languages-types/

  6. https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%86%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85

  7. https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%82%D0%B8%D0%BF%D0%BE%D0%B2

  8. https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

  9. https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

  10. https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BD%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F

  11. https://obrmos.ru/kur/kur_dr/comp/kur_dr_comp_progr.html

  12. https://gb.ru/blog/urovni-yazykov-programmirovaniya/

  13. https://otus.ru/journal/yazyki-programmirovaniya-harakteristika-opisanie-vidy/

  14. http://prog.tversu.ru/library/tapl.pdf

  15. https://al.cs.msu.ru/system/files/19-BaseTypes-ADT.pdf