LINUX.ORG.RU
ФорумTalks

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

 


1

2

Сразу оговорюсь, что я не программист.

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

Чисто в теории можно ли создать язык программирования, который будет пригоден и для низкоуровневой работы (вместо языка C, например, для разработки ядра), и для написания прикладного ПО и скриптов?

Например, в языке может присутствовать как статическая, так и динамическая типизация. Вроде что-то подобное есть в, прости, Г-споди, C#, там есть тип dynamic. В Qt есть класс QVariant. Можно сделать оговорку, что, если хотим компилируемый бинарник, то пользуемся только статическими типами.

Реально ли это? Чисто в теории. На практике однозначно не получится, так как это будет не замена существующих языков, а ещё один язык.


Ответ на: комментарий от soomrack
union MyType {
    int a;
    float b;
};

function f(MyType ab) {
   // о нет, как нам выковыривать число, как ab.a или ab.b?
   // нет, типизация тут ни при чем, мы имеем на входе просто тип MyType с хаком с union
}
goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от soomrack

если язык сам говорит, что тип не изменился

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

id переменной не изменился

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

То, что эти данные оформлены как метод объекта – ну так это синтаксический сахар, которого в питоне на целый сахарный завод хватит.

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

FishHook
()
Ответ на: комментарий от goingUp

?

ab это идентификатор переменной, с ее значениями ты можешь работать как через ab.a и тогда значение переменной будет типа int, или через ab.b и тогда значение переменной будет типа float.

soomrack ★★★★
()
Ответ на: комментарий от FishHook

Ты опять пытаешься объяснить мне то, что я во-первых, и так знаю (надеюсь), а во-вторых, не имеющее отношение к предмету моего замечания.

Динамическая типизация (к.м.к.) это когда связывание: переменная – тип данных может меняться в ходе исполнения программы. В указанном примере тип данных не поменялся (type выдает одно и то же), переменная не поменялась (id выдает одно и то же). Следовательно, приведенный пример не подходит для демонстрации изменения связывания переменной - типа данных в ходе выполнения программы.

soomrack ★★★★
()
Ответ на: комментарий от soomrack

ab это идентификатор переменной, с ее значениями ты можешь работать как через ab.a и тогда значение переменной будет типа int, или через ab.b и тогда значение переменной будет типа float.

вот, а в питоне так нельзя, потому что в питоне типизация строгая

FishHook
()
Ответ на: комментарий от FishHook

Это правда. Хоть некоторых это может приводить в ступор.

soomrack ★★★★
()
Ответ на: комментарий от soomrack

ab это идентификатор переменной, с ее значениями ты можешь работать как через ab.a и тогда значение переменной будет типа int, или через ab.b и тогда значение переменной будет типа float.

Нет же. Формально тип ab будет MyType, а int будет тип выражения ab.a. Ты наверное имел в виду «реальный» тип, который «спрятан» в переменной? Мы его в рантайме в общем случае не знаем. Если мы сделаем ab.a = 4, то в ab.b будет мусор. Это не приведение типов. Это не изменение типа. Мы не сможем написать функцию f, которая удвоит «реальное» значение, потому что мы не знаем, удваивать ab.a или ab.b? Удвоим ab.a, в ab.b будет мусор.

goingUp ★★★★★
()

Ну создай общемировой язык общения.

Tigger ★★★★★
()
Ответ на: комментарий от soomrack

но это все одна и та же переменная, идентификатор которой – ab

ab.a не переменная, а выражение. Ок, как мне корректно вывести на экран переменную ab?)

goingUp ★★★★★
()
Ответ на: комментарий от soomrack

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

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

https://en.wikipedia.org/wiki/Structural_type_system

https://en.wikipedia.org/wiki/Nominal_type_system

динамическая типизация совсем не то же самое, что связывание. Пример раста я уже приводил. В питоне конкретно (как уже говорилось) все есть PyObject, поэтому грубо говоря переприсваивание

a =1
a = "asta"

с точки зрения виртуальной машины изменяет лишь ссылку на PyObject.

  1. Этими категориями вообще размышлять нельзя, потому что в том же питоне переменные это тоже ключи хеш-таблицы locals

  2. Класс в питоне - это тоже объект и его тоже можно создать в рантайме, то есть в питоне тип это нечто СОЗДАВАЕМОЕ динамически на этапе исполнения байт кода. Все сравнения с Си здесь просто дурацкие и имеют хоть какие то пересечения потому что используются одинаковые слова

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

FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)
Ответ на: комментарий от soomrack

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

goingUp ★★★★★
()
Ответ на: комментарий от soomrack

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

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

В с++ у выражения есть dynamic type, который не всегда может быть известен компилятору.

https://eel.is/c++draft/defns.dynamic.type

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

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

vM ★★
()

То-есть, ты имеешь ввиду, Ассемблер, грубо говоря. Самый близкий к нему, собственно, - тот самый C#, между прочим. Но. Исключительно «благодаря» ООП - он от него уже за многолетнее наследование классов настолько далеко ушел, что ужосонах.

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

При существующей скорости процессоров, это уже - привело к тому, что элементарные приложения на 6-8ядерных процессорах выполняются медленнее, чем в моё время, то-же самое выполнялось на 8-битном Z80.

cadaber ★★
()

Это глупая идея или это будет просто обертка с единственной логикой «если скрипт, беру язык Х, если не скрипт, беру язык Y». Потому что на шкале «скриптовый <—> нескрипиовый» у самого скриптового (Шелл) и самого нескриптового (например, C++) очень сильно разный синтаксис и семантика. И никто не будет городить классы и неймспейсы (а в шарпе без них никуда) там, где нужна баш-портянка. Просто в какой элемент нескриптового языка ни ткни - всё пепеусложнено и куча лишних телодвижений, а того, что нужно - нет (пайпы и подстановка). И поскольку скрипты нужны для других задач, нежели общие вычисления, куча проблем, которые решают нескриптовые ЯП со строгой, статической и проч. типизацией просто нерелевантны для скриптов (что в т.ч. и упрощает семантику и синтаксис скриптов).

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

От того, что в шарп добавили dynamic, люди не побежали на нём писать свои скрипты.

seiken ★★★★★
()
Ответ на: комментарий от cadaber

моё время, то-же самое выполнялось на 8-битном Z80

Не обманывайся, это было не то же самое.

seiken ★★★★★
()

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

Не только можно, но и нужно. Современные ЯП и стиль разработки застрял в 80-х годах. Большинство разрабов оверпрайснутые ботаны с зашлакованными сосудами в мозге из-за сидячего образа жизни. Поэтому от них будешь ещё долго ждать современного ЯП и современных подходов к разработке системного и прикладного ПО. Их максимум это 0-day плодить в ПО и делать дырявые ЦПУ.

По итогу в ИТ никакой безопасноти. Поэтому сейчас золотая эпоха для хакеров всех мастей. Гребут миллиардами в USD.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)

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

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

ugoday ★★★★★
()
Ответ на: комментарий от foror

Большинство разрабов оверпрайснутые ботаны с зашлакованными сосудами в мозге из-за сидячего образа жизни. Поэтому от них будешь ещё долго ждать современного ЯП

AI придет, порядок наведет

Aber ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)