IT в России и мире в реалиях мирового кризиса
1,401,176 8,469
 

  Jack Doe ( Слушатель )
09 мар 2016 01:50:37

Си и графика

новая дискуссия Дискуссия  634

Заблуждение, что на Си нельзя написать API для работы с графикой/окнами в объектной модели.
Можно, есть примеры реализаций: WinAPI, GDK/GTK, реализация протокола X11 в XFree86, а затем в X.org.
 
Писать на Си в псевдообъектном стиле весьма несложно: сначала определяются структуры данных (например, typedef struct _point {...} point_t). Затем определяются функции работы над этими структурами, которые в объектном языке были бы методами класса point_t. Именуются функции префиксом класса, в данном случае point (например, point_draw()). Инкапсуляция, имена пространств, группировка данных и алгоритмов - отсутствующие выразительные средства берутся из головы программиста.

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

Я не призываю фигачить код в таком стиле, я лишь обращаю внимание на две вещи: 1) оптимально продуманная семантическая система лаконична и выразительна одновременно (касается не только языков, но и API); 2) мыслите критически, умейте выделить суть, распознавайте маркетинговые обманки.
  • +0.03 / 3
  • АУ
ОТВЕТЫ (30)
 
 
  ps_ ( Слушатель )
09 мар 2016 01:55:33

Вы забыли Сановский OpenView (по моему, самый красивый и продуманный интерфейс до недавнего времени)
  • +0.00 / 0
  • АУ
 
 
  Valery ( Слушатель )
09 мар 2016 04:32:05

Вы еще забыли, что к становлению X11 в ссое время прложила руку еще и ныне покойная Digital Equiipment Corporaion.
А уж писали они свои операционки по разному. В основном шел Bliss-32 и 64 (после появления процессора Alpha). Использовалось все. PLI, COBOL, PASCAL,BASIC, C, FORTRAN  ...
Но самое главное, был разработан стандарт передачи параметров в функцию (с подержкой архитектуры процессора).
То есть, мне было не важно, пишу ли я бибилиотеку функций на Паскале, фортране, Си и других языках (кроме С++).
Все вызывается. Даже в Ассемблере стандарт соблюдалсяю
Для облегчения был создан SDL (Structure definition language)который позволял генерировать необходимые файлы  определений и прототипов для разных языков. Был еще язык Data Definition Language (продукт назывался Common Data Dictionary). То же самое позволял делать для базы данных.
Ну и менеджер транзакций, который позволял сделать единую транзакцию в DEC RDB (ныне Oraсle RDB(реляционноая база, не поддерживается)) DEC DBMS(сетевая база данных, ныне Oracle DBMS, не поддерживается), DATATRIEVE (очень интересный инструмент, позволяющий обрращаться ко весму вышеназванному+ файловая система(имеет поддержку тразакций+ иерархические базы данных) не хуже SQL Plus). А самое главное - все это уложить в одну транзакцию. Ну и сверхглавное - плевать на язык программирования. Вот только C++, Java и подобные прикручиваются только через задницу...
  • +0.01 / 1
  • АУ
 
  Lapsha ( Слушатель )
10 мар 2016 11:01:39

Я не писал, что "на Си нельзя написать API для работы с графикой/окнами". 

С графикой можно работать и в АSM. 
Я писал, что Си не дружит с развесистой графикой. 
Оконный интерфейс очень естественным образом упаковывается в библиотеку С++. И очень громоздко - с С или любым другим не ООП.
  • +0.00 / 0
  • АУ
 
 
  adolfus ( Слушатель )
10 мар 2016 21:43:59

Для тех кто в танке -- код практически всех графических и/или оконных библиотек написан на С. И родной их интерфейс исполнен тоже на С. На С++ только привязки.
Насчет упаковки графических и оконных библиотек в C++ -- только в виде оберток С-кода.

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

"Объектно-ориентированный" отнюдь не означает "поддерживает объектную парадигму". Скорее наоборот, "Объектно-ориентированный С++" означает, что С++ ее не поддерживает -- он просто где-то как-то около пробегал.
  • +0.00 / 0
  • АУ
 
 
 
  Lapsha ( Слушатель )
10 мар 2016 22:11:30


Какой-то странный подход.

А сам компилятор С написан на ассемблере. И С есть не что иное, как "обертка" ассемблера. Только еще более абстрагированная от процессорных кодов.

А человек - не что иное как набор атомов из таблицы Менделеева.


Цитата: Цитата: adolfus от 10.03.2016 04:43:59Пришлось целый Qt разработать, чтобы упаковать окна в С++. И весь смысл Qt состоит в том, чтобы добавить в объектно-ориентированный С++ те  объектные штучки, которых там нет изначально -- сигналы и сообщения в юзерспейсе.


Смысл Qt - кроссплатформенная универсальная библиотека C++, плюс сигналы, да. Они даже одно время не шутя пытались конкурировать с Java.


Только сигналы - это именно для UI, сами по себе они не имеют ничего общего с "объектными штучками".
Любой многопоточный/многопользовательский графический интерфейс в той или иной форме имплементирует эти сигналы (в общем смысле). И так публично нелюбимая у кулхацкеров микрософтовская MFC, и давно давшая дуба Борландовская OWL, и нынешняя пока еще коптящая дельфийская VCL. Все они имеют диспетчеры событий. Событий, генерируемых UI.

Цитата: Цитата: adolfus от 10.03.2016 04:43:59"Объектно-ориентированный" отнюдь не означает "поддерживает объектную парадигму". Скорее наоборот, "Объектно-ориентированный С++" означает, что С++ ее не поддерживает -- он просто где-то как-то около пробегал.


Я этого не понимаю. К сожалению или к счастью - хз.
  • +0.00 / 0
  • АУ
 
 
 
 
  adolfus ( Слушатель )
11 мар 2016 00:17:08

Раньше бы сказали "белены объелся"...
Компилятор си написан на си -- это тверже, чем "НБКАиМПЕ".
Скачайте исходники gcc и посмотрите - там нет ни одной несишной строчки, в отличие от всех остальных ЯП.
Это единственный ЯП, на котором можно писать компиляторы со всех ЯП и ассемблеры, не привлекая ничего, кроме стандартной библиотеки.
С++ здесь просто нахлебник -- согласно стандарту ФТЫШ ШЫЩ ШУЦ 14882 он просто обязан поддерживать конструкции C и его две дюжины библиотек.
  • +0.00 / 0
  • АУ
 
 
 
 
 
  Lapsha ( Слушатель )
11 мар 2016 00:32:06


Самый первый компилятор С написан таки на ASM. Потому что тупо больше не на чем было его тогда писать.


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

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

ASM -> BCPL -> B -> C.
http://stackoverflow…er-written
  • +0.01 / 1
  • АУ
 
 
 
 
  adolfus ( Слушатель )
11 мар 2016 02:14:13

Если Вы не понимаете, что такое объектная парадигма и чем она отличается от объектно-ориентированного подхода, начните с межпроцессных взаимодействий, сокетов, сигналов, сообщений, очередей pm/win32 и остальной IPC-шной шняги. Когда разберетесь, представьте, что все это  должно быть реализовано эффективно и безопасно в юзерспейсе и в рамках одного процесса -- объектный язык должен предоставить языковые конструкции для всего этого на таком уровне, на котором процедурный представляет конструкции для сложения и вычитания. И это должно быть эффективнее вызова процедур.
Qt как раз и пытается реализовать основные элементы этой парадигмы, вводя сигналы и слоты, чтобы подставить костыли C++.
  • +0.00 / 0
  • АУ
 
 
 
 
  LightElf ( Слушатель )
11 мар 2016 02:31:54

Компиляторы С 99.9% случаев написаны на С. В последнее время gcc перешел на С++. Есть такое понятие compiler bootstrapping - создание компилятора "из ничего", последовательными итерациями.
Насчет же "обертка для ассемблера" - тоже не соглашусь, давно уже принято генерировать напрямую машинный код.
  • +0.00 / 0
  • АУ
 
 
 
 
 
  Lapsha ( Слушатель )
11 мар 2016 05:25:34


Шо, и самый первый - тоже на С?


Цитата: Цитата: LightElf от 10.03.2016 09:31:54Насчет же "обертка для ассемблера" - тоже не соглашусь, давно уже принято генерировать напрямую машинный код.


Это как? Что это за новости? Шокированный


Линковщик уже отменили? А как вообще тогда линкуются вызовы функций, коль скоро все - и сразу в коды?
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
  LightElf ( Слушатель )
11 мар 2016 17:47:25

Самый-самый первый в истории? Фиг его знает на чем был написан. На Алголе или Фортране например. Может и на ассемблере. В любом случае входит в те самые 0.1%

Цитата: ЦитатаЛинковщик уже отменили? А как вообще тогда линкуются вызовы функций, коль скоро все - и сразу в коды?

0. Линкуется как раз скомпилированный машинный код, а не ассемблерный текст.
1. Линкер не является обязательным атрибутом любого компилятора C. Зависит от многих факторов. Есть компиляторы напрямую выдающие готовый бинарник. Есть компиляторы вообще не создающие файлов (программа компилируется в ОЗУ и сразу выполняется). Есть компиляторы использующие внешний линковщик.
2. Линковщик может быть частью ОС, а не компилятора. Например в Линухе binutils не имеет прямого отношения к gcc. В OS/2 был линкер link386 и был он частью ОС, а не компилятора (кстати, компилятор Virtual Pascal использовал именно системный link386 для сборки).
3. Точно также линковщик не имеет прямого отношения к ассемблеру. Вообще к конкретному языку программирования. Задача линкера - склеить бинарные файлы определенного формата по определенным правилам (они могут вообще выполняемого кода не содержать, как например шрифты FON).
  • +0.04 / 3
  • АУ
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
11 мар 2016 21:01:55

Ох уж эти теоретики!


Последний релиз GCC 5.3 случился 4 декабря 2015 года:
https://gcc.gnu.org

Полная гнутая документация на GCC 5.3.0 за 2015-й год:
https://gcc.gnu.org/…5.3.0/gcc/

И вот интересные моменты:
3.12 Passing Options to the Assembler:
https://gcc.gnu.org/…er-Options

3.13 Options for Linking:
https://gcc.gnu.org/…nk-Options

Как можно линковать машинный код? Работающему с GCC неизвестен термин "объектный файл"?
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
  ps_ ( Слушатель )
11 мар 2016 21:24:02

А что по Вашему содержит (в структурированном виде) объектный файл, сделанный gcc? Java bytecode? Шокированный
  • +0.03 / 2
  • АУ
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
11 мар 2016 22:07:13


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


Если объектный файл - машинный код, то запустите его на выполнение без всяких изменений. И доложите результат.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
12 мар 2016 03:17:20

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

Цитата: ЦитатаЧто непринципиально, поскольку между ними однозначное соответствие в обе стороны.

Это, мягко говоря, не совсем так. Даже для x86 есть мнемоники ассемблера без соответствующей инструкции процессора и инструкции процессора без ассемблерной мнемоники. А ежели более другие процессоры рассматривать - там вообще все запущено.
  • +0.01 / 1
  • АУ
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
11 мар 2016 22:09:46

Что сказать -то хотели? Gcc - единственный компилятор Си? Компилятор не имеет права вызывать ассемблер для трансляции ассемблерных вставок? Объектные файлы gcc нельзя линковать без ld? Объектный файл не является машинным кодом? В чем по вашему заключается процесс линковки, если "нельзя линковать машинный код"? 
Мне прям интересно постигнуть всю глубину глубин 
  • +0.04 / 3
  • АУ
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
11 мар 2016 22:26:09


Какой интересный речитатив!

Про GCC начали Вы, не я.
Приведите пример компилятора С, который генерирует исполняемый файл без объектного кода и линковщика.

Возьмите любой машинный код (исполняемые файлы Win, Linux - без разницы), и покажиет мне пальчиком, что там можно линковать.
И повторю уже озвученную ранее просьбу: если объектный файл - машинный код, то запустите его на исполнение.
  • -0.02 / 1
  • АУ
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
11 мар 2016 23:56:38

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

Цитата: ЦитатаПро GCC начали Вы, не я.
Приведите пример компилятора С, который генерирует исполняемый файл без объектного кода и линковщика.

Вы начали с утверждения, что компилятор C - обертка над ассемблером. Вам и доказывать ваше утверждение. Объектный код и линковщик - вообще отдельная тема. Но просто на всякий случай, в качестве примера подскажу название: tiny C compiler. Который, что характерно, обходится и без объектного кода и без линковщика и без ассемблера. Без единого гвоздя, исключительно с божьей помощью.

Цитата: ЦитатаВозьмите любой машинный код (исполняемые файлы Win, Linux - без разницы), и покажиет мне пальчиком, что там можно линковать.

Вы за стул держитесь, я сейчас страшную вещь скажу. Любой исполняемый файл, (что в Windows, что в Linux) необходимо  линковать с системными сервисами (в windows это kernel32.dll, в linux - libc.so), а обычно - еще и с кучей других всяких модулей, которые так и называются - динамически линкуемые библиотеки.
Цитата: ЦитатаИ повторю уже озвученную ранее просьбу: если объектный файл - машинный код, то запустите его на исполнение.

Регулярно беру именно объектный файл и запускаю его на исполнение. Ну есть у меня такой код, который весь в один файл помещается и ничего снаружи не требует.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
12 мар 2016 00:26:59


Это неправда. Мягко говоря.

Я утверждал, что С - обертка ассемблера. А не компилятор С.
И это утверждение верно. Любой язык программирование есть в конце-концов обертка ассемблера. Который, в свою очередь, есть обертка машинного кода.
Вам, как программеру, следовало бы быть внимательным к мелочам, практически параноидальным буквоедом. Иначе будут проблемы на работе.


Цитата: Цитата: LightElf от 11.03.2016 06:56:38tiny C compiler. Который, что характерно, обходится и без объектного кода и без линковщика и без ассемблера. Без единого гвоздя, исключительно с божьей помощью.


Документация TCC прямо от разработчика (Bellard):

http://bellard.org/tcc/tcc-doc.html

И что мы там видим?

4. TinyCC Assembler:
http://bellard.org/t…html#SEC10

5. TinyCC Linker:
http://bellard.org/t…html#SEC16

Веселый

Просто TCC не создает физический объектный файл, он его процессит линковщиком в оперативной памяти. В отличие от GCC. Но шаги компилятора все те же.

Цитата: Цитата: LightElf от 11.03.2016 06:56:38Вы за стул держитесь, я сейчас страшную вещь скажу. Любой исполняемый файл, (что в Windows, что в Linux) необходимо  линковать с системными сервисами (в windows это kernel32.dll, в linux - libc.so), а обычно - еще и с кучей других всяких модулей, которые так и называются - динамически линкуемые библиотеки.


Другими словами, до сегодняшнего дня Вы не знали о существовании линковщиков у компиляторов.
К системным компоновщикам они отношения не имеют.


Цитата: Цитата: LightElf от 11.03.2016 06:56:38Регулярно беру именно объектный файл и запускаю его на исполнение. Ну есть у меня такой код, который весь в один файл помещается и ничего снаружи не требует.


Если снаружи ничего не требует - в некоторых специальных случаях будет исполняться. И то это зависит от компилятора: будет он создавать заголовок для таблицы символов или нет.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
12 мар 2016 02:34:53

Любой  язык программирования - обертка машины Тьюринга. Есть ли у машины Тьюринга ассемблер? А есть ли жизнь на Марсе?

Цитата: ЦитатаИ что мы там видим?


4. TinyCC Assembler:
http://bellard.org/t…html#SEC10

"Дядя, ты дурак?" (С) Прямо первой строчкой:

Цитата: ЦитатаSince version 0.9.16, TinyCC integrates its own assembler. TinyCC assembler supports a gas-like syntax (GNU assembler). You can desactivate assembler support if you want a smaller TinyCC executable (the C compiler does not rely on the assembler).

Из чего следует, что до версии 0.9.16 ассемблера не было вообще. А после - появился опциональный встроенный транслятор с ассемблера. Отдельно сказано, что самому TinyCC ассемблер как пятая нога зайцу.

Цитата: Цитата5. TinyCC Linker:

http://bellard.org/t…html#SEC16
Веселый

Опять, для не умеющих читать, первая же строчка

Цитата: ЦитатаTCC can directly output relocatable ELF files (object files), executable ELF files and dynamic ELF libraries without relying on an external linker.

Что характерно, речь идет о версии, где появилась возможность сохранять результат компиляции в файл стандартного формата ELF.

Цитата: ЦитатаПросто TCC не создает физический объектный файл, он его процессит линковщиком в оперативной памяти. В отличие от GCC. Но шаги компилятора все те же.

Словоблудие. Не ходит, не крякает и не похожа на утку - но все равно утка. Смеющийся

Цитата: ЦитатаВам, как программеру, следовало бы быть внимательным к мелочам, практически параноидальным буквоедом. Иначе будут проблемы на работе.

Бог миловал меня от чистого программерства, к счастью.

Цитата: ЦитатаДругими словами, до сегодняшнего дня Вы не знали о существовании линковщиков у компиляторов.
К системным компоновщикам они отношения не имеют

Другими словами вы не знали, что выполняемые файлы тоже требуют линковки. Будет ли линковка выполняться системным загрузчиком или отдельной программой - вопрос несущественный. Ничто не мешает готовый exe-шник и готовую dll статически слинковать в один жирный файл.
Цитата: ЦитатаЕсли снаружи ничего не требует - в некоторых специальных случаях будет исполняться.

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

Спасибо, Кэп. Формат объектного файла сам по себе зависит от компилятора (удивительно, да?), а наличие таблицы символов никак не мешает коду выполняться.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
12 мар 2016 12:04:50

Отнюдь!
Язык программирования может быть оберткой языка же программирования более низкого уровня. 

Он не может быть оберткой какой-то машины, тем более в виде абстрактной модели. Язык программирования предназначен для удобного для человека кодирования программ для машин.
Цитата: Цитата: LightElf от 11.03.2016 09:34:53"Дядя, ты дурак?" (С) Прямо первой строчкой:


Быдлить не надо, знаток страшных (кагбэ) слов. Глядишь, и к тебе начнут относиться не как к...
Цитата: Цитата: LightElf от 11.03.2016 09:34:53Из чего следует, что до версии 0.9.16 ассемблера не было вообще. А после - появился опциональный встроенный транслятор с ассемблера. Отдельно сказано, что самому TinyCC ассемблер как пятая нога зайцу.


Это всего лишь значит, что TCC изначально пропускал этап с генерированием чисто ассемблерного кода (*.s файлов), что ранее делал gcc. Т.е. TCC сразу генерил объектный код, да и то не в виде файлов.


С самого начала tiny C был сделан для запуска с магнитной дискеты.
Цитата: Цитата: LightElf от 11.03.2016 09:34:53Опять, для не умеющих читать, первая же строчка

Что характерно, речь идет о версии, где появилась возможность сохранять результат компиляции в файл стандартного формата ELF.


Умеющий читать вместо патетических восклицаний лучше бы перевел процитированную строчку, как смог бы. И тогда стало бы понятно, что ни о каких версиях там нет речи вообще (в отличии от ассемблера). Там просто перечислены опции, во что линковщик может преобразовать объектный файл после шага assembling.
Говорить надо проще. Патетические надрывные восклицания с какими-то невнятными намеками и прямой ложью (совмещенной с намеками на неумение оппонента читать) меня никак не задевают. Увы!


Цитата: Цитата: LightElf от 11.03.2016 09:34:53Словоблудие. Не ходит, не крякает и не похожа на утку - но все равно утка. Смеющийся



Бог миловал меня от чистого программерства, к счастью.


Другими словами вы не знали, что выполняемые файлы тоже требуют линковки. Будет ли линковка выполняться системным загрузчиком или отдельной программой - вопрос несущественный. Ничто не мешает готовый exe-шник и готовую dll статически слинковать в один жирный файл.

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

Спасибо, Кэп. Формат объектного файла сам по себе зависит от компилятора (удивительно, да?), а наличие таблицы символов никак не мешает коду выполняться.



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


Я завтра еду с семейством по среднедальним окрестностям на предмет пофтыкать во всякие виды в качестве зевак. А вот в понедельник-вторник (по Москве - вторник-среда) я сделаю простенькую программку на С. И вот Вы мне и всем желающим продемонстрируете, как Вы запускаете объектный файл на выполнение. В любой удобной системе. С подробным описанием шагов. Именно объектный файл до линковщика, не тот, что сгенерит линковщик (исполняемый или динамическую/статическую библиотеку).

ОК?
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
15 мар 2016 11:25:26

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


Ссылку на документацию на tiny C я давал ранее, вот конкретно на опции командной строки:
http://bellard.org/tcc/tcc-doc.html#SEC2


Цитата: Цитата`tcc -o myprog a.c b.c'
Compile `a.c' and `b.c', link them and generate the executable `myprog'.
...

`tcc -c a.c'
Compile `a.c' and generate object file `a.o'.



Т.е. опция -c - это просто компиляция в объектный файл без линковщика, а опция -o - это компиляция и линкование в исполняемый объектный файл.

В качестве сорса пользуем файл tcctest.c с таким содержанием:


Цитата: Цитата#include <stdio.h>


int main()
{
    printf("Hello World!\n");
    return 0;
}





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

Далее результаты для Вынь и Линуха.

Windows




После запуска подчеркнутой команды Win вывалила такое окошко:





Linux




Тут все понятно и так.

Необязательную опцию -v я использовал чтобы tcc "не молчал" во время исполнения команд, что он делает без вербализации.

С опцией -run (в конце каждого теста) - стандартное использование tiny C, для чего он и был изначально создан: компилирование, линковка и запуск исходников на С, все в оперативной памяти, "на лету", без генерации промежуточных файлов на HDD. 
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
15 мар 2016 18:39:50

Нам, диванным знатокам, совершенно непонятно о чем вообще ваш пост и какое отношение он имеет к теме дискуссии, заданной вашим же утверждением

Цитата: ЦитатаА сам компилятор С написан на ассемблере. И С есть не что иное, как "обертка" ассемблера. Только еще более абстрагированная от процессорных кодов.

Я вам указал на компилятор языка C, который не написан на ассемблере и не является "оберткой" ассемблера (поскольку без ассемблера прекрасно обходится). Можете просто заглянуть в исходник самый древний TCC и убедиться, что там нет ни ассемблера, ни линкера. Хотя конечно ссылки на внешние функции (если они есть в программе) приходится разруливать. Можете считать это линковкой.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
15 мар 2016 20:51:12


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

О том, что tiny C не имеет линковщика и линковщик вообще не нужен компиляторам - это вообще не о Вас, - не так ли?Улыбающийся


Цитата: Цитата: LightElf от 15.03.2016 02:39:50Можете просто заглянуть в исходник самый древний TCC и убедиться, что там нет ни ассемблера, ни линкера.


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


Это не "самый древний TCC", это Беллард рассказывает об Obfuscated Tiny C Compiler, который он написал для участия в междунардном конкурсе трудночитаемого С кода (International Obfuscated C Code Contes).

Вот рассказ Белларда:
http://bellard.org/otcc/

Вот ссылка на сайт конкурса со всеми правилами и т.п.:
http://www.ioccc.org/

В первой ссылке Беллард рассказывает о требованиях к коду (должен не превышать 2048 байт, не считая символы ';', '{', '}'  и пробелы), и должен уметь скомпилить свой собственный код. И - все.
Это вообще не компилятор С, а некая игрушка для конкурса. Остроумная и нетривиальная, но - игрушка. Беллард просто рассказывает, с чего все началось.

А компилятора tiny C без линковщика никогда не было.

Цитата: Цитата: LightElf от 15.03.2016 02:39:50Хотя конечно ссылки на внешние функции (если они есть в программе) приходится разруливать. Можете считать это линковкой.


Это и есть линковка. И она называется линковкой везде в мире. В том числе и в официальной документации tiny C. И в любой другой документации любого компилятора языка высокого уровня.

Как видите, без линковки объектный файл не выполняется. Отчего-то.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
16 мар 2016 12:47:16

Знатный специалист придумал какую-то херню и героически ее разоблачает. Цитату приведите, где я утверждаю что линкер совсем не нужен компиляторам? Ну, чтоб меня носом ткнуть.
Обычно - нужен,  особенно если компилятор изначально заточен на раздельную компиляцию разных исходных файлов. Это наиболее распространенное решение, но не единственное. Компиляторы, работающие в один проход, появились не вчера. 
Что называть, а что не называть линковкой - вы петляете как заяц. То "в исполняемых файлах Win нечего линковать ", то любая настройка вызовов становится линковкой. Определитесь уже. Ну, чтоб балаболом не выглядеть.
Ну и собственно, что там насчет "обертка ассемблера "? Очень многообещающая тема, хотелось бы пропасть к источнику знаний. 
Что до TCC/OTCC - если вы неспешно прочитаете страничку Белларда,  то выясните что TCC - развитие той самой игрушки. Собственно нумерация версий, начинающая сразу с 0.9 как бы намекает. Версия, на которую я дал ссылку, нифига не obfuscated, да и значительно крупнее 2048 байт. Ну и самое главное, что это меняет? Вы хотели компилятора - получите и распишитесь. Как он называется - глубоко вторично.
  • +0.01 / 1
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  Lapsha ( Слушатель )
16 мар 2016 19:05:16

Иди, иди, солдатик!

Больно интересно все это опять перемешивать с подобными знатоками.
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  LightElf ( Слушатель )
18 мар 2016 02:08:03
Сообщение удалено

18 мар 2016 06:16:25

  • +0.00
 
 
 
 
 
  Igor_FF ( Слушатель )
11 мар 2016 12:04:23

Та ладна! Мне казалось, что Clang сейчас в тренде... 
  • +0.00 / 0
  • АУ
 
 
 
 
 
 
  LightElf ( Слушатель )
11 мар 2016 17:55:09

Тренд - это о чем трындят. А чем реально пользуются в работе - это другое. Кстати, некоторые компиляторы (например watcom) не умеют генерировать ассемблерный листинг даже если сильно попросить.
PS. Clang не генерирует ассемблер - он генерирует промежуточный платформо-независимый байткод.
  • +0.00 / 0
  • АУ
 
  TAU ( Слушатель )
10 мар 2016 17:26:28

Опять же, весьма здравые мысли, под коими готов подписаться.
  • +0.00 / 0
  • АУ