User Tag List

Страница 7 из 10 ПерваяПервая ... 345678910 ПоследняяПоследняя
Показано с 61 по 70 из 99

Тема: "Умная линковка" в компиляторах

  1. #61

    Регистрация
    21.05.2006
    Адрес
    Canada
    Сообщений
    78
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Одна из промышленных реализаций.
    Я всего-навсего попросил Oleg N. Cher подтвердить его же собственные слова по поводу легкости реализации принципов ООП на чистом С. Из трех принципов только по одному было что-то с натяжкой похожее на ответ. Что какбэ намекает на уровень знаний по данному вопросу, слабо соотносящийся с апломбом заявлений.
    Я, вероятно, не может в полной мере следить за ходом дискуссии из-за языкового барьера, но у меня есть трудное время, чтобы понять, почему есть споры.

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

    Метод связывания, что Олег описывает, с участием имя-коверкая и вырезания объектов в 500 000 штук не был изобретен Олег - это была вокруг в течение десятилетий, и точно, как C + + компиляторов работы. Разница лишь в том вы не видите все эти файлы, как разрезы компилятора вещи и ставит его в один файл объекта. Предварительно скомпилированные заголовки и постепенно компиляции в объектные файлы являются как этот процесс ускорился.

    Другой aternative помощью # IFDEF * не * эквивалентны и используется только когда инструменты, чтобы сделать это автоматически не доступны.

    Примеры методов ООП, я могу предложить некоторые в z88dk реализованного в z80 ассемблере. Я не вижу никакой разницы между С и z80 ассемблере поэтому они должны служить в качестве заменителя.

    У нас есть несколько контейнеров в z88dk по образцу C + + STL. Все это реализовать [B] Отношения наследования [/ B]. Один простой пример: "массива байтов" является одним из основных тип, который может хранить фиксированный размер массива байтов. Он определяет операции для добавления, индекс, скопируйте строки в / из и т.д. "байт Vector" наследует от "массива байтов". Все "массив байт" функции можно также назвать на "байт Вектор». Но "Байт Вектор" добавляет операций, которые позволяют основной массив для выращивания или сократилась с помощью Realloc (). Это наследство вместе с увеличением подкласса. Это очень легко сделать в C или ассемблере, устраивая иметь данные в "базового класса" появляются в начале структуры "подкласса".

    [B] инкапсуляции данных [/ B], еще один принцип ООП. Конечно, инкапсуляции данных существует уже с начала вычислений. Под С его называют "абстрактные типы данных" и легко реализуется с помощью структуры для хранения личных данных и публичный интерфейс, доступный как документально функции, принимающие указатели на структуры в качестве параметра. В z88dk, одним из примеров является библиотека SP1 спрайт.

    Полиморфизм. Это один видно реже. В z88dk мы используем полиморфизм в STDIO. Файл (данные) + его водитель (методы) представляют собой полиморфный объект. Вид полиморфизма мы используем это как то, что находится в Smalltalk и Java. Как Smalltalk, это делается через передачи сообщений и, как Java, мы указываем интерфейсы, что водители должны быть реализованы.

    Интерфейс STDIO содержит сообщения типа "putc", "читать", "писать" и т.д. Все Printf / зсапЕ / поиск / и т.д. операции переводятся в небольшом количестве сообщений, каждый из которых идентифицируется байта. Файловая структура, что эти сообщения отправляются содержит z80 JP инструкцию для водителя. Водитель декодирует сообщение с помощью переключателя о "CP STDIO_MSG_READ", и переходит к правильному действию.

    В дополнение к STDIO интерфейс, есть консольный интерфейс для текста ввода / вывода на экран, интерфейс символов для таких вещей, как последовательных устройств, а также интерфейс диска для дисковых устройств. Эти интерфейсы реализованы все таким же образом с использованием сообщений.

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

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

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

    ===

    I probably can't fully follow the discussion because of the language barrier, but I have a hard time to understand why there is controversy.

    OOP principles existed long before the OOP term was popularized. C++ itself started as a pre-processor that output pure C code that was then compiled by a C compiler. Data encapsulation, inheritance, polymorphism were all translated to C code.

    The linking method that Oleg describes, involving name-mangling and cutting objects into 500,000 pieces was not invented by Oleg -- this has been around for decades and is exactly how C++ compilers work. The only difference is you don't see all those files as the compiler cuts stuff up and puts it into a single object file. Pre-compiled headers and incrementally compiling into object files are how this process is sped up.

    The other aternative using #ifdef is *not* equivalent and is only used when the tools to do this automatically are not available.

    For examples of OOP techniques, I can offer some in z88dk implemented in z80 assembler. I don't see any difference between C and z80 assembler so they should serve to act as substitute.

    We have several containers in z88dk modelled on C++ STL. These all implement inheritance relationships. One easy example: "Byte Array" is a fundamental type that can store a fixed size array of bytes. It defines operations to append, index, copy strings to / from, etc. "Byte Vector" inherits from "Byte Array". All "Byte Array" functions can also be called on a "Byte Vector". But "Byte Vector" adds operations that allow the underlying array to be grown or shrunk via realloc(). This is inheritance along with augmentation of the subclass. It's very easy to do in C or asm by arranging to have the "base class's" data appear at the beginning of the "subclass's" structure.

    Data encapsulation is another OOP principle. Of course, data encapsulation has been around since the beginning of computing. Under C it is called "Abstract Data Types" and is easily implemented using structures to hold private data and a public interface available as documented functions taking pointers to the structure as parameter. In z88dk, one example is the sp1 sprite library.

    Polymorphism. This one is seen less often. In z88dk we use polymorphism in stdio. A FILE (data) + its driver (methods) constitute a polymorphic object. The kind of polymorphism we use is like what is found in smalltalk and Java. Like smalltalk, it's done through message passing and like Java, we specify interfaces that the drivers must implement.

    The stdio interface contains messages like "putc", "read", "write", etc. All printf/scanf/seek/etc operations are translated into a small number of messages, each one identified by a byte. The FILE structure that these messages are sent to contains a z80 JP instruction to the driver. The driver decodes the message using a switch statement "CP STDIO_MSG_READ", and jumps to the correct action.

    In addition to the stdio interface, there is a console interface for text i/o to the screen, a character interface for things like serial devices, and a disk interface for disk devices. These interfaces are all implemented in the same way using messages.

    We also almost do generic programming as several libraries use the concept of iterators. The sp1 sprite library has several iterator functions to traverse lists of character squares to update on screen, lists of screen tiles, lists of sprites but these are lists of one type of object. In C (or asm) it is really easy to make them lists of any kind of object implementing a specific interface. All that is needed is each structure in the list needs a function pointer to a function implementing the operation. Because the function pointer is a member of the structure, each item in the list can be a different object and here is another example of both generic programming and polymorphism.

    The harder type of polymorphism to implement is that done with virtual functions, so it's seen less often. But this can be done by having arrays of function pointers that implement the methods of each part of the object.

    All these things have been done in C since its early history. C++ just provides compiler support to simply implement these features which means fewer errors and more complex programs.

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,103
    Спасибо Благодарностей отдано 
    1,338
    Спасибо Благодарностей получено 
    323
    Поблагодарили
    152 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Из трех принципов только по одному было что-то с натяжкой похожее на ответ.
    Ну вот на счёт инкапсуляции. Как это можно продемонстрировать? Это-же что-то типа принципа не применять GOTO. Если в языке уже нет оператора GOTO то это уменьшает возможности программисту ошибиться. А если в языке есть GOTO, ну что-же, не применяй его "вручную" . Так и инкапсуляция. Это языковые рельсы, которые жёстко не дают съехать с пути. Нет рельсов - рули сам, ответственность на программисте.
    Хотя я не знаю так хорошо Си, возможно можно на предпроцессоре накрутить какието assert-ы, чтобы рельсы всё-таки были. Вот, раз ты эксперт, взял-бы да рассказал.
    Последний раз редактировалось Shadow Maker; 18.06.2014 в 21:29.

  4. #63

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,716
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот такой-сякой полиморфизм наследования на Обероне. В голый Си переводится по аналогии. Я, правда, не уверен, что Vitamin впечатлится, ему, видимо, непременно нужен такой вид полиморфизма, который совместим только с виртуальной машиной фирмы Microsoft. Но увы, чудес на свете не бывает.
    Последний раз редактировалось Shadow Maker; 18.06.2014 в 09:41.

  5. #64

    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Скорее речь шла об этом: http://en.wikipedia.org/wiki/Oberon-...WITH_statement
    Взносы в призовой фонд конкурса "Твоя игра 5" принимаются с помощью PaуPal, ЯндексДенег или перевода на карту Сбербанка (см. http://ti5.retropc.ru)

  6. #65

    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,286
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    39 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Alcoholics Anonymous, you are absolutely right!
    Basic OOP principles are extremely simple but very powerfull. And should not be associated only with languages like C++/Java/ObjC - they only provides syntax sugar and hides a lot of machinery you should care about while implementing the same on C/asm. So, you can share my sarcasm for talks about how OOP is sux because OOP=C++/Java/ObjC.

    Цитата Сообщение от Reobne Посмотреть сообщение
    Ну вот на счёт инкапсуляции. Как это можно продемонстрировать?
    Например так:
    Код:
    struct MyObject;
    void MyObject__Foo(struct MyObject* this, int param);
    Все. Кишки MyObject не видны наружу. Для пущего сокрытия можно даже не использовать forward declaration, но это уже хардкор, имхо.

    Цитата Сообщение от Reobne Посмотреть сообщение
    А Олег честно сказал что не вполне сам знает, что при сравнении языков пользовался оценками экспертов. Что ещё надо?
    Под нажимом и после уверток- это честно?

    Цитата Сообщение от Reobne Посмотреть сообщение
    Зачем упорно доказывать тому, кого считаешь дураком, что он дурак? Если он дурак, то он не поймёт, если он не дурак, то ты не прав. В любом случае это бессмысленно.
    Я стараюсь воздерживаться от подобных оценок, хотя это и нелегко. В отличие от, проявляющего агрессию в ответ на любое уточнение.

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Я, правда, не уверен, что Vitamin впечатлится, ему, видимо, непременно нужен такой вид полиморфизма, который совместим только с виртуальной машиной фирмы Microsoft.
    А можно подробнее? Что за виртуальная машина фирмы Microsoft? А то я слышал только про Virtual PC, Virtual Server и HyperV.

  7. #66

    Регистрация
    01.03.2005
    Адрес
    Саранск
    Сообщений
    5,830
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    247
    Поблагодарили
    106 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Не сдавайся. Дыши?

    Virtual TR-DOS

  8. #67

    Регистрация
    26.03.2005
    Адрес
    Ivanovo
    Сообщений
    640
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    1 сообщение
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от esl Посмотреть сообщение
    Почему?
    Как по мне, так модель с посылкой сообщений - более правильная чем плюсовая
    А никто и не спорит, но там ООП реализуется по другому и значительно легче конвертируется в С. Яркий пример такого ООП Амижный MUI.

  9. #68

    Регистрация
    16.09.2009
    Адрес
    г. Харьков
    Сообщений
    1,466
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Q-Master Посмотреть сообщение
    А никто и не спорит, но там ООП реализуется по другому и значительно легче конвертируется в С. Яркий пример такого ООП Амижный MUI.
    тут вопрос не в "легче конвертируется в С", а в модели ООП в принципе
    она от smalltalk вроде как корни ведёт,
    это просто РАЗНЫЕ подходы.

  10. #69

    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    484
    Спасибо Благодарностей отдано 
    135
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Q-Master Посмотреть сообщение
    Я прошу прощения что сделал именно так, но вот кусок либ z80 собирающихся с помощью cmake sdcc и sdasz80.
    А где собранные либы-то?
    Не понял, каким образом в сборку либ вовлекается sdar или sdcclib.
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

  11. #70

    Регистрация
    26.03.2005
    Адрес
    Ivanovo
    Сообщений
    640
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    1 сообщение
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sergey Посмотреть сообщение
    А где собранные либы-то?
    Не понял, каким образом в сборку либ вовлекается sdar или sdcclib.
    mkdir build
    cd build
    cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain/sdcc.toolchain.cmake
    make

    profit.

Страница 7 из 10 ПерваяПервая ... 345678910 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 17
    Последнее: 26.12.2015, 23:22
  2. Ответов: 19
    Последнее: 30.09.2011, 03:08
  3. Ответов: 0
    Последнее: 15.08.2010, 14:38
  4. Ответов: 18
    Последнее: 27.08.2008, 20:27
  5. Ответов: 6
    Последнее: 20.11.2007, 11:29

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •