@fsgdoterr

Правильно ли я понимаю что такое Язык программирования?

Я уже довольно долгое время изучаю php и его фреймворки, также js и c# . Но так как по свой натур я чайник, стало интересно правильно ли я понимаю что такое языки и как они работают.

Если брать компилируемые языки то по сути это просто текстовый файл с необходимым расширением, а компилятор к ним это программа написанная на ассемблере которая читает этот текстовый файл и получает в нем как бы сценарий.
пример:
Программа компилятор запустилась.
Читаю текстовый файл test.c
class MyClass{

void myfunc() {
   int c = 1488;
}
}
...
myfunc();

Вижу класс с названием MyClass и функцию с названием myfunc которой принадлежит локальная переменная c.
Регистрирую значение в хипе с названием Myclass;
Регистрирую фрейм в стеке с названием myfunc и помещаю внутрь него переменную с значением 1488.
Очищаю память.
Создаю программу на ассемблере исходя из того что я прочитал.
.
(если не совсем понятно что я имел ввиду, то асм читает файл и видит написанную цифру 1 и с помощью заложнных в программу кодов понимает что в готовой программе нужно поставить вместо 1 команду "пример")
И получается если это так то программа написанная на высокоуровневом языке без компилятора просто текстовый файл, а также что готовая скомпилированная программа будет написана на языке ассемблера исходя из того что написано в исходном файле на высокоуровневом языке.

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

Я не красноречив, поэтому не уверен что правильно описал то как это понимаю, но думаю суть изложил ясно. Правильно ли это? если нет то что не так?
  • Вопрос задан
  • 260 просмотров
Решения вопроса 1
GavriKos
@GavriKos
Нет, неправильно.
Во первых - язык это не текстовый файл. Это набор правил (синтаксических, семантических), лексем и прочего.
Во вторых процесс компиляции не так выглядит совершенно. Компилятор никаких переменных не создает. Более того - там еще есть трансляторы, линковщики, валидаторы и прочее.

Ну и да, на ассемблере компиляторы давно не пишут.

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

Ну вот это в каком то приближении правильно, правда необязательно на языке ассемблера.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@none7
Ассемблер это тоже не более чем формализированный текстовый файл, компиляторы оперируют машинными кодами, которые процессор воспринимает как конкретную инструкцию к действию. Для процессора нет ни функций, ни переменных лишь память в стиле JS-TypedArray и последовательности инструкций вроде load, store, add, sub, compare, goto to ptr if(compare is signed_less), в той же памяти в виде бинарных чисел.
Именно Ваш пример любой оптимизирующий компилятор просто сотрёт. То есть просто запишет инструкцию return попутно ругнувшись на unused variable, а может вообще стереть всю функцию и её вызовы, ведь это никак не повлияет на результат.
Хотя конечно зная один из Ассемблеров выбранной процессорной архитектуры(а их как известно немало) можно без особого труда написать примитивный, не оптимизирующий компилятор, который будет передавать сгенерированный Ассемблерный файл в транслятор Ассемблера. Который просто транслирует Ассемблерные инструкции в соответствующие бинарные, машинные инструкции.
Вообще если хотите сделать свой язык программирования, то советую смотреть в сторону llvm. Это позволит Вам не заморачиваться с поддержкой бесчисленных процессорных архитектур и оптимизации машинных кодов под них. На хабре даже есть статья как сделать свой llvm компилятор.
Ответ написан
Комментировать
Adamos
@Adamos
php и его фреймворки, также js и c#

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


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

А так, программа на компилируемом языке - это текст, который при помощи нескольких утилит (транслятор,компилятор, линкер, и др), преобразовывает в конечном счете текст в исполняемый файл.

Но это все довольно условно, так как сейчас виртуализация достигла платформ, и если 30 лет назад под платформой подразумевался процессор, то сейчас платформой может быть даже браузер (для webassembly, css и js) и так далее.

P.S. И да, ассемблер - это текст. А конечный результат, например для С++ это исполняемый файл с машинным кодом и структурой исполняемого файла, в котором заложено как и что загрузить в память и куда передать управление.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы