LINUX.ORG.RU
ФорумTalks

Встречайте очередную замену Си

 ,


0

8

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

https://drewdevault.com/2021/03/19/A-new-systems-language.html

use io;

export fn main() void = {
	const greetings = [
		"Hello, world!",
		"¡Hola Mundo!",
		"Γειά σου Κόσμε!",
		"Привет мир!",
		"こんにちは世界!",
	];
	for (let i = 0z; i < len(greetings); i += 1) {
		io::println(greetings[i]);
	};
};

По сравнению с Си:

  • More robust error handling via tagged unions
  • Improved, Unicode-aware string support
  • Memory safe array, slice, and pointer types (and unsafe versions, if needed)
  • Direct compatibility with the C ABI for trivial C interop
  • A simpler, context-free, expression-oriented syntax
  • A standard library free of the constraints of POSIX or the C standard
★★★

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

PE представляет собой модифицированную версию COFF формата файла для Unix.

Я знаю. Но только эта модификация очень значительная и она меняет формат до неузнаваемости. Большая часть критических заголовков PE (optional header, data directories) придуманы Microsoft, от COFF там осталась совсем мелочь. Хотелось бы посмотреть на оригинальный исполняемый (не объектный) COFF без изменений от Microsoft.

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

MinGW почему-то передаёт this в регистре ECX

Так во всех бинарниках на винде. Исключение - COM-объекты, которые через стек передают

В MinGW всё освобождается вызывающим

Соглашение о вызовах можно задать ручками - __stdcall и __cdecl. Для ELF тоже можено задать через __attribute__

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

В компиляции в ELF this передаётся через стек.

Секунду. А какое отношение формат файла имеет к порядку передачи аргументов?

cvs-255 ★★★★★
()
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от SR_team

Так во всех бинарниках на винде.

Я предполагал, что на C++ Itanium ABI это не распространяется. В любом случае это я уже починил через правку Clang.

Соглашение о вызовах можно задать ручками - __stdcall и __cdecl.

Аттрибуты для смешанного stdcall/cdecl, когда аргументы передаются как cdecl, а возвращаемые структуры/классы как stdcall, я не видел. Например BPoint BView::ConvertToParent(BPoint localPoint);, в конце функции есть RET 4 для освобождения указателя на возвращаемое значение BPoint.

X512 ★★★★★
()
Ответ на: комментарий от cvs-255

Секунду. А какое отношение формат файла имеет к порядку передачи аргументов?

Вот и мне интересно. В коде Clang и GCC/MinGW захардкожено использование разных ABI для ELF и PE.

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

Там у него просто другой ABI по дефолту подхватился компилятором, по всей видимости.

Нет, в PE выбран Itanium C++ ABI, манглинг имён и формат виртуальных таблиц и метаинформации используется оттуда. Но передача this и возвращаемых структур/классов почему-то другая.

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

Эмм… http://cs.usu.edu.ru/docs/pe/dirs4.html ??

Покажите мне где там тип релокации, позволяющий записать адрес символа по указанному месту или хотя бы скопировать значение по одному адресу в другой адрес? Эти релокации PE умеют только прибавлять в указанные места разницу между адресом загрузки модуля и image base.

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

в конце функции есть RET 4

Ну да, методы классов используют __thiscall, который, как и __stdcall сам чистит за собой стек

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

прибавлять в указанные места разницу между адресом загрузки модуля и image base.

А какие еще нужны?

записать адрес символа по указанному месту

Зачем?

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

Зачем?

Чтобы не было накладных расходов при вызове функций, писать адрес сразу в CALL <PC-relative offset> E8xxxxxxxx. Также это критически нужно в Itanium C++ ABI чтобы записать адреса на виртуальные методы и type_info из импортированных классов. В MinGW для этого сделаны свои релокации: https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-crt/crt/pseudo-reloc.c. В моём эксперименте с PE в Haiku это реализовно, иначе всё падает.

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

Этим не таблица импорта занимается?

Там адреса импортированных символов можно записывать только подряд в указанную таблицу (получается что-то наподобие GOT, сама таблица называется IAT (import address table) если не ошибаюсь). Если бы можно было записывать куда угодно, то авторы MinGW не делали бы костыли со своими релокациями.

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

Также это критически нужно в Itanium C++ ABI чтобы записать адреса на виртуальные методы

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

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

Виртуальные методы не через E8xxxxxxxx вызываются

Они вызываются из таблицы виртуальных методов, которая находится в секции данных и может содержать указатели на импортированные методы из другого модуля. Но с виртуальными методами ещё ладно, их можно по именам импортировать и вставить переходники PLT, но с type_info этот трюк не пройдёт, там нужен именно указатель на type_info из другого модуля.

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

Мы сейчас точно о PE говорим, а не о ELF?

Там тоже используются аналогичные вещи, но они по другому называются. Function: JMP [__imp_Function] используется во многих форматах модулей. Это по сути вообще не зависит от формата модуля.

Например иногда надо передать указатель на импортированную функцию, для этого CALL [tableEntry] работать не будет, надо будет создавать переходник или использовать свои релокации.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 3)
Ответ на: комментарий от shimon

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

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

Хотелось бы посмотреть на оригинальный исполняемый (не объектный) COFF без изменений от Microsoft

Такой?

$ file oash
oash: Intel 80386 COFF executable, no relocation info, no line number info, stripped, 8 sections, optional header size 28

$ head -n 4 oash.doc
     OASH(C)                    SCO UNIX System V (value added)

     Name
          oash - Invokes the shell command interpreter.
 $ ./main
Machine code: 0x14C
Num of sections: 8
UNIX timestamp: 732233752
Table of symbols: 0
Num of elements: 0
Header size: 28
Flags: 0x10F

732233752 это 15 марта 1993, 22:15:52 GMT

Пардон, шёл мимо, глазом зацепился, пошел рыться в архивах из любопытства )

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

Я не знаю.

Меня там интересовал scosh (это такой их mc). Пытался расковырять, но не осилил. Этот oash, как я понимаю, запчасть от scosh. Запускалка shell. Вроде.

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.