Есть ли язык, который переносится в C, с лучшим синтаксисом? [закрыто]
19
CoffeeScript - это язык, который переносится в JavaScript с чистым синтаксисом, вдохновленным Ruby. Существует ли подобный язык, который переносится на C, позволяя создавать более читаемый код без ущерба для производительности? Если ничего подобного не существует, есть ли веская причина не создавать его?
Обратите внимание, однако, что «компилируется в C» не является синонимом «так быстро, как исходные программы на C». Когда что-то компилируется в C, оно часто генерирует код, довольно (или полностью) отличающийся от того, что любой нормальный человек написал бы в C. Это может легко оказаться значительно медленнее (или иногда быстрее), чем то, что вы обычно пишете вручную.
Джерри Коффин
4
Что мне не нравится в любом из этих ответов, так это в том, что они предлагают совершенно разные языки, такие как Vala. Дело в том, что CoffeeScript - это Javascript, но с другим синтаксисом.
Я действительно хочу, чтобы "transcompile" (слово) просто умер. Это «компиляция» и «компилятор». Вам не нужно новое слово только потому, что язык вывода не x86 (и если вы думаете, что вам это нужно, вы не понимаете компиляторы).
Леушенко
2
Слово transile означает (или в последнее время стало означать) перевод кода в исходный код другого языка с той же семантикой , обычно оператор для эквивалентного оператора (позволяющий также создавать исходную карту). Никто не утверждает, что транспортеры делают что-то отличное от компиляторов. Транспортеры - это особый тип компилятора.
Карл Смит
Ответы:
23
CoffeeScript компилируется в JavaScript по очень простой причине: JavaScript является де-факто клиентским языком, и было бы неразумно ожидать, что производители браузеров будут изначально поддерживать CoffeeScript, когда все, что он предлагает, - это альтернативный синтаксис.
Подобным образом, основной смысл высокоуровневого языка для C-переводчиков - это немедленная переносимость, так как есть компилятор C почти для каждой платформы и изобилие C-библиотек. Вала , например, была разработана для :
создавать собственные исполняемые файлы (через компилятор C машины),
автоматизировать подсчет ссылок и
все еще быть доступным для программистов GNOME C
GNOME - это традиционно ориентированный на C проект, а GObject специально написан на C, и Vala вряд ли найдет большую любовь среди разработчиков GNOME, если он скомпилирован в машинный код, независимо от его дружественной природы (и синтаксиса). Не всем, казалось, нравился синтаксис до такой степени, что другой язык, Genie , был создан для его улучшения.
Для примера на C ++ Facebook разработал HipHop , переводчик PHP на C ++. Они пытались решить очень специфическую проблему, связанную с использованием процессора, без необходимости заменять весь свой PHP-код и переучивать своих инженеров (или, что еще хуже, заменять их). Это гораздо более конкретный пример, поскольку проблемы масштабируемости Facebook, ну, в общем-то, уникальны, и снова иметь доступ к промежуточному коду C ++ может быть полезно, так как расширения PHP написаны на C и C ++.
Так что переводчик с языка высокого уровня на другой - это хорошая идея, в основном, когда требуется доступ к промежуточному коду. Для CoffeeScript код JavaScript необходим из-за его широкого использования в браузерах, а для Vala, Genie и HipHop из-за существующей кодовой базы. Очевидно, что доступ к промежуточному коду означает, что вы можете дополнительно оптимизировать его при необходимости.
Но, вообще говоря, было бы не очень хорошей идеей создавать язык, переводящий на C, или любой другой язык, если бы вы не использовали полученный код. Есть так много языков, если вы не можете справиться с Си, просто выберите другой. По совпадению первый компилятор C ++, написанный Bjarne Stroustrup, CFront, был переводчиком C с Classes на C, но это было главным образом потому, что как новый язык было невозможно загрузить C с помощью Classes.
Я собираюсь охватить несколько моментов, которые Яннис Ризос не сделал в своем отличном ответе.
Да, существует много языков. C - это общая цель для бэкэндов компилятора, поскольку он невероятно переносим и сильно оптимизирован, хотя с LLVM в этом нет особого смысла.
Я знаю несколько реализаций, которые делают это:
C ++ (по крайней мере, в первые дни)
GHC Haskell (хотя основным генератором кода является C--)
Нет, только потому, что он использует C как промежуточный язык, не означает, что вы достигнете его скорости. Причина C в том, что метод написания кода отличается от других языков. Это просто портативная сборка, ничего особенного.
Некоторые люди думают о C как о «ассемблере высокого уровня». Это довольно близко к машине, но, конечно, это не куча опкодов.
Дстромберг
6
Rock - это компилятор ooc, который генерирует исходный код C99. OOC-Ланг это язык программирования с объектами, функциями первого класса и розовых единорогов. МНК представляет собой динамичный язык и идет так далеко. Он генерирует более толстые и медленные c-коды. Вам нужно изменить больше, чтобы удовлетворить ваши требования. Но это хорошая отправная точка.
Не могли бы вы немного рассказать о том, что есть у каждого из этих ресурсов, и почему вы рекомендуете их как ответ на заданный вопрос? «Ответы только на ссылки» не очень приветствуются на Stack Exchange
gnat
4
OCaml может составить в байт - код, в машинный код, можно интерпретировать непосредственно, либо может составить до С .
Вы не могли бы объяснить больше о том, что он делает, и почему вы рекомендуете ответить на заданный вопрос? «Ответы только на ссылки» не очень приветствуются на Stack Exchange
gnat
3
Я не вижу, как мой ответ является «ответом только по ссылке». На самом деле, я мог бы удалить ссылку, и это все равно будет правильным ответом. Вопрос «Есть ли язык, который делает X», а мой ответ «язык Y делает X». Этот комментарий также относится к ответу Билика.
Барджак
3
Оригинальный компилятор C ++ Bjarne Stroustrop, cfront, скомпилировал C ++ в C, после чего он мог бы при желании запустить компилятор C для создания объектного кода. C ++ настолько "не теоретический", насколько вы можете получить :-)
Компиляторы-компиляторы Unix "yacc" и GNU "Bison" переводят свои входные языки на C. Многие, многие сложные системы были написаны с ними.
Ответы:
CoffeeScript компилируется в JavaScript по очень простой причине: JavaScript является де-факто клиентским языком, и было бы неразумно ожидать, что производители браузеров будут изначально поддерживать CoffeeScript, когда все, что он предлагает, - это альтернативный синтаксис.
Подобным образом, основной смысл высокоуровневого языка для C-переводчиков - это немедленная переносимость, так как есть компилятор C почти для каждой платформы и изобилие C-библиотек. Вала , например, была разработана для :
GNOME - это традиционно ориентированный на C проект, а GObject специально написан на C, и Vala вряд ли найдет большую любовь среди разработчиков GNOME, если он скомпилирован в машинный код, независимо от его дружественной природы (и синтаксиса). Не всем, казалось, нравился синтаксис до такой степени, что другой язык, Genie , был создан для его улучшения.
Для примера на C ++ Facebook разработал HipHop , переводчик PHP на C ++. Они пытались решить очень специфическую проблему, связанную с использованием процессора, без необходимости заменять весь свой PHP-код и переучивать своих инженеров (или, что еще хуже, заменять их). Это гораздо более конкретный пример, поскольку проблемы масштабируемости Facebook, ну, в общем-то, уникальны, и снова иметь доступ к промежуточному коду C ++ может быть полезно, так как расширения PHP написаны на C и C ++.
Так что переводчик с языка высокого уровня на другой - это хорошая идея, в основном, когда требуется доступ к промежуточному коду. Для CoffeeScript код JavaScript необходим из-за его широкого использования в браузерах, а для Vala, Genie и HipHop из-за существующей кодовой базы. Очевидно, что доступ к промежуточному коду означает, что вы можете дополнительно оптимизировать его при необходимости.
Но, вообще говоря, было бы не очень хорошей идеей создавать язык, переводящий на C, или любой другой язык, если бы вы не использовали полученный код. Есть так много языков, если вы не можете справиться с Си, просто выберите другой. По совпадению первый компилятор C ++, написанный Bjarne Stroustrup, CFront, был переводчиком C с Classes на C, но это было главным образом потому, что как новый язык было невозможно загрузить C с помощью Classes.
источник
Я собираюсь охватить несколько моментов, которые Яннис Ризос не сделал в своем отличном ответе.
Да, существует много языков. C - это общая цель для бэкэндов компилятора, поскольку он невероятно переносим и сильно оптимизирован, хотя с LLVM в этом нет особого смысла.
Я знаю несколько реализаций, которые делают это:
Нет, только потому, что он использует C как промежуточный язык, не означает, что вы достигнете его скорости. Причина C в том, что метод написания кода отличается от других языков. Это просто портативная сборка, ничего особенного.
источник
Rock - это компилятор ooc, который генерирует исходный код C99. OOC-Ланг это язык программирования с объектами, функциями первого класса и розовых единорогов. МНК представляет собой динамичный язык и идет так далеко. Он генерирует более толстые и медленные c-коды. Вам нужно изменить больше, чтобы удовлетворить ваши требования. Но это хорошая отправная точка.
источник
Vala и Genie - оба языка, которые компилируются в C. haxe компилируются в C ++, но я не уверен, что вы этого хотите.
источник
OCaml может составить в байт - код, в машинный код, можно интерпретировать непосредственно, либо может составить до С .
источник
источник